
Código PoC para la vulnerabilidad en webmod v0.48. Escrito originalmente en 2007, asignado CVE-2007-1260.
por cybermind (Kevin Masterson)
[email protected]
Sitio de WebMod (archivado): https://web.archive.org/web/20080517044559/http://djeyl.net/w.php
Versiones vulnerables:
0.48, tanto Win32 como Linux. Las versiones anteriores pueden ser vulnerables. Esto debería funcionar con cualquier versión de HLDS.
Tipo de vulnerabilidad:
DoS, ejecución remota de código bajo el usuario con el que se ejecuta HLDS.
Descripción: Al recibir una petición HTTP POST, asigna 11 bytes en la pila para almacenar el valor de Content-Length, pero escribe en ese búfer hasta que recibe un salto de línea o un terminador nulo. Cuando tu cadena Content-Length alcanza los 158308 bytes, comienza a sobrescribir el EIP. Este número puede ser ligeramente diferente en Linux debido al padding. Tu shellcode no debe contener 0x00, 0x0A o 0x0D, o de lo contrario dejará de leer datos del socket.
Esto puede ayudarte a ejecutar tu shellcode:
Código de prueba de concepto:
w48crash.c
Nota: El "shellcode" utilizado en el PoC está hardcodeado específicamente para funcionar con un servidor que ejecuta Win2K SP4/kernel32.dll/user32.dll v5.0.2195.6688. Sin embargo, el desbordamiento de búfer real funcionará tal cual en cualquier versión de Windows. Para probarlo, puedes establecer la variable global "our_eip" a 0xFFFFFFFF para simplemente causar un crash.
Causa/Corrección:
El código problemático está en las líneas 542-552 de 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';
El búfer, clbuf, asignado en la línea 542, se rellena con el bucle de las líneas 550-551, y luego se añade el terminador nulo. La corrección consiste en sustituir la línea 550 por:
550 for(j=0;input[i]!='\n'&&input[i]&&j<10;i++,j++)