
CVE-2026-54121 (Certighost) PoC de impersonação de DC do AD CS. Tratamento de SAN corrigido + reutilização de conta segura para MAQ.
Um fork funcional da ferramenta de prova de conceito para CVE-2026-54121, também conhecida como Certighost. Pesquisa original e PoC por @H0j3n e @aniqfakhrul; análise detalhada em:
Este fork corrige o tratamento de SAN que impedia o PKINIT de obter sucesso em CAs que respeitam a SAN solicitada, torna o parsing de --target-san mais robusto e reformula o tratamento da conta de computador para que não esgote mais a cota ms-DS-MachineAccountQuota.
Execute como root porque os serviços LDAP e SMB falsos exigem as portas privilegiadas 389 e 445.
sudo python3 certighost.py -d playground.local -u lowpriv -p 'Password1234' --dc-ip 192.168.1.10
Após a conclusão bem-sucedida, o certificado alvo (.pfx) e o cache Kerberos (.ccache) são gravados no diretório de trabalho atual.
CERTIGHOST$, criada na primeira execução) ou usa uma especificada via --computer-name.cdc personalizado apontando para um IP controlado (via --listener; opcional, auto-detectado se omitido) além de um atributo rmd contendo o nome DNS do DC alvo..ccache e o hash NT.O original construía a SAN do certificado tanto a extensão subjectAltName do CSR quanto o atributo de solicitação SAN:dns= a partir do hostname do computador falso em vez do FQDN do DC alvo. Em uma CA que respeita a SAN solicitada, o certificado emitido portanto carregava o dNSHostName da conta falsa, então o PKINIT o mapeava para o principal errado e falhava com:
KDC_ERR_CLIENT_NAME_MISMATCH(Reserved for PKINIT)
A SAN agora usa o dNSHostName do DC alvo (rmd_value / target_dns), que é o que o PKINIT mapeia para uma conta de máquina. O certificado emitido agora apresenta DNS:<dc>.<domain> e o AS-REQ é concluído como o DC.
--target-san robusto--target-san agora aceita qualquer uma das formas MEEREEN, MEEREEN$ ou o FQDN meereen.essos.local (correspondido por sAMAccountName ou dNSHostName), em vez de apenas a forma curta NAME.
O original criava uma nova conta aleatória GHOST********$ a cada execução. Como as contas de computador criadas via ms-DS-MachineAccountQuota são de propriedade dos Administradores de Domínio (não do criador), um usuário com privilégios baixos não pode excluí-las, então execuções repetidas rapidamente esgotavam a cota (padrão 10) com contas órfãs.
Este fork reutiliza uma única conta estável (CERTIGHOST$, criada somente se ainda não existir), então a cota nunca cresce e não há nada para limpar entre execuções.
Quando a conta é criada pela primeira vez, o script exibe um aviso informando que ela fica no AD:
[!] WARNING: computer account CERTIGHOST$ was created and is left in AD.
A conta permanece para reutilização em execuções futuras. Para removê-la completamente, exclua-a com um Administrador de Domínio (o proprietário do objeto):
Get-ADComputer CERTIGHOST | Remove-ADComputer -Confirm:$false
impacketcryptography, pyasn1, asn1crypto, pycryptodomexApenas para testes de segurança autorizados e fins educacionais. Use-o somente contra sistemas em que você tenha permissão explícita para testar.