Nmap es un poderosa herramienta libre que toda persona involucrada en la seguridad informática debería conocer, con ella podemos realizar diferentes tareas de mapeo de red como los son: Descubrimiento de los hosts activos en la red (Host Discovery), detectar que puertos están abiertos en cada uno de los hosts (Port Scanning), como también averiguar qué versión de servicios y sistema operativo se están ejecutando en los objetivos (Version Detection).

Como soy usuario de Debian GNU/Linux (Testing) he decidido primero descargar el código fuente para compilarlo, ya que la última versión estable al día de hoy es la 6.00 (que dicho sea de paso ya trae soporte completo para IPv6) y en los repositorios de Debian está la 5.51. La instalación no va más allá de los clásicos pasos config, make y make install. Para entender cómo funciona Nmap debemos tener conocimientos básicos de redes como el Modelo OSI, protocolos mayores (IP, ICMP, TCP, UDP) entre otras cosas. Vamos a suponer que estamos en una red privada del tipo 192.168.1.0/24. ¡Manos a la obra!:

Empezar a “jugar” con Nmap en Internet puede llevar a problemas legales, ya que en teoría no deberías escanear infraestructura de red que no te pertenezca o no tengas el permiso expreso para hacerlo. Este post es para uso meramente educativo.

HOST DISCOVERY

La primera tarea que tenemos que realizar es identificar los hosts de la red que nos interesen y de esta manera reducir el rango de direcciones IP a las cuales realizarle un Port Scanning o Version Detection. Para realizar esta tarea debemos identificar que hosts están activos en la red utilizando diferentes técnicas:

List Scan [-sL]

Mediante una resolución inversa de DNS busca los nombres en la red de las direcciones IP que se indiquen:

$ nmap -sL 192.168.1.0/24

Ya que le pasamos como parámetro toda la red, en este caso verificará los nombres de los 254 hosts de la red. Con esta opción Nmap no envía ningún paquete a los hosts de la red siendo entonces un escaneo pasivo, simplemente verifica los nombres en la red de las IP’s pasadas como parámetro. Esta opción debe ser usada sin ningún otro parámetro ya que de lo contrario generará un error al ejecutar Nmap. Los hosts que aparecen aquí no necesariamente están activos en la red en el momento del sondeo.

Al final del sondeo nos muestra una lista que relaciona cada una de las IP con su respectivo nombre en la red. La siguiente salida la obtuve usando wireshark para verificar que solamente se hacen peticiones DNS en dicho sondeo:

$ nmap -sL 192.168.1.250-254
1  0.000000  192.168.1.6    192.168.1.254  DNS  86   Standard query ...
2  0.000030  192.168.1.6    192.168.1.254  DNS  86   Standard query ...
3  0.000039  192.168.1.6    192.168.1.254  DNS  86   Standard query ...
4  0.000047  192.168.1.6    192.168.1.254  DNS  86   Standard query ..
5  0.000055  192.168.1.6    192.168.1.254  DNS  86   Standard query ...
6  0.017477  192.168.1.254  192.168.1.6    DNS  163  Standard query ...
7  0.031365  192.168.1.254  192.168.1.6    DNS  163  Standard query ...
8  0.033979  192.168.1.254  192.168.1.6    DNS  163  Standard query ...
9  0.062687  192.168.1.254  192.168.1.6    DNS  163  Standard query ...
10 0.084612  192.168.1.254  192.168.1.6    DNS  163  Standard query ...

Se le indica a Nmap que revise las últimas cinco direcciones del segmento de red, en este ejemplo no interesa si se ejecuta como root o un usuario normal, el comportamiento de Nmap es el mismo, más adelante entederemos el por qué de esta aclaración.

Cuando estamos utilizando Nmap, debemos entender que la palabra ping no tiene el significado clásico de la herramienta por consola del mismo nombre que hace uso del protocolo ICMP mediante peticiones Echo Request/Reply. El ping en Nmap es buscar algún tipo de respuesta de los objetivos pero no solamente haciendo uso del protocolo ICMP sino utilizando otros como TCP, UDP e inclusive ARP como veremos más adelante.

No Port Scan [-sn]

La opción -sn le indica a Nmap que únicamente realice descubrimiento de sistemas (Host discovery) y que desactive el escaneo de puertos (Port Scanning), en las versiones anteriores de la herramienta se conocía como -sP:

$ nmap -sn 192.168.1.0/24

Nuevamente le pasamos como parámetro toda la red a Nmap, esto es conocido como barrido de ping, y no es muy útil si queremos pasar desapercibidos en la red en cuestión, también podemos pasar un rango menor de direcciones para no hacer tanto ruido en la red: 192.168.1.1-15 especificando de esta manera las primeras 15 direcciones de la red.

Nos imprimirá un listado de los hosts que respondieron:

Starting Nmap 6.00 ( http://nmap.org ) at ...
Nmap scan report for 192.168.1.6
Host is up (0.00038s latency).
Nmap scan report for dsldevice.lan (192.168.1.254)
Host is up (0.017s latency).
Nmap done: 256 IP addresses (2 hosts up) scanned in 20.93 seconds

De la manera que acabamos de ejecutar la herramienta Nmap, ésta utiliza Scan List y Ping SYN (-PS80,443) tipos de ping que veremos más adelante, y no usa durante todo el sondeo ningún paquete ICMP como se podría pensar, esto lo podemos comprobar mediante Wireshark pero en esta ocasión enviando solamente la IP del gateway:

$ nmap -sn 192.168.1.254
1 0.000000 192.168.1.6   192.168.1.254  TCP  74     51665 > http [SYN] ...
2 0.000032 192.168.1.6   192.168.1.254  TCP  74     36941 > https [SYN] ...
3 0.004078 192.168.1.254 192.168.1.6    TCP  60     http > 51665 [SYN, ACK] ...
4 0.004125 192.168.1.6   192.168.1.254  TCP  54     51665 > http [ACK] ...
5 0.004223 192.168.1.6   192.168.1.254  TCP  54     51665 > http [RST, ACK] ...
6 0.013084 192.168.1.254 192.168.1.6    TCP  60     https > 36941 [RST, ACK] ...
7 0.013371 192.168.1.6   192.168.1.254  DNS  86     Standard query ...
8 0.037796 192.168.1.254 192.168.1.6    DNS  163    Standard query ...

Analicemos que ha pasado aquí: Como se puede observar no se ha utilizado el protocolo ICMP, en vez de eso Nmap intenta realizar dos conexiones TCP a los puertos 80(http) y 443(https) del objetivo (las dos primeras lineas en la captura) enviando dos paquetes TCP con la bandera SYN activada, el cual es el primer paso de toda conexión TCP, como no es el momento de hablar del Ping SYN no analizaremos los siguiente paquetes, los últimos dos corresponden al Scan List que usa DNS. Con esto podemos comprobar que Nmap no ha utilizado el protocolo ICMP para realizar el sondeo.

Aquí vemos un dato curioso, como podemos ver que en la documentación de Nmap (en el apartado -sn) nos dicen que cuando un usuario diferente al root ejecuta la acción solamente se usa el Ping SYN a los puertos dichos anteriormente, pero la captura nos demuestra que además de esta se hace un Scan List, siendo este un comportamiento no documentado.

Al realizar el mismo sondeo pero ahora como usuario root, vemos que Nmap se comporta de una manera diferente, analizando la captura se puede observar que Nmap hace uso de un List Scan y ahora utiliza un Ping ARP. En esta ocación no usa el Ping SYN, las direcciones MAC de mi PC y de mi AP las he cambiado en la captura:

# nmap -sn 192.168.1.254
1 0.000000  aa:aa:aa:aa:aa:aa Broadcast          ARP  42     Who has 19...
2 0.030871  bb:bb:bb:bb:bb:bb aa:aa:aa:aa:aa:aa  ARP  60     192.168...
3 0.047947  192.168.1.6       192.168.1.254      DNS  86     Standard query ...
4 0.089047  192.168.1.254     192.168.1.6        DNS  163    Standard query ...

Nmap usa Ping ARP porque detecta que estamos haciendo un sondeo en nuestro mismo segmente de red, si quisiéramos obligarlo a que usara pings basados en IP usamos la opción –send-ip:

# nmap -sn --send-ip 192.168.1.254
1 0.000000   192.168.1.6    192.168.1.254  ICMP  42   Echo (ping) request...
2 0.000029   192.168.1.6    192.168.1.254  TCP   58   56467 > https [SYN]...
3 0.000036   192.168.1.6    192.168.1.254  TCP   54   56467 > http [ACK]...
4 0.000043   192.168.1.6    192.168.1.254  ICMP  54   Timestamp request...
5 0.002900   192.168.1.254  192.168.1.6    ICMP  60   Echo (ping) reply...
6 0.003458   192.168.1.6     ...           DNS   84   Standard query...
7 0.004536   192.168.1.254  192.168.1.6    TCP   60   https > 56467 [RST, ACK]...
8 0.006370   192.168.1.254  192.168.1.6    TCP   60   http > 56467 [RST]...
9 0.006588   192.168.1.254  192.168.1.6    ICMP  60   Timestamp reply...
10 0.034576  ...            192.168.1.6    DNS   161  Standard query...

Aquí podemos ver que Nmap ha usado cuatro técnicas diferentes para realizar el sondeo: Ping SYN (paquetes 2,3,7,8) Ping ICMP Echo Request (paquetes 1,5) Ping ICMP Timestamp Request (paquetes 4,9) y por último un Scan List (paquetes 6,10). Más adelante miraremos en detalle cada uno de estos tipos de ping por separado.