<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    一步一步教你漏洞挖掘之Windows SMB Ghost CVE-2020-0796(一)

    VSole2021-10-01 05:44:54

     2020年3月11日,微軟公布了SMBGhost漏洞的相關信息,這是內核驅動srv2.sys中SMBv3.1.1消息解壓縮過程中的一個整數溢出漏洞。到3月底就出現了利用該漏洞實現本地提權(LPE)的技術研究,之后就是國內外各路大神都發布了相關研究成果。但是針對該漏洞的遠程利用似乎只有 Ricerca Security 的研究人員在4月發布了其研究成果。下面主要是基于 Ricerca Security 的研究成果和利用腳本,對該漏洞進行復現、成因分析和利用分析。

    漏洞復現

    0x01 測試環境

    目標系統:Windows 10 1909 64位 build 18363.418

    調試方式:遠程內核調試(net 模式)

    虛擬機配置:

    調試器Windbg配置:

    0x02 測試過程

    漏洞觸發過程非常簡單,只要發送一個包含壓縮數據的SMB v3的數據報就可以導致目標藍屏崩潰。使用的漏洞觸發腳本:

    https://github.com/eerykitty/CVE-2020-0796-PoC


    發送的 SMB 數據包格式如下:

    漏洞poc中對SMB壓縮數據結構(offset)進行惡意賦值:

    def _compress(self, b_data, session):    header = SMB2CompressionTransformHeader()    header['original_size'] = len(b_data)    header['offset'] = 4294967295    header['data'] = smbprotocol.lznt1.compress(b_data)    return header
    

    調試器中的崩潰現場:

    PAGE_FAULT_IN_NONPAGED_AREA (50)Invalid system memory was referenced.  This cannot be protected by try-except.Typically the address is just plain bad or it is pointing at freed memory.……rax=ffffba86ed2f9d58 rbx=0000000000000000 rcx=ffffba86ed2f9d50rdx=0000000000000001 rsi=0000000000000000 rdi=0000000000000000……nt!RtlDecompressBufferLZNT1+0x57:fffff806`356f0127 0fb71e          movzx   ebx,word ptr [rsi] ds:00000000`00000000=????……STACK_TEXT:……nt!RtlDecompressBufferLZNT1+0x57nt!RtlDecompressBufferEx2+0x66srvnet!SmbCompressionDecompress+0xddsrv2!Srv2DecompressData+0xe1srv2!Srv2DecompressMessageAsync+0x1e……
    

    漏洞成因分析

    根據崩潰的位置,我們通過逆向回溯,可以一步一步找到漏洞的成因,首先看到nt!RtlDecompressBufferLZNT1+0x57處的內存訪問異常,是由于rsi寄存器地址異常導致的,所以可以通過追溯rsi的數據流,來尋找污點源:

    從IDA可以看到,rsi的值來自nt!RtlDecompressBufferLZNT1的第一個參數r8,由于其父函數是nt!RtlDecompressBufferEx2,分析父函數中相關代碼:

    r8的值來自nt!RtlDecompressBufferEx2的第二個參數r9,繼續追溯其父函數,發現是srvnet!SmbCompressionDecompress,繼續分析父函數中相關代碼:

    r9的值來自r15,在向前追溯可以發現r15的值其實來自srvnet!SmbCompressionDecompress的第4個參數rdx,最后我們追溯到srv2!Srv2DecompressData,可以看到rdx是兩個數相加的結果:


    其實到這里就是漏洞的關鍵點(溢出就發生在該函數),從srv2!Srv2DecompressData的函數名可知該函數的作用就是處理SMB數據包中的壓縮數據,用IDA對該函數進行分析(其中關鍵數據結構直接搬運的 ZecOps 研究團隊的逆向成果)

    NTSTATUS Srv2DecompressData(PHEADER Header, SIZE_T TotalSize) {    PSRVNET_BUFFER_HDR Alloc = SrvNetAllocateBuffer(        (ULONG)(Header->OriginalSize + Header->Offset), NULL);    ……    NTSTATUS Status = SmbCompressionDecompress(        Header->CompressionAlgorithm,        (PUCHAR)Header + sizeof(HEADER) + Header->Offset,        (ULONG)(TotalSize - sizeof(HEADER) - Header->Offset),        (PUCHAR)Alloc->UserBuffer + Header->Offset,        Header->OriginalSize,        &FinalCompressedSize);    ……}
    

    srv2!Srv2DecompressData的第4個參數(第10行)是一個加法表達式:Alloc->UserBuffer + Header->Offset,其中Alloc->UserBuffer是通過SrvNetAllocateBuffer(第3行)動態申請的內存指針,Header->Offset就是數據包中我們設置的異常值0xffffffff,由于在代碼中沒有對Header->Offset所涉及的數學運算進行驗證,于是在函數Srv2DecompressData中出現了一系列可能的溢出點(包括第4、8、9、10行)。

    可以通過調試器我們再確認下:

    Alloc->UserBuffer就是rax,Header->Offset就是rdx,其值為0xffffffff+0x10,由于沒有對Header->Offset的值進行相關檢查,加法操作導致指針越界,系統訪問非法內存而崩潰。其實用戶可以控制的除了Header->Offset,還有一個是Header->OriginalSize,在后面的利用過程中可以利用。


    當然如果想要搞清楚Alloc->UserBuffer的申請過程,需要進入SrvNetAllocateBuffer函數進行分析,該過程比較復雜,而且在調試過程中發現,我自己的虛擬機中并沒有按照 ZecOps 研究團隊分析的那樣執行,后面漏洞利用的時候再做詳細分析吧。

    下一篇我們將詳細分析CVE-2020-0796各種利用姿勢。

    offsetheader
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Windows SMB Ghost CVE-2020-0796漏洞分析與利用(一)
    由于init函數是linker調用的,所以沒法做加密。所以我們合理懷疑初始化函數位置找錯了。其實之所以會搞錯,是因為錯誤的section header干擾了ida的解析。這通常是因為代碼中有花指令的緣故,我們要考慮去除花指令了。所以有理由懷疑,這里就是花指令,用來干擾ida解析的。執行完后再加上0x20,棧是平衡的。所以我們確信,中間的ret部分就是花指令。
    musl libc 是一個專門為嵌入式系統開發的輕量級 libc 庫,以簡單、輕量和高效率為特色。
    本題來源于DefCon Quals 2021的mooosl,考察點是最新版本musl libc 1.2.2利用。
    所謂“殺豬盤”,是指詐騙分子利用網絡交友通常是“異性”交友,誘導受害人下載詐騙APP并在上面進行各種“投資”,如菠菜、股票、期貨甚至虛擬貨幣的網絡詐騙。今年某月某日小白就遭遇了這種騙局,他先是被騙子通過QQ添加并下載了一個名為”心動“的APP,在“心動“APP上結識了位名為“xx老師”的美女小白被美色迷了眼打算相約這名網友,但是美女則借口讓他下載另一個名為午夜樂園的APP進行投資,果不其然小白被成
    跟php pwn一樣,以前遇到這樣的pwn直接都不看的,經過了解之后發現,老版本的Musl libc和新版本之間差距還比較大。結合最近幾次比賽中出現的Musl pwn,學習一下新老版本的Musl libc姿勢。
    加密算法共4種,第二個任務注冊機,缺一個算法的解密算法,其他三個算法均已寫好C實現的解密算法。隨后在xxx函數通過frida分析找到XTEA加密,然后用frida在內存中找到并提取了密鑰。Dump && Recover IL2CPP雖然用修改后的frida去hook libsec2023.so仍然會被檢測,但是hook其他庫沒有出現問題。
    文中使用的示例代碼可以從 這里 獲取。的功能是在終端打印出hello這6個字符(包括結尾的?編譯它們分別生成libtest.so和?存在嚴重的內存泄露問題,每調用一次say_hello函數,就會泄露1024字節的內存。
    一個先進的跨平臺工具,可以自動檢測和利用SQL注入漏洞,支持布爾注入、時間注入、報錯注入、堆疊查詢,支持的數據庫有MySQL,Microsoft SQL Server,Postgre,Oracle,支持的注入類型有GET、POST、COOKies等。
    head&key采用的XOR&Rotate加密,payload采用AES&ZLIB加密壓縮。最后發送至C2的數據包仍以上述結構組成,其中payload 經解密為上述指令執行的結果。Buni的通信流量特征與RotaJakiro相似度較低。Buni指令碼為WORD類型,未發現指令碼共享。研究人員將Buni后門歸因為海蓮花的主要原因是其與RotaJakiro后門存在相似之處。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类