最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

CVE-2021-26411 漏洞利用樣本分析

2023-03-10 15:31 作者:360沙箱云  | 我要投稿

概述

該樣本是利用 CVE-2021-26411 漏洞進行攻擊的 html 文件,攻擊目標是 ie 和 edge 瀏覽器,其最終的目的是執(zhí)行 shellcode 啟動 powershell 進程進行下載行為。關于 CVE-2021-26411 漏洞的原因參考文章 【1】已經(jīng)講的比較精細,這里就不在贅述,簡要描述是由于 Internet Explorer 的 mshtml 組件中存在一個釋放后使用的缺陷。當用戶訪問了一個惡意頁面時,會觸發(fā)屬性對象 nodeValue 的 valueOf 回調。在回調期間,手動調用 clearAttributes(),導致 nodeValue 保存的 BSTR 被提前釋放。這樣就會造成內存破壞和遠程代碼執(zhí)行。關于利用方式參考文章【1】【2】講的略微精簡。樣本分析主要包括漏洞利用部分和 shellcode 部分。

樣本信息

  • MD5:56B8C44BB0B2B7EE31A766E1A77BAEDA

  • SHA1:95D643B3C7DA6AE209940A6F3722074A800282C0

分析環(huán)境

  • Windows 10 x64 1607

  • IE11,Windbg x86,IDA 7.5

  • mshtml.dll(11.0.14393.0),jscript9.dll(11.0.14393.0)

樣本分析

樣本的初始內容是一段混淆&加密的 js。

加密算法使用的是 AES(CBC)。

js 解密后的內容除去 shellcode 基本與參考文章【3】中公布的漏洞利用代碼一致,只是做了一些精簡。

漏洞利用分析

為了便于對利用原理的理解,我使用了參考文章【3】中的較規(guī)范的 js 代碼進行分析。

利用過程

  • 利用 CVE-2021-26411 的 UAF 造成類型混淆

  • 利用類型混淆泄露對象元數(shù)據(jù),使用泄露對象的元數(shù)據(jù)偽造一個起始地址為 0,大小為 0xffffffff 的 ArrayBuffer 對象

  • 利用偽造的 ArrayBuffer 對象實現(xiàn)任意讀寫原語

  • 使用任意讀原語實現(xiàn)任意對象地址泄露原語

  • 偽造 RPC_MESSAGE 為任意函數(shù)調用做準備

  • bypass CFG

  • 執(zhí)行 shellcode

造成類型混淆

執(zhí)行 valueOf 的調用棧,執(zhí)行重寫 valueOf 的原因似乎和 CVE-2016-0189 一樣,均是需要進行類型轉換。

element.removeAttributeNode(attr1) 開始時的 element,其中 attr2.nodeValue 是長度為 0x2000a 的 BSTR,為什么它占用的空間是 0x20010,是因為 BSTR 還包括字符串前長度為 4 字節(jié)的長度域和尾部 2字節(jié)的 \x00。

element.clearAttributes() 結束后,AttributeArray 中的無效元素將被其最后一個元素 attr2.nodeValue 覆蓋,而 attr2.nodeValue 所占空間也被釋放,被釋放的緣由是參考文章【1】【3】中提到的極長 BSTR (大于 0x8000)。

hd2 = hd1.cloneNode() 結束后,原 attr2.nodeValue 所占空間將被重新占用,重新占用的目的有兩個:

  • 為了避免在第一次 CBase::DeleteAt 刪除 [2] attr1 時 CAttrValue::Free 釋放無效內存而崩潰

  • 為了在 CAttrValue::Free 將其釋放后繼續(xù)持有這塊內存的地址從而形成懸垂指針

element.setAttribute('yyy', 1337) 結束后,attr1.nodeValue 被重新設置,重新設置的目的是為了避免在第二次 CBase::DeleteAt 刪除 [1] attr1.nodeValue 時對象解引用失敗而崩潰。

element.removeAttributeNode(attr1) 結束后雖然 attr2.nodeValue(0874035c) 被釋放,但是 hd2.nodeValue (BSTR)仍然持有這塊內存的地址。

hd0.nodeValue = alloc 結束后 attr2.nodeValue 將被 hd0.nodeValue 重新占用并且與 hd2.nodeValue 形成類型混淆。

hd0.nodeValue 類型值為 0xc safeArray。

hd2.nodeValue 類型值為 0x8 BSTR。

泄露對象元數(shù)據(jù),偽造 ArrayBuffer

dump 函數(shù)以 hd2.nodeValue 為參數(shù),使用 string 對象方法 charCodeAt 獲取 hd2.nodeValue(0874035c) 處的數(shù)據(jù),然后再以 uint32 視圖泄露 fake 對象和 arr 對象的地址。

setData 函數(shù)將 fake 對象的元數(shù)據(jù)的地址填充到 abf ArrayBuffer 中。

abf ArrayBuffer。

flush 函數(shù)再將 abf ArrayBuffer 中的數(shù)據(jù)刷新到 hd2.nodeValue(0874035c)。

使用 hd0.nodeValue(safeArray) 泄露 fake 對象的元數(shù)據(jù)。

繼續(xù)使用 hd0.nodeValue(safeArray) 泄露 fake.ArrayBuffer 的元數(shù)據(jù)。

使用泄露的 fake 對象的元數(shù)據(jù)在 fake.ArrayBuffer.buffer 中偽造對象,偽造的對象是一個起始地址為 0,大小為 0xffffffff 的 ArrayBuffer 對象。

實現(xiàn)任意讀寫原語

使用偽造的 ArrayBuffer 對象實現(xiàn)任意讀寫對象 god。

以 god 對象實現(xiàn)任意讀。

以 god 對象實現(xiàn)任意寫。

任意對象地址泄露原語

addrOf 將對象地址存儲在 arr[0],然后讀取值。

偽造 RPC_MESSAGE

偽造 RPC_MESSAGE 之前需要先調用 rpcrt4!I_RpcTransServerNewConnection 以獲得 OSF_SCALL_Vftable,OSF_SCALL_Vftable 最終將被設置到 RPC_MESSAGE->Handle 中。而 I_RpcTransServerNewConnection 和后續(xù) rpcrt4!NdrServerCall2 的調用都是通過偽造 Attribute 進行的。

創(chuàng)建 xyz 作為偽造 Attribute 的目標對象。

偽造 Attribute,這里偽造的 Attribute 只用在 I_RpcTransServerNewConnection 調用,NdrServerCall2? 的調用將會重新構造。

偽造的 Attribute 與原 Attribute 只有虛表指針不同。

使用目的函數(shù)地址替換假虛表中 normalize 函數(shù)的地址,這樣調用 xyz.normalize() 函數(shù)便可以執(zhí)行目的函數(shù),normalize 函數(shù)地址對比。

調用方式是先將 xyz 的 Attribute 指針修改為偽造 Attribute 的地址,然后調用 xyz.normalize(),調用完再恢復 xyz 的 Attribute 指針。

initRpc() 的內容比較龐大這里就不展開說明,這里用一張圖說明其構建的 RPC_MESSAGE 主要結構,其中 RPC_MESSAGE 也是偽造的 Attribute,其虛表的 0x28c 處是 xyz.normalize() 執(zhí)行的 NdrServerCall2 函數(shù)的地址。

bypass CFG

構建完 RPC_MESSAGE 后只需將想要調用的函數(shù)的地址放在上圖中的 Target Func 處并將函數(shù)參數(shù)放在 ArgementBuffer 處,然后使用 xyz.normalize() 即可執(zhí)行目的函數(shù)。但是由于 rpcrt4!Invoke 在執(zhí)行目標函數(shù)之前會進行 CFG Check,這樣只能調用在 CFGBitmap 中的函數(shù),想調用位于任意位置的 shellcode 就需要 bypass CFG。

bypass 的方法是將 RPCRT4!__guard_check_icall_fptr 中保存的負責進行 CFG Check 的函數(shù)指針由 ntdll!LdrpValidateUserCallTarget 替換為 ntdll!KiFastSystemCallRet。

執(zhí)行 shellcode

加載 msi.dll 模塊到進程中,將 shellcode 寫入距 msi.dll 基址 0x5000 的位置,設置內存屬性后執(zhí)行之。

shellcode 分析

shellcode 通過在 kernel32.dll 模塊導出表中查找 WinExec 函數(shù)的地址,然后使用其執(zhí)行了命令行。

最終執(zhí)行了一段 powershell 腳本執(zhí)行繼續(xù)執(zhí)行下載動作。

直達360沙箱云:https://ata.360.net/

參考文章

【1】https://iamelli0t.github.io/2021/03/12/CVE-2021-26411.html

【2】https://iamelli0t.github.io/2021/04/10/RPC-Bypass-CFG.html

【3】https://medium.com/enki-techblog/internet-explorer-0day-%EB%B6%84%EC%84%9D-f14bf5db771e

CVE-2021-26411 漏洞利用樣本分析的評論 (共 條)

分享到微博請遵守國家法律
宜君县| 资讯 | 水富县| 左权县| 布尔津县| 简阳市| 东丰县| 延川县| 黄梅县| 清水河县| 绍兴县| 二手房| 烟台市| 白沙| 长治县| 西青区| 沂源县| 孝感市| 开封县| 肇东市| 新宾| 古交市| 彭泽县| 普兰店市| 始兴县| 凤阳县| 邯郸市| 五台县| 海丰县| 永泰县| 都安| 杂多县| 四平市| 鹿邑县| 武强县| 南和县| 博湖县| 屯昌县| 漾濞| 普兰县| 湖北省|