
Easy File Sharing Web Server 7.2におけるSEHベースのバッファオーバーフロー - 認証されたHTTP POSTパラメータが例外ハンドラチェーンを破壊する方法の実証
Easy File Sharing Web Server 7.2 における SEH ベースのバッファオーバーフロー。認証された HTTP POST パラメータが例外ハンドラチェーンを破壊する方法を示しています。
このリポジトリは、メモリ破壊エクスプロイトを教える際に使用する教材の一部です(通常の業務に加えて、さまざまなサイバーセキュリティコースで教鞭をとり、次世代のリバースエンジニアの育成を支援しています)。
CVE-2018-18912 は、単純な EIP 上書きから SEH ベースのエクスプロイトに移行するために使用するケースです。学生が直接リターンアドレス上書きの仕組みを理解したら、次のステップとして、スタックが破壊されすぎてプログラムがリターン前に例外をトリガーする場合に何が起こるか、そして例外ハンドラチェーンが代わりに攻撃対象となることを理解します。この CVE はその移行を明確に示しています。オーバーフローは SEH チェーンに到達するのに十分な深さがあり、エクスプロイトのパスは、すべてのエクスプロイト開発者が理解すべき古典的な POP POP RETN テクニックに従います。ROP によるオプションの DEP バイパスは、さらに進みたい学生のための拡張として残されています。同じオーバーフロー、異なるガジェット戦略、はるかに難しい問題です。
この脆弱性は、Easy File Sharing Web Server 7.2 に影響を与えます。これは、単純なファイル共有に広く使用されていた軽量な Windows ウェブサーバーアプリケーションです。このソフトウェアは、現代のセキュリティ緩和策を考慮せずに書かれていました。教育の観点からこのケースが特に興味深いのは、関与する要因の組み合わせです:
この組み合わせにより、CVE-2018-18912 は基本を超えたエクスプロイト開発技法を教えるための優れたケースとなっています。
Easy File Sharing Web Server 7.2 は、ユーザーが HTTP 経由でファイルを共有できる Windows アプリケーションです。ファイルブラウジング、ユーザー認証、組み込みのフォーラムシステムなどの機能が含まれています。
フォーラム機能は、新しいトピックを作成するための POST リクエストを受け付けます。このエンドポイントで処理されるフォームフィールドの 1 つは author パラメータです。内部的には、アプリケーションはこのユーザー制御の値を、長さを検証せずに固定サイズのスタックバッファにコピーします。
この脆弱性は 2018 年に発見され報告されました。その後すぐに元の PoC が公開され、クラッシュと、バンドルされた ImageLoad.dll モジュールからの ROP ガジェットを含む動作するエクスプロイトチェーンの両方を示しています。
主な技術的詳細:
Easy File Sharing Web Server は、ユーザーが新しいフォーラムトピックを作成するときに、/forum.ghp への HTTP POST リクエストを処理します。受け入れられるパラメータの 1 つは author であり、長さチェックなしでローカルのスタックバッファにコピーされます。
バイナリをリバースエンジニアリングすると、このフォームフィールドのハンドラが固定サイズのバッファと安全でないコピー操作を使用していることが観察できます。脆弱なロジックの簡略化されたバージョンは次のようになります:
char author_buffer[64];
strcpy(author_buffer, user_input);
宛先バッファは固定サイズであり、入力長が検証されないため、author フィールドに十分に長い文字列を送信すると、コピーがバッファの終端を超えて書き込まれます。
より多くのデータが書き込まれるにつれて、スタックレイアウトが破壊されます。単純なリターンアドレスの上書きとは異なり、オーバーフローはスタックに保存された構造化例外ハンドラ (SEH) チェーンに到達します。破壊されたスタックの結果として例外がトリガーされると、OS は SEH チェーンを辿り、攻撃者が制御するハンドラアドレスに制御を移します。
したがって、エクスプロイトの流れは SEH 上書きテクニックに従います:
これにより、この脆弱性は基本的な EIP 上書きよりもエクスプロイトが複雑になりますが、現実世界のシナリオをよりよく代表するものになります。
クラッシュは、有効な認証情報で認証した後、/forum.ghp への POST リクエストの author パラメータに長い文字列を送信することで再現できます。Python を使用した例:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 500
request = (
b"POST /forum.ghp?forumid=1 HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Content-Type: application/x-www-form-urlencoded\r\n"
b"Cookie: UserID=test; PassWD=test; SESSIONID=1234\r\n"
b"Connection: close\r\n"
b"\r\n"
b"author=" + payload + b"&passwd=test&title=test&content=test&Submit=Submit\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
デバッガで実行すると、クラッシュは破損した SEH チェーンとアクセス違反を示し、ユーザー制御のデータが例外ハンドラポインタを上書きしたことを確認できます。
このリポジトリの目標は、クラッシュを示すだけでなく、実際の SEH ベースのエクスプロイトを開発する際に使用される方法論に従って、完全なエクスプロイトプロセスを段階的に説明することです。
メインの README を整理するために、詳細なエクスプロイトノート、スクリプト、デバッガの手順は、このリポジトリの Vulnerability 📂 フォルダ内に配置されています。
そこには、この CVE をエクスプロイトするために使用された完全なワークフローが含まれています: