
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 バイトを割り当てますが、改行または null 終端文字を受信するまでそのバッファに書き込み続けます。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 行目のループで書き込まれ、その後 null 終端されます。修正方法は、550 行目を次に置き換えることです:
550 for(j=0;input[i]!='\n'&&input[i]&&j<10;i++,j++)