
War FTP Daemon 1.65における古典的なスタックベースのバッファオーバーフロー。不正なFTPコマンドによる旧式のリモートコード実行を示しています。
War FTP Daemon 1.65 における古典的なスタックベースのバッファオーバーフロー。不正なFTPコマンドを通じた昔ながらのリモートコード実行を示しています。
このリポジトリは、メモリ破壊の悪用を教える際に使用する教材の一部です(通常の業務に加えて、さまざまなサイバーセキュリティコースで教鞭をとり、次世代のリバースエンジニアの育成に貢献しています)。
CVE-2007-1567 は、バニラなEIP上書きの基本を紹介した直後に使用するケースです。悪用は明快で直接的なものですが、通常の最初の練習問題よりも少し興味深い詳細が含まれています。FTPプロトコルが導入する追加の不良文字であり、学生はシェルコードを構築する際にこれを特定して考慮する必要があります。小さな制約ですが、学生が既に使用した手法を単にコピーするのではなく考えるのに十分です。
War FTP Daemon 1.65 は1990年代後半のレガシーWindows FTPサーバです。脆弱性はUSERコマンドハンドラにあり、sprintfを使用してユーザー制御の入力を固定サイズのスタックバッファに長さを検証せずにコピーします。このケースが教育に役立つ理由:
War FTP Daemon は1990年代後半に作成されたWindows用FTPサーバです。TCPポート21で待機し、標準的なFTPコマンドを処理します。脆弱性はUSERコマンドハンドラにあり、接続クライアントから送信されたユーザー名をsprintfで長さ検証なしに処理します。
主な技術的詳細:
War FTP Daemon はUSERコマンドを処理する際、指定されたユーザー名をsprintfに渡し、長さをチェックせずに固定サイズのスタックバッファにコピーします。脆弱なロジックの簡略版は次のようになります:
char buffer[256];
sprintf(buffer, "%sCRLF", username);
USER引数として十分に長い文字列を送信すると、コピーがバッファの終端を超えて書き込まれ、保存されたリターンアドレスが上書きされるまでスタックを破壊します。関数が戻るとき、CPUはスタックから攻撃者が制御する値をEIPにロードし、そこにジャンプします。
クラッシュは、FTP経由で過大なUSER引数を送信することで再現できます。認証は不要です。Pythonを使用した例:
import socket
HOST = '127.0.0.1'
PORT = 21
payload = b"A" * 700
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.recv(1024)
s.send(b"USER " + payload + b"\r\n")
s.close()
デバッガ上で実行すると、クラッシュはEIPがユーザー制御のデータで上書きされたことを示します:
EIP = 41414141
保存されたリターンアドレスがオーバーフローによって破壊されたことを確認します。
このリポジトリの目的は、クラッシュを実証するだけでなく、ファジングから動作するリバースシェルに至るまで、完全な悪用プロセスを段階的に説明することです。
メインのREADMEをすっきり保つため、詳細な悪用ノート、スクリプト、デバッガの手順は、このリポジトリの Vulnerability 📂 フォルダに配置されています。
そこには、このCVEを悪用するために使用された完全なワークフローが含まれています: