Nmap Timing and Evasion
Definición
El Nmap timing and evasion es el uso de las primitivas de tasa, reintento, paralelismo y forma de paquete de Nmap para (a) reducir resultados filtered falsos contra redes con rate limiting o (b) testear qué capturará y qué no un IDS/IPS, WAF o firewall stateful.
Por qué importa
El comportamiento por defecto de Nmap optimiza para precisión en una LAN tranquila. Los objetivos de internet en producción están detrás de rate limiters, middleboxes que dropean paquetes y thresholds por IP fuente — los valores por defecto producen resultados incorrectos ahí, no solo lentos. El uso senior maneja los dials de timing individuales explícitamente para que el output del scan sea repetible, comparable entre corridas y defendible en un reporte.
Las primitivas de evasión importan menos para esconderse (la inspección stateful moderna las neutraliza en su mayoría) y más como toolkit de diagnóstico: cada primitiva aísla una capa de inspección, así que una matriz de probes te dice exactamente qué control te capturó.
Cómo funciona
El timing de Nmap es 5 dials vestidos como una plantilla:
- Timeout por probe (
--min-rtt-timeout,--max-rtt-timeout,--initial-rtt-timeout) — cuánto esperar antes de declarar un probe perdido. - Conteo de reintentos (
--max-retries) — cuántas veces reenviar un probe perdido antes de llamar el puertofiltered. - Concurrencia (
--min-parallelism,--max-parallelism) — cuántos probes en vuelo mantiene Nmap. - Tasa (
--min-rate,--max-rate) — piso/techo de paquetes-por-segundo, el dial más predecible. - Espaciado (
--scan-delay,--max-scan-delay) — brecha determinística entre probes para derrotar los detectores de rate limiting.
Las plantillas -T0 a -T5 son combinaciones preestablecidas de esos 5 dials:
-T0 paranoid 5 min between probes IDS evasion theatre
-T1 sneaky 15 s between probes IDS evasion theatre
-T2 polite 0.4 s spacing, low rate shared-network considerate
-T3 normal Nmap default LAN baseline
-T4 aggressive fast, max-retries 6 what most tutorials use
-T5 insane very fast, max-retries 2 accuracy starts dropping
El error en la mayoría de los engagements no es "el scan fue demasiado lento"; es "el scan fue rate-limited por un control upstream y Nmap silenciosamente reetiquetó puertos open como filtered."
Técnicas / patrones
- Anclar
--min-rateen lugar de-Tpara corridas reproducibles (ej.--min-rate 100 --max-rate 300). - Detectar rate limiting con dos corridas a diferentes tasas: si el conteo de
filteredsube bruscamente a tasas más altas, hay un rate limiter en el camino, no un firewall que bloquea el puerto directamente. - Usar
--scan-delaycuando un IDS se activa en N probes dentro de W segundos — el espaciado determinístico bajo el threshold supera el timing aleatorio. - Usar
--max-retries 1para descubrimiento rápido en primera pasada, luego reescanear solo puertosopenyopen|filteredcon--max-retries 6y-Pn. - Source-port spoofing (
--source-port 53,--source-port 88) — muchas ACLs de firewall viejas confían en tráfico desde el puerto 53/88 para permitir retornos DNS/Kerberos. Todavía funciona en ACLs de perímetro mal configuradas en 2026. --badsum— detección de IDS: los OS reales dropean paquetes con checksum inválido, los motores IDS que no validan el checksum responden de todas formas y se delatan.--data-length N— varía el tamaño del payload del probe, derrotando reglas de firma que coinciden en longitud exacta.
Variantes y bypasses
El uso senior se agrupa en 4 modos.
1. Preciso contra rate limiters
Objetivo: obtener el estado open verdadero en un objetivo hardened. nmap -Pn -sS --min-rate 200 --max-rate 500 --max-retries 3 -p- target. Dials anclados, no manejados por plantilla.
2. Matriz de forma de paquete diagnóstica
Objetivo: descubrir qué capa de inspección capturó el scan. Correr la misma lista de puertos con -f, --mtu 16, --data-length 200, --badsum, --source-port 53 y -D RND:10 por separado. Cualquier variante que devuelve open revela qué inspecciona y qué no el middlebox.
3. Stealth desde logs (idle scan)
nmap -sI zombie:port target — la IP del scanner nunca aparece en los logs del objetivo. Requiere un host "zombie" con IPID globalmente incremental. La mayoría de OS modernos randomiza IPID; esta es ahora una técnica de nicho para entornos legacy.
4. Engaños de source-port y TTL
--source-port 53 y --ttl N explotan ACLs stateless que confían en source-port igual a 53 o TTL igual al hop-count esperado. Ambos son patrones legacy, ambos todavía aparecen en appliances viejos.
Impacto
- Falsos negativos al usar
-T4por defecto contra objetivos con rate limiting, perdiendo exposición real. - Detección del engagement — un scan
-T5activa la mayoría de IDS/WAFs modernos en segundos. - Blowback de scope —
-Dcon decoys aleatorios puede incluir IPs de terceros en scope como fuentes falsas, lo que algunos pipelines IDS escalan a quejas de abuso. - Interrupción de servicio —
-T5 --min-rate 50000contra un dispositivo embebido o servicio de bajo rendimiento puede colgarlo.
Detección y defensa
- Inspección stateful más rate limiting por IP fuente.
La combinación derrota casi todos los trucos de stealth y timing de Nmap a la vez. - Reglas IDS atadas a combinaciones de flags TCP.
-sN,-sF,-sX,-sMenvían combinaciones de flags inválidas. Los rule sets por defecto de Snort/Suricata/Zeek las capturan de manera confiable. - Detección de anomalías basada en distribución de la distribución de probes.
La entropía por IP fuente en destino-puerto × tiempo derrota la evasión por--scan-delayporque el fingerprint (una fuente tocando muchos puertos, aunque sea despacio) todavía es anómalo. - Honeyports / tarpits.
Unos pocos puertos monitoreados que nunca deberían ver tráfico convierten cualquier scan externo en una alerta de alta confianza sin falsos positivos.
Qué no funciona como defensa primaria
- Esconder el perímetro ("no estamos listados en DNS") — Masscan/Shodan igual te ven.
- Supresión de banners como control primario — reduce ruido en el output NSE, no explotabilidad.
- Bloquear
-Pndropeando ICMP echo — Nmap usa probes TCP cuando el ICMP está filtrado; no bloqueaste el descubrimiento, solo lo hiciste más lento.
Labs prácticos
# Lab 1 — reveal rate limiting on an authorized target.
nmap -Pn -sS -p 1-1000 --min-rate 50 --max-rate 100 -oN slow.txt LAB
nmap -Pn -sS -p 1-1000 --min-rate 5000 --max-rate 5000 -oN fast.txt LAB
diff <(grep '^[0-9]' slow.txt) <(grep '^[0-9]' fast.txt)
# What ports moved from open -> filtered between runs is the rate-limit signature.
# Lab 2 — packet-shape diagnostic matrix on one open port.
PORT=443
for FLAG in "" "-f" "--mtu 16" "--data-length 200" "--badsum" "--source-port 53"; do
echo "===== $FLAG"
nmap -Pn -sS -p $PORT $FLAG LAB
done
# Whichever invocation still reports open tells you what the inspection device skipped.
# Lab 3 — confirm an IDS validates checksums.
nmap -Pn --badsum -p 80,443 LAB
# Real targets answer with nothing (OS drops invalid checksum). If you get RST/ACK,
# something on path is replying without validating the TCP checksum — an inline IDS.
# Lab 4 — idle scan against an authorized lab zombie.
sudo nmap -sn -PR LAB_NET # find candidate zombies
sudo nmap -sI ZOMBIE:80 -p 22,80,443,3389 TARGET # only works if ZOMBIE has incrementing IPID
# Verify with: nmap -O ZOMBIE -> look for "IP ID Sequence Generation: Incremental".
# Lab 5 — `--scan-delay` to evade per-source connection-rate IDS.
sudo nmap -Pn -sS -p 22,80,443,3389 --scan-delay 2s --max-retries 1 LAB
# Compare alert count in IDS console with and without --scan-delay 2s.
Ejemplos prácticos
- Engagement externo contra app con CDN frontal.
-T4por defecto devuelve todos los puertosfiltered; anclar--min-rate 50 --max-rate 100revela puertos abiertos reales detrás del rate limit por IP del CDN. - Rescan de assets en bug bounty.
nmap -Pn -sS --min-rate 200 -p- ASN-IP-LISTtrimestral con flags de timing fijos permite diff de exposición entre trimestres sin ruido de timing. - Paridad lab vs producción. Los mismos flags de scan contra staging y producción revelan que el WAF de staging está configurado diferente al de prod — un hallazgo real recurrente.
- Detección de un IDS transparente. Un probe
--badsuma un puerto cerrado conocido que devuelve RST/ACK es un indicador limpio de inspección inline que no valida checksums.
Notas relacionadas
- Nmap Scanning
- Puertos y Servicios
- Firewalls y Límites de Red
- Descubrimiento de Hosts y Puertos
- Active Recon
- Cloaking and Security Evasion
- Detección de Anomalías de Scan y Análisis de Fingerprint
- Packet Fragmentation and Decoy Scans
- Masscan Internet-Scale Scanning
- RustScan and NSE Pipeline
Referencias
- Docs Oficiales: Nmap Reference Guide — Timing and Performance — https://nmap.org/book/man-performance.html
- Docs Oficiales: Nmap Reference Guide — Firewall/IDS Evasion and Spoofing — https://nmap.org/book/man-bypass-firewalls-ids.html
- Investigación / Deep Dive: ProjectDiscovery Reconnaissance 103 — https://projectdiscovery.io/blog/reconnaissance-series-3-host-and-port-discovery