如何通過查找惡意開發(fā)者的線索來尋找漏洞(下)
接上篇:
內(nèi)核地址泄漏
在絕大多數(shù)漏洞利用中,攻擊者使用內(nèi)核指針泄漏原語來調(diào)整漏洞利用。在除CVE-2019-1458之外的所有漏洞利用中,此泄漏原語都是眾所周知的HMValidateHandle技術(shù)。
HMValidateHandle()是user32.dll的內(nèi)部未導(dǎo)出函數(shù),可通過isMenu()等各種函數(shù)加以利用,并且可用于獲取所有Windows版本(直到Windows10RS4)中不同Window對象的內(nèi)核地址。這項技術(shù)是眾所周知的,甚至早在2011年就已使用,因此大多數(shù)開發(fā)教程都選擇專門解析isMenu()來查找HMValidateHandle()的地址。
令人驚訝的是,在可用于查找HMValidateHandle()的數(shù)十種不同函數(shù)中,攻擊者只是按照眾所周知的教程選擇了也使用isMenu()。更令人驚訝的是,這種常見的利用技術(shù)多年來仍然很有效,沒有激勵攻擊者通過選擇更先進(jìn)的諸如CheckMenuRadioItem()來嘗試“隱藏”。
該泄漏為研究人員提供了以下痕跡信息:
- 窗口的內(nèi)核地址;
- THREAD_INFO的內(nèi)核地址(pti字段);
在利用過程中的多個步驟中將使用此痕跡信息:
- 在指向/創(chuàng)建偽內(nèi)核結(jié)構(gòu)時使用地址;
- 確保研究人員的內(nèi)核地址是有效的Unicode字符串(不包含兩個連續(xù)的“\x00”字節(jié));
- pti用于定位有效的EPROCESS,然后在令牌交換階段使用它;
與PlayBit的比較:PlayBit選擇通過直接訪問用戶模式桌面堆來實現(xiàn)此函數(shù)。
令牌互換
該攻擊的最終目標(biāo)是根據(jù)給定的PID參數(shù)將系統(tǒng)特權(quán)授予所需的進(jìn)程,按著常規(guī)的思路實現(xiàn)這一點的方法是用系統(tǒng)進(jìn)程的令牌替換EPROCESS/KPROCESS結(jié)構(gòu)中的進(jìn)程的令牌。
下面有一些常用的技術(shù)可以做到這一點,你會驚訝地發(fā)現(xiàn)有這么多不同的選項可以實現(xiàn)此函數(shù)。
使用Ps符號
Windows內(nèi)核包含以下函數(shù)和與進(jìn)程相關(guān)的函數(shù)的全局變量:
- PsLookupProcessByProcessId:檢索指向進(jìn)程的EPROCESS的指針;
- PsInitialSystemProcess:包含指向系統(tǒng)EPROCESS的指針的全局變量;
- PsReferencePrimaryToken–返回一個指向進(jìn)程主要令牌的指針;
通過以內(nèi)核模式執(zhí)行這些函數(shù),給定的shellcode可以輕松定位SYSTEM的令牌,但仍不能解決如何在所需的EPROCESS中分配令牌的問題。
有兩種常見的解決方案:
- 使用特定于版本的偏移量直接在EPROCESS中訪問正確的偏移量;
- 掃描EPROCESS以查找研究人員自己的指針(先前調(diào)用PsReferencePrimaryToken所知道的指針),并在找到匹配項后替換該條目;
此技術(shù)需要以內(nèi)核模式執(zhí)行代碼,因此除非部署了其他SMEP繞過,否則它將被SMEP保護(hù)阻止。
掃描PsList
查找目標(biāo)進(jìn)程和系統(tǒng)進(jìn)程的EPROCESS的常見替代方法是掃描被稱為PsList的雙鏈接進(jìn)程列表,此技術(shù)涉及的步驟為:
- 使用泄漏的pti字段,定位初始EPROCESS;
- 掃描PsList以查找具有目標(biāo)PID的EPROCESS;
- 通過查找PID為4或名稱為SYS來掃描PsList,以搜索SYSTEM的EPROCESS;
- 提取令牌并將其放置在目標(biāo)進(jìn)程中的匹配偏移量中;
謹(jǐn)慎更新SYSTEM令牌的引用計數(shù)。
Volodya漏洞利用Arbitrary-Read原語搜索SYS,如Cutter所示
這種技術(shù)需要PsList的主令牌和LIST_ENTRY的偏移量,基本上要求它們都作為版本特定配置的一部分進(jìn)行存儲。
該技術(shù)的主要優(yōu)點是,盡管它仍可以在內(nèi)核模式下作為簡單的shellcode執(zhí)行,如在CVE-2017-0263的利用中所做的那樣),但它也可以在用戶模式下完全實現(xiàn)。為此,你需要兩個利用原語,一個用于任意讀取(來自內(nèi)核空間),另一個用于任意寫入(進(jìn)入內(nèi)核空間)。在用戶模式下運(yùn)行可以解決研究人員之前針對SMEP所詳述的問題,從而使這種保護(hù)對于這種利用原語毫無用處。
由于令牌是一個引用計數(shù)對象,因此正確注冊剛添加的引用非常重要,這樣可以避免在提升進(jìn)程終止時出現(xiàn)藍(lán)屏死亡(BSOD)。實際上,有兩個不同的引用計數(shù):
- 令牌是一個EX_FAST_REF對象,較低的指針位被用作引用計數(shù);
- OBJECT_HEADER存儲在令牌之前,并保留另一個引用計數(shù);
由于攻擊者選擇更新后一個引用計數(shù)字段,因此需要執(zhí)行以下步驟:
- 屏蔽掉令牌指針的引用計數(shù)位:在32位進(jìn)程中應(yīng)對齊8個字節(jié),在64位進(jìn)程中應(yīng)對齊16個字節(jié)。
- 減去指向OBJECT_HEADER的引用計數(shù)字段所需的常量;
- 讀取值(使用任意讀取漏洞利用原語);
- 相應(yīng)地增加它;
- 回寫更新后的值;
但是,如圖9所示,研究人員在包含此函數(shù)的所有32位漏洞利用程序中發(fā)現(xiàn)了以下漏洞:
32位漏洞利用中的引用計數(shù)更新中實現(xiàn)的漏洞
讀取引用計數(shù)值時的對齊掩碼為8字節(jié)的對齊方式,而回寫更新后的值時使用不同的掩碼。如果令牌將存儲在對齊8個字節(jié)而不對齊16個字節(jié)的內(nèi)存地址中,則寫入操作將更新漏洞的字段。
盡管CVE-2016-0040和CVE-2016-0167使用Ps技術(shù),但到目前為止,掃描PsList是研究人員發(fā)現(xiàn)的攻擊者最喜歡的執(zhí)行令牌交換的方式了,在他們的8種利用中都使用了這種方式。在其中的7個中,他們使用了用戶模式下的任意讀取和任意寫入。
與PlayBit的比較:在他們的所有示例中,研究人員會經(jīng)常看到PlayBit使用Ps函數(shù)進(jìn)行令牌交換。這個決定迫使攻擊者采取了一些SMEP繞過措施,將它們集成到CVE-2016-7255和CVE-2018-8453的后續(xù)漏洞中。這種設(shè)計選擇說明了為什么攻擊者不愿意將適當(dāng)?shù)娜我庾x取原語作為漏洞利用的一部分。PlayBit始終使用0x300或0x600作為搜索上限,不是對EPROCESS中的令牌偏移使用特定于版本的配置,而是始終掃描EPROCESS進(jìn)行搜索。
值得注意的是,PlayBit在不同漏洞利用中使用的內(nèi)存損壞技術(shù)也被Duqu2.0使用,并在微軟于2015年發(fā)布的VB演講中進(jìn)行了分析。通過這種內(nèi)存損壞,它們可以觸發(fā)一些內(nèi)存讀取/寫入操作。
PlayBit漏洞掃描EPROCESS以搜索令牌,如Cutter所示
盡管研究人員還可以從其他方面來討論這個問題,例如每個攻擊者在開發(fā)過程中喜歡使用的不同系統(tǒng)調(diào)用,對Windows和ScrollBars之類的已創(chuàng)建對象的命名約定。但研究人員相信上面的列表已經(jīng)清楚地證明了研究人員方法的效率或有效性。從上面的列表可以看出,幾乎每個漏洞的每個方面都可以通過幾種不同的方式實現(xiàn)。盡管如此,研究人員所發(fā)現(xiàn)的兩個攻擊者在各自使用的攻擊方法上都非常一致,每個人都堅持自己喜歡的方式。
在整個研究過程中,研究人員希望專注于漏洞編寫者本身,無論是Volodya,PlayBit還是其他人。但是,研究人員認(rèn)為,通過查看漏洞利用開發(fā)者的客戶群,也有很多值得學(xué)習(xí)的東西。Volodya的客戶列表各不相同,包括Ursnif等銀行木馬開發(fā)者,GandCrab,Cerber和Magniber等勒索軟件開發(fā)者,以及Turla,APT28和Buhtrap等APT組織,這些組織最初從事網(wǎng)絡(luò)犯罪,后來都發(fā)展為網(wǎng)絡(luò)間諜活動。有趣的是,研究人員可以看到Volodya的零日漏洞更有可能賣給PT組織,而一日漏洞是由多個犯罪軟件組織購買的。由于沒有更多的信息,研究人員只能假設(shè)一旦安全行業(yè)檢測到零日漏洞,該漏洞便被回收并以較低的價格出售。
APT的客戶Turla,APT28和Buhtrap都通常來自于俄羅斯,而且有趣的是,即使是這些高級團(tuán)隊也購買了漏洞利用程序,而不是內(nèi)部開發(fā)。這些事實進(jìn)一步加強(qiáng)了研究人員的假設(shè),即書面漏洞(written exploit)利用可以被視為惡意軟件的被利用的前奏。
下表總結(jié)并顯示了來自于Volodya的CVE,以及使用這些漏洞發(fā)現(xiàn)的客戶或惡意軟件組。標(biāo)有藍(lán)色的CVE為零日漏洞,自然更昂貴。左側(cè)突出顯示的組被視為APT。
Volodya的客戶和他們使用的CVE
綜上所述,研究人員在檢查了一段時間內(nèi)的漏洞樣本后發(fā)現(xiàn),他們還不能討論還沒有發(fā)現(xiàn)的零日漏洞。此外,研究人員只能嘗試將示例的日期追溯到被捕獲之前的時期,但可悲的事實是,研究人員通常會確定在野外首次發(fā)現(xiàn)這種攻擊行為的日期。此外,值得一提的是,Volodya在開發(fā)CVE-2015-2546的第一個漏洞時,從一開始就已經(jīng)非常專業(yè)了。例如,它有一個唯一的任意編寫原語,研究人員無法跟蹤到任何其他漏洞利用指南。
在對漏洞利用程序進(jìn)行分析以及對研究人員收集的數(shù)十個惡意軟件示例進(jìn)行分析期間,研究人員注意到了一個有趣的變化。早期的Volodya漏洞是作為嵌入到惡意軟件中的源代碼出售的,而后期的漏洞利用程序則作為接受某個API的外部實用程序來出售,這種變化可能表明Volodya正在采取更多的反檢測措施。
在2015年至2019年的這段時間內(nèi),研究人員還注意到Volodya的技術(shù)技能有了顯著改善。隨著該組織變得更好和更有經(jīng)驗,Volodya開始使用更有效的任意讀寫原語,他們甚至修復(fù)了這些原語之間的錯誤。
CVE-2015-2546和CVE-2016-0165,而且,隨著大型函數(shù)被拆分為較小的子例程,漏洞利用代碼變得更加模塊化。此外,他們在各種結(jié)構(gòu)中搜索和訪問特定偏移量的技術(shù)也得到了改進(jìn),并且在最近的實現(xiàn)中,它可以更好地處理Windows次要版本中的更改,因此變得更加動態(tài)和安全。
這不僅顯示了攻擊者的學(xué)習(xí)能力愈來愈強(qiáng),也暗示了他們的技能也在提高。查找并可靠利用Windows內(nèi)核漏洞的能力確實不是那么簡單。相比之下,研究人員可以看到PlayBit在2015-2018年期間在這個市場上非常活躍,他們的重點是出售一日漏洞,其中之一是Volodya的零日漏洞(CVE-2016-7255)。
總結(jié)
研究人員的研究方法是對漏洞利用開發(fā)者的特征進(jìn)行線索識別,然后再將這些特征用作唯一的搜索簽名。在追蹤Volodya和PlayBit的漏洞時,研究人員兩次使用了這項技術(shù)。有了這兩個成功的測試示例,研究人員相信該研究方法可用于搜索其他漏洞利用程序開發(fā)者。研究人員建議其他研究人員嘗試本文講的技術(shù),并將其用作其武器庫中的其他工具。
在此研究過程中,研究人員重點研究了APT攻擊和流行的惡意軟件(尤其是勒索軟件)中不同惡意軟件家族所使用或嵌入的漏洞。
研究人員能夠反復(fù)使用研究人員的技術(shù)來跟蹤由兩個不同攻擊者編寫和出售的16種WindowsLPE漏洞,這一點非常令人驚訝。考慮到其中有15個是在2015-2019年的時間范圍內(nèi),因此可以假設(shè)它們構(gòu)成了漏洞利用市場的重要份額,尤其是WindowsLPE漏洞。
最后,研究人員不可能知道Windows內(nèi)核零日漏洞的總量。話雖如此,研究人員仍然可以通過回顧所捕獲的漏洞窺一斑而知全豹。去年,卡巴斯基報告,有一個攻擊者傳播了一個漏洞利用框架,其中包括另外3個零日漏洞。將這些數(shù)字加起來,研究人員發(fā)現(xiàn)15個零日漏洞中有8個(占“市場份額”的一半以上)僅來自于兩個開發(fā)團(tuán)隊。這意味著研究人員的研究技術(shù)有可能被用來追蹤可見市場中的許多攻擊者。

本文翻譯自:https://research.checkpoint.com/2020/graphology-of-an-exploit-volodya/