Confundiendo a los malos (I)
Sigo con la costumbre que he cogido hace poco de escribir un post a la semana en el metro, de camino al curro. Hoy toca otro tema curioso: cómo engañar a los malos.
De qué va este post
Vamos a ver cómo, cambiando tres líneas en el servidor web, puedes confundir a un atacante.
Por qué querría confundir a un atacante
Puede que estés muy orgulloso de tu Apache, de tu Tomcat, de tu Nginx o del que sea. Pero no deja de ser software, y el software tiene fallos.
Aunque lo tengas parcheado y bien configurado, es imposible conocer todos los ataques. Y menos los que no son públicos, que son justo los que te pueden pillar.
Contra eso no hay mucho que hacer, salvo mitigar o prevenir. Así que te propongo algo un poco distinto: engañar a quien intente atacarnos.
Cómo engañamos a un atacante
Hay muchísimas formas de hacerlo. Hoy solo vamos a ver una pincelada. El objetivo es este: cuando un atacante se conecte a nuestro servidor web, que crea que tiene delante un servidor distinto del que hay instalado.
Es decir, cambiar el banner del servidor web por otro.
¿Suena tonto? Sí, lo es. Pero ya verás lo efectivo que resulta.
Cómo lo hacemos
Lo voy a explicar con Nginx, que es mi preferido, pero el concepto vale para cualquier otro. Manos a la obra.
Primero instalamos el paquete nginx-extras:
sudo apt-get install nginx-extras
Después añadimos esto al fichero de configuración de Nginx:
# vim /etc/nginx/nginx.conf
http {
...
server_tokens off;
server_name_in_redirect off;
more_set_headers 'Server: Microsoft-IIS/8.5';
...
Qué hemos hecho
Le hemos dicho al servidor que sustituya la cabecera Server que devuelve al usuario por la que le hemos indicado.
Y aquí viene un matiz importante: ¿qué valor ponemos ahí?
No hay una respuesta exacta. Mi recomendación es que, si quieres engañar a un “malo”, construyas una mentira plausible. Cuando analice tu servidor, lo que vea tiene que ser creíble.
¿Y cómo la hacemos creíble? Fácil.
Lo primero que va a usar cualquier atacante para identificar tus sistemas es nmap, ¿verdad? Pues si conseguimos engañar a nmap, es bastante probable que engañemos al “malo”.
Cómo nos identifica nmap
Aunque no lo parezca, engañar a nmap es muy fácil.
La parte de red es algo más compleja, cierto. Pero la identificación de los servicios que hay detrás de cada puerto la hace, casi toda, con simples expresiones regulares.
Nmap tiene una base de datos con esas expresiones. Lo único que necesitamos es que nuestro banner encaje con una de ellas en el puerto 80 o el 443. ¿A que ahora parece más fácil? :)
Si te fijas, el banner que elegí arriba coincide con una de las expresiones de esa base de datos:
(5070) match http m|^HTTP/1\.1 400 .*\r\nServer: Microsoft-IIS/(\d[-.\w]+)\r\n| p/Microsoft IIS httpd/ v/$1/ o/Windows/ cpe:/a:microsoft:iis:$1/ cpe:/o:microsoft:windows/a
En la versión 7.01 de nmap esa expresión está en la línea 5070.
El fichero lo tienes aquí:
Mac:
/opt/local/share/nmap/nmap-service-probes
Kali Linux:
/opt/share/nmap/nmap-service-probes
Demostración
No sé tú, pero yo no me creo nada que no pueda comprobar :) Y en este caso comprobarlo es muy sencillo. Un nmap al puerto de nuestro servidor y…

Conclusiones
Un par de cosas para terminar:
- Este tipo de técnicas se llaman técnicas anti-fingerprinting.
- En el ejemplo hemos usado nmap, pero te invito a probar con Nessus, OpenVAS o similares. Verás cómo orientan las pruebas al servidor que les has dicho, así que los resultados que saquen no tendrán ningún sentido.
Iré contando más técnicas sencillas de anti-fingerprinting. Ya verás que no es tan complicado engañar a los malos :)
Chau!