Ir al contenido

Nmap

Última actualización

Nmap transforma packets y respuestas en hipótesis sobre hosts, puertos, servicios y filtros. La parte importante no es memorizar flags, sino saber qué probe ha enviado, qué respuesta esperaba y qué incertidumbre conserva el estado resultante. Esa lógica permite cambiar el scan cuando la red no se comporta como el ejemplo de un laboratorio.

Nmap cubre varias tareas relacionadas, pero distintas:

  1. validar y expandir una especificación de objetivos
  2. buscar hosts que respondan a probes de discovery
  3. clasificar puertos TCP, UDP y otros protocolos
  4. identificar servicios y estimar el sistema operativo
  5. ejecutar interacciones adicionales mediante Nmap Scripting Engine (NSE)
  6. guardar resultados que puedan revisarse y compararse

El resultado no es una lista de vulnerabilidades. Una versión, una CPE o el output de un script pueden iniciar una investigación, pero la validación de vulnerabilidades requiere comprobar componente, configuración, reachability, prerrequisitos e impacto.

Nmap tampoco sustituye la enumeración del servicio. Descubrir 445/tcp open microsoft-ds indica dónde continuar. Entender dialectos SMB, signing, shares y permisos exige hablar SMB.

La página sigue el mismo orden que un scan real. Cada bloque añade una capacidad después de explicar la anterior:

  1. validar cómo interpreta Nmap los targets
  2. descubrir qué direcciones responden
  3. elegir puertos y comprender los estados
  4. cubrir TCP y UDP
  5. identificar servicios y estimar el OS
  6. ejecutar scripts específicos
  7. guardar y comparar resultados
  8. ajustar timing, filtros, origen y forma de los packets

El proceso vuelve atrás cuando aparece una discrepancia. Si version detection contradice el port scan, se aísla ese puerto. Si un host deja de responder, se compara origen, ruta, timing y probe antes de ampliar el scan.

La sintaxis general es:

Ventana de terminal
nmap [SCAN_TYPE] [OPTIONS] TARGET_SPEC

TARGET_SPEC puede ser una IP, un hostname, varias direcciones, un rango o una red CIDR. Los ejemplos reutilizan varias convenciones:

  • sudo aporta los privilegios necesarios para construir raw packets en Unix
  • -n desactiva reverse DNS y evita consultas que no forman parte de la pregunta
  • --reason muestra qué respuesta sustenta un estado
  • -oA BASENAME guarda los formatos normal, XML y grepable con el mismo basename
  • TARGET_IP, TARGET_CIDR, PORT_LIST y los nombres de archivo son placeholders

Para cargar targets desde un archivo se usa -iL FILE. -sL muestra cómo los ha interpretado Nmap sin ejecutar host discovery ni port scanning. Antes de enviar probes, comprueba que esa expansión coincide con el scope:

Revisar la lista de objetivos sin hacer port scanning
nmap -sL -n -iL scope/targets.txt

El output debe contener exactamente las direcciones esperadas. Esta comprobación no corrige una lista equivocada. Hay que compararla con el scope y las exclusiones.

Usa --exclude TARGET_SPEC o --excludefile FILE cuando el scope contenga excepciones. Si necesitas reverse DNS mediante resolvers concretos, la opción correcta es --dns-servers SERVER_LIST, en plural. Esta opción controla la resolución que hace Nmap. No obliga a una aplicación del objetivo a usar esos servidores.

Las técnicas basadas en raw packets requieren privilegios adecuados. En Unix, un usuario privilegiado puede ejecutar el SYN scan -sS. Sin esos privilegios, Nmap usa normalmente TCP connect -sT. El cambio modifica el tráfico y la posibilidad de que el servicio registre una conexión completa.

Antes del primer scan registra también la interfaz de salida y la ruta. nmap --iflist muestra interfaces y rutas conocidas por Nmap. Si el objetivo se alcanza mediante VPN o pivoting, una dirección correcta enviada por la interfaz equivocada produce conclusiones falsas.

Host discovery intenta responder si una dirección está en uso antes de dedicarle un port scan. No equivale a “hacer ping”: Nmap puede combinar ARP, ICMP, TCP, UDP y otros probes.

En una red Ethernet local, Nmap usa ARP para IPv4 o Neighbor Discovery para IPv6 porque suele ser más fiable que ICMP. Esta preferencia se mantiene incluso si se solicita -PE, la opción de discovery mediante ICMP Echo. --disable-arp-ping permite aislar una prueba IP sin ARP, aunque elimina una señal especialmente útil dentro del mismo segmento.

En una red enrutada y con privilegios, el discovery por defecto combina ICMP Echo, TCP SYN a 443, TCP ACK a 80 e ICMP Timestamp. Sin privilegios, Nmap utiliza llamadas connect() hacia TCP 80 y 443. Un firewall puede permitir unas señales y descartar otras, por lo que “host down” significa que Nmap no obtuvo una prueba de vida con los probes utilizados.

Opción Efecto real
-sn Ejecuta host discovery y omite el port scan posterior.
-Pn Omite host discovery y trata cada dirección como activa para el scan pedido.

-Pn no significa “desactivar ICMP” ni demostrar que el host esté activo. En un /16 obliga a probar las 65.536 direcciones y puede multiplicar el tiempo. En Ethernet local, Nmap todavía puede usar ARP para obtener la MAC necesaria, salvo que se añada --disable-arp-ping o se fuerce el envío IP.

En el primer discovery, -sn omite el port scan, -n conserva la resolución desactivada, --reason explica cada host activo y -oA guarda los tres formatos. sudo permite que Nmap utilice los probes raw disponibles:

Discovery sobre un rango
sudo nmap -sn -n --reason -oA scans/01-discovery TARGET_CIDR

Si faltan hosts que deberían existir, amplía los probes de forma deliberada. -PE solicita ICMP Echo. -PS envía SYN a los puertos indicados, -PA envía ACK y -PU utiliza UDP:

Discovery con probes ICMP, TCP y UDP seleccionados
sudo nmap -sn -n -PE -PS22,80,443,445 -PA80,443 -PU53,161 \
--reason -oA scans/02-discovery-expanded TARGET_CIDR

Los puertos se eligen porque es razonable que atraviesen los controles del entorno, no porque exista una combinación universal. Una respuesta RST también prueba que el host está activo, aunque el puerto no acepte conexiones.

Para estudiar un caso concreto, --disable-arp-ping impide que ARP sustituya la prueba IP y --packet-trace muestra los packets enviados y recibidos:

Comprobar por qué un host se considera activo
sudo nmap -sn -n -PE --disable-arp-ping --packet-trace --reason TARGET_IP

No conviene usar --packet-trace sobre una red grande: el output deja de ser manejable. Aísla una dirección y una pregunta.

Los seis estados de Nmap describen lo que el scanner puede concluir desde su punto de observación. No son una propiedad permanente del puerto.

Estado Interpretación
open Una aplicación acepta conexiones, datagramas o asociaciones en ese puerto.
closed El host responde, pero no hay una aplicación escuchando para el probe enviado.
filtered Un filtro o problema de red impide decidir entre open y closed.
unfiltered El puerto es alcanzable, pero el scan utilizado no distingue abierto y cerrado.
open|filtered La ausencia de respuesta encaja tanto con un puerto abierto como con un filtro.
closed|filtered El idle scan no puede separar ambos estados.

Un mismo TARGET_IP:PORT puede cambiar de estado al modificar la red de origen, la técnica, el protocolo, el timing o las reglas del firewall. Guarda esos parámetros con el resultado.

Sin -p, Nmap escanea los 1.000 puertos más frecuentes de cada protocolo solicitado según su base nmap-services. No escanea simplemente del 1 al 1.000.

Selección Significado
-F 100 puertos más frecuentes.
--top-ports 1000 Los 1.000 más frecuentes.
-p 22,80,443 Lista explícita.
-p 1-1024 Rango explícito.
-p- Puertos del 1 al 65.535.
-p T:80,443,U:53,161 Selección separada por protocolo en un scan mixto.

Una conexión TCP normal se establece con tres pasos:

cliente servidor
| -------- SYN ------------> |
| <----- SYN/ACK ------------ |
| -------- ACK -------------> |

El SYN scan -sS envía el primer packet, pero no completa la conexión:

respuesta SYN/ACK → open → la conexión se corta con RST en lugar del ACK final
respuesta RST → closed
sin respuesta o ICMP filtrado → filtered

El siguiente comando combina -sS con --top-ports 1000. -Pn omite un nuevo host discovery porque el host ya se ha confirmado:

SYN scan sobre los 1.000 puertos más frecuentes
sudo nmap -sS -n -Pn --top-ports 1000 --reason \
-oA scans/03-tcp-top TARGET_IP

-Pn se usa aquí cuando el host ya se conoce y se quiere evitar que un discovery bloqueado impida el port scan. No hace el scan más sigiloso. -sS tampoco es invisible: un IDS/IPS moderno reconoce el patrón de SYNs aunque no se complete el handshake.

-sT pide al sistema operativo local que ejecute connect(). Si el puerto está abierto, el kernel completa el handshake y después cierra la conexión. Es la opción habitual sin privilegios raw y puede ser útil cuando se quiere observar el comportamiento de una conexión normal.

TCP connect sobre puertos concretos
nmap -sT -n -Pn -p 22,80,443 --reason -oA scans/04-tcp-connect TARGET_IP

El servicio puede registrar la conexión. Frente a -sS, cambia el mecanismo: completa el handshake mediante connect() y crea estado en el servicio y en los controles intermedios.

-sA envía un ACK que no pertenece a una conexión existente. Si el packet alcanza el host, un stack TCP normal responde con RST tanto si el puerto está abierto como si está cerrado. Por eso Nmap informa unfiltered, no open:

RST recibido → unfiltered
sin respuesta o error ICMP → filtered
Comparar reachability con ACK
sudo nmap -sA -n -Pn -p PORT_LIST --reason TARGET_IP

El ACK scan sirve para comparar reglas y detectar filtrado stateless en algunos entornos. Un firewall stateful puede descartar correctamente un ACK fuera de estado. No identifica servicios ni “abre” un puerto filtrado.

El scan inicial permite empezar a enumerar mientras se ejecuta la cobertura completa. -p- selecciona los 65.535 puertos y --stats-every 30s imprime el progreso cada treinta segundos sin cambiar el tráfico:

Cobertura TCP completa
sudo nmap -sS -n -Pn -p- --reason --stats-every 30s \
-oA scans/05-tcp-all TARGET_IP

Separa cobertura y profundidad. Primero identifica los puertos. Después aplica -sV, NSE y OS detection donde aporten información, ya que estas fases abren conexiones, envían payloads de protocolo y aumentan el tiempo y el tráfico del scan.

UDP no establece una sesión antes de enviar datos. La respuesta depende de la aplicación y del payload:

respuesta UDP → open
ICMP Destination Unreachable 3/3 → closed
otro error ICMP → filtered
sin respuesta → open|filtered

Muchos servicios UDP ignoran datagramas vacíos o solo responden a una petición válida. Además, los hosts pueden limitar la tasa de errores ICMP. Esa combinación hace que un scan UDP completo sea lento y que open|filtered sea frecuente.

-sU selecciona el UDP scan. Empieza por los puertos con mayor probabilidad o por los protocolos que encajen con el entorno:

UDP sobre los 100 puertos más frecuentes
sudo nmap -sU -n -Pn --top-ports 100 --reason \
-oA scans/06-udp-top TARGET_IP

Después utiliza -sV, que envía probes de aplicación e intenta reconocer el servicio. Esos probes específicos pueden obtener la respuesta que un datagrama genérico no produjo:

Validar candidatos UDP con probes de servicio
sudo nmap -sU -sV -n -Pn -p UDP_PORT_LIST --reason \
-oA scans/07-udp-services TARGET_IP

open|filtered no debe registrarse como servicio confirmado. Conserva la incertidumbre y continúa con una petición válida del protocolo.

En un scan sin -sV, la columna SERVICE suele salir de la asociación entre número de puerto y nmap-services. 80/tcp http puede significar únicamente que HTTP usa habitualmente ese puerto. Un servicio puede escuchar en un puerto no estándar y un banner puede estar oculto o manipulado.

-sV abre o sondea los puertos descubiertos, compara las respuestas con nmap-service-probes e intenta obtener protocolo, producto, versión, hostname, tipo de dispositivo, familia de OS y CPE:

Identificar servicios en los puertos descubiertos
sudo nmap -sV -n -Pn -p PORT_LIST --reason \
-oA scans/08-service-detection TARGET_IP

--version-light reduce probes y --version-all los amplía. Más intensidad consume más tiempo y tráfico, pero no convierte la identificación en certeza. Contrasta los datos relevantes mediante el protocolo, TLS, documentación del producto y otras señales independientes.

Por defecto, version detection excluye TCP 9100 porque algunas impresoras imprimen literalmente los probes recibidos. --allports elimina esa exclusión y puede provocar que el dispositivo imprima los payloads enviados. Identifica primero qué escucha en ese puerto y usa --version-trace si necesitas estudiar la interacción.

Para ver qué probes envía Nmap a un único puerto, usa --version-trace. Para una confirmación manual sencilla de un servicio que entrega banner al conectar, Ncat ofrece -n para evitar DNS y -v para mostrar el estado de la conexión:

Ventana de terminal
ncat -nv TARGET_IP PORT

No todos los protocolos hablan primero y algunos requieren TLS o una petición válida. La ausencia de banner no implica ausencia de servicio.

-O compara respuestas TCP/IP con la base nmap-os-db. El fingerprint mejora cuando Nmap encuentra al menos un puerto TCP abierto y otro cerrado. --osscan-limit evita intentarlo cuando Nmap no dispone de condiciones razonables para producir un resultado útil:

OS detection sobre un host ya caracterizado
sudo nmap -O --osscan-limit -n -Pn -p OPEN_AND_CLOSED_PORTS TARGET_IP

El resultado es una estimación. NAT, proxies, middleboxes, virtualización y filtros pueden alterar el fingerprint. Una versión de OpenSSH compilada para una distribución tampoco demuestra por sí sola el OS completo.

-A activa OS detection, version detection, scripts default y traceroute. Es un atajo, no una técnica independiente ni una opción obligatoria:

-A = -O + -sV + -sC + --traceroute

Aplicarlo a puertos ya seleccionados mantiene el output manejable y permite atribuir cada resultado a una interacción concreta.

NSE ejecuta scripts Lua para discovery, enumeración, version detection y comprobaciones específicas. -sC equivale a seleccionar la categoría default:

Scripts default sobre servicios conocidos
sudo nmap -sV -sC -n -Pn -p PORT_LIST TARGET_IP

La categoría default combina scripts seleccionados por utilidad, fiabilidad, intrusividad, verbosidad y privacidad. Algunos abren sesiones o envían peticiones que el servicio puede registrar.

--script acepta nombres, categorías, directorios y expresiones booleanas. --script-help muestra su documentación sin ejecutarlos. --script-args NAME=VALUE entrega argumentos y debe usar el nombre cualificado del script cuando esté disponible. Conviene revisar primero qué selecciona la expresión y qué argumentos necesita cada script:

Consultar ayuda antes de ejecutar un script
nmap --script-help SCRIPT_NAME
Ejecutar scripts concretos
sudo nmap -n -Pn -p 25 --script banner,smtp-commands TARGET_IP
Seleccionar una categoría y pasar argumentos
sudo nmap -sU -Pn -p 161 --script snmp-sysdescr \
--script-args creds.snmp=COMMUNITY TARGET_IP

Las catorce categorías describen la finalidad o el comportamiento del script. Un script puede pertenecer a varias:

Categoría Qué agrupa
auth Credenciales, métodos de autenticación y bypasses.
broadcast Discovery mediante broadcast en la red local.
brute Intentos repetidos de autenticación.
default Selección ejecutada por -sC y por -A.
discovery Información adicional de servicios, hosts, registros y directorios.
dos Checks que pueden provocar una denegación de servicio.
exploit Explotación activa de una vulnerabilidad.
external Consultas que envían datos a un servicio externo.
fuzzer Campos inesperados o aleatorios para buscar fallos de implementación.
intrusive Interacciones con consumo, cambios o efectos apreciables sobre el target.
malware Señales de malware o backdoors conocidas.
safe Discovery y enumeración sin explotación ni consumo intencional significativo.
version Extensiones que Nmap activa con -sV. No se seleccionan directamente.
vuln Checks de vulnerabilidades concretas.

Las expresiones booleanas combinan categorías. Esta consulta muestra los scripts que pertenecen a default y también a safe:

Combinar categorías mediante una expresión
nmap --script-help "default and safe"

Seleccionar una categoría ejecuta todos los scripts elegibles que coincidan con el host o servicio. Por ejemplo:

Ejecutar los checks de la categoría vuln aplicables a un servicio
sudo nmap -sV -Pn -p PORT_LIST --script vuln TARGET_IP

El output identifica el script que produjo cada resultado. Hay que contrastar su lógica, condiciones y evidencia antes de convertirlo en un hallazgo. --script-trace muestra la comunicación de aplicación de los scripts y resulta útil para entender un resultado inesperado:

Trazar la interacción de un script concreto
sudo nmap -Pn -p 445 --script smb-os-discovery \
--script-trace TARGET_IP

Los argumentos comparten un namespace global. Usa nombres cualificados, como SCRIPT_NAME.argument, cuando la documentación los ofrezca para no cambiar accidentalmente otros scripts. --script-args-file FILE permite separar argumentos extensos del comando. --script-updatedb solo hace falta después de añadir, retirar o recategorizar scripts en el directorio de NSE.

Los scripts de terceros se ejecutan localmente sin sandbox. Su código tiene el mismo acceso que el proceso de Nmap, así que hay que revisarlo antes de cargarlo. En el target, categorías como brute, dos, exploit, fuzzer e intrusive cambian el tipo y el impacto de la interacción. Esa propiedad técnica debe formar parte de la selección del scan.

El output interactivo ayuda durante el scan, pero no debe ser el único registro. Nmap ofrece:

Opción Uso principal
-oN FILE Formato normal, legible para revisión manual.
-oX FILE XML estructurado para parsing, importación y comparación.
-oG FILE Formato grepable legado. Pierde extensibilidad frente a XML.
-oA BASENAME Genera .nmap, .xml y .gnmap con el mismo basename.

-oA no guarda literalmente todos los formatos existentes: agrupa normal, XML y grepable. Nmap continúa mostrando el output interactivo en stdout.

Usa nombres que indiquen orden, alcance y propósito:

Artefactos de un host
scans/
├── 01-discovery.nmap
├── 01-discovery.xml
├── 03-tcp-top.nmap
├── 05-tcp-all.nmap
├── 06-udp-top.nmap
└── 08-service-detection.nmap

El output normal conserva el comando ejecutado en un comentario. El XML es la mejor base para automatización. ndiff compara dos resultados de Nmap y muestra hosts, puertos o servicios que han cambiado:

Comparar dos resultados XML
ndiff baseline.xml retest.xml

El XML también puede convertirse en un informe HTML mediante la stylesheet que instala Nmap. En xsltproc, -o scan.html selecciona el archivo de salida:

Convertir XML de Nmap a HTML
xsltproc scan.xml -o scan.html

Los navegadores modernos suelen impedir que un XML local cargue directamente una stylesheet desde otra ruta. Generar el HTML evita esa restricción y deja un artefacto autocontenido para revisión. --stylesheet PATH_OR_URL permite elegir otra XSL, mientras que el valor local por defecto evita solicitar recursos externos.

Guarda el output completo como artefacto y copia en la nota solo el fragmento que justifica una decisión. Gestión de evidencias desarrolla integridad, custodia y saneamiento.

Nmap adapta paralelismo, timeouts, retransmisiones y ritmo según las respuestas. El default -T3 suele ser un punto de partida más fiable que imponer valores copiados de otro entorno.

Las templates -T0 a -T5 agrupan varios ajustes. -T4 puede reducir el tiempo en una red estable. -T5 usa timeouts y retransmisiones más restrictivos, por lo que puede perder respuestas y concentrar el tráfico. El número no representa únicamente velocidad.

Opción Qué controla Riesgo al forzarla
--min-rate 300 Intenta mantener al menos 300 packets por segundo. Pérdida de respuestas y presión en la red.
--max-rate 100 Limita la tasa media de envío. Scan más largo, pero impacto acotado.
--max-retries 2 Limita retransmisiones por probe. Falsos negativos en redes con pérdida.
--min-parallelism 10 Mantiene al menos diez probes pendientes por grupo. Reduce la adaptación ante congestión.
--max-parallelism 1 Limita los probes pendientes por grupo a uno. Puede alargar mucho el scan.
--initial-rtt-timeout Fija el timeout inicial. Un valor bajo falla antes de medir la red.
--max-rtt-timeout Acota cuánto puede crecer el timeout. Pierde respuestas lentas o rate-limited.
--stats-every 30s Muestra progreso sin cambiar el tráfico del scan. Ninguno sobre el objetivo.
-v, -vv Aumenta la información mostrada durante la ejecución. Más ruido local en la terminal.

--min-rate expresa packets por segundo, no packets simultáneos. --max-rate permite imponer un techo de envío, mientras que --min-rate obliga a Nmap a intentar sostener un suelo incluso cuando la red responde con pérdida o latencia.

Durante un scan interactivo, Enter o cualquier tecla sin función asignada imprime el estado actual. v y V cambian la verbosidad, d y D el nivel de debug, y p y P activan o desactivan packet tracing. ? muestra la ayuda disponible. Estos cambios afectan a la ejecución en curso. Anótalos si el log debe explicar por qué el output final difiere del comando inicial. Para procesos en background, --noninteractive desactiva la captura del teclado y --stats-every TIME mantiene el progreso periódico.

Optimiza después de obtener una baseline. Si un scan acelerado encuentra menos hosts o puertos, no ha demostrado que hayan desaparecido: ha cambiado la sensibilidad de la prueba. Conserva ambos resultados y explica la diferencia.

Un firewall decide qué tráfico permite, rechaza o descarta. Un IDS observa y alerta. Un IPS puede además bloquear o modificar el tráfico. Nmap solo ve las consecuencias desde su posición.

Un rechazo explícito puede llegar como RST o error ICMP y suele resolverse rápido. Un drop no responde, obliga a esperar y puede terminar en filtered o open|filtered. La ausencia de respuesta no identifica por sí sola el dispositivo que la causó.

No toda evasión persigue lo mismo. Conviene identificar qué control se está estudiando antes de cambiar el scan:

Objetivo técnico Variable que suele modificarse Qué se observa
Atravesar una regla de filtrado Protocolo, TCP flags, fragmentación, puerto o dirección de origen Cambios entre filtered, unfiltered, open y respuestas ICMP
Reducir coincidencias por firma Orden de hosts, cadencia, tamaño y forma de los packets Alertas, resets, degradación o ausencia de un bloqueo reactivo
Distinguir un bloqueo por origen VPS, egress node, interfaz o dirección de salida El mismo probe funciona desde un origen y falla desde otro
Ocultar el origen entre decoys Direcciones añadidas con -D El objetivo registra varios orígenes para una fase compatible

Una técnica puede afectar a una capa y dejar intactas las demás. Fragmentar un SYN no oculta las conexiones posteriores de -sV. Reducir el rate puede evitar un umbral corto, pero no una correlación que acumule eventos durante horas. Cambiar el puerto de origen no altera el payload que inspecciona un proxy de aplicación.

Compara scans que difieran en una sola variable. Conserva el comando, el origen, la interfaz, la ruta, la hora, la versión de Nmap, el rate y el output completo. Para analizar un puerto filtrado, una secuencia mínima puede ser:

Baseline SYN
sudo nmap -sS -Pn -n -p PORT --reason --packet-trace TARGET_IP
Comparación con ACK
sudo nmap -sA -Pn -n -p PORT --reason --packet-trace TARGET_IP
Petición de aplicación desde el mismo origen
ncat -nv TARGET_IP PORT

El SYN scan pregunta si el puerto acepta una conexión. El ACK scan estudia reachability y filtrado, no si existe un listener. Ncat completa una conexión TCP y permite comprobar si el servicio responde a una interacción normal. Si se cambian técnica, origen y timing a la vez, la diferencia deja de tener una causa aislable.

Un IPS reactivo, un firewall con rate limiting o un sistema de reputación puede permitir los primeros probes y bloquear después una IP concreta. El síntoma no siempre es un error explícito: un puerto previamente open puede pasar a filtered, aumentar la latencia o dejar de responder tras superar un umbral.

Para distinguir un bloqueo dinámico de un drop estable:

  1. ejecuta un probe de control pequeño desde ORIGIN_A y anota el timestamp
  2. repítelo sin cambiar flags, puertos ni timing
  3. si deja de responder, ejecuta exactamente el mismo probe desde ORIGIN_B
  4. vuelve a probar ORIGIN_A tras un intervalo conocido
  5. compara también una dirección o servicio de control que no forme parte del scan principal

La interpretación depende del patrón:

Resultado Hipótesis que gana peso
ORIGIN_A falla y ORIGIN_B responde Bloqueo, reputación o ACL asociados al origen
Ambos fallan al mismo tiempo Cambio en el target, servicio, ruta o control compartido
ORIGIN_A vuelve a responder tras un intervalo similar Bloqueo temporal o ventana de rate limiting
El fallo aparece después de un volumen o patrón repetible IPS reactivo o threshold basado en frecuencia
Solo cambia un puerto mientras los controles siguen respondiendo Regla o protección específica del servicio

Un pool de VPS o egress nodes permite repetir la observación desde direcciones y redes distintas. Cada nodo necesita una identidad estable, reloj sincronizado, versión conocida de las herramientas y logs propios. La rotación cambia más que la IP: también puede cambiar el ASN, la reputación, la ruta, el RTT, el MTU y los filtros intermedios. Dos resultados solo son comparables si esas diferencias se registran y el resto del probe se mantiene estable.

En operaciones de Red team, los egress nodes y redirectors separan la infraestructura expuesta de los sistemas de control y permiten sustituir un origen bloqueado sin reconstruir toda la operación. En enumeración también sirven para determinar si un control correlaciona por IP, subred, patrón o comportamiento global. Cambiar de origen reinicia algunos contadores locales, pero no evita una correlación centralizada entre sensores.

-D mezcla la dirección real con direcciones simuladas durante host discovery, port scanning y OS detection compatibles. ME fija la posición de la dirección real. RND:N genera N direcciones IPv4 aleatorias:

SYN scan con decoys aleatorios
sudo nmap -sS -Pn -n -p 80,443 -D RND:5,ME --packet-trace TARGET_IP
SYN scan con decoys controlados
sudo nmap -sS -Pn -n -p 80,443 \
-D DECOY_1,DECOY_2,ME,DECOY_3 TARGET_IP

Nmap envía un batch de probes equivalentes: uno con su dirección real y otros con las direcciones de los decoys. El target responde a cada dirección de origen. Solo la respuesta dirigida al origen real vuelve al scanner, salvo que este controle también el routing de los demás nodos.

Los decoys activos presentan señales de reachability y pueden generar tráfico propio. Si las direcciones simuladas no existen, un sensor puede separarlas mediante reachability, comportamiento o concentración de respuestas. Demasiados decoys alargan el scan, aumentan la congestión y pueden reducir su precisión.

La cobertura de -D termina antes de varias fases importantes. No oculta la dirección utilizada por TCP connect -sT, version detection -sV, NSE ni reverse DNS. En un scan -sS -sV -D ..., los SYN pueden aparecer repartidos entre orígenes, pero las conexiones de version detection seguirán saliendo únicamente desde la dirección real.

-f divide la cabecera TCP, UDP o ICMP entre fragmentos IP pequeños. Una aparición de -f usa fragmentos de hasta ocho bytes después de la cabecera IP. Repetirla usa 16 bytes. --mtu permite indicar un tamaño, que debe ser múltiplo de ocho:

Fragmentar un SYN scan
sudo nmap -sS -Pn -n -p 80,443 -f --packet-trace TARGET_IP
Fijar una MTU de fragmentación
sudo nmap -sS -Pn -n -p 80,443 --mtu 24 --packet-trace TARGET_IP

La técnica estudia dispositivos que inspeccionan fragmentos sin reensamblarlos correctamente. Un firewall que normaliza o reensambla el tráfico verá el packet original. Un IDS situado después del punto de reensamblado también puede reconstruirlo.

La fragmentación se aplica a features de raw packets. No fragmenta -sT, version detection ni NSE. Algunos sistemas operativos locales pueden reensamblar los fragments antes de transmitirlos. Verifica el tráfico real con tcpdump o Wireshark y usa --send-eth si necesitas que Nmap envíe directamente en la capa Ethernet.

-S fija la dirección IPv4 de origen y -e selecciona la interfaz:

Probar una dirección de origen concreta
sudo nmap -sS -Pn -n -e tun0 -S SOURCE_IP -p 445 \
--reason --packet-trace TARGET_IP

Si SOURCE_IP es una dirección spoofed que el scanner no controla, el target enviará allí las respuestas y Nmap no podrá clasificarlas. El comando resulta útil cuando la dirección pertenece realmente a una interfaz local, a un pivot o a una ruta controlada. También permite comparar ACL basadas en origen cuando existe un return path válido.

Spoofing no convierte al scanner en un proxy. El origen simulado recibe las respuestas y puede recibir resets, errores ICMP o tráfico de aplicación causado por el probe. Si un router aplica ingress filtering, el packet puede descartarse antes de llegar al target.

--source-port PORT o -g PORT fija el puerto de origen en scans que construyen raw packets. Sirve para detectar reglas que confían en un puerto como 53 o 20 sin validar el estado de la conexión:

Comparar un SYN desde el puerto de origen 53
sudo nmap -sS -Pn -n --source-port 53 -p 50000 \
--reason --packet-trace TARGET_IP

El resultado solo es significativo frente a una baseline idéntica sin --source-port. Si el puerto cambia de filtered a open, la hipótesis es que algún control trata de forma distinta ese origen. Un firewall stateful puede descartar el SYN aunque use 53 porque no pertenece a una sesión DNS establecida.

La opción no se conserva en TCP connect, version detection, NSE ni peticiones DNS, y no se aplica de forma uniforme a todas las probes de OS detection. Cuando un SYN scan detecta una diferencia, Ncat permite validar una conexión completa desde el mismo puerto de origen:

Completar una conexión desde el puerto de origen 53
ncat -nv --source-port 53 TARGET_IP 50000

Ncat necesita poder enlazar ese puerto local. Si otro proceso lo usa o el sistema exige privilegios para puertos inferiores a 1024, la conexión fallará antes de salir.

Los controles basados en thresholds pueden contar intentos por origen, destino, puerto o ventana temporal. Reducir picos no modifica el contenido de los probes, pero cambia el patrón que observa el sensor. --randomize-hosts baraja grupos de targets, --scan-delay 200ms impone ese intervalo mínimo entre probes hacia el mismo host y --max-rate 20 limita la tasa media global:

Distribuir probes entre hosts y limitar la cadencia
sudo nmap -sS -Pn -n -iL targets.txt -p PORT_LIST \
--randomize-hosts --max-rate 20 --scan-delay 200ms \
-oA scans/09-distributed

Estas opciones pueden evitar ráfagas evidentes, aunque alargan la ventana de observación y facilitan que un sistema con retención suficiente correlacione el patrón completo.

Una cadencia baja también cambia la calidad del resultado. Los servicios pueden reiniciarse, las reglas pueden rotar y un scan de horas puede mezclar estados de momentos distintos. Registra cuándo se observó cada resultado y repite probes de control si la red cambia durante la ejecución.

Síntoma Comprobación útil
Host seems down Ruta, VPN, interfaz, ARP local, probes alternativos y -Pn sobre un host conocido.
Todos los puertos aparecen filtered Punto de origen, ACL, errores ICMP, --reason y un puerto que deba estar expuesto.
SERVICE no coincide con la app Confirmar si se usó -sV. Después negociar el protocolo manualmente.
UDP queda open|filtered Enviar una petición válida del protocolo o aplicar -sV al puerto concreto.
El scan tarda mucho Revisar drops, rate limiting, DNS, retries y RTT antes de reducir timeouts.
Dos scans no coinciden Comparar origen, hora, versión, targets, flags, timing y archivos XML con ndiff.

No resuelvas una ambigüedad añadiendo flags al azar. Aísla una dirección, un puerto y una diferencia observable. Usa --reason, --packet-trace o --version-trace sobre ese caso.

Tarea Opción o patrón Interpretación mínima
Cargar targets -iL FILE Lee una lista. No valida el scope.
Ver expansión -sL -n Lista targets sin port scan ni DNS.
Solo host discovery -sn No ejecuta port scan.
Saltar host discovery -Pn Escanea cada target como si estuviera activo.
ICMP Echo -PE Puede quedar sustituido por ARP en Ethernet local.
Desactivar ARP implícito --disable-arp-ping Útil para aislar una prueba IP, no como default.
SYN scan -sS Half-open. Requiere raw packets.
TCP connect -sT Usa connect() y completa conexiones abiertas.
ACK scan -sA Distingue filtered de unfiltered, no open.
UDP scan -sU La falta de respuesta suele quedar open|filtered.
Version detection -sV Envía probes de aplicación y compara firmas.
OS detection -O Produce un fingerprint probabilístico.
Scripts default -sC Equivale a --script default.
Script concreto --script SCRIPT_NAME Leer antes --script-help SCRIPT_NAME.
Explicar un estado --reason Muestra la respuesta que sustentó la clasificación.
Ver packets --packet-trace Usar sobre un caso pequeño.
Guardar tres formatos -oA BASENAME Genera normal, XML y grepable.
Ver progreso --stats-every 30s No altera el tráfico.
Elegir resolvers --dns-servers SERVERS Afecta al reverse DNS realizado por Nmap.
Limitar tasa --max-rate N Acota packets por segundo de media.