
Emula puertos abiertos y firmas de servicios en los 65535 puertos TCP para ralentizar el reconocimiento, confundir a los escáneres y malgastar los recursos del atacante con servicios falsos convincentes y tarpitting.
Portspoof emula puertos abiertos y firmas de servicios en los 65535 puertos TCP, convirtiendo la fase de reconocimiento de un escaneo rápido en un proceso largo e intensivo en recursos. Los escáneres ven miles de servicios falsos pero convincentes, lo que hace poco práctico identificar la superficie de ataque real.
El objetivo principal de Portspoof es hacer que el reconocimiento sea lento, costoso y poco fiable para los atacantes. En lugar de un escaneo Nmap estándar de 5 segundos que mapea cada servicio real en un sistema, un atacante que se enfrenta a Portspoof ve 65535 puertos abiertos, cada uno ejecutando lo que parece un servicio legítimo diferente. No hay una forma rápida de saber cuáles son reales.
SYN+ACK para cada intento de conexión.nmap -sV -p-) va mucho más allá de los límites prácticos.Ejemplo de escaneo Nmap:
$ nmap -p 1-20 target
Starting Nmap 7.80 ( https://nmap.org )
Nmap scan report for target
Host is up (0.00016s latency).
PORT STATE SERVICE
1/tcp open tcpmux
2/tcp open compressnet
3/tcp open compressnet
4/tcp open unknown
5/tcp open rje
6/tcp open unknown
7/tcp open echo
8/tcp open unknown
9/tcp open discard
10/tcp open unknown
11/tcp open systat
12/tcp open unknown
13/tcp open daytime
14/tcp open unknown
15/tcp open netstat
16/tcp open unknown
17/tcp open qotd
18/tcp open unknown
19/tcp open chargen
20/tcp open ftp-data
Portspoof responde a las sondas de servicios con firmas válidas generadas dinámicamente basadas en una enorme base de datos de expresiones regulares. Como resultado, un atacante no podrá determinar qué números de puerto está utilizando realmente su sistema.
Ejemplo de escaneo de versión (puertos 1–100):
$ nmap -sV -p 1-100 target
Nmap scan report for target
Host is up (0.00016s latency).
PORT STATE SERVICE VERSION
1/tcp open tcpmux?
2/tcp open irc ircu ircd
3/tcp open tcpwrapped
5/tcp open http Polycom CMA Global Address Book (GAB) httpd
10/tcp open http PGP Universal httpd
11/tcp open http SnapStream Media Beyond TV PVR http config
12/tcp open pop3 Novell GroupWise pop3d
13/tcp open http micro_httpd
15/tcp open ssh OpenSSH r (protocol 8; NCSA GSSAPI authentication patch)
16/tcp open ftp QMS/Minolta Magicolor 2200 DeskLaser printer ftpd
17/tcp open smtp Network Box smtpd
21/tcp open ftp?
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
23/tcp open tcpwrapped
25/tcp open smtp?
27/tcp open http BMC/Marimba Management http config
37/tcp open http Indy httpd qlRKjiF
39/tcp open pop3
41/tcp open ftp VSE ftpd WhH
43/tcp open imap Scalix imapd 6
46/tcp open telnet AXIS webcam telnetd 96747 (Linux)
49/tcp open smtp Openwave Email Mx smtpd
50/tcp open http 3Ware web interface 3v (RAID storage)
51/tcp open ftp WebStar 4dftp ...
53/tcp open tcpwrapped
55/tcp open webdav Tonido WebDAV
56/tcp open tor-control Tor control port (Authentication required)
59/tcp open irc ircu ircd
60/tcp open rtsp GStreamer rtspd
64/tcp open http BaseHTTPServer CAxoE (Mercurial hg serve; Python LDkW)
66/tcp open telnet Slirp PPP/SLIP-on-terminal emulator telnetd
70/tcp open smtp qpsmtpd
71/tcp open smtp Microsoft Exchange smtpd
73/tcp open http Avaya IP Office VoIP PBX httpd
77/tcp open smtp Zeus SMTPS smtpd
79/tcp open ftp Sambar ftpd
80/tcp open tcpwrapped
81/tcp open imap-proxy nginx imap proxy
82/tcp open ssh (protocol 811)
83/tcp open http peercast.org
88/tcp open csta Alcatel OmniPCX Enterprise
90/tcp open http WASD httpd
91/tcp open http Fortinet FortiGate 50B firewall http config
93/tcp open imap ModusMail imapd 4
98/tcp open ssh Sysax Multi Server sshd 7 (protocol 940)
99/tcp open http 2Wire HomePortal http config 5473
100/tcp open newacct?
Combinadas, estas técnicas significan:
nmap -sV -p-) con la configuración predeterminada de tarpit tarda más de 10 horas y genera cientos de megabytes de datos falsos.Los servicios reales (SSH, SMTP, FTP, HTTP) envían un banner y mantienen la conexión abierta, esperando la entrada del cliente. Una emulación convincente significa hacer lo mismo: aceptar, enviar, esperar. Pero un modelo de un hilo por cliente consume memoria y CPU en cambios de contexto, y a escala el defensor se queda sin recursos antes de que el atacante se quede sin paciencia. La herramienta de engaño se convierte en un vector de auto-DOS.
El enfoque: un bucle de eventos epoll de un solo hilo. A cada puerto se le asigna un modo de entrega al inicio: algunos envían un banner inmediatamente, otros esperan a que el cliente envíe datos antes de responder, y algunos permanecen en silencio. Los tiempos de espera se distribuyen en órdenes de magnitud (decenas de milisegundos a minutos) con fluctuación por conexión, por lo que las sondas repetidas al mismo puerto no devuelven tiempos idénticos.
Esto es importante porque sin ello, un atacante puede enviar basura a cada puerto y medir el tiempo de respuesta: los servicios reales se cierran rápido (protocolo incorrecto), mientras que un tarpit ingenuo espera durante segundos. Con modos mixtos y una amplia distribución de tiempos, miles de puertos falsos también se cierran en el mismo rango que los servicios reales. No hay un umbral limpio para filtrar.
La economía funciona debido a la asimetría:
Los modos de entrega por puerto son fijos durante la vida del proceso pero impredecibles entre reinicios. Los tiempos de espera tienen un componente aleatorio por conexión, por lo que las sondas repetidas muestran una variación natural, similar a los servicios reales bajo carga.
v2.0 reemplaza el comportamiento original de banner-y-cierre que era vulnerable a una evasión por cierre de conexión (ver la publicación del blog de Vicarius/Hored1971). El motor de tarpit mantiene todas las conexiones abiertas con tiempos mixtos, derrotando el filtrado por cierre de conexión, la huella digital temporal, el análisis de banners y el modelado estadístico de patrones.
Asegúrate de tener instalado un compilador C++ y CMake (3.10+).
mkdir build && cd build
cmake -DCMAKE_INSTALL_SYSCONFDIR=/etc ..
make
sudo make install
Portspoof se ejecuta en espacio de usuario pero depende de las reglas del cortafuegos del sistema para interceptar el tráfico destinado a otros puertos.
Redirigir todo el tráfico TCP entrante (puertos 1-65535) al puerto de Portspoof (por defecto 4444).
Linux (iptables):
# Excluir servicios reales primero, luego redirigir el resto a Portspoof
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j RETURN
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -j REDIRECT --to-ports 4444
Nota: Reemplaza eth0 con tu interfaz de red. Añade una regla RETURN para cada puerto que ejecute un servicio real.
Para hacer esto persistente, puedes guardar tus reglas de iptables o usar el iptables-config proporcionado en el directorio system_files.
Puedes añadir Portspoof a tus scripts de inicio usando los ejemplos en system_files/init.d/.
Este modo genera y alimenta a los escáneres de puertos con firmas de servicios falsas.
portspoof -c /etc/portspoof.conf -s /etc/portspoof_signatures -D
Con tiempos de tarpit personalizados (mantener cada conexión entre 10 y 60 segundos):
portspoof -s /etc/portspoof_signatures -t 10 -T 60 -D
Este modo simplemente devuelve un estado ABIERTO para cada intento de conexión sin enviar banners de servicio. Las conexiones aún se mantienen en tarpit.
portspoof -D
Portspoof puede usarse para fuzzear herramientas de escaneo enviando cargas útiles aleatorias o basadas en listas de palabras.
Fuzz con generador interno:
# Genera cargas útiles aleatorias de tamaño aleatorio
portspoof -1 -v
Fuzz con una lista de palabras:
portspoof -f payloads.txt -v
La regla REDIRECT básica anterior funciona, pero un escáner agresivo aún puede intentar abrumar a Portspoof con conexiones. El siguiente conjunto de reglas añade limitación de velocidad y bloqueo automático para hosts que exceden el umbral de conexión. Los puertos que alojan servicios reales (SSH en este ejemplo) se excluyen de la redirección pero aún están protegidos por la regla de bloqueo global.
# --- NAT: redirigir todo excepto servicios reales ---
# añadir una regla RETURN para cada puerto que uses realmente (SSH, HTTP, etc.)
iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-ports 4444
# --- FILTER: defensa en profundidad ---
# permitir loopback (crítico: evita romper servicios locales)
iptables -A INPUT -i lo -j ACCEPT
# si esta IP fue marcada como abusiva, descartar todo (silencioso, sin RST)
iptables -A INPUT -m recent --name PORTSCAN --rcheck --seconds 60 -j DROP
# limitar velocidad de nuevos SYNs por IP origen
iptables -A INPUT -p tcp --syn -m hashlimit \
--hashlimit-above 10/sec --hashlimit-burst 30 \
--hashlimit-mode srcip --hashlimit-name syn_throttle -j DROP
# si una sola IP mantiene 100+ conexiones a portspoof, marcar y descartar
iptables -A INPUT -p tcp --syn --dport 4444 -m connlimit \
--connlimit-above 100 --connlimit-mask 32 \
-m recent --name PORTSCAN --set -j DROP
# permitir tráfico establecido y nuevas conexiones
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --syn -j ACCEPT
iptables -A INPUT -j DROP
Para despliegues de alto tráfico, aumenta el tamaño de la lista xt_recent:
echo "options xt_recent ip_list_tot=10000" > /etc/modprobe.d/xt_recent.conf
Y ajusta el seguimiento de conexiones del núcleo:
sysctl -w net.netfilter.nf_conntrack_max=131072
sysctl -w net.core.somaxconn=4096
Portspoof Pro escala el engaño de un solo host a toda una red. Un solo sensor emula redes /16 completas: miles de IPs, cada una con servicios únicos en todos los puertos, manteniendo conversaciones de múltiples pasos con estado.
Autor: Piotr Duszyński (@drk1wi)
Licencia: GNU General Public License v2.0 (GPLv2). Consulta el archivo LICENSE para más detalles.
Para aplicaciones comerciales y legítimas, contacta al autor para los acuerdos de licencia adecuados.
Si encuentras algún error o tienes solicitudes de características, por favor repórtalos en el Rastreador de Incidencias de GitHub o contacta al autor por correo electrónico a piotr [at] duszynski.eu.