Arquivo para servidore web

slowloris: um novo ataque DoS para servidores Web

Posted in seguranca, sysadmin with tags , , , , , , , , , , on 30-06-2009 by sirboderafael

depois de muito tempo sem postar… lah vai:

ha pouco tempo, surgiu um novo tipo de ataque DoS (Denial of Service), que afeta varios servidores Web utilizados amplamente no mercado… ele se destaca dos demais, pelo fato de voce nao precisar dispor de uma rede com inumeros computadores zumbis para parar o serviço http, por exemplo… com esse script, escrito em pearl, eh possivel degradar um servidor Web com apenas uma maquina, sem utilizar muita banda… eh realmente sinistro…

ele funciona enviando, atraves de um processo multi-thread, varias requisiçoes parciais ao servidor Web alvo, que na verdade, nunca sao completadas… servidores como o apache, mantem por um determinado tempo as conexoes tcp, entao o que acontece eh o seguinte: ele manda inumeras dessas requisiçoes maliciosas, nao as completando, espera um pouco mais e vai mandando mais varias levas de novas requisiçoes dessas… e por ai vai, esse processo fica se repetindo ateh que voce peça para ele parar… e o resultado? voce acaba atingindo o numero maximo de requisiçoes que o servidor Web suporta e a performance se torna altamente degradada, pois voce segura grande parte dessas conexoes consigo mesmo (pra nao dizer todas)… os demais visitantes vao ficar esperando, esperando, esperando e nada! pronto… voce acaba de ferrar com um servidor Web usando somente uma maquina e usando pouca banda… nao eh maravilhoso? (brincadeira pessoal…)

quando voce para o processo, depois de um tempinho o servidor Web volta a responder normalmente, pois ele manda pro espaço as conexoes que ficaram pra tras… mas isso acontece somente se voce enjoar de manter o servidor “fora do ar”… ele nao fica exatamente fora do ar, o que acontece eh que ele nao consegue por “time-sharing” encontrar meios de responder a todas as requisiçoes… geralmente uma ou outra requisiçoes externas, durante o ataque, sao sempre respondidas corretamente, mesmo que isso demore muito mais que o normal…

esse ataque degrada somente o servidor Web, diferente de muitos outros ataques DoS, que fazem com que a maioria (ou todos) os serviços parem de responder… tanto que se voce parar o processo de envio dos pacotes, o servidor volta a responder as requisiçoes… =D

o fato dele nao enviar uma requisiçao completa, e sim parcial, faz com que essas requisiçoes nao sejam registradas imediatamente nos logs… ou seja, voce pode estar “mandando ver” em um servidor ha alguns minutos e isso nao ser registrado em lugar algum… caracteristicazinha do mal essa, que ao meu ver, dificulta a vida dos administradores… quando o ataque para, dae sim sao registradas gazilhoes de requisicoes falhadas (status 400) nos logs… pode ser que nas futuras versoes do script se implementem uma maneira de completar as requisiçoes, quando o ataque parar, assim serao registrados codigos de status 200, ou seja, de sucesso (o que eh absolutamente normal, dependendo do servidor… hehehehe)… quem quiser, pode dar uma olhada nas lista de codigos de status http

quer testar a bagaça? (assuma seus riscos, recomendo testar em um servidor que seja seu…)

1) certifique-se que voce possui os seguintes modulos pearl instalados em sua maquina: IO::Socket::INET e IO::Socket::SSL, caso nao os tenha instalado, rode o seguinte (com privilegios apropriados, eh claro…)

root@bodacious:~ perl -MCPAN -e 'install IO::Socket::INET'
root@bodacious:~ perl -MCPAN -e 'install IO::Socket::SSL'

2) mande bala no seu alvo (um usuario nao-privilegiado convencional, roda isso numa boa):

bode@bodacious:~$ ./slowloris.pl -dns www.oenderecodoservidorquequeiraatacar.com

bom, dae voce pode entrar em seu navegador e pedir pra ele carregar alguma pagina do servidor alvo… se ele estiver na lista negra dos servidores afetados, com certeza o slowloris vai dar conta de degradar o serviço… recomendo a todos que leiam o link anterior, pois ele contem informaçoes extremamente relevantes e com certeza se mantera mais atualizado, ao longo do tempo, com relacao a este post… alem do que, foi a primeira referencia que tive contato para saber da existencia desse ataque… 😉

vi hoje que teve mais gente do brasil comentando sobre esse ataque… lah fora teve mais caras comentando, como em darknet.org.uk, wooga.drbacchus.com, hackaday.com e ha.ckers.org (que volto a frisar, recomendo a leitura, tem mais posts sobre o ataque)… teve inclusive um cara que re-implementou esse ataque em python e afirma oferecer mais controle sobre ele, o que pode tornar-lo ainda mais venenoso que o original…

nessa thread, o autor da mensagem afirma ter escrito um patch, denominado como ‘prova de conceito’ e que eh capaz de minimizar o efeito do ataque…

ja nessa thread, fala-se sobre o antiloris, que eh um shell-script feito pra rodar a cada minuto no servidor (tah, nao eh uma soluçao muito elegante, mas foi uma maneira que encontraram de se resolver o problema) como cron-job… o duro eh ter que ficar reiniciando o apache… analisando o script, se ve facilmente que ele identifica o IP do atacante (caso ele atinja um numero superior ao permitido de conexoes) e manda uma regra de iptables que começa a droppar todos os pacotes que vierem desse cara… bom, acompanhe a thread que voce ira tirar suas proprias conclusoes…

particularmente nao testei essas soluçoes, mas acredito que pelo menos para o apache, tudo se resolva tranquilamente limitando-se o numero de requisiçoes por endereço de IP, atraves do modulo mod_limitipconn… eis os links para apache 1.x e para apache 2.x

se puder vou postar, em breve, alguma coisa sobre essas diferentes soluçoes… se alguem souber alguma maneira melhor de se evitar esse tipo de DoS, as sugestoes com certeza serao bem apreciadas…

[]’s!
t++!