0x01 背景描述
2021 年 9 月初,我們發現有攻擊者在多個 Microsoft Windows 服務器上使用特權提升漏洞進行網絡攻擊。該漏洞有許多和CVE-2016-3309相同的調試字符串,但仔細分析顯示,這是一個0 day漏洞。我們發現,樣本在 Win32k 驅動程序中利用了未知漏洞,漏洞利用使用了泄漏內核模塊基地址技術。微軟給此Win32k 內核驅動程序中的UAF漏洞分配了CVE-2021-40449編號 ,并作為 10 月補丁星期二的一部分,于 2021 年 10 月 12 日發布了補丁版本。
https://github.com/siberas/CVE-2016-3309_Reloaded/
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-40449
除了在野外發現此0 day漏洞,我們還分析了此0 day漏洞一起使用的惡意軟件載荷,并發現在對 IT 公司、國防承包商和外交實體的廣泛間諜活動中發現了惡意軟件的變體。
我們將這一系列活動稱之為“MysterySnail”。
0x02 特權提升漏洞利用
已發現的漏洞利用工具支持以下 Windows 產品:
Microsoft Windows Vista
Microsoft Windows 7
Microsoft Windows 8
Microsoft Windows 8.1
Microsoft Windows Server 2008
Microsoft Windows Server 2008 R2
Microsoft Windows Server 2012
Microsoft Windows Server 2012 R2
Microsoft Windows 10 (build 14393)
Microsoft Windows Server 2016 (build 14393)
Microsoft Windows 10 (build 17763)
Microsoft Windows Server 2019 (build 17763)
CVE-2021-40449 是 Win32k NtGdiResetDC 函數中的UAF漏洞。與許多其他 Win32k 漏洞一樣,此漏洞的根本原因是能夠設置用戶模式回調并在執行這些回調時執行惡意的 API 函數。當ResetDC 函數在執行其回調,第二次執行相同的句柄時將觸發 CVE-2021-40449。此漏洞的利用過程如下:
1、ResetDC 的用戶模式調用執行系統調用 NtGdi ResetDC 及其內部函數GreResetDCInternal。此函數將指向 PDC 對象,然后執行調用函數 hdcOpenDCW。
2、函數 hdcopenDCW 執行用戶模式回調,可用于第二次執行相同句柄的重置處理。
3、如果漏洞在回調期間執行ResetDC,則 NtGdi ResetDC和GreResetDCInternal內部將再次執行為同一 DC 執行。
4、如果漏洞利用在第二次調用GreResetDCInternalDC內部時忽略所有回調,此函數將按預期執行。它將創建一個新的 DC 。
5、在回調中,在第二次ResetDC 調用完成后,漏洞利用可以恢復 PDC 對象的釋放內存并完成回調執行。
6、執行回調后,函數 hdcOpenDCW 返回到 GreResetDC 內部,但分步檢索的指針現在是一個懸空指針, 它指向以前被破壞的 PDC 對象的內存。
7、在 GreResetDC 內部執行的后期階段,一個畸形的 PDC 對象可用于執行具有受控參數的任意內核函數的調用。
在已發現的漏洞利用中,攻擊者能夠使用 GDI 調色板對象實現所需的內存狀態,并使用單個調用到內核函數來構建用于讀取和編寫內核的原始存儲器。此步驟很容易完成,因此可以使用公開的技術泄漏當前加載的驅動程序/內核模塊的內核地址。
0x03 MysterySnail RAT樣本
我們深入到MysterySnail RAT家族開始分析一個以前未知的遠程shell類型的木馬。我們分析的樣本是在 2021 年 8 月 10 日上傳VT的。樣本很大 , 8.29MB。文件大小的原因之一是,它是與 OpenSSL 庫靜態編譯的,包含屬于該庫的未使用的代碼和數據。但其大小的主要原因是存在兩個非常大的函數,會消耗CPU處理器的時鐘周期。這些函數還使用了隨機生成的字符串,這些字符串也存在于二進制文件中。 https://www.virustotal.com/gui/file/b7fb3623e31fb36fc3d3a4d99829e42910cad4da4fa7429a2d99a838e004366e
反編譯函數使用的隨機字符串
我們先假設這兩個函數是用于免殺的,隨后這一理論得到其他代碼邏輯和大量的導出函數的證實,實際工作僅由其中一個函數執行。
導出函數的名稱,實際業務邏輯是從函數“GetInfo”執行
樣本中有兩個硬編碼網址,以純文本形式存在 。“www[.]disktest[.]com” 和 “www[.]runblerx[.]com” 。它們被放入類變量中使用,但從未使用:真正的 C2 地址由單字節 xor 解碼 - “http[.]ddspadus[.]com” 。
惡意軟件枚舉“Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer”注冊表密鑰下的值,并使用它們請求通過代理服務器進行隧道處理,以防止無法直接連接到 C2。
惡意軟件本身不是很復雜,其函數類似于許多其他遠程shell程序。有一些特殊功能,如監控插入的磁盤驅動器、代理中轉。
命令具有與下面相同格式,所有通信都通過 SSL 加密。
通信命令格式
在收到任何命令之前,惡意軟件會收集并發送有關受害者機器的一般信息。此信息包括:
?計算機名稱
?當前 OEM 代碼頁、默認標識符
?Windows 產品名稱
?本地 IP 地址
?登錄用戶名
?活動名稱(Campaign name)
一個有趣的事實是,默認情況下,“Campaign name”被設置為“windows”。此名稱被覆蓋,但它可能表示有為其他平臺編譯的相同 RAT 版本。
RAT 總共執行 20 個命令,命令描述和命令 ID 在下面的表格中。
RAT 支持的命令列表
0x04 IOCs
www[.]disktest[.]com www[.]runblerx[.]com http[.]ddspadus[.]com
MD5 e2f2d2832da0facbd716d6ad298073ca SHA1 ecdec44d3ce31532d9831b139ea04bf48cde9090 SHA256 b7fb3623e31fb36fc3d3a4d99829e42910cad4da4fa7429a2d99a838e004366e