
Code PoC pour la vulnérabilité dans webmod v0.48. Écrit à l'origine en 2007, il s'est vu attribuer l'identifiant CVE-2007-1260.
par cybermind (Kevin Masterson)
[email protected]
Site WebMod (archivé) : https://web.archive.org/web/20080517044559/http://djeyl.net/w.php
Versions vulnérables :
0.48, à la fois Win32 et Linux. Les versions précédentes peuvent être vulnérables. Cela devrait fonctionner avec n'importe quelle version de HLDS.
Type de vulnérabilité :
DoS, exécution de code à distance sous l'utilisateur sous lequel HLDS s'exécute.
Description : Lors de la réception d'une requête HTTP POST, il alloue 11 octets sur la pile pour stocker la valeur de Content-Length, mais écrit dans ce tampon jusqu'à ce qu'un saut de ligne ou un terminateur nul soit reçu. Une fois que votre chaîne Content-Length atteint 158308 octets, elle commence à écraser l'EIP. Ce nombre peut être légèrement différent sur Linux en raison du padding. Votre shellcode ne doit pas contenir 0x00, 0x0A ou 0x0D, sinon il cessera de lire les données du socket.
Cela peut aider à exécuter votre shellcode :
Code de preuve de concept :
w48crash.c
Remarque : Le "shellcode" utilisé dans le PoC est codé en dur pour fonctionner spécifiquement avec un serveur tournant sur Win2K SP4/kernel32.dll/user32.dll v5.0.2195.6688. Le débordement de tampon réel fonctionnera tel quel sur n'importe quelle version de Windows, cependant. Pour le tester, vous pouvez définir la variable globale "our_eip" sur 0xFFFFFFFF pour simplement provoquer un crash.
Cause/Correctif :
Le code problématique se trouve aux lignes 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';
Le tampon, clbuf, alloué à la ligne 542, est écrit via la boucle des lignes 550-551, puis terminé par un nul. Le correctif consiste à remplacer la ligne 550 par :
550 for(j=0;input[i]!='\n'&&input[i]&&j<10;i++,j++)