Usando Nmap para detectar Heartbleed

A estas alturas, pocas personas existirán que no hayan escuchado hablar de Heartbleed, considerado uno de los bug más críticos de la historia de internet.

No entraré en más explicaciones de Heartbleed, puesto que existen ya infinidad de sitios hablando de ello, aunque uno que explica todo muy claro lo tenéis en el blog Un Informático en el lado del mal.

En estos pasados días me ha tocado dedicarme exclusivamente a este bug en OpenSSL por lo que he debido informarme bien de en qué consistía exactamente hasta al mismo nivel del código fuente.

Una vez entendido ha tocado escanear una gran cantidad de IPs para comprobar qué hosts eran vulnerables. En esta ocasión me centro en servidores que pueden estar dando servicios que usan OpenSSL vulnerable, aunque no olvidéis que los clientes también pueden serlo.

Dado que la cantidad de IPs a escanear superaba los pocos miles, debía automatizar el scanning de alguna manera. Voy a explicar sin entrar en mucho detalle cómo fue el proceso.

Aclarar que he utilizado BackTrack 5 RC2 y Nmap 6.25.

1ª Situación

Cuando empecé el chequeo no existía exploit, tan sólo la web que todos conocemos para comprobar online si una aplicación bajo un dominio y puerto es vulnerable.

Por lo tanto el proceso sería usar nmap con fingerprinting de los servicios y una vez localizados aquellos servicios que podrían estar usando una versión vulnerable de OpenSSL comprobarlos en la web. Inviable dada la gran cantidad de IPs a comprobar.

2ª Situación

Sale el primer exploit en Python. Por lo tanto la idea cambia. Analizar qué servidores tiene esas servicios abiertos y crear un script para correr el exploit en esos servidores. Tedioso.

3ª Situación

Sale el primer script para nmap para comprobar Heartbleed. Suena perfecto. Tras unos cuantos escaneos me doy cuenta de que nmap me esta dando algunos falsos negativos, es decir, servidores que son de hecho vulneables, nmap los muestra como no vulnerables. Toca analizar a mano algunos de ellos aunque muchos otros ya son marcados correctamente gracias al script.

¿Situación final?

Sale una modificación del script para nmap que hace también Hearbeat request usando TLS 1.0, TLS 1.1 y TLS 1.2. En problema de los falsos negativos en la etapa anterior venía de que el script sólo comprobaba TLS 1.1.

El nuevo script podéis encontrarlo aquí . Se instala igual que cualquier otro script para nmap. En BackTrack (BT BT!!!) bajáis el fichero .nse y lo metéis en directorio usr/local/share/nmap/scripts/ 

En mi instalación de nmap por defecto el script me daba error ya necesita la librería tls para realizar conexiones «seguras» (si es que las hay hoy en día, un saludo  para la NSA por cierto). Para instalar esta librería debéis descargarla de aquí y alojar el fichero .lua en nselib de vuestro nmap.

Ya tenemos todo listo para escanear. Este es el comando que yo he usado:

 # nmap -iL ip_ranges -sV –top-ports 100 –script ssl-heartbleed -oA nmap_heartbleed_results

Breve explicación del comando:

-iL ip_ranges: ip_ranges es un fichero plano con todas las IPs a escanear. Muy útil cuando la cantidad es grande. Podemos incluir ahí IPs individuales, rangos de Ips, IPs de red con máscara… Se puede poder una en cada línea y mezclando formatos.

 –top-ports 100: Nmap escaneará sólo los 100 puertos más comunes. Esta clasificación está basada en el fichero nmap-services y cogerá aquellos 100 puertos con el ratio más alto. En mi caso era suficiente para cubrir los servicios más importantes que podrían utilizar OpenSSL.

–script ssl-heartbleed: Hacer uso del script para este bug.

-oA nmap_heartbleed_results: Cuando uso nmap, acostumbro a sacar los resultados en todos los formatos posibles, de modo que podremos grepearlos a nuestro antojo, exportar XML a otros formatos, etc.

No dudéis en reducir el scan sólo a los puertos que realmente queráis comprobar, ahorraréis tiempo.

Una vez tengáis los resultados, podréis exportarlos a un bonito HTML con la aplicación xsltproc.

Ahora a reportar y parchear, que la ocasión lo merece.

Podéis encontrarme en twitter: @ciyinet

PD: no tengo a mano los resultados por lo que no puedo publicar ninguna captura. Aún así, no os debe resultar difícil encontrar un servidor vulnerable o montar el vuestro propio para las pruebas.