วิเคราะห์ CVE-2026-54121 - CertiGhost

ช่วงปลายเดือนที่ผ่านมาหลายคนในสาย Active Directory security น่าจะได้เห็นชื่อช่องโหว่ตัวใหม่ที่ชื่อว่า CertiGhost (CVE-2026-54121) ผ่านตากันมาบ้างแล้ว จุดที่ทำให้ช่องโหว่นี้น่าสนใจมากคือ ผู้โจมตีที่เป็นเพียง domain user ธรรมดา ก็สามารถปลอมตัวเป็น Domain Controller (DC) และขยายผลไปจนถึงการยึดครองทั้ง domain ได้ ผ่านบริการที่หลายองค์กรมีอยู่แล้วอย่าง Active Directory Certificate Services (AD CS)
ช่องโหว่นี้ถูกรายงานไปยัง Microsoft ตั้งแต่เดือนพฤษภาคม 2026 ได้รับการแก้ไขใน security update รอบเดือนกรกฎาคม 2026 (14 ก.ค. 2026) และเปิดเผยรายละเอียดต่อสาธารณะเมื่อวันที่ 24 ก.ค. 2026
บทความนี้จะพาไปดูว่าเส้นทางที่เรียกว่า chase ทำงานยังไง ทำไมมันถึงถูกนำมา abuse ได้ และ patch ของ Microsoft แก้ตรงไหน
Too Long; don't read. (TL;DR)
- ต้นตอของปัญหา: ในบางเงื่อนไขของการ enroll certificate ตัว CA จะมี fallback ที่เรียกว่า chase คือไปดึงข้อมูล identity จากอีก host หนึ่ง โดยดูจาก request attribute ชื่อ
cdcปัญหาคือ CA เชื่อค่านี้ที่ผู้ร้องขอกำหนดมาเอง โดยไม่ได้พิสูจน์ก่อนว่า host นั้นเป็น DC จริงหรือเปล่า - ผลกระทบ: ผู้โจมตีสามารถชี้ให้ CA ไปคุยกับเครื่องของตัวเอง แล้วป้อนข้อมูล identity ของ DC (
objectSid+dNSHostName) กลับไป ทำให้ได้ certificate ที่ยืนยันตัวตน "เป็น DC" ออกมา จากนั้นก็ทำ DCSync ดึงkrbtgtและยึด domain ได้ - เงื่อนไขที่เจอในการทดสอบ: Enterprise CA บน build ก่อน patch กรกฎาคม 2026, ใช้ template
Machineค่า default, และค่าms-DS-MachineAccountQuotaแบบ default เท่ากับ10ก็เพียงพอแล้ว - วิธีแก้: ลง security update เดือนกรกฎาคม 2026 (CVE-2026-54121)
จบสำหรับคนที่ไม่อยากอ่านยาว.. แต่ถ้าใครอยากเข้าใจว่ามันทำงานยังไงจริง ๆ ตามมาได้เลย
ทำความรู้จัก "chase" fallback
ก่อนจะไปถึงตัวบั๊ก ขอปูพื้นเรื่องนึงก่อน เพราะถ้าไม่เข้าใจตรงนี้ ที่เหลือจะงงหมด
ปกติเวลา enroll certificate มันก็จบในสเต็ปเดียว แต่มีบางเคส พวกที่ enroll ข้าม Domain Controller CA จะไปค้น directory เพิ่มอีกรอบ ตัวที่ทำงานรอบสองนี้แหละที่เรียกว่า chase
chase ถูกคุมด้วย request attribute สองตัว คือ
cdc(Client DC) : บอกว่า CA ควรไปติดต่อ host ไหนrmd(Remote Domain) : บอกว่า CA ควรไปค้นหา principal ตัวไหน
พอสองค่านี้ถูกส่งมา CA ก็เชื่อมไปที่ host ใน cdc ผ่าน SMB กับ LDAP แล้วไปดึง principal ตาม rmd ตรงไปตรงมา ไม่มีอะไรซับซ้อน
คำถามคือ... แล้ว CA รู้ได้ยังไงว่า host ที่เราบอกให้ไปคุยด้วยเนี่ย มันเป็น DC จริง ๆ
ช่องโหว่ CertiGhost
ปัญหาหลักคือ CA ยอมรับ chase target ที่ผู้ร้องขอกำหนดมาเอง โดยไม่ได้พิสูจน์ก่อนว่า host นั้นเป็น Domain Controller ตัวจริงตามที่อ้าง พอเป็นแบบนี้ ผู้โจมตีก็แค่:
- รันบริการ LDAP และ LSA ปลอม บนเครื่องที่ตัวเองคุม
- ชี้ให้ CA วิ่งมาที่เครื่องนั้นผ่าน
cdc - ป้อนข้อมูล identity อะไรก็ได้ที่ต้องการ กลับไปให้ CA สำหรับ principal ที่ระบุใน
rmd
ประเด็นไม่ได้อยู่แค่ที่ "CA วิ่งออกไปข้างนอก" เท่านั้น แต่อยู่ที่ CA เอา response จาก host นั้นมาใช้เป็นข้อมูล directory จริง ๆ ในการสร้าง certificate
ทำไมถึงขยายผลไปยึด Domain ได้
ในเชนที่ถูกทดสอบ ผู้โจมตีสามารถส่งค่า objectSid และ dNSHostName ของ Domain Controller กลับไปให้ CA ค่าทั้งสองนี้จะไปมีอิทธิพลต่อข้อมูล identity ใน certificate ที่ CA ออกให้ รวมถึง strong-mapping SID และฟิลด์ DNS identity ที่ใช้ระหว่างการ authenticate
แล้วทำไมเครื่องปลอมของผู้โจมตีถึงผ่านการตรวจของ CA ได้? คำตอบอยู่ที่ machine account
machine account ที่ถูกสร้างผ่านค่า default ms-DS-MachineAccountQuota ถือเป็น domain principal
ด้วยเหตุนี้ endpoint ปลอมของผู้โจมตี (ที่มี LSA/LDAP service คอย relay authentication challenge ของ CA ไปยัง DC จริง) จึงผ่านการตรวจสอบที่จำเป็น ทำให้ CA เดินหน้าออก certificate ต่อ ทั้งที่มันไม่ใช่ DC ที่กำลังถูกปลอมตัวเลย
ผลลัพธ์คือ CA ออก certificate ที่มี identity เท่ากับ DC เป้าหมายให้เรามาถือครอง
ภาพรวมขั้นตอนการโจมตีทั้งหมด
ผู้โจมตีเตรียม machine account ที่ถูกต้อง + รัน service ปลอม → CA ตาม cdc ไปเชื่อข้อมูลที่ผู้โจมตีป้อน → DC ถูกปลอมตัวผ่าน certificate-based authentication และสิทธิ์ replication
Attack Flow
Lab
ทฤษฎีมาเยอะแล้ว มาลองของจริงบน lab กันดีกว่า
Lab environment
- AD forest ที่ functional level Windows Server 2016 ขึ้นไป (lab นี้ Windows Server 2025 functional level)
- Domain Controller:
CITY-CENTER.NIGHT.CITY10.40.0.5 - Enterprise CA:
NCPD-CAบนARASAKA.NIGHT.CITY10.40.0.67 - ค่า
ms-DS-MachineAccountQuotaเป็นค่า default =10 - template
Machineค่า default พร้อม ACL default - เครื่องผู้โจมตี:
10.40.0.9 - account Domain Users สิทธิ์ต่ำ 1 user:
silver
PoC Exploitation
รัน PoC script จาก repo aniqfakhrul/CVE-2026-54121 โดยที่ใช้ faketime ปรับเวลาให้ โดยดึงเวลาจาก DC (ผ่าน ntpdate) มาตั้งให้ตรงกัน เพื่อกันปัญหา clock skew ของ Kerberos ที่ถ้าเวลาเครื่องเราต่างกับ DC เกินไป ticket จะใช้ไม่ได้
faketime "$(ntpdate -q 10.40.0.5 | cut -d ' ' -f 1,2)" python3 certighost.py -d night.city -u silver -p •••••••• --dc-ip 10.40.0.5
Running the PoC script
ถึงจุดนี้ผู้โจมตีได้รับ certificate ที่ CA sign ให้ (city-center.pfx) ซึ่ง authenticate เป็น DC เป้าหมายได้ พร้อม hash และ Kerberos credential cache ของ account นั้น (city-center.ccache) เรียบร้อย
DCSync
account ของ Domain Controller มีสิทธิ์ directory replication ดังนั้นเมื่อได้ Kerberos credential มาแล้ว ผู้โจมตีก็ขอ secret ของ account ต่าง ๆ ได้
faketime "$(ntpdate -q 10.40.0.5 | cut -d ' ' -f 1,2)" impacket-secretsdump -k -no-pass -dc-ip 10.40.0.5 '@CITY-CENTER.NIGHT.CITY'
DCSync with the cache credential
ล่าร่องรอย จุดที่ใช้ตรวจหาการโจมตี CertiGhost
ถ้าสงสัยว่าองค์กรอาจโดน CertiGhost ไปแล้ว ต่อไปนี้คือจุดที่เข้าไปไล่ดูได้ ย้ำก่อนว่านี่คือไอเดียที่ได้มาจาก public PoC, writeup และพฤติกรรมปกติของ Windows/AD CS ยังไม่ใช่ IoC ที่คอนเฟิร์มแล้ว ให้ใช้เป็นจุดตั้งต้นในการหา ไม่ใช่ checklist สำเร็จรูป
- บน DC ให้ดู Security Event ID
4741(computer account created) โดยเฉพาะ account ที่ถูกสร้างโดย user สิทธิ์ต่ำ และยิ่งน่าสงสัยถ้าเกิดขึ้นไม่นานก่อนจะมี activity แปลก ๆ ที่ฝั่ง CA ตัว PoC ตั้งชื่อ machine account แบบสุ่มโดยขึ้นต้นด้วยGHOSTเช่นGHOSTKFXJXIMA$ซึ่ง match กับ regex:^GHOST[A-Z]{8}\$$
แต่ให้ถือว่าเป็น quick check เท่านั้น เพราะชื่อนี้ผู้โจมตีแก้เองได้ง่าย ๆ และยังสามารถนำ machine account ที่มีอยู่แล้วมา reuse ได้ด้วย การไล่ดูที่ใครเป็นคนสร้างสำคัญกว่าตัวชื่อ
Computer account created in Event Viewer
- ค้นใน
Attributesหา request attribute สองตัวที่ใช้ในการโจมตีนี้คือcdcและrmdใน Issued Certificates เพราะcdcและrmdไม่ใช่ attribute ที่โผล่มาใน enrollment ปกติทั่วไป
Issued Certificates
โดย PoC จะส่งค่า:cdc: <IP ของผู้โจมตี>rmd: <FQDN ของ DC เป้าหมาย>CertificateTemplate: Machine
Issued certificate properties
- หา traffic ที่ CA เชื่อมต่อออกไปยัง TCP
445และ TCP389ของเครื่องที่ ไม่ใช่ Domain Controller ตัวจริง เพราะ PoC จะเปิด rogue SMB/LSA และ LDAP listener รอไว้บน port เหล่านี้ - ถ้า account DC ทำ PKINIT authentication มาจาก address ที่ไม่ใช่ของ DC ตัวนั้น ถือว่าน่าสงสัยอย่างยิ่ง
- Replication / DCSync การ replicate โดย DC เป็นเรื่องปกติอยู่แล้ว ประเด็นที่น่าสนใจคือการที่ identity ของ DC ถูกใช้จากเครื่องที่ไม่ใช่ DC ฉะนั้นต้องเอาไป correlate กับ logon และ network telemetry ประกอบด้วย
วิธีการแก้ไข
- ติดตั้ง patch
ดูรายละเอียดและดาวน์โหลด update ได้ที่ Microsoft Security Update Guide: CVE-2026-54121
- Hot fix (กรณีลง update ทันทีไม่ได้): ปิด chase fallback
เราสามารถปิด code path ที่มีช่องโหว่ทิ้งไปทั้งหมดได้ด้วย policy flag เพราะ chase ที่ใช้cdcเป็นแค่ fallback feature ที่เป็น optional ไม่ใช่โค้ดที่รันทุก request อยู่แล้ว:
certutil -setreg policy\EditFlags -EDITF_ENABLECHASECLIENTDC
Restart-Service CertSvc -Force
ย้ำว่านี่คือ mitigation ไม่ใช่ patch ถ้า EDITF_ENABLECHASECLIENTDC ถูกเปิดกลับมาบน CA ที่ยังไม่ได้ patch ไม่ว่าจะโดย admin หรือจาก group policy ช่องโหว่นี้ก็จะ exploit ได้อีกครั้ง
หมายเหตุ: hot fix นี้ถูกทดสอบเฉพาะใน lab ที่ควบคุมได้เท่านั้น ยังไม่ได้ทดสอบบน production CA จริง ก่อนนำไปใช้จริงควรลองบน staging CA ที่จำลอง environment จริงก่อน และยืนยันให้แน่ใจว่าไม่มี enrollment ปกติตัวไหนที่พึ่ง chase fallback อยู่ เพราะ request เหล่านั้นจะ fail ทันทีเมื่อ flag ถูกเคลียร์ออก สุดท้ายแล้ว July update ยังเป็นวิธีแก้ที่แนะนำอยู่ดี
- Hardening เพิ่มเติม
- ตั้งค่า
ms-DS-MachineAccountQuotaเป็น0เพื่อไม่ให้ user ทั่วไปสร้าง machine account เองได้ ซึ่งเป็นส่วนสำคัญของการโจมตีนี้ - รัดกุม ACL / สิทธิ์ enroll ของ certificate template โดยเฉพาะ template
Machineและ template ที่ใช้ client authentication ได้ - Monitor การ enroll certificate ที่ผิดปกติ และการสร้าง machine account โดย user สิทธิ์ต่ำ
ปิดท้าย
จบไปแล้วสำหรับการชำแหละ CertiGhost ในครั้งนี้ จะเห็นว่า idea หลักของช่องโหว่ตรงไปตรงมามาก "เชื่อ input จากผู้ร้องขอโดยไม่พิสูจน์" แต่พอมันไปอยู่ในตำแหน่งที่ถูกต้อง (identity material ของ certificate) ผลลัพธ์กลับรุนแรงถึงขั้นยึด domain ได้
สิ่งที่อยากฝากไว้คือ ช่องโหว่ที่อันตรายที่สุดหลายตัวไม่ได้มาจากเทคนิคซับซ้อน แต่มาจากการที่ระบบ "เชื่อ" ในจุดที่ควรจะ "ตรวจสอบ" การไล่ดูว่าค่าไหนในระบบที่ผู้ร้องขอกำหนดเองได้ แล้วมันถูกตรวจสอบมากพอหรือยัง จึงเป็นมุมมองที่คุ้มค่ากับการเอาไปปรับใช้กับระบบอื่น ๆ ต่อ
References
- certighost.py PoC https://github.com/aniqfakhrul/CVE-2026-54121
- Certipy (AD CS toolkit) https://github.com/ly4k/Certipy
- Microsoft Security Update Guide: CVE-2026-54121 https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-54121
- MS-WCCE: Windows Client Certificate Enrollment Protocol https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-wcce/
- Original writeup โดย @h0j3n และ @aniqfakhrul
Advertorial
นอกจาก CertiGhost ตัวนี้แล้ว ยังมีช่องโหว่อีกมากมายที่ทำให้ Active Directory และ AD CS ขององค์กรมีความเสี่ยง แล้วจะหาความเสี่ยงเหล่านั้นเจอได้อย่างไร? หนึ่งในวิธีที่ได้ผลคือการทำ VA/Pentest
หากต้องการคำแนะนำเพิ่มเติม ทีมงานของเรายินดีให้คำปรึกษา ติดต่อเราได้เลยครับ
Last reviewed: 16 Sep 2026
คำถามที่พบบ่อย
CertiGhost เป็นช่องโหว่ ESC ตัวใหม่ของ AD CS ใช่ไหม
CertiGhost ไม่ได้จัดอยู่ในกลุ่ม ESC1-ESC16 ที่ toolkit อย่าง Certipy รวบรวมไว้ เพราะ ESC ส่วนใหญ่เกิดจาก template หรือ ACL ที่ admin ตั้งค่าพลาด แต่ CertiGhost เป็น bug ใน logic ของตัว CA เองที่เชื่อ chase target จากผู้ร้องขอโดยไม่พิสูจน์ นั่นแปลว่าต่อให้คุณ hardening template และสิทธิ์ enroll ตามแนวทาง ESC ครบทุกข้อแล้ว CA ที่ยังไม่ patch ก็ยังโดนได้อยู่ดี การแก้จึงต้องพึ่ง security update เป็นหลัก ไม่ใช่แค่ไล่ปิด misconfiguration
ลง patch กรกฎาคม 2026 แล้ว การ enroll แบบข้าม domain ที่ใช้ chase ยังทำงานปกติไหม
patch ไม่ได้ตัด chase ทิ้งทั้งหมดแบบ hot fix แต่เพิ่มการตรวจว่า host ที่ระบุใน cdc เป็น Domain Controller จริงก่อนจะยอมเชื่อข้อมูล identity ที่ส่งกลับมา ดังนั้น enrollment ที่พึ่ง chase อย่างถูกต้องจะยังใช้งานได้ต่อ ต่างจากการเคลียร์ flag EDITF_ENABLECHASECLIENTDC ที่จะทำให้ request ซึ่งใช้ chase fail ทันที ถ้าองค์กรของคุณมี workflow แบบ cross-domain enrollment อยู่ การลง patch จึงกระทบงานปกติน้อยกว่าการปิด fallback ทิ้ง
ตั้ง ms-DS-MachineAccountQuota เป็น 0 แล้วกัน CertiGhost ได้ 100% เลยไหม
การตั้งเป็น 0 ช่วยตัดวิธีที่ง่ายที่สุด คือกันไม่ให้ user สิทธิ์ต่ำสร้าง machine account ใหม่มาทำเป็น domain principal ปลอม แต่มันไม่ได้แก้ที่ตัวช่องโหว่ ผู้โจมตีที่มี machine account อยู่แล้ว หรือคุมเครื่องที่ join domain อยู่ ก็ยัง reuse account เดิมมาเดิน chain นี้ต่อได้ ให้มองว่าเป็น hardening ที่ลด attack surface ไม่ใช่ตัวแทนของ patch
ถ้าสงสัยว่า CA โดน CertiGhost ไปแล้ว ต้องกู้คืนยังไง
เพราะปลายทางของการโจมตีนี้คือ DCSync ที่ดึง krbtgt ออกไป การลง patch ย้อนหลังเพียงอย่างเดียวไม่พอ คุณต้อง reset password ของ account krbtgt สองรอบ โดยเว้นระยะให้ replication เสร็จก่อนรอบที่สอง เพื่อ invalidate golden ticket ที่อาจถูกสร้างไว้แล้ว จากนั้นควร revoke certificate ที่ CA ออกให้อย่างน่าสงสัย และ reset credential ของ account สิทธิ์สูงที่อาจรั่วไปตอน dump secret ด้วย
certificate ที่ CA เผลอออกให้ผู้โจมตีไปแล้ว revoke ทีหลังให้หมดฤทธิ์ได้ไหม
revoke ได้และควรทำ แต่ต้องเข้าใจว่า revocation จะได้ผลก็ต่อเมื่อปลายทางเช็ค CRL หรือ OCSP จริง ซึ่งบางเส้นทางของ PKINIT ไม่ได้เช็คเสมอไป ที่สำคัญกว่านั้นคือถ้าผู้โจมตีทำ DCSync ดึง credential ออกไปได้แล้ว ตัว credential เหล่านั้นจะยังใช้งานได้ต่อแม้ certificate จะถูก revoke ไปแล้ว การ revoke จึงเป็นแค่ส่วนหนึ่งของการกู้คืน ต้องทำควบคู่กับการ reset credential เสมอ
CertiGhost โจมตีจากภายนอกโดยไม่มี account ในระบบได้เลยไหม
ไม่ได้ ผู้โจมตีต้องถือ credential ของ domain user สิทธิ์ต่ำอย่างน้อยหนึ่ง account อยู่ในมือก่อน จึงจะเริ่ม chain นี้ได้ ช่องโหว่นี้จึงเป็นเครื่องมือสำหรับ privilege escalation และ lateral movement หลังผู้โจมตีตั้งหลักใน network ได้แล้ว ไม่ใช่ initial access จากอินเทอร์เน็ตโดยตรง สิ่งที่ทำให้มันอันตรายคือระยะจาก user ธรรมดาไปถึงระดับ domain admin นั้นสั้นมาก
OUR SERVICES
PENETRATION TEST
With our high-ethical, professional certified team and methodology based on NIST SP800-115, we offer a full range of cost-effective services to identify your cyber risks in application, infrastructure, and mobile platforms to meet the requirements of your organisation.
Up Next

ARTICLES/10 Aug 2026
Kerberos Delegation Attacks Part 1: Unconstrained Delegation
Kerberos Delegation ถูกสร้างมาเพื่อรองรับ multi-tier application แต่ trust relationship ที่ทรงพลังของมันก็เปิดช่องให้ attacker ปลอมเป็นผู้ใช้และทำ lateral movement ได้ถ้าตั้งค่าผิด

ARTICLES/23 Jul 2025
NTLM Authentication กำลังจะกลายเป็นอดีตจริงหรือ ?
Microsoft ออกมาประกาศว่า NTLM จะถูก deprecated อย่างเป็นทางการใน Windows 11 24H2 และ Windows Server 2025

ARTICLES/27 Aug 2021
Pave the way to Domain Admins with BloodHound
ก่อนมี BloodHound การไล่หาเส้นทางสู่ Domain Admins กินเวลามาก บทความแสดงว่าเครื่องมือนี้ย่นขั้นตอนให้ pentester ได้อย่างไร

