NMAP

The Network Mapper

Adrián L. G. P.

COMANDOS BÁSICOS
nmap <tipo> <opciones> <objetivo> Sintaxis básica.
nmap --help Ayuda sobre el uso del comando. Guía completa.
CONEXIONES TCP
SYN → SYN/ACK → ACK Conexión TCP exitosa.
SYN → RA RA: Indica que se rechaza la conexión (RST) y que se confirma la recepeción del SYN enviado (ACK).
SYN → (No responde) Posibles causas: Host apagado, firewall ignorando paquetes o paquete perdido.
SYN → SYN/ACK → (No recibe ACK) Nuestro host no responde a la conexión (conexión TCP-SYN).
SYN → SYN Error del servidor al responder con SYN.
FIN → FIN/ACK → ACK Conexión TCP finalizada.
OBJETIVOS
10.200.0.0/16 La red entera.
10.200.0.1 Un único objetivo.
10.200.0.1 10.200.0.2 Ciertas IPs separadas por espacios.
10.200.0.0-20 Un rango de ciertas IPs.
-iL<nombre_archivo> Varias IPs en un archivo separadas una tras otra con saltos de línea.
PUERTOS A ESCANEAR
-p- Los 65.535 puertos.
-p 22 Un puerto específico.
-p 22,80,443 Varios puertos separados por comas.
-p 22-443 Un rango de puertos.
-F Los 100 primeros puertos más importantes según nmap.
--top-ports=10 Los 10 puertos más importantes según nmap.
TIPOS DE ESCANEOS
-sS Funcionamiento del escaneo TCP-SYN:
  • Se envía SYN al host
  • Si responde con SYN/ACK se detecta el puerto como 'open'
  • Si responde con RA (RST y ACK) se detecta el puerto como 'closed'
  • Si no responde se detecta el puerto como 'filtered'

Predefinido si no se especifica.

Útil: Es rápido.
Problemas: Se necesita permisos de root al tener que modificar paquetes.
-sT Funcionamiento del escaneo TCP-CONNECT:
  • Se envía SYN al host
  • Si responde con SYN/ACK se le envía ACK para completar la conexión y se detecta como 'open'
  • Si responde con RA (RST y ACK) se detecta el puerto como 'closed'
  • Si no responde se detecta el puerto como 'filtered'

La diferencia con TCP-SYN es que sí completa la conexión TCP.

Útil: No provoca fallos en el servidor. Es más fiable en la detección. Menos detectable por IPS.
Problemas: Más posibilidades de registrar la conexión en un log. Es más lento que SYN-TCP.
-sA Funcionamiento del escaneo TCP-ACK:
  • Se envía un paquete TCP con la bandera ACK
  • Si se recibe un paquete con RST entonces el puerto permite una conexión pudiendo estar 'open' o 'closed'
  • Si no se recibe una respuesta el puerto está bloqueado así que es 'filtered'

Útil: Mucho más difícil de filtrar para firewalls y sistemas IDS/IPS ya que no se puede averiguar si el ACK forma parte de una conexión establecida. Permite descubrir información sobre el estado del firewall o del sistema sin iniciar una conexión.
Problemas: No se sabe si está 'open' o 'closed'.
-sU Funcionamiento del escaneo UDP:
  • Se envía un paquete UDP al host
  • Si se recibe una respuesta el puerto es 'active'
  • Si se recibe error 3 (inalcanzable) el puerto es 'closed'
  • Si se recibe otro error diferente el puerto es 'open|filtered'

Útil: Podemos hacer conexiones a servicios UDP, por ejemplo DNS que utiliza el puerto 53 TCP y UDP.
Problemas: Más lento que un escaneo TCP. No sabemos si recibió el paquete al ser un protocolo sin estado.
-PE Funcionamiento del escaneo ICMP echo request:
  • Antes de enviar el ICMP y, si está en la misma red que el objetivo, envia un ARP request.
  • Si recibe un ARP reply, el host está 'active'
  • Si no, se envia un ICMP Echo Request
  • Si se recibe un ICMP reply el host está 'active'
  • Si se recibe un ICMP reply el host está 'inactive'

Problemas: Es muy detectable por sistemas IPS o firewalls.
DESHABILITAR OPCIONES
--disable-arp-ping Deshabilita la resolución de MAC por ARP al realizarse por defecto para poder enviar el paquete. Por ejemplo en el escaneo -PE.
-Pn Deshabilita el ICMP echo request para averiguar si el host a está activo. Con esto se presupone que el host está siempre activo.
-sN Deshabilita el escaneo de puertos ya que por defecto se escanean los 1000 primeros.
INFORMACIÓN ADICIONAL
-sV En el host intenta averiguar el S.O.
En sus puertos abiertos intenta averiguar el servicio que se ejecuta, versión y detalles.
-n Deshabilita la resolución DNS.
--packet-trace Nos da la información detallada de cada paquete enviado y recibido incluyendo banderas.
Se puede encontrar paquetes enviado por nosotros (SENT) o recibidos (RCVD).
--traceroute Identifica cada salto que da el paquete para llegar a su destino.
--reason Identifica la razón de porqué está activo un host.
-vvv Podemos ver información en tiempo real mientras se escanea con 3 niveles de verbose. Cuantos más v haya, más información recibiremos.
También podemos ver cuanto tiempo estimado falta para finalizar el escaneo pulsando "ESPACIO" en cualquier momento.
--stats-every=(segundos)/s[o](minutos)/m Nmap envia información cada x segundos o minutos. NO se puede poner minutos y segundos a la vez.
OPTIMIZAR TIEMPOS DE RESPUESTA
--initial-RTT-timeout min:initial:max
  • min: Tiempo mínimo de espera permitido. Predeterminado: 100ms.
  • initial: Tiempo máximo en el que se espera un paquete. Cuando lo reciba cambiará este valor para futuros paquetes en el tiempo que tardó pero nunca debe ser menos que min y no más que max.
  • max: Tiempo máximo de espera permitido.
--max-retries <intentos> Intenta enviar un paquete si no lo recibe hasta x veces. Predeterminado: 10.
--min-rate <paquetes> Nmap intentará igualar la tasa de paquetes que envía cada segundo.
-T <0-5> Lo anterior es manual pero hay 6 plantillas predefinidas según niveles. El nivel 0 es el más lento y sigiloso y, el nivel 5, lo más rápido y detectable. El valor intermedio e ideal es el nivel 3.
EXPORTAR RESULTADOS
-oA <nombre_archivo> Exporta el resultado en 3 formatos: nombre_archivo.nmap, nombre_archivo.xml y nombre_archivo.gnmap.
-oN <nombre_archivo> Exporta el resultado en formato: nombre_archivo.nmap. Salida normal de terminal.
-oG <nombre_archivo> Exporta el resultado en formato: nombre_archivo.gnmap. Salida de terminal adaptado para hacer grep.
-oX <nombre_archivo> Exporta el resultado en formato: nombre_archivo.xml. Formato XML.
xsltproc <nombre_archivo>.xml -o <nombre_archivo>.html Una vez exportado a XML se puede convertir a HTML mediante un comando externo.
SCRIPTS
[EXPLICACIÓN] Los scripts están hecho en LUA y están agrupados en varias categorías, ofreciendo funcionalidades diferentes.
[CATEGORÍAS]
  • auth: Determina credenciales de acceso.
  • broadcast: Descubrimiento de hosts.
  • brute: Intenta iniciar sesión en el servicio.
  • default: Predeterminados.
  • discovery: Evaluación de servicios accesibles.
  • dos: Buscar vulnerabilidades con DoS.
  • exploit: Explota vulnerabilidades conocidas.
  • external: Se utilizan servicios externos.
  • fuzzer: Identificar vulnerabilidades con paquetes.
  • intrusive: Scripts intrusivos en el sistema.
  • malware: Se comprueba si está infectado.
  • safe: No se realizan accesos intrusivos.
  • version: Detección de versiones de servicios.
  • vuln: Buscar vulnerabilidaes específicas.

Esto se puede aplicar a todos los puertos o solo a algunos con -p. Ver más scripts o categorías.
-sC Uso de scripts predeterminados (default).
--script <script/categoria> Cargar un único script con su nombre o varios con una categoría.
-A Combina detección de S.O. (-O), detección de versiones y servicios (-sV), scripts default (-sC) y --traceroute.
EVASIÓN DE IDS E IPS
[EXPLICACIÓN] El sistema de detección de intrusiones (IDS) y sistema de prevención de intrusiones (IPS) son componentes basados en software.

IDS escanea la red en busca de posibles ataques, los analiza e informa cualquier ataque detectado. El análisis de los ataques se basa en la coincidencia de patrones y firmas.

IPS complementa el IDS tomando medidas defensivas específicas si se hubiera detectado un posible ataque. Si se detectan patrones se puede por ejemplo impedir los intentos de conexión pendientes.
[RECOMENDACIÓN] Se puede tener una VPS con una IP distinta pudiendo así dividir escaneos o, si un host nuestro está bloqueado del sistema objetivo, podemos seguir con la VPS.

Además si llegamos a realizar un ataque y el objetivo lo detecta, puede contactar con nuestro ISP para parar el ataque y, así, bloquearnos el acceso a internet desde esa IP.
-D RND:<cantidad_IPs> Esta opción permite enviar el mismo paquete x cantidad de veces desde diferentes IPs pero siempre añadiendo nuestra IP real en la lista.
Problema: Los routers e ISP si ven una IP fuera de su rango como origen pueden descartar el paquete y no llegar al destino (IP spoofing).
-S <IP_origen> Esta opción permite manipular la IP de origen de los paquetes mediante el campo IP ID. Es recomendable que la IP exista para recibir las respuestas. Se puede usar la IP de una VPS diferente.
-e <interfaz> Se puede enviar el paquete por diferentes interfaces a la predeterminada del sistema.
--dns-server <server1,server2> Se puede cambiar el servidor DNS para hacer las consultas.
--source-port <puerto> Si un sistema, ya sea de origen o destino, bloquea solicitudes, pero descubrimos puertos que pueden estar libres, como el 53 en la mayoría de los casos, podemos enviar la solicitud por ese puerto para bypassar el sistema.
INTERPRETACIÓN DE S.O. SEGÚN TTL
ttl 64 Posibles S.O.: Linux, MacOS, Android, FreeBSD
ttl 128 Posibles S.O.: Windows
ttl 255 Posibles S.O.: Cisco IOS, Solaris
otros El ttl es un valor que se puede cambiar, por lo tanto la identificación se puede realizar mediante firmas usando -O.
INTERPRETACIÓN DE TIEMPOS DE RESPUESTA
SENT (0.0381s) TCP nosotros > destino S ...
SENT (1.0411s) TCP nosotros > destino S ...
… Nmap done: ... scanned in 2.06 seconds
Este caso llamado dropped se puede ver que se envia 2 paquetes SYN y en ninguno responde, dando un mayor tiempo de espera para intentar recibir una respuesta.
Posible causa: Un firewall descarta la conexión y no envía un paquete de vuelta haciéndonos esperar más tiempo.
SENT (0.0381s) TCP nosotros > destino S ...
RCVD (0.0487s) ICMP [destino Port unreachable (type=3/code=3)
… Nmap done: ... scanned in 0.05 seconds
Este caso llamado rejected se puede ver que se envia 1 paquete SYN y el firewall rechaza la conexión con una paquete ICMP. Gracias a esto se espera mucho menos tiempo al recibir una respuesta.
INTERPRETACIÓN DEL ESTADO DE UN PUERTO
'open' Se estableció la conexión al puerto con TCP, UDP o SCTP.
'closed' Se rechaza la conexión con la bandera RST.
'filtered' No se puede saber su estado. El firewall puede hacer: reject o drop.
'unfiltered' Solo pasa en el scan TCP-ACK donde se puede acceder al puerto pero no se puede determinar su estado.
'open|filtered' Cuando un firewall o filtro de paquetes protege un puerto y no se obtiene una respuesta.
'closed|filtered' En un IP ID idle scan, indica que no se pudo saber si el puerto está cerrado o bloqueado por un firewall.
RECOGER INFORMACIÓN
curl <objetivo>:<puerto> Muchos servidores al hacer esta solicitud devuelven un banner que puede contener información del sistema.
Los servidores web se encuentran entre los servicios más atacados porque se hacen accesibles y presentan un alto potencial de ataque.
smbclient -L //<objetivo>/ -N Al realizar esta conexión al puerto 443 (SMB) nos permitirá ver recursos compartidos accesibles, permisos e información del host.
Podemos probar a acceder a cada recurso compartido (share) sin contraseña y, una vez dentro aparecerá un prompt con "smb: \>". Comando: smbclient /<IP>/<share> -N

(-N: Modo sin credenciales; -L: Listar recursos compartidos)
ftp <objetivo> <puerto> Con una conexión ftp podemos probar a autentificarnos con anonymous y ver información.
telnet <objetivo> <puerto> Con una conexión telnet podemos intentar conectarnos en remoto al puerto 23 y probar si el servidor deja autentificarse como root sin contraseña.
netcat -nv -p <puerto_origen> <objetivo> <puerto_objetivo> Si vemos que el destino acepta conexiones si las enviamos desde un puerto determinado, podemos manipular ese campo y conectarnos para así obtener más información.
IMPORTANTE: El puerto 53 junto a otros es un servicio esencial y, en algunos casos, nos permite conectarnos si lo configuramos como puerto de origen.

Adrián L. G. P.