Friday, May 22, 2009

Seguridad por oscuridad y Http Headers

Que tiene que ver el taijitu ( el dibujo con el que se representa el ying y yang ) en esto de Http headers ?

Wikipedia nos da una ayuda sobre este concepto

"El
yin y yang es un concepto fundamentado en la dualidad de todo lo existente en el universo según la filosofía oriental, en la que surge. Describe las dos fuerzas fundamentales aparentemente opuestas y complementarias, que se encuentran en todas las cosas. En todo se sigue este patrón: luz/oscuridad, sonido/silencio, calor/frio, movimiento/quietud, vida/muerte, mente/cuerpo, masculino/femenino"


Bueno digamos que la mayoría de los sitios de seguridad ( este incluido ) estamos volcados a realizar posts mas basados en como aprovechar un exploit que mostrar como evitar ser víctimas de esos ataques.

Pero esta filosofía nos enseña que para que haya dia debe haber noche y para que haya verano debe existir el invierno. Asi que hoy vamos a poner un poco de equilibrio al universo.

Hoy el post sobre Http Headers mostrara como podemos utilizar el concepto de seguridad por oscuridad para agregar una capa mas de protección ( atención dije una capa mas, no dije que la única ) y asi defendernos de ataques "masivos".


Imaginemos que surge un worm con el ultimo bug de IIS6 + Webdav, seguramente el worm realizara un scanneo buscando que webservers ejecutan IIS6 para luego verificar si tienen WebDav. Si nuestro webserver responde que es un Apache o Lighttpd o directamente no entrega información, seguramente nos descartara.

Es bueno aclarar que esta protección no serviría de mucho ante un ataque puntualmente dirigido a nuestra infraestructura, hay otros métodos de conocer que Webserver esta corriendo un sitio.

Nota : Este tipo de modificaciones, se deben realizar previamente en un ambiente de HOMOLOGACION y no directamente en PRODUCCION.
Luego de verificado que no tenemos problemas, debemos aplicar el cambio en PRODUCCION teniendo preprarado un esquema de RECOVERY en caso de problemas en la implementacion.


Comencemos con los Headers de IIS 6.0.

IIS 6.0 :

UrlScan V2.5 es una herramienta de seguridad que restringe los tipos de peticiones HTTP que puede procesar IIS .

Podemos bajar URLSCAN 2.5 desde aqui.

UrlScan consta de dos archivos: UrlScan.dll y UrlScan.ini, juntos componen el paquete UrlScan.exe.

Por default es instalado en el siguiente directorio :

%windir%\system32\inetsrv\UrlScan


Para demostrar el funcionamiento del cambio realizado sobre los parámetros del Header voy a utilizar un pequeño script que hice en Python.

Aclaro que estoy aprendiendo un poco sobre Python en forma autodidacta, asi que posiblemente alguno encuentre errores en el codigo, ya que pase del "Hello World" directamente a esto.

#!/usr/bin/python
import urllib, urllister,sys
arg = ''+sys.argv[1]+''
usock = urllib.urlopen(arg)
usock.close()
print usock.info()

El script recibe como parámetro una URL y muestra el header del server.

Tengo instalado un Windows 2003 con IIS6 , al ejecutar el script antes de modificar el parámetro obtenemos :

xxxxxxx@nostromo:~/python$ ./manejodeurl-2.py http://10.10.10.4
Cache-Control: max-age=2592000
Content-Length: 1433
Content-Type: text/html
Content-Location: http://10.10.10.4/iisstart.htm
Last-Modified: Sat, 22 Feb 2003 01:48:30 GMT
Accept-Ranges: bytes
ETag: "06be97f14dac21:5897"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Sat, 23 May 2009 20:53:06 GMT
Connection: close

Ahora modifiquemos el parámetro :

RemoveServerHeader:1


Ejecutamos nuevamente el script :

xxxxxxx@nostromo:~/python$ ./manejodeurl-2.py http://10.10.10.4

Cache-Control: max-age=2592000
Content-Length: 1433
Content-Type: text/html

Content-Location: http://10.10.10.4/iisstart.htm

Last-Modified: Sat, 22 Feb 2003 01:48:30 GMT

Accept-Ranges: bytes

ETag: "06be97f14dac21:5897"
X-Powered-By: ASP.NET
Date: Sat, 23 May 2009 21:11:45 GMT

Connection: close


El header Server: Microsoft-IIS/6.0 desaparecio.

También podemos modificar el header para que muestre otros valores.

Dejando el parámetro :

RemoveServerHeader=0

y Cambiando el parámetro :

AlternateServerName=Apache/2.0

La respuesta del server sera :

Cache-Control: max-age=2592000

Content-Length: 214

Content-Type: text/html

Content-Location: http://10.10.10.5/index.htm

Last-Modified: Sun, 24 May 2009 18:51:28 GMT

Accept-Ranges: bytes

ETag: "10fa93a5a0dcc91:5897"

Powered-By: Apache/2.0

Server: Apache/2.0

Date: Sun, 24 May 2009 20:43:43 GMT

Connection: close





Aun asi, herramientas como HTTP PRINT detectan que se esta corriendo un IIS6 con un 71% de posibilidades, contra un 78% con el header incluido.

Es que HTTP PRINT realiza diferentes consultas al server y dependiendo de las respuestas, compara esta "firma" contra un patrón de firmas que posee en su base de datos.

Veamos las consultas que realiza HTTP PRINT

Como se puede apreciar realiza diferentes consultas, tanto validas, como invalidas.

Al ser IIS un paquete cerrado es muy dificil modificar su comportamiento para engañar a este tipo de herramientas. Únicamente mediante la utilización de software de terceros (ej: servermask), podemos logra un resultado mas satisfactorio.


Headers en Apache 2.0

En este webserver las cosas son un poco diferentes ya que al tener el codigo fuente podemos modificar la respuesta de Apache a ciertos pedidos.

Veamos como responde el servicio a una peticion antes de cualquier modificación.

XXXXXX@nostromo:~/python$ ./manejodeurl-2.py http://10.10.10.2

Date: Sun, 24 May 2009 15:29:49 GMT

Server: Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny2 with Suhosin-Patch

Last-Modified: Fri, 06 Mar 2009 22:03:58 GMT

ETag: "a4e-2d-4647a76288f80"

Accept-Ranges: bytes

Content-Length: 45

Vary: Accept-Encoding

Connection: close

Content-Type: text/html


Alli tenemos bastante información. Utilizando un modulo llamado mod_headers podemos eliminar esto, pero lamentablemente para quitar todo se necesita recompilar el código.

Modifiquemos los siguientes parámetros y veamos la respuesta :

Valor original

ServersTokens Full

Nuevo valor

ServersTokens Prod

Respuesta ante el pedido

Date: Sun, 24 May 2009 15:33:59 GMT

Server: Apache

Last-Modified: Fri, 06 Mar 2009 22:03:58 GMT

ETag: "a4e-2d-4647a76288f80"

Accept-Ranges: bytes

Content-Length: 45

Vary: Accept-Encoding

Connection: close

Content-Type: text/html

X-Pad: avoid browser bug


Podemos agregar otros valores para tratar de confundir, pero realmente ayudan de poco.

Header set "Motorola httpserver" processor
Header set Via "1.1 squid.proxy.companyx.com (Squid/2.4.STABLE6)"
Header set X-Cache "MISS from www.nonexistenthost.com"


Date: Sun, 24 May 2009 15:36:39 GMT

Server: Apache

Last-Modified: Fri, 06 Mar 2009 22:03:58 GMT

ETag: "a4e-2d-4647a76288f80"

Accept-Ranges: bytes

Content-Length: 45

Vary: Accept-Encoding

Motorola httpserver: processor

Via: 1.1 squid.proxy.companyx.com (Squid/2.4.STABLE6)

X-Cache: MISS from www.nonexistenthost.com

Connection: close

Content-Type: text/html



Para obtener verdaderos resultados contra programas como HTTP PRINT deberiamos instalar modsecurity, el cual actua como un firewall de aplicaciones.

Tengo que levantar una máquina virtual para poder recompilar Apache e instalar modsecurity, en un próximo post vamos a ver si podemos confundir los resultados de HTTP Print.

Un buen paper sobre http fingerprinting

Otro trabajo en el cual pueden encontrar informacion mas detallada

No comments: