當前位置:
首頁 > 新聞 > PROPagate——一種新的代碼注入技巧

PROPagate——一種新的代碼注入技巧

通常在不同的進程空間中執行代碼會有很多種方法,最常見的方法有以下幾種:

1.注入的DLL或系統級的鉤子,

2.sideload模式,

3.執行遠程線程,

4.APCs,

5.攔截和修改遠程線程的線程上下文。

然後再通過Gapz/Powerloader代碼注入(又名EWMI),AtomBombing或映射/不映射方法來利用NtClose補丁。

不過今天,我會在本文介紹一個一種新的代碼注入技巧——PROPagate。

還記得2002左右發生的「粉碎」(shatter)攻擊嗎?UIPI是一種強制機制,它阻止向高級進程發送特定的windows事件消息。保護模式依靠UIPI來防止低級進程向更高級許可權的進程發送潛在的惡意消息,這也就是所謂的「粉碎攻擊」的原理。

在我看來,實施粉碎攻擊不止有一種方法,下面我要描述的技巧更簡單甚至不需要任何ROP。

在使用窗口子類化的系統上總是存在一類窗口,因為在子類化過程中,舊窗口過程被保留,而新窗口被顯示在當前的窗口中。不過舊窗口並不會停止運行,而是把所有的顯示信息都攔截下來隱藏在後台運行 。

「native」窗口子類化是使用SetWindowSubclass API完成的,當一個窗口被子類化時,它會獲得一個存儲在其內部結構中的新屬性,並根據comctl32.dll的版本來命名名稱:

版本6.x對應的名稱是UxSubclassInfo;

版本5.x對應的名稱是CC32SubclassInfo。

查看Windows資源管理器子窗口的屬性,你可以看到其中很多都使用了這個特殊的子類屬性:

可以這麼說,幾乎所有的Windows應用程序都是如此,包括OllyDbg:

當SetWindowSubclass被調用時,它使用SetProp API將這兩個屬性(UxSubclassInfo或CC32SubclassInfo)中的一個指向內存中的一個區域,其中舊的函數指針就被存儲在該區域。當調用新的通信進程時,它將為給定的窗口調用GetProp API,一旦它被檢索到,它就會被執行。

回想一下上述的粉碎攻擊,我可以不使用SetWindowLong或SetClassLong來設置windows屬於其他進程(通過GWL_WNDPROC或GCL_WNDPROC)的窗口地址。但是,SetProp函數不受此限制的影響。當涉及到低級進程時,窗口就會發出以下提示信息:

SetProp受 UIPI的限制,進程只能調用屬於較低或相同級別的進程窗口上函數。當UIPI阻止屬性更改時,GetLastError將返回5。

因此,如果你要在同一會話中討論其他用戶應用程序,就可以自由地修改其windows的屬性,比如:

1.你可以自由地修改屬於另一個進程的窗口的屬性;

2.我們還知道一些屬性指向內存區域,該區域存儲的是子類窗口進程的舊地址;

3.地址指向的進程將在某個階段執行。

應該說,這都是UxSubclassInfo/CC32SubclassInfo屬性正在使用的結構。在檢查SetProp在這些子類窗口的運行過程後,你會很快發現,舊的過程存儲在該內存區域開頭的偏移量0x18處。這個結構有點複雜,雖然它包含多個回調,但第一個回調出現在0x18處。

因此,將一個小的緩衝區注入到目標進程中,可以確保預期的結構被正確地填充並且指向有效載荷,然後改變相應的窗口屬性以確保下一次窗口接收到消息時會執行有效載荷(這個過程可以通過發送消息來強制執行)。

當我發現這個技巧後,迅速編寫了POC,該POC會用前面提到的屬性枚舉所有的窗口。對於發現的每個子類屬性,我都會將其更改為隨機值—,這樣Windows資源管理器,Total Commander,Process Hacker,Ollydbg和其他一些應用程序就會立即崩潰。這代表所發現的技巧是正確的,然後我創建了一個非常小的shellcode,它會在桌面窗口上顯示一個消息框,並在Windows 10(在正常帳戶下)進行測試。

在第一個隨機目標(這裡是Total Commander)中調用shellcode的截圖:

當然,它也適用於Windows資源管理器,這是它在執行時的截圖:

如果我檢查進程瀏覽器,就可以看到窗口屬於explorer.exe:

在Windows XP系統上測試它,並向Windows資源管理器中注入shellcode,就會讓每個窗口暴露出子類化屬性的執行過程。

還有許多其他的通用屬性可以以相同的方式來使用:

1.microsoftfoundation類庫(MFC)使用「AfxOldWndProc423」屬性來對其窗口進行子類化,

2.ControlOfs[HEX]屬性與Delphi應用程序引用的內存可視化組件庫(VCL)對象,

3.新的windows框架,例如Microsoft.Windows.WindowFactory.ViewId都需要更多的研究,

4.一些自定義控制項使用「子類」時,我推斷它們也可以以類似的方式進行修改,

5.一些公開了COM/OLE介面的屬性,例如OleDropTargetInterface。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

HomeHack——LG物聯網家用電器中的新漏洞
另類端掃:無IP地址的埠掃描
利用BDF向EXE文件植入後門
微軟office DDE攻擊與防禦
Web App攻擊之使用Web Scarab工具搜索目標

TAG:嘶吼RoarTalk |