Pass-the-Certificate
Pass-the-Certificate uses a valid X.509 certificate to authenticate via Kerberos PKINIT, retrieving a TGT without a password or NT hash. This works even when NTLM authentication is disabled domain-wide. Certificates survive password changes, making them useful for both lateral movement and persistence.
Common certificate sources:
ADCS exploitation (ESC1, ESC4, ESC6): request certificate as any UPN via a vulnerable template
Shadow Credentials: write to msDS-KeyCredentialLink → authenticate via PKINIT
Stolen CA key: forge a certificate for any account
Own enrollment: request a certificate for your own account, use after password rotation
Authenticate via PKINIT: get TGT or NT hash
Certipy auth takes a .pfx certificate and authenticates via PKINIT. It returns both a ccache TGT and the account's NT hash via UnPAC-the-Hash. Rubeus does the same from Windows.
[*] Using principal: [email protected] [*] Trying to get TGT... [*] Got TGT [*] Saved credential cache to 'administrator.ccache' [*] Trying to retrieve NT hash for 'administrator' [*] Got hash for '[email protected]': aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889
[*] Action: Ask TGT
[*] Using PKINIT with etype aes256_cts_hmac_sha1
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIFqDCCBaSgAwIBBaEDAgEWo...
[*] Getting credentials using U2U
[0] NTLM: fc525c9683e8fe067095ba2ddc971889
Lateral movement with the obtained TGT
Once you have a TGT or NT hash, reach other hosts. The TGT is valid for 10 hours by default; the NT hash is usable indefinitely while the certificate remains valid.
NTLM-restricted environments
When NTLM is blocked via GPO (Network security: Restrict NTLM), Pass-the-Hash fails and Pass-the-Ticket with Kerberos is the only path. If you have a certificate for a privileged account, PKINIT works regardless of NTLM restrictions because it authenticates directly with the DC over Kerberos port 88.
Test whether NTLM is restricted:
References
-
Certipy (GitHub)github.com/ly4k/Certipy (opens in new tab)
auth subcommand for PKINIT authentication and UnPAC-the-Hash
-
Rubeus (GitHub)github.com/GhostPack/Rubeus (opens in new tab)
asktgt /certificate /getcredentials /ptt for Windows-side PKINIT and TGT injection
-
Impacket (GitHub)github.com/fortra/impacket (opens in new tab)
psexec, wmiexec, smbclient, secretsdump with -k -no-pass for Kerberos-only lateral movement
Was this helpful?
Your feedback helps improve this page.