En el post de hoy les vamos a comentar acerca de un software libre de escaneo de redes. En muchos artículos, libros y películas relacionadas con la seguridad informática se menciona la herramienta Nmap como una de las más importantes utilidades en lo que a seguridad se refiere.
¿Qué es Nmap?
Nmap (Network mapper) es una utilidad de software libre para explorar, administrar y auditar una red de ordenadores. Fue diseñado por Gordon Lyon (más conocido como Fyodor Vaskovich) y su desarrollo se encuentra hoy a cargo de una comunidad. Fue diseñado originalmente para Linux aunque, actualmente puede utilizarse en múltiples plataformas.
Entre sus utilidades podemos encontrar que detecta hosts online, escanea los puertos y servicios corriendo a través de ellos, sistema operativo, firewalls, etc. Principalmente esta herramienta es utilizada para 3 cosas:
- Auditorias de seguridad
- Pruebas rutinarias de escaneo de redes
- Recolección de información para futuros ataques
Muchas de las técnicas de escaneo incluidas en Nmap están basadas en el protocolo TCP. Este protocolo está orientado a conexión que se utiliza para ofrecer servicios de red y una buena parte de su funcionalidad se debe a los flags que podemos encontrar en los segmentos TCP.
Además cabe destacar los pasos que siguen en un establecimiento de sesión TCP
El host que inicia la sesión envía un segmento con el flag SYN activo. El receptor, si está a la escucha, devolverá un segmento con los flags SYN y ACK activos, a lo que el emisor responderá con un segmento con el flag ACK activo. Durante estos pasos, ambos extremos habrán realizado la comunicación, estableciendo así la comunicación entre ellos.
Según la respuesta de la máquina, Nmap puede utilizar la información obtenida para conocer mucha más información acerca del host de destino. Al escanear un puerto, nmap nos dará una vista muy detallada, entre la que podemos encontrar 6 tipos de estados diferentes para los mismos:
- Abierto -> La aplicación está a la escucha en el puerto, es decir, acepta conexiones que pueden ser TCP o UDP.
- Cerrado -> El puerto recibe los paquetes de Nma y responde con un paquete RST (Reset), pero no hay ninguna aplicación a la escucha. Detectar que puertos están abiertos y cuales cerrados puede ayudarnos a identificar el sistema operativo.
- Filtrado -> Los paquetes no llegan al puerto y por lo tanto no puede decidir si está abierto o cerrrado. Esto indica que tenemos delante algún tipo de cortafuegos.
- No filtrado -> Este estado sólo lo marcará cuando está realizando un escaneo ACK, que explicaremos más adelante. No hay cortafuegos pero, el escaneo no es suficiente para identificar el estado del puerto.
- Abierto|filtrado -> Los escaneos UDP, IP, FIN, Null y Xmas pueden darnos este resultado al no poder determinar si el puerto se encuentra abierto o filtrado.
- Cerrado|filtrado -> Este resultado sólo lo dará al realizar un escaneo IPID pasivo y se debe a que no puede determinar si el puerto se encuentra cerrado o filtrado.
Con los conceptos aclarados empezaremos instalando Nmap en nuestro ordenador.
Instalación de Nmap en Linux
Para instalar Nmap en nuestro sistema Linux, podemos lanzar el comando e instalarlo desde el repositorio
# Nmap en debian y distribuciones basadas en debian.
=> sudo apt-get install nmap -y
# Centos,RedHat,Fendora.
=> sudo yum -y install nmap
# FreeBSD
=> sudo pkg install nmap
O descargando los ficheros y compilarlo nosotros, para ello descargamos la última versión de nmap desde su página oficial
root@evil:~# wget https://nmap.org/dist/nmap-version.tgz
root@evil:~# tar -xzf nmap-version.tgz
root@kali:~# cd nmap-version
root@kali:~# ./configure
root@kali:~# make
root@kali:~# make install
Y ya tendríamos listo Nmap para su uso y disfrute.
Escaneo básico con Nmap
Empezaremos realizando el escaneo más básico de Nmap, en el que no utilizaremos ninguna de las muchas opciones de las cuales dispone.
Para comenzar, podemos escanear una red o subred completa, para ello el comando sería el siguiente
root@kali:~# nmap 192.168.1.0/24
y nos mostraría un resultado similar al siguiente
Una vez descubiertas las máquinas disponibles en la subred, podemos escanear una en concreto, colocando la ip de dicho host
root@kali:~# nmap 192.168.1.135
En el escaneo de la máquina podemos ver que tiene abiertos varios puertos como 135, 139 o 445. También esto nos ayuda a identificar el sistema operativo, por ejemplo el puerto 445, utilizado en máquinas Windows para compartir recursos de red nos indica que se trata de una máquina Windows, aunque veremos más adelante como averiguar exactamente de que OS se trata.
Escaneo TCP Syn
El escaneo TCP Syn, también llamado escaneo semi-abierto porque no se completa todo el proceso. La idea es evitar que quede registrado el escaneo en la máquina objetivo. Para esto, Nmap envía un segmento SYN y queda a la espera de recibir el SYN-ACK, pero aunque lo reciba no cerraría el saludo (handshake). De esta forma no llega a iniciarse sesión y es probable que la máquina no lo guarde en el registro.
Vamos a probarlo con la máquina Windows de la prueba anterior, para ello lanzamos el siguiente comando
root@kali:~# nmap -sS 192.168.1.135
Escaneo TCP Connect
Este tipo de escaneo, es muy similar al escaneo TCP Syn con la diferencia de que nos arriesgamos mucho más a que nuestra actividad quede registrada.
Para ello, lanzaríamos el siguiente comando
root@kali:~# nmap -sT 192.168.1.135
Como vemos, la información obtenida en ambos casos es similar pero, en esta segunda opción, las posibilidades de ser descubiertos son muy superiores.
Escaneo FIN, Null y Xmas
Si el cortafuegos está configurado para interceptar los paquetes SYN, bloquearía los dos escaneos que hemos realizado hasta ahora. Una de las posibilidades para saltar este cortafuegos sería utilizar el escaneo FIN, en el cual Nmap enviará los paquetes sólo si el flag SYN está activo.
Para ello lanzaríamos el siguiente comando
root@kali:~# nmap -sF 192.168.1.135
Otras opciones de intentar evitar los cortafuegos sería utilizar los escaneos Null o Xmas. El objetivo de estos escaneos es saltarse la protección de un cortafuegos básico. Si el cortafuegos no espera la llegada de estos paquetes, podría ocurrir que no supiera lo que hacer con ellos y los dejara pasar, pero esto no quiere decir que funcione siempre. Por suerte, la mayoría de cortafuegos ya saben como frenarlo y no caer en la trampa, pero esto no quiere decir que no funcione.
Para lanzar estos escaneos lo haríamos con los siguientes comandos
# escaneo Null
root@kali:~# nmap -sN 192.168.1.135
# escaneo Xmas
root@kali:~# nmap -sX 192.168.1.135
Como acabamos de comprobar, el resultado de estos 3 últimos comandos, nos muestra el resultado open|filtered al escanear los puertos. Más arriba lo mencionamos y esto nos demuestra que estamos ante algún tipo de cortafuegos que nos deniega el acceso.
Escaneo UDP
Cambiando de protocolo, podemos obtener diferentes resultados, debido principalmente a que este protocolo no siempre es bloqueado por los cortafuegos. Los últimos comandos no dieron los resultados esperados, vamos a probar ahora con este protocolo.
Para ello lanzamos el siguiente comando
root@kali:~# nmap -sU 192.168.1.135
Ahora nos aparece abierto el puerto 137, correspondiente al servicio de Netbios y que suele ser indicativo de una máquina de Microsoft, aunque todavía no podemos asegurarlo.
Hay que tener en cuenta también que es habitual que los host abran y cierren los puertos en determinados momentos, por lo cual es una buena práctica, realizar el escaneo en diferentes momentos para intentar obtener diferentes resultados.
Escaneo TCP ACK
Este tipo de escaneo es diferente al resto porque no intenta determinar si los puertos están abiertos. El objetivo de este escaneo es detectar el tipo de cortafuegos que tenemos delante.
La sonda enviada sólo contiene el flag ACK activo. Si el puerto no responde o devuelve un paquete ICMP “destination unreachable”, consideramos que el puerto esta filtrado por el cortafuegos. Si por el contrario, devuelve un paquete RST, se clasificaría como “unfiltered”, es decir, que es alcanzable.
En este caso lanzaremos el comando sobre una máquina Linux con Ubuntu y con el cortafuegos desactivado sobre el puerto 22 y después sobre la máquina windows con el cortafuegos activado, sobre el puerto 137.
Para Linux el comando sería
root@kali:~# nmap -sA -vv -n -p 22 192.168.1.136
donde cada opción significa
- -sA -> realiza el escaneo TCP ACK
- -vv -> modo verbose
- -n -> evita el intento de resolución DNS inversa para acelerar el proceso
- -p puerto -> indicamos el puerto sobre el cual queremos realizar el escaneo
Al no tener el cortafuegos activado, podemos apreciar como el puerto 22 no se encuentra filtrado, lo que quiere decir que podemos alcanzarlo.
Para windows
root@kali:~# nmap -sA -vv -n -p 137 192.168.1.135
Por el contrario, en Windows sí está activado el cortafuegos, y para el caso del puerto 137 sí está siendo filtrado por el cortafuegos, imposibilitando nuestro acceso al mismo.
Escaneo TCP WIndow
Este tipo de escaneo funciona de forma similar al escaneo TCP ACK, estudia el cortafuegos que tenemos delante, pero con la diferencia que si puede alcanzar el puerto, identifica si el puerto que escaneamos se encuentra abierto o cerrado. El flag ACK se envía activo en la sonda y se analiza el campo del tamaño de ventana de la respuesta. En algunos sistemas, este campo tiene un valor positivo si está abierto y negativo si está cerrado.
Vamos a lanzarlo sobre la máquina Ubuntu, que no tiene activo el cortafuegos, para ver con claridad la información obtenida. El comando sería:
root@kali:~# nmap -sW -vv -n -p 22 192.168.1.136
Vemos claramente que hemos podido acceder al puerto y su estado es closed, es decir, cerrado. Esto no quiere decir que podamos fiarnos siempre de este escaneo, como ya mencioné anteriormente, es necesario realizar escaneos en diferentes momentos para asegurarnos de que la información que obtenemos es fiable.
Comandos más utilizados en Nmap
En nmap podemos acceder a la guía completa de comandos con el comando
root@kali:~# nman nmap
O acceder a ellos pero sin demasiada explicación con
root@kali:~# nmap -h
root@kali:~# nmap --help
Pero os vamos a dejar alguna tabla con los más utilizados de todos ellos
-iL file Se pasa un fichero con el listado de objetivos a escanear
-iR num Escanea objetivos aleatorios
–exclude host Excluir equipos
–excludefile file Se pasa un fichero con los objetivos a excluir
-Pn no realiza ping
-sL lista los equipos
-sn ping sweep
-PR ping arp
-ps puerto ping arp al puerto o puertos especificados
-PS puerto ping tcp ack al puerto o puertos especificados
-PU puerto ping udp al puerto o puertos especificados
-PY puerto ping sctp al puerto o puertos especificados
-PE ping icmp
-PM ping icmp address mask
-6 habilita el escaneo ipv6
-sS escaneo TCP Syn
-sT escaneo TCP Connect
-sF escaneo FIN
-sN escaneo Null
-sX escaneo Xmas
-sU escaneo UDP
-sW escaneo TCP Window
-sO escaneo IP Protocol
-sA realiza el escaneo TCP ACK
-vv modo verbose
-n evita el intento de resolución DNS inversa para acelerar el proceso
-p puerto indicamos el puerto sobre el cual queremos realizar el escaneo
Comandos DNS
-PO protocolo escanea el protocolo especificado
-n/-R Resolver DNS nunca/siempre
–dns-servers server Especifica los servidores a escanear
–traceroute muestra además el trazado de ruta
-p min-max escanea el rango de puertos especificado
–top-ports escanea los puertos más utilizados
Escaneo
-sV identifica servicios y versiones
–allports escanea todos los puertos posibles
–version-intensity num especifica la intensidad del escaneo de 0-9 (min-max), hay que tener cuidado ya que el uso de esta acción hace mucho ruido en la máquina objetivo
–version-light escaneo en intensidad 2
–version-all escaneo en intensidad 9
–version-trace traza la actividad del análisis de versiones
Sistema Operativo
-A activa la detección de OS, version, script y traceroute
-O detecta el OS
–osscan-limit limita la detección
–osscan-guess realiza un escaneo más agresivo
Evsión de Firewall y suplantación
-f fragmenta paquetes de 8 bits
-mtu fragmenta paquetes múltiplos de 8 bits
–daa-length gestiona el tamaño del paquete
–randomize-host utiliza objetivos aleatorios
-D host[hostx] utiliza señuelos
-S ip envía paquetes a una ip destino específica
–spoof-mac mac envía tramas de ethernet a la mac objetivo
-g puerto envía paquetes desde el puerto especificado
-e interface define la interfaz de red a utilizar
Bueno esto ha sido todo por ahora, próximamente realizaré algunos post utilizando esta herramienta en una práctica lo más real posible. Cualquier duda o sugerencia en los comentarios.