
webmod v0.48의 취약점에 대한 PoC 코드입니다. 원래 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 요청을 수신하면 Content-Length 값을 저장하기 위해 스택에 11바이트를 할당하지만, 개행 문자나 널 종결자를 받을 때까지 해당 버퍼에 씁니다. Content-Length 문자열이 158308바이트에 도달하면 EIP를 덮어쓰기 시작합니다. 이 숫자는 패딩으로 인해 Linux에서는 약간 다를 수 있습니다. 셸코드에 0x00, 0x0A, 0x0D가 포함되면 안 됩니다. 그렇지 않으면 소켓에서 데이터 읽기를 중단합니다.
이것은 셸코드를 실행하는 데 도움이 될 수 있습니다:
개념 증명 코드:
w48crash.c
참고: PoC에 사용된 "shellcode"는 Win2K SP4/kernel32.dll/user32.dll v5.0.2195.6688에서 실행되는 서버에서 작동하도록 특별히 하드코딩되어 있습니다. 그러나 실제 버퍼 오버플로는 모든 Windows 버전에서 그대로 작동합니다. 이를 테스트하려면 "our_eip" 전역 변수를 0xFFFFFFFF로 설정하여 단순히 크래시를 일으키면 됩니다.
원인/수정:
문제 코드는 server.cpp의 542-552행에 있습니다:
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';
542행에서 할당된 버퍼 clbuf는 550-551행의 루프로 값이 쓰여진 뒤 널 종결됩니다. 수정 방법은 550행을 다음으로 바꾸는 것입니다:
550 for(j=0;input[i]!='\n'&&input[i]&&j<10;i++,j++)