歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

如何針對使用HTTP的.NET Remoting尋找并利用反序列化漏洞

來源:本站整理 作者:佚名 時間:2019-04-04 TAG: 我要投稿

一、概述
在NCC Group最近一次的安全評估中,我發現了一個.NET v2.0應用程序,該應用程序使用.NET Remoting通過HTTP方式發送SOAP請求,以與其服務器進行通信。在對應用程序進行了反編譯后,我意識到該服務器已經將TypeFilterLevel設置為Full,這非常危險,因為它可能會導致攻擊者利用反序列化攻擊實現遠程代碼執行。當然,實際的漏洞利用并不像我最初所想的那樣直截了當。
因此,我進行了研究,希望通過我的研究能夠為滲透測試人員提供幫助,以便將來能夠更加容易的在這一領域進行測試。本篇文章主要說明了如何使用ysoserial.net小工具在使用HTTP方式的.NET Remoting應用程序中尋找存在漏洞的應用程序,并進行漏洞利用。
在我們的.NET環境中,包括一臺易受攻擊的客戶端,并且其服務器也是為實戰演練的目的而創建的,可以在這里公開訪問。
二、通常存在的障礙
使用.NET Remoting的應用程序可以選擇使用TCP、IPC和HTTP信道。James Forshaw編寫了一個針對TCP和IPC信道進行測試和漏洞利用的出色工具。但是,我們沒有找到任何使用SOAP消息的HTTP信道。
當ysoserial.net的SOAP Payload在沒有任何更改的情況下直接發送時,服務器會顯示一條錯誤消息。
為了向已知的.NET Remoting對象URI(以下稱為“服務名稱”)創建有效的SOAP請求,我們需要知道對象名稱空間及其結構。這可能使我們的黑盒測試變得更加困難,因為即使我們掌握了服務名稱,通常情況下也沒有這些信息。
我的目標使用的是.NET框架的2.0版本,但ysoserial.net項目使用的是4.x版本。在測試.NET Remoting的過程中可能有時無法使用該工具,但我們可以使用.NET v2.0的ysoserial.net,它可以派上用場。
如果無法訪問源代碼,我們很難知道應用程序是否已經將TypeFilterLevel設置為Full。因此,我需要找到一種方法來安全地對它進行測試,希望不會導致服務器的崩潰。
三、利用反序列化漏洞
如果應用程序已經將TypeFilterLevel設置為Full,那么我們無需實際了解要發送到服務器的對象和SOAPAction標頭。唯一需要知道的信息,就是我們需要知道在對TCP或IPC信道進行漏洞利用過程中所需的服務名稱。
其他必要的條件如下:
1. HTTP的類型應該是POST或M-POST;
2. Content-Type標頭應該是text/xml;
3. SOAPAction標頭不應該為空;
4. Content-Length標頭應該顯示準確的請求主體大小。
如果設置了上述所有的標頭,但服務名稱無效,那么服務器將會作出如下響應:
System.Runtime.Remoting.RemotingException - Requested Service not found
如果沒有設置上述標頭,例如在發送GET請求時,服務器會響應截然不同的錯誤消息。下面展現了一般情況下發送GET請求時的錯誤消息:
System.ArgumentNullException: No message was deserialized prior to calling the DispatchChannelSink.
需要注意的是,當使用?wsdl、?sdl或?sdlx將GET請求發送到有效服務名稱時,有時服務可能會返回有用的數據。然而,在我們提供的GitHub示例中,卻并非如此。
為了使用ysoserial.net生成SOAP Payload,我們可以使用任何支持SoapFormatter的小工具。但是,必須使用以下技巧之一,才能使Payload能夠正常工作。
方法1:從Payload中刪除和標記。
方法2:在標記后立即添加以下標記之一:
當我們使用ysoserial.net的TextFormattingRunProperties小工具運行cmd /c calc命令時,以下的HTTP請求中展現了一個成功的示例。在這個示例中,服務名稱為VulnerableEndpoint.rem。
使用上面的第一種方法,HTTP請求如下:
POST /VulnerableEndpoint.rem HTTP/1.1
Content-Type: text/xml
SOAPAction: "x"
HOST: target
Content-Length: 1470
 
 
 
 cmd
 /c "calc"
 
 
其工作原理如下圖所示:

使用上面的第二種方法,HTTP請求如下:
POST /VulnerableEndpoint.rem HTTP/1.1
Content-Type: text/xml
SOAPAction: "x"
HOST: target
Content-Length: 1518
 
 
 
 cmd
 /c "calc"
 
 
在使用上述兩種方法的過程中,即使漏洞成功利用,服務器應用程序仍然會顯示以下錯誤消息:
**** System.Runtime.Remoting.RemotingException - Server encountered an internal error.
(System.Runtime.Remoting.RemotingException – 服務器遇到內部錯誤)
當TypeFilterLevel設置為Low時,服務器應用程序會響應以下錯誤消息:
**** System.Reflection.TargetInvocationException - Exception has been thrown by the target of an invocation. **** System.Security.SecurityException - Request failed.
(System.Reflection.TargetInvocationException – 調用目標拋出了異常)
(System.Security.SecurityException – 請求失敗)
此時,ysoserial.net生成的SOAP請求只能產生錯誤,不會使服務器的應用程序崩潰。我們可以使用上述錯誤消息,來識別應用程序服務器是否易受攻擊。
為了掃清測試過程中對.NET框架2.0版本應用程序進行漏洞利用的最后一個障礙,我創建了一個新的ysoserial.net v2.0項目,可以在這里找到。但是,該項目僅支持有限數量的小工具,并且還要求目標安裝.NET框架的3.5版本。盡管這并不理想,但在測試過程中,可以在我的目標上成功實現漏洞利用,并且該目標主機也安裝了較新版本的.NET框架。僅僅依賴于.NET框架2.0版本的漏洞利用,還需要使用其他新的小工具。
四、防范可能出現的拒絕服務問題
即使TypeFilterLevel被設置為Low,也可能會使服務器應用程序發生崩潰。在使用DataSet類(參考)進行測試的期間,就發生了這種情況,其中我們使用了由ysoserial.net的TypeConfuseDelegate小工具生成的Payload,如下所示:

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.pcpbjo.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected]m,我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        云南快乐十分前三电视