
CVE-2026-54121 (Certighost) AD CS DC-impersonation PoC. Patched SAN handling + MAQ-safe account reuse.
CVE-2026-54121에 대한 개념 증명 도구의 작동하는 포크이며, _Certighost_라고도 합니다. 원본 연구 및 PoC는 @H0j3n 과 @aniqfakhrul 이 수행했으며, 자세한 분석은 다음에서 확인할 수 있습니다:
이 포크는 요청된 SAN을 존중하는 CA에서 PKINIT가 성공하지 못하게 하던 SAN 처리를 수정하고, --target-san 파싱을 강화하며, 컴퓨터 계정 처리를 재구성하여 ms-DS-MachineAccountQuota를 더 이상 소진하지 않도록 합니다.
루트로 실행하세요. rogue LDAP 및 SMB 서비스는 권한 있는 포트 389와 445를 필요로 합니다.
sudo python3 certighost.py -d playground.local -u lowpriv -p 'Password1234' --dc-ip 192.168.1.10
성공적으로 완료되면 대상 인증서(.pfx)와 Kerberos 캐시(.ccache)가 현재 작업 디렉토리에 기록됩니다.
CERTIGHOST$, 첫 실행 시 생성됨)을 재사용하거나 --computer-name을 통해 지정된 계정을 사용합니다.cdc 속성(--listener를 통해, 생략 시 자동 감지)과 대상 DC의 DNS 이름을 포함한 rmd 속성을 포함합니다..ccache와 NT 해시를 요청합니다.원본은 인증서 SAN을 CSR subjectAltName 확장과 SAN:dns= 요청 속성 모두 rogue 컴퓨터의 호스트 이름으로 구성했으며, 대상 DC의 FQDN 대신 사용했습니다. 요청된 SAN을 존중하는 CA에서는 발급된 인증서가 rogue 계정의 dNSHostName을 가지게 되어 PKINIT이 잘못된 주체로 매핑되어 다음 오류와 함께 실패했습니다:
KDC_ERR_CLIENT_NAME_MISMATCH(Reserved for PKINIT)
이제 SAN은 대상 DC의 dNSHostName(rmd_value / target_dns)을 사용하며, 이는 PKINIT이 머신 계정을 매핑하는 값입니다. 발급된 인증서는 이제 DNS:<dc>.<domain>을 제시하고 AS-REQ가 DC로 마무리됩니다.
--target-san--target-san은 이제 MEEREEN, MEEREEN$, 또는 FQDN meereen.essos.local ( sAMAccountName 또는 dNSHostName으로 매칭됨) 중 하나를 허용하며, 더 이상 짧은 NAME 형식만 허용하지 않습니다.
원본은 실행할 때마다 새로운 무작위 GHOST********$ 계정을 생성했습니다. ms-DS-MachineAccountQuota를 통해 생성된 컴퓨터 계정은 도메인 관리자가 소유하므로(생성자가 아님), 낮은 권한의 사용자는 삭제할 수 없습니다. 따라서 반복 실행 시 고아 계정으로 인해 할당량(기본 10개)이 빠르게 소진되었습니다.
이 포크는 단일 안정적인 계정(CERTIGHOST$, 존재하지 않을 때만 생성됨)을 재사용하므로 할당량이 증가하지 않으며 실행 간에 정리할 것이 없습니다.
계정이 처음 생성될 때 스크립트는 AD에 남아 있음을 알리는 경고를 출력합니다:
[!] WARNING: computer account CERTIGHOST$ was created and is left in AD.
계정은 후속 실행에서 재사용을 위해 남아 있습니다. 완전히 제거하려면 도메인 관리자(개체 소유자)가 삭제해야 합니다:
Get-ADComputer CERTIGHOST | Remove-ADComputer -Confirm:$false
impacketcryptography, pyasn1, asn1crypto, pycryptodomex공인된 보안 테스트 및 교육 목적으로만 사용하십시오. 테스트할 명시적 권한이 있는 시스템에 대해서만 사용하십시오.