
PoC-код для уязвимости в webmod v0.48. Изначально написан в 2007 году, присвоен CVE-2007-1260.
от cybermind (Kevin Masterson)
[email protected]
Сайт WebMod (архивировано): https://web.archive.org/web/20080517044559/http://djeyl.net/w.php
Уязвимые версии:
0.48, как Win32, так и Linux. Предыдущие версии могут быть уязвимы. Эта уязвимость должна работать с любой версией HLDS.
Тип уязвимости:
DoS, удаленное выполнение кода от имени пользователя, под которым запущен HLDS.
Описание: При получении HTTP POST-запроса он выделяет 11 байт в стеке для хранения значения Content-Length, но записывает в этот буфер до тех пор, пока не будет получен символ новой строки или нулевой терминатор. Когда ваша строка Content-Length достигает 158308 байт, начинается перезапись EIP. Это число может немного отличаться в Linux из-за выравнивания. Ваш shellcode не должен содержать 0x00, 0x0A или 0x0D, иначе чтение данных из сокета будет остановлено.
Это может помочь в выполнении вашего shellcode:
Код доказательства концепции:
w48crash.c
Примечание: "shellcode", используемый в PoC, жестко задан для работы с сервером на Win2K SP4/kernel32.dll/user32.dll v5.0.2195.6688. Однако само переполнение буфера будет работать на любой версии Windows. Для тестирования можно установить глобальную переменную "our_eip" в 0xFFFFFFFF, чтобы просто вызвать крах.
Причина/Исправление:
Проблемный код находится в строках 542-552 файла 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';
Буфер clbuf, выделенный в строке 542, заполняется циклом в строках 550-551, а затем завершается нулевым символом. Исправление заключается в замене строки 550 на:
550 for(j=0;input[i]!='\n'&&input[i]&&j<10;i++,j++)