3.3.2.4. NMAP
Tabla de contenidos:
Nmap: Escaneo de puertos y servicios
NMAP es probablemente la herramienta gratuita para el escaneo de puertos y servicios en hosts más usada en todo el mundo. Con unos 25 años de existencia, sigue siendo una herramienta imprescindible para administradores de redes y servicios y expertos en seguridad informática. Es muy versátil y fácil de usar una vez se comprende el funcionamiento de los parámetros. Actualmente, a pesar de sus años, sigue recibiendo actualización de versiones para estar al día con las nuevas versiones de software de servicios.
NMAP está disponible en cualquier versión de Kali Linux. También existen versiones para Windows y una versión gráfica (ZENMAP). La página principal del proyecto contiene información de uso y descarga para diferentes Sistemas Operativos (https://nmap.org/):
Funciona a través de consola de línea de comandos. Desde Kali Linux introduciendo nmap en la consola se pueden ver todas las opciones de parametrización, siendo el uso corriente el que se indica:
nmap [Scan Type] [Options] [targets]
Respecto a los targets, NMAP permite incluir diferentes opciones: nombre de host, dominio o IP. También se pueden hacer escaneos para toda una red, introduciendo la notación CIDR (p. ej.: 192.168.1.0/24) o indicando asterisco en alguno de los octetos (p. ej.: 192.168.1.*). Se puede hacer escaneo de varios targets a la vez, separando cada uno de ellos con espacio:
nmap [Scan Type] [Options] target1 target2 target3 …
La sintaxis para utilizar los parámetros en NMAP es compleja, pero tal y como se indica a groso modo se debe indicar una técnica de escaneo y después las diferentes opciones, que incluye desde reconocimiento de Sistema Operativo, forma de escanear, incluir información de versión de servicio, etc. Si no se indica ningún parámetro NMAP realizará un escaneo básico sobre los 10000 primero puertos (1-10000), indicando si el host está activo y que puertos están abiertos:
Con el escaneo básico no se obtiene mucha más información de la que se puede obtener con hping por ejemplo. No obstante, NMAP es una herramienta mucho más desarrollada que contiene una base de datos sobre el comportamiento de los diferentes servicios y software del mercado, pudiendo ir más allá y determinando información importante para posteriormente escoger un exploit.
La cuestión principal es que las técnicas de escaneo y las opciones permiten establecer un escaneo más o menos intenso, es decir, generando más o menos ruido. El ruido puede encender las alarmas en el software de detección de intrusos, por lo que conviene estudiar cuales son las opciones a parametrizar. A continuación se detallan las técnicas de escaneo y opciones más destacadas, con una breve descripción:
ESCANEO DE HOST | |
-Pn | Omitir técnica de PING en el escaneo. Se recomienda incluirla siempre por defecto. |
-sn | Solo PING, omitiendo escaneo de puertos. |
TECNICAS DE ESCANEO | |
-sT | Establece conexión completa con el host destino (Three-way Handshake). Genera mucho ruido y el proceso es lento aunque permite obtener más información que otros métodos. |
-sS | Establece método de escaneo con paquetes de datos que contienen el bit de control SYN. No es tan eficiente como la opción –sT pero es menos agresiva. |
-sF / -sX / -sN | Técnicas de escaneo Stealth FIN, Xmas Tree y Null Scan. Son opciones diseñadas para hacer el menor ruido posible. |
TECNICAS DE ESCANEO (2) | |
-sU | Escaneo para puertos protocolo UDP. |
-sO | Técnica IP Scan, para ver que protocolos soporta el host escaneando los diferentes puertos. No es muy fiable. |
TECNICAS DE ESCANEO: FIREWALL | |
-sI <zombie_host> | Para emplear la técnica IDLE Scan, que puede determinar si existe un Firewall bloqueando las peticiones. Se verá en siguientes apartados. |
-sA | Técnica ACK Scan. Permite mapear las reglas del Firewall. Se verá en siguientes apartados. |
ESPECIFICACIÓN DE PUERTOS | |
-p | Especificar puertos a escanear. Ejemplos: -p22; -p1-65535; U:53,111,T:21-25,80 |
DETECCIÓN DE SERVICIO Y VERSION EN PUERTO | |
-sV | Determinar versión y software de los puertos abiertos. |
–version-intensity <level> | Determinar intensidad para el escaneo de versión de servicio. Level = 0 – 9. |
–version-light | Pruebas de versión de servicio reducido (poco ruido). |
–version-all | Prueba todas las técnicas para ver la versión del servicio. |
DETECCION SO | |
-O | Habilitar escaneo de Sistema Operativo. |
OTRAS OPCIONES |
|
-A | Escaneo intenso. Habilita detección de SO, versión de servicios, uso de scripts y trazado de ruta (genera mucho ruido). |
-F | Técnica de fast scan. Se realiza un escaneado rápido de los puertos más habituales, para ver si están disponibles. |
-v | Incorpora mayor información sobre el proceso. Es prescindible. |
-d | Añade información del proceso (debugging mode). |
-f | Opción para fragmentar los paquetes enviados. |
-T[n] | Determina la frecuencia en tiempo de envío de paquetes, de menos a más. El valor de n tiene que estar entre 1 y 5. A mayor cantidad, más rápido se hará el escaneo pero generará más ruido. |
A priori, todos los parámetros son opcionales y se pueden combinar las técnicas de escaneo, los modos (intenso o rápido) y la detección de versión de servicio. No obstante, es preferible mantener una coherencia y orden a la hora de seleccionar los parámetros, adaptándose a la situación (si conviene o no generar ruido y hacer un escaneo más o menos intenso). Si por ejemplo se tiene el permiso completo para inspeccionar los hosts de una red, el modo -A permite obtener casi toda la información de un plumazo. Sin embargo, si el objetivo es escanear un puerto en concreto sin disparar las alarmas antiintrusos, será conveniente escoger un tipo de escaneo y opciones más sutiles. El siguiente comando y gráfico, permiten establecer el orden adecuado en NMAP a la hora de realizar la sintaxis de una instrucción:
nmap [scan_technique: -sT, -sS…] –sV -p[puertos] –T[n] –O [-A / -F] –v –Pn [service_version_detection] [target]
Como puede observarse, las combinaciones posibles son casi ilimitadas y hay que atender al sentido común. En ejemplo de abajo, se realiza un escaneado ligero, con la técnica SYN y detección de servicios ligero, para un determinado rango de puertos (sin PING). La información obtenida se muestra claramente:
NMAP obtiene la información de forma pasiva, y el éxito en la recogida de información dependerá de la sutileza con la que se realiza el escaneo, manteniendo un equilibrio con el ruido que se va a generar (pues a más ruido, también se obtendrá más información…). Como en otros softwares de escaneo, NMAP utiliza como referencia una base de datos sobre el comportamiento esperado para un software y versión determinado, por lo que en muchas ocasiones proporciona información en base a probabilidades.
3.3.2.4.1. Zenmap
Como ya se ha comentado, existe una versión gráfica para NMAP denominada ZENMAP. Esta versión estaba incluida por defecto en anteriores versiones de Kali Linux pero a la hora de escribir esto ya no se encuentra disponible ni tan siquiera en los repositorios de descarga de software. Aun así, se puede descargar el fichero .RPM en la web de NMAP e instalarlo siguiendo las instrucciones (P. ej.: https://phoenixnap.com/kb/install-rpm-packages-on-ubuntu).
Esta versión resulta útil para familiarizarse con el uso de NMAP y como existe también una versión para Windows se puede probar a instalar y usar primero en este Sistema Operativo (ir a sección de descargas de la web de NMAP, justo encima de la opción Linux RPM). El funcionamiento es muy sencillo: se introduce un target y se selecciona alguno de los métodos de escaneo que propone la aplicación, después se da al botón scan y realiza todo el proceso, mostrando el resultado de forma más amigable que en la consola de comandos. Comentar que antes de realizar el escaneo, se pueden modificar los parámetros a conveniencia:
3.3.2.4.2. Nmap Scripting
NMAP puede ir más allá del escaneo de puertos y servicios de un host, pudiendo obtener otra información adicional a parte del software, versión y Sistema Operativo. Para ello implementa un sistema de scripting denominado NSE (Nmap Scripting Engine). Los script son complementos que ejecutan instrucciones específicas usando librerías de funciones de NMAP. Existen una multitud de scripts dedicados a servicios y categorías específicas.
El sistema de scripting de NMAP se basa en el lenguaje de programación LUA (https://www.lua.org/) y puede encontrarse extensa documentación sobre su funcionamiento en la web de NMAP (https://nmap.org/book/nse.html). Un usuario con conocimientos avanzados podría llegar a crear sus propios scripts. En este epígrafe se va a realizar una pequeña descripción de la búsqueda, funcionamiento y uso de un script.
En Kali Linux, las librerías de funciones y código de los scripts se almacenan en los directorios indicados a continuación (repositorios nslib y scripts respectivamente). Al acceder al repositorio de scripts, estos se pueden listar. Los scripts tienen un formato de fichero con extensión .nse, siendo el nombre del fichero la forma de identificar un script.
Librería de funciones: /usr/share/nmap/nselib
Scripts: /usr/share/nmap/scripts
Aunque a simple vista puede parecer que haya muchos scripts, estos están organizados en categorías. La categoría de un script puede identificarse a través del código (se puede abrir un fichero de script con algún editor de texto) y permite posteriormente localizarlos y emplearlos con los comandos adecuados de NMAP.
Un script puede tener más de una categoría y existen diferentes categorías, cada una de ellas con una función específica: auth, broadcast, brute, exploit, fuzzer… Aunque por el nombre se puede intuir la función, a continuación se describen algunas de estas categorías:
- default: Son scripts genéricos. Se emplean también en la forma intensiva de escaneo (opción -A).
- auth: Scripts de tipo autenticación.
- safe: Scripts no intrusivos.
- vuln: Scripts para descubrir vulnerabilidades de software.
A través de la ayuda de NMAP, se muestra cómo es la anotación para el uso de los script. Aunque aquí se tratará de simplificar.
De forma general, los scripts se pueden combinar con las tipos de escaneo y las opciones (todas), de acuerdo al siguiente esquema (se añaden al final, antes del target).
nmap [Scan Type] [Options] [scripts] [targets]
Antes de seguir con el uso de scripts, conviene destacar el sistema de localización y carga de scripts, que funciona igual tanto para buscar información de uno o varios scripts, así como emplearlos con un escaneo. Principalmente se emplea como input el nombre exacto del script, la categoría, una palabra clave o una palabra clave y categoría. Así pues, siendo el comando para localizar scripts e información de uso –script-help, el comando a emplear sería, dependiendo del caso:
nmap --script-help=
nmap --script-help=
nmap --script-help=<"palabra_cable*">
nmap --script-help=<"palabra_cable*" and [categoria]>
A continuación, algún ejemplo. En la información del script a parte de la categoría, uso, etc. se añade la URL con información al detalle, que siempre es interesante consultar, sobre todo en aquellos que no pertenecen a la categoría default, pues normalmente requieren añadir algún parámetro adicional.
Respecto al uso y parametrización de un script si se da el caso, la sintaxis sería la siguiente, donde selección_script se puede indicar alguna de las opciones para el comando de ayuda (por nombre, categoría, etc.) y n1=v1… indicaría el nombre del parámetro 1 y el valor de este primer parámetro. En cualquier caso, si no se indica un script específico, NMAP cargará todos aquellos que considere dentro del filtro y los empleará a la vez.
nmap [Scan Type] [Options] --script --script-args=n1=v1… [targets]
Partiendo de esta base hay que tener en cuenta si el uso de scripts es o no conveniente. Por lo general, todos los scripts ejecutan tareas de escaneo específicas sobre un puerto y esto conlleva generar gran ruido. Por otro lado, se puede seguir la estrategia de emplear de forma masiva todos los scripts de tipo default con el parámetro –A o –sC (equivalente a –script default). Aunque puede ser una forma intensiva de conseguir información adicional sobre todos los puertos y servicios, es también el camino directo a encender todas las alarmas en un servidor. Por lo tanto, la recomendación es evitar el uso masivo de scripts, y centrarse en el uso de algún script habiendo localizado previamente un puerto abierto y el servicio que proporciona.
A continuación un ejemplo en el que se muestra un escaneo no ruidoso (abajo) para identificar si existe un servicio en el puerto 3306, normalmente usado para el servicio de base de datos mysql. Arriba se muestra el mismo escaneo pero cargando todos los scripts según indica el filtro. Como se observa, los scripts proporcionan información adicional importante, aunque no exenta de ruido en cualquier caso: