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

Log4j-Unserialize-Analysis

第二种方法
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 对象等待通信。

Log4j-Unserialize-Analysis
Log4j-Unserialize-Analysis

下面的代码是基于 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);
   }
}

Log4j-Unserialize-Analysis

漏洞分析

当 socketServer 启动的时候,我们通过nc发送漏洞payload,服务端的 serverSocket.accept() 接收到请求之后会创建一个线程,处理 SocketNode 这个类。

Log4j-Unserialize-Analysis

跟进 SocketNode 这个类之后就发现它通过 BufferedInputStream 获取到通过 Socket 传入的 payload 。

Log4j-Unserialize-Analysis

经过 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 这个类。

Log4j-Unserialize-Analysis

在 SocketNode.run 方法中,正是反序列化的触发点了,真的是简单粗暴的漏洞触发呀。

Log4j-Unserialize-Analysis


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>

Log4j-Unserialize-Analysis

漏洞分析

创建 TcpSocketServer 对象的时候,代入了 port(端口变量) 以及 ObjectInputStreamLogEventBridge 对象,在这个对象里面有反序列化的入口。

Log4j-Unserialize-Analysis

之后调用 TcpSocketServer#run 开始运行。

Log4j-Unserialize-Analysis

这个run方法存在的意义实际上是因为 TcpSocketServer 继承于 AbstractSocketServer 。

Log4j-Unserialize-Analysis

而这个 AbstractSocketServer 抽象类继承了 Runable 接口, Runable 接口在Thread这个方法作用相信熟悉Java的都不太陌生。所以实际上这个run方法的作用就是把客户端连接分发给 SocketHandler 进行处理。

Log4j-Unserialize-Analysis

当客户端发送Socket请求过来的时候 serverSocket.accept 会接收到来自客户端的 Socket 请求。

Log4j-Unserialize-Analysis

然后 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);
}

Log4j-Unserialize-Analysis

而此时我们的 handler 对象正是我们的线程对象,也就是说实际上这里就是 Thread.start,而线程对象里面的是 TcpSocketServer 这个类,所以这里 start 后执行的自然是 TcpSocketServer 里的 run 函数。

Log4j-Unserialize-Analysis

反序列化的过程中 TcpSocketServer#run 方法里 TcpSocketServer.this.logEventInput 对象实际上就是我们前面最开始封装的 ObjectInputStreamLogEventBridge 这个类。所以这里实际上调用的是 ObjectInputStreamLogEventBridge#logEvents 方法。

Log4j-Unserialize-Analysis

而在 ObjectInputStreamLogEventBridge#logEvents 方法中自然就看到了我们的反序列化触发点。

Log4j-Unserialize-Analysis


No.4

漏洞修复

当然针对反序列化漏洞修复一般都是在 resolveClass 或者 resolveProxyClass 处进行检查,这个也不例外。

检查方法 org.apache.logging.log4j.core.util.FilteredObjectInputStream.resolveClass ,判断类名是否是 org.apache.logging.log4j. 开头。

Log4j-Unserialize-Analysis


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的主要内容,如果未能解决你的问题,请参考以下文章