
Codice PoC per la vulnerabilità in webmod v0.48. Scritto originariamente nel 2007, a cui è stato assegnato CVE-2007-1260.
di cybermind (Kevin Masterson)
[email protected]
Sito di WebMod (archiviato): https://web.archive.org/web/20080517044559/http://djeyl.net/w.php
Versioni vulnerabili:
0.48, sia Win32 che Linux. Le versioni precedenti potrebbero essere vulnerabili. Questo dovrebbe funzionare con qualsiasi versione di HLDS.
Tipo di vulnerabilità:
DoS, esecuzione remota di codice con l'utente con cui HLDS è in esecuzione.
Descrizione: Quando riceve una richiesta HTTP POST, alloca 11 byte sullo stack per memorizzare il valore di Content-Length, ma scrive in quel buffer finché non riceve un newline o un terminatore null. Dopo che la stringa Content-Length raggiunge i 158308 byte, inizia a sovrascrivere l'EIP. Questo numero potrebbe essere leggermente diverso su Linux a causa del padding. Il tuo shellcode non deve contenere 0x00, 0x0A, o 0x0D altrimenti smetterà di leggere i dati dal socket.
Questo potrebbe aiutare a eseguire il tuo shellcode:
Codice proof-of-concept:
w48crash.c
Nota: lo "shellcode" usato nel PoC è hardcoded specificamente per funzionare con un server in esecuzione su Win2K SP4/kernel32.dll/user32.dll v5.0.2195.6688. L'overflow del buffer effettivo funzionerà comunque così com'è su qualsiasi versione di Windows. Per testarlo, puoi impostare la variabile globale "our_eip" a 0xFFFFFFFF per causare semplicemente un crash.
Causa/Correzione:
Il codice problematico si trova nelle righe 542-552 di 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';
Il buffer, clbuf, allocato alla riga 542, viene scritto con il ciclo alle righe 550-551, e poi terminato con null. La correzione consiste nel sostituire la riga 550 con:
550 for(j=0;input[i]!='\n'&&input[i]&&j<10;i++,j++)