| 項目 | 詳細 |
|---|
| 脆弱性 | CVE-2021-41773 — Apache 2.4.49 パストラバーサル / RCE |
| 対象サービス | ポート 8080 上の Apache HTTP Server |
| 影響を受けるバージョン | Apache/2.4.49 (Unix) |
| 根本原因 | ap_normalize_path() における正規化順序の欠陥 |
| 影響 | 任意ファイル読み取り → mod_cgi 経由のリモートコード実行 |
| 使用ツール | curl |
Apache 2.4.49 では、ap_normalize_path() による URL の処理方法が変更されました。Apache は、../ を含むリクエストパスをファイルシステムに到達する前にブロックすることになっています。しかし、トラバーサルフィルターは、URL の完全なデコードが行われる前に実行されます。
つまり、二重エンコードされたシーケンス .%2e/ を使用するリクエストは、フィルターによって ../ として認識されません。ところが、Apache がパスを OS に渡すと、.%2e/ は ../ として解決され、トラバーサルフィルターはすでにバイパスされた状態になります。
これ単体でも Web ルート外の任意ファイル読み取りが可能になります。影響が致命的になるのは mod_cgi と組み合わさった場合です。トラバーサルパスが CGI 有効ディレクトリ(例: /cgi-bin/)内の /bin/sh のような実行可能ファイルに解決されると、Apache はそれを CGI スクリプトとして実行し、HTTP POST ボディをその標準入力に渡すため、リモートコマンド実行が可能になります。
ターゲットの Server レスポンスヘッダーが以下であることを確認:
Apache/2.4.49 (Unix)
このバージョンは CVE-2021-41773 の直接の影響を受けます。
/cgi-bin/ の存在確認/cgi-bin/ にリクエストを送信し、403 Forbidden レスポンス(404 ではなく)を受信しました。これは、ディレクトリが存在し、mod_cgi が有効である可能性が高いことを示しています — 本 CVE による RCE の前提条件です。
エンコードされたトラバーサルシーケンスを、curl によるクライアント側の正規化を受けずに、入力したとおり正確に送信するため、--path-as-is フラグを指定して curl を使用しました:
curl -s --path-as-is "http://<TARGET_IP>:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh" \
--data 'echo Content-Type: text/plain; echo; cat /flag.txt'
--path-as-is が必要な理由: デフォルトでは、curl はリクエストを送信する前に URL を正規化し、.%2e/ シーケンスを除去します。--path-as-is は curl に URL を記述されたとおり送信するよう指示し、エンコードされたトラバーサルがそのままサーバーに届くようにします。
ペイロードは /cgi-bin/ からルートファイルシステムまでトラバースし、注入した POST ボディ経由で /bin/sh を CGI スクリプトとして実行し、/flag.txt の内容を返しました。
Flag format confirmed: THM{...}
(フラグは公開 writeup に関する TryHackMe のガイドラインに従い伏せています。)
mod_cgi + パストラバーサル = RCE。 ファイル読み取りだけでも危険ですが、CGI 実行可能ディレクトリと組み合わさると、コマンド実行になります。--path-as-is(または同等の raw リクエストツール)が不可欠です。mod_cgi を無効化する。本 writeup はラボ環境(TryHackMe)での検証を文書化したものです。許可なくアクセスされたシステムはありません。