Hacking ético: identificación de servicios con nmap

En el anterior post de hacking ético, explicamos de forma somera diversas opciones para conseguir una enumeración de direcciones IP y subdominios a la hora de realizar un proceso de ethical hacking. Si os gustó aquello de “esto es muy seguro porque quién va a saber que existe este subdominio” (que aunque no os lo podáis creer, es más habitual de lo que parece), no os perdáis cómo acaba de mal el “quién va a saber que pongo este servicio en este puerto con un número tan raro”…

En definitiva, en este post vamos a tratar de ver cómo es posible realizar un inventario de puertos abiertos en una IP o rango de IPs, e incluso identificar la tecnología que hay debajo de un puerto abierto, cuando ello es posible.

Básicamente este post se va a centrar en el uso de una herramienta fantástica e imprescindible, nmap. Aunque es una herramienta típicamente usada en Linux (y por supuesto incluida dentro de la suite de referencia que utilizo en estos posts, Kali), se pueden encontrar ya compilaciones para otros sistemas operativos.

Antes de entrar en faena, queremos avisar de que nmap es una herramienta compleja y completa, con una enorme cantidad de opciones, parámetros, etc.; este post no pretende ser un manual de uso de la herramienta sino nuevamente una introducción a la misma para entender la identificación de servicios como fase del ethical hacking previa a la detección de vulnerabilidades. Para conocer más sobre la herramienta, recomendamos la lectura de su manual en castellano.

La herramienta Open Source nmap nos permite realizar escaneos de redes y puertos, pudiendo escanear un único destino, un rango, una lista de IPs… se basa en peticiones TCP, UDP, ICMP, SCTP, etc. e incorpora diversas técnicas de escaneo.

Recomendamos en general refrescar algo de conocimiento sobre protocolos de transporte, por ejemplo recordando cómo funciona el establecimiento de una conexión TCP con la negociación en tres pasos: primero, llamada de tipo SYN desde el cliente a un puerto, respuesta RST si el puerto está cerrado o SYN-ACK si está abierto, y el ACK desde el cliente al servidor para completar el proceso. nmap se basará en este tipo de mensajes para determinar si un puerto está escuchando o no en el destino.

En ocasiones esto no se puede utilizar, o es detectado por el servidor remoto, y existen otras alternativas para el escaneo.

Sintaxis general y primer escaneo

Sintaxis general:


nmap [  ...] [  ] {  }

A continuación, procedemos a realizar el primer escaneo:

Ejecutamos el comando:


nmap 45.33.49.119

No estamos poniendo ningún tipo de sondeo, por lo que usa el sondeo por defecto, TCP SYN. nmap envía un SYN y asume que el puerto está abierto si recibe un SYN ACK. Tampoco hay ningún parámetro adicional de opciones, y como destino hay una única IP. Este comando nos dará un resultado similar al siguiente:


Starting Nmap 7.70 ( https://nmap.org ) at 2019-10-01 18:12 CEST
Nmap scan report for ack.nmap.org (45.33.49.119)
Host is up (0.19s latency).
Not shown: 993 filtered ports
PORT      STATE  SERVICE
22/tcp    open   ssh
25/tcp    open   smtp
70/tcp    closed gopher
80/tcp    open   http
113/tcp   closed ident
443/tcp   open   https
31337/tcp closed Elite

Nmap done: 1 IP address (1 host up) scanned in 10.86 seconds

Devolviéndonos en pocos segundos un listado de puertos abiertos en dicha IP, incluyendo un SSH, un servidor de correo SMTP, un servidor web, y un posible back orifice.

En muchas ocasiones simplemente esto ya es un primer punto de análisis aunque, por ejemplo, el software que haya detrás de un servidor FTP, SSH, etc., esté totalmente actualizado y no haya vulnerabilidades conocidas. Ya de primeras se podría, por ejemplo, lanzar un ataque de fuerza bruta con diccionario sobre el SSH o FTP intentando acceder (hay una enorme cantidad de servidores de este tipo con credenciales por defecto o inseguras).

Existen herramientas automáticas (bots) que básicamente están continuamente escaneando amplios rangos de IPs buscando puertos abiertos reconocibles, por ejemplo de base de datos (MongoDB, MySQL, PostgreSQL, etc.), y cuando detectan un puerto así abierto, automáticamente intentan un login con credenciales por defecto. Por ejemplo, en el caso de instalaciones típicas LAMP / WAMP, un acceso root / al puerto mySQL. Y básicamente así se han hackeado una enorme cantidad de bases de datos sin intervención humana previa. Esto es viable incluso aunque lo tengamos abierto en otro puerto, dado que es posible identificar en muchos casos que eso que hay en el puerto 5555 “para despistar”, por decir algo, es un mySQL a través del fingerprint del servicio, como veremos más adelante.

En resumen, es muy peligroso dejar credenciales por defecto en servidores web, routers, FTPs, SSHs, bases de datos… porque no hace falta que nadie os tenga manía, un bot lo hará.

Escanear ips con nmap

Un primer parámetro

Si queremos tener un poco de información sobre cómo ha obtenido nmap esta información, podemos aumentar las trazas con el parámetro -v (verbose) o -vv, donde podemos ver que nmap ha estado lanzando comandos SYN y en algunos casos recibiendo RESET (puerto cerrado), en otros SYN-ACK (puerto abierto) y en otros ningún tipo de respuesta (“filtered”), lo cual nos puede hacer entender que un firewall está parando nuestra petición:


PORT            STATE           SERVICE         REASON
22/tcp          open            ssh             syn-ack ttl 53
25/tcp          open            smtp            syn-ack ttl 53
70/tcp          closed          gopher          reset ttl 52
80/tcp          open            http            syn-ack ttl 53
113/tcp         closed          ident           reset ttl 52
443/tcp         open            https           syn-ack ttl 53
31337/tcp       closed          Elite           reset ttl 53

Aumentando el rango de IPs a escanear

nmap nos permite determinar rangos de IPs a escanear de diversos modos (se recomienda analizar el manual o utilizar –help para una información más completa). Por ejemplo:


nmap 192.168.10.0/24 (subred completa)
nmap 192.168.10.1-20 (20 IPs)
nmap 192.168.10.*
nmap 192.168.10.1 192.168.10.2 192.168.10.3

O por ejemplo, imaginemos que hemos ido acumulando IPs desde nuestra enumeración inicial, y tenemos un fichero con las distintas IPs separadas por tabuladores o saltos de línea (una IP o rango por línea). Podemos cargar el fichero con el parámetro -iL (input list) y realizar así el escaneo de todo el inventario de IPs. También permite, por ejemplo, excluir algunas IPs concretas con –exclude o –excludefile.

Definiendo los puertos a escanear

Podemos definir manualmente los puertos que queremos escanear. Por ejemplo, si buscamos servidores web en puertos 80, 443 y 8080 en una subred podríamos hacerlo con el parámetro -p:


nmap -p 80,443,8080 192.168.10.0/24

También podemos pedirle a nmap que escanee los “N” (número entero) puertos más comunes; por ejemplo, para escanear los 25 puertos más comunes en un rango de IPs:


nmap --top-ports 25 192.168.10.0/24

Recibiendo una respuesta como esta:


PORT     STATE     SERVICE
21/tcp    closed   ftp
22/tcp    open     ssh
23/tcp    closed   telnet
25/tcp    closed   smtp
53/tcp    open     domain
80/tcp    open     http
110/tcp   closed   pop3
111/tcp   open     rpcbind
135/tcp   closed   msrpc
139/tcp   open     netbios-ssn
143/tcp   closed   imap
199/tcp   closed   smux
443/tcp   closed   https
445/tcp   open     microsoft-ds
587/tcp   closed   submission
993/tcp   closed   imaps
995/tcp   closed   pop3s
1025/tcp  closed   NFS-or-IIS
1720/tcp  closed   h323q931
1723/tcp  closed   pptp
3306/tcp  closed   mysql
3389/tcp  closed   ms-wbt-server
5900/tcp  open     vnc
8080/tcp  closed   http-proxy
8888/tcp  closed   sun-answerbook

Podemos pedir que se escaneen todos los puertos TCP, UDP y SCTP (más lento) con el identificador -p- :


nmap -p- 192.168.10.0/24

Identificando sistemas operativos y servicios

Como vemos, nmap nos permite detectar puertos que están escuchando en una IP o un rango. Posteriormente veremos además cómo se pueden definir otras técnicas de sondeo. Además, nmap nos permite intentar identificar qué tecnología (producto, versión, etc.) hay detrás de un puerto abierto, o incluso el sistema operativo instalado en un servidor, con los parámetros -O y -sV. Esta detección se basa en la “firma” (fingerprint) de las respuestas que da el servicio a determinadas llamadas.


nmap -O -sV 192.168.10.5

PORT         STATE         SERVICE       VERSION
22/tcp       open          ssh           OpenSSH 6.7p1 Raspbian 5+deb8u3 (protocol 2.0)
53/tcp       open          domain        ISC BIND 9.9.5 (Raspbian Linux 8.0 (Jessie based))
80/tcp       open          http          Apache httpd 2.4.10 ((Raspbian))
111/tcp      open          rpcbind       2-4 (RPC #100000)
139/tcp      open          netbios-ssn   Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp      open          netbios-ssn   Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
4567/tcp     open          http          Jetty 9.4.8.v20171121
5900/tcp     open          vnc           RealVNC Enterprise 5.3 or later (protocol 5.0)
MAC Address: B8:27:EB:CD:FE:89 (Raspberry Pi Foundation)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
Service Info: Host: RASPBERRYPI; OS: Linux; CPE: cpe:/o:linux:linux_kernel

En este caso, no solamente sabemos que esta máquina tiene determinados puertos abiertos. También nos dice que es una Raspberry corriendo Raspbian (con lo que, por ejemplo, podríamos hacer una prueba de fuerza bruta con un usuario “pi”, que es el usuario por defecto), y las versiones de los distintos puertos que están escuchando, de forma que esta información puede ser utilizada para explotar vulnerabilidades sobre versiones no parcheadas, etc.

Utilizando más técnicas de sondeo

Por defecto nmap utiliza SYN como técnica de sondeo. Es una técnica rápida y poco intrusiva / detectable, pero en ocasiones , pero soporta en total 12 técnicas distintas que podemos definir como parámetros, tal como podemos ver en el manual de uso de la herramienta.

Por ejemplo, si queremos hacer un escaneo basado en llamadas UDP, podemos hacer una llamada del tipo:


nmap  -sU 192.168.10.5

Buscando vulnerabilidades con nmap

Si bien existen herramientas más “cómodas” y específicas para la búsqueda de vulnerabilidades, como por ejemplo Nessus, o suites como Metasploit que consolida diversas herramientas, nmap también nos permite realizar análisis de vulnerabilidades.

Para ello, utiliza una serie de scripts Lua que están ubicados en una ruta de nuestra máquina (en el caso de Kali, en /usr/share/nmap/scripts/ ) y que se pueden invocar con –script o su equivalente -sC.

Los scripts pueden pertenecer a una o varias categorías, de forma que podemos pedir a nmap que evalúe, por ejemplo, todos los scripts de una categoría contra un host. Hay algunas categorías especialmente interesantes como “vuln” (scripts dedicados a detectar vulnerabilidades en el destino), “exploit”, etc.

Por ejemplo, si queremos escanear los scripts de categoría vulnerabilidad contra un host:


nmap --script vuln scanme.nmap.org

PORT       STATE      SERVICE
22/tcp     open       ssh
80/tcp     open       http
| http-csrf: 
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=scanme.nmap.org
|   Found the following possible CSRF vulnerabilities: 
|     
|     Path: http://scanme.nmap.org:80/
|     Form id: cse-search-box-sidebar
|_    Form action: https://nmap.org/search.html
|http-dombased-xss: Couldn't find any DOM based XSS. | http-enum:  |   /images/: Potentially interesting directory w/ listing on 'apache/2.4.7 (ubuntu)' |  /shared/: Potentially interesting directory w/ listing on 'apache/2.4.7 (ubuntu)'
| http-slowloris-check: 
|   VULNERABLE:
|   Slowloris DOS attack
|     State: LIKELY VULNERABLE
|     IDs:  CVE:CVE-2007-6750
|       Slowloris tries to keep many connections to the target web server open and hold them open as long as possible.  It accomplishes this by opening connections to the target web server and sending a partial request. By doing so, it starves the http server's resources causing Denial Of Service.
|     Disclosure date: 2009-09-17
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750
|_      http://ha.ckers.org/slowloris/
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
9929/tcp  open  nping-echo
31337/tcp open  Elite

Como vemos, el script ha detectado una potencial vulnerabilidad basada en el ataque de denegación de servicio de Slowloris. Si analizamos los scripts que hay en la ruta mencionada anteriormente, vemos que precisamente hay uno que explota esta vulnerabilidad, llamado http-slowloris. Si queremos más información sobre el script podemos lanzar el siguiente comando:

nmap --script-help http-slowloris

Explicándonos cómo funciona el script, cómo lanzarlo (es posible hacerlo también con el propio nmap con –script y –script-args), etc. Podemos también obtener por ejemplo una descripción de todos los scripts que buscan vulnerabilidades:

nmap --script-help vuln

También podemos por ejemplo lanzar todos los scripts de un tipo determinado. Por ejemplo, si queremos escanear vulnerabilidades sobre protocolo SMB en un host determinado:

nmap --script smb-* 192.168.10.5

También podemos, por ejemplo, evaluar una vulnerabilidad sobre toda nuestra red, escogiendo un script concreto contra un rango. El parámetro –script

nmap --script-help vuln
nmap --script

En definitiva, nmap incluye incluso opciones interesantes para evaluar vulnerabilidades e incluso lanzar exploits, si bien existen otras herramientas utilizadas comúnmente para este propósito.

Buscando vulnerabilidades con nmap

Otras opciones interesantes

Como hemos comentado, nmap tiene muchísimas opciones y es imposible tratar de cubrir ni siquiera un pequeño porcentaje en un post. De hecho, existe un libro oficial de nmap de casi 500 páginas… pero en todo caso intentamos comentar aquí algunas que parecen interesantes.

  • La herramienta permite generar el resultado del escaneo en un fichero output procesable, por ejemplo, en formato XML, con -oX o -oN .
  • Cuando escaneamos amplios rangos de IPs, podemos desactivar el intento de resolución inversa de DNS con el parámetro -n.
  • Durante la ejecución de un comando podemos aumentar el nivel de información mostrada en consola (verbosity) pulsando la tecla “V”.
  • Si tenemos un firewall que nos corta, podemos probar con -Pn

En definitiva, hemos intentado desarrollar una “breve” introducción a nmap como herramienta de identificación de puertos abiertos y servicios en un host o rango de IPs. En posteriores posts veremos otras formas de detectar vulnerabilidades.