
Código PoC para vulnerabilidade no webmod v0.48. Originalmente escrito em 2007, atribuído CVE-2007-1260.
por cybermind (Kevin Masterson)
[email protected]
Site do WebMod (arquivado): https://web.archive.org/web/20080517044559/http://djeyl.net/w.php
Versões vulneráveis:
0.48, tanto Win32 quanto Linux. Versões anteriores podem estar vulneráveis. Isso deve funcionar com qualquer versão do HLDS.
Tipo de vulnerabilidade:
DoS, execução remota de código sob o usuário que o HLDS está executando.
Descrição: Ao receber uma requisição HTTP POST, ele aloca 11 bytes na pilha para armazenar o valor de Content-Length, mas escreve nesse buffer até que uma nova linha ou terminador nulo seja recebido. Após a string Content-Length atingir 158308 bytes, começa a sobrescrever o EIP. Esse número pode ser ligeiramente diferente no Linux devido ao padding. Seu shellcode não deve conter 0x00, 0x0A ou 0x0D, caso contrário, ele parará de ler dados do socket.
Isso pode ajudar na execução do seu shellcode:
Código de prova de conceito:
w48crash.c
Nota: O "shellcode" usado no PoC é codificado especificamente para funcionar com um servidor executando no Win2K SP4/kernel32.dll/user32.dll v5.0.2195.6688. No entanto, o estouro de buffer real funcionará como está em qualquer versão do Windows. Para testar isso, você pode definir a variável global "our_eip" como 0xFFFFFFFF para simplesmente causar uma falha.
Causa/Correção:
O código problemático está nas linhas 542-552 em server.cpp:
542 char clbuf[11];
543
544 for(i=0;(size_t)i<strlen(input)-17;i++)
545 {
546 if(!strnicmp(input+i,"\nContent-Length: ",17))
547 {
548 LOG_DBG_SERVER(("Content-length spotted"));
549 i+=17;
550 for(j=0;input[i]!='\n'&&input;[i];i++,j++)
551 clbuf[j]=input[i];
552 clbuf[j]='\0';
O buffer, clbuf, alocado na linha 542, é escrito com o loop nas linhas 550-551, e então terminado com nulo. A correção é substituir a linha 550 por:
550 for(j=0;input[i]!='\n'&&input[i]&&j<10;i++,j++)