前言
流程注入是一種惡意軟件和無文件間諜攻擊中使用的最為廣泛的漏洞攻擊技術,而且在攻擊時還需要在另一個進程的地址空間内運行自定義代碼。過程注入除了提高了攻擊的隐蔽性之外,也實現了持久性攻擊。盡管目前有許多流程注入技術,但在本文中,我隻介紹十種在野外看到的能夠運用另一個進程運行惡意代碼的技術。在介紹的同時,我還會提供這些技術的屏幕截圖,以便于逆向工程和惡意軟件分析,協助針對這些常見技術進行的檢測和防禦。
一、經典的DLL注入
這種技術是用于将惡意軟件注入另一個進程的最常用技術之一,其方法就是惡意軟件将路徑寫入到其他進程的虛拟地址空間中的惡意動态鍊接庫(DLL),并通過在目标進程中創建遠程線程來确保遠程進程加載它。
惡意軟件首先需要找到注入過程,例如svchost.exe,要做到這一點,通常通過調用三個應用程序接口(API)來搜索進程:CreateToolhelp32Snapshot,Process32First和Process32Next。 CreateToolhelp32Snapshot是用于枚舉指定進程或所有進程的堆或模塊狀态的API,通過它返回一個snapshot。 然後,Process32First檢索snapshot中有關第一個進程的信息。最後,在循環中使用Process32Next來遍曆它們。找到目标進程後,惡意軟件通過調用OpenProcess獲取目标進程的句柄。
如下圖所示,惡意軟件調用VirtualAllocEx時,會用一個空格來寫入其DLL的路徑。然後惡意軟件調用WriteProcessMemory寫入分配的内存中的路徑。最後,為了讓代碼在另一個進程中執行,惡意軟件會調用API,如CreateRemoteThread,NtCreateThreadEx或RtlCreateUserThread。而NtCreateThreadEx或RtlCreateUserThread則是無文檔的,不過,一般的想法是将LoadLibrary的地址傳遞給其中一個API,以便遠程進程必須代表惡意軟件執行DLL。
目前,CreateRemoteThread已被許多安全産品跟蹤和标記。此外,它需要可以檢測到的磁盤上的惡意DLL。考慮到攻擊者常常使用注入代碼以逃避安全防護,現在的殺毒軟件可能不會使用這種方法。下面的屏幕截圖顯示了一個名為Rebhip的惡意軟件執行此技術的過程。
上圖顯示Rebhip蠕蟲執行典型的DLL注入
Sha256:07b8f25e7b536f5b6f686c12d04edc37e11347c8acd5c53f98a174723078c365
二、PE注入
惡意軟件不會傳遞LoadLibrary的地址,而是将其惡意代碼複制到現有的開放進程中,并使其執行(通過一個小的shellcode或通過調用CreateRemoteThread)。相比LoadLibrary技術,PE注入的一個優點是惡意軟件不必放棄磁盤上的惡意DLL。類似于第一種所介紹的經典注入技術,惡意軟件會在主機進程(例如VirtualAllocEx)中分配内存,而不是寫入DLL路徑,它通過調用WriteProcessMemory寫入其惡意代碼。然而,使用這種方法的前提是要更改複制圖像的基址。當惡意軟件将其PE注入另一個進程時,它将具有不可預測的新基址,要求它動态地重新計算其PE的固定地址。為了解決這一問題,惡意軟件需要在主機進程中找到其重定位表的地址,并通過循環遍曆其重定位描述符來解析複制映像的絕對地址。
這種技術類似于其他技術,如反射式DLL注入和内存模塊,因為它們不會将任何文件丢棄到磁盤。然而,内存模塊和反射式DLL注入方法甚至更加隐蔽。它們不依賴任何額外的Windows API(例如,CreateRemoteThread或LoadLibrary),因為它們在内存中加載并通過自身執行。反射式DLL注入通過創建一個DLL,在執行時将自身映射到内存中,而不依賴于Window的加載器。内存模塊類似于反射式DLL注入,注入器或加載器負責将目标DLL映射到内存而不是DLL映射本身。
在分析PE注入時,在調用CreateRemoteThread之前,看到循環(通常是兩個“for”循環,一個嵌套在另一個循環中)是非常常見的。這種技術在密碼(加密和模糊惡意軟件的軟件)中非常受歡迎。在下圖中,樣本單元測試利用的就是這種技術。該代碼有兩個嵌套循環來調整其重定位表,可以在調用WriteProcessMemory和CreateRemoteThread之前看到它。“and 0x0fff”指令也是另一個很好的指标,可以顯示用于獲取包含重定位塊的虛拟地址偏移量的前12位。現在,惡意軟件已經重新計算了所有必需的地址,它需要做的就是将其起始地址傳遞給CreateRemoteThread并将其執行。
上圖為調用CreateRemoteThread之前PE注入循環的結構示例
Sha256:ce8d7590182db2e51372a4a04d6a0927a65b2640739f9ec01cfd6c143b1110da
三、PROCESS HOLLOWING
Process Hollowing是現代惡意軟件常用的一種進程創建技術,雖然在使用任務管理器之類的工具查看時,這些進程看起來是合法的,但是該進程的代碼實際上已被惡意内容所替代。
當惡意軟件從目标進程的内存中解除HOLLOWING合法代碼并用惡意可執行文件覆蓋目标進程的内存空間(例如,svchost.exe)時,會發生進程中斷。
惡意軟件首先會創建一個新進程,以挂起模式托管惡意代碼。如下圖所示,通過調用CreateProcess并将流程創建标志設置為CREATE_SUSPENDED(0x00000004)完成。新進程的主線程被創建為挂起狀态,直到ResumeThread函數被調用才會運行。接下來,惡意軟件需要用惡意的有效載荷來替換合法文件的内容。這可以通過調用ZwUnmapViewOfSection或NtUnmapViewOfSection來取消映射目标進程的内存。這兩個API基本上釋放了一個指向所有内存的部分,當内存被取消映射後,加載器會執行VirtualAllocEx為惡意軟件分配新内存,并使用WriteProcessMemory将每個惡意軟件的部分寫入目标進程空間。惡意軟件調用SetThreadContext将entrypoint指向已編寫的新代碼段。最後,惡意軟件通過調用ResumeThread來恢複挂起的線程,以使進程處于暫停狀态。
上圖就是Ransom.Cryak執行HOLLOWING的過程
Sha256:eae72d803bf67df22526f50fc7ab84d838efb2865c27aef1a61592b1c520d144
四、線程劫持注入(THREAD EXECUTION HIJACKING)
THREAD EXECUTION HIJACKING又名SUSPEND, INJECT, AND RESUME (SIR),這種技術與先前讨論的PROCESS HOLLOWING有一些相似之處。在線程執行劫持的過程中,惡意軟件會針對進程的現有線程,并避免任何其他幹擾進程或線程創建的操作。因此,在分析期間,你可能會看到對CreateToolhelp32Snapshot和Thread32First的調用,它們都緊随OpenThread。
在獲取目标線程的句柄後,惡意軟件通過調用SuspendThread來執行注入,将線程置于挂起模式。惡意軟件調用VirtualAllocEx和WriteProcessMemory來分配内存并執行代碼注入。該代碼可以包含shellcode,惡意DLL的路徑和LoadLibrary的地址。
下圖展示了使用這種技術的trojan.generic,為了劫持線程的執行,惡意軟件通過調用SetThreadContext修改目标線程的EIP寄存器(包含下一條指令的地址)。之後,惡意軟件恢複線程來執行它已寫入主機進程的shellcode。從攻擊者的角度來看,SIR方法可能是有問題的,因為在系統調用中暫停和恢複線程可能導緻系統崩潰。為避免這種情況,如果EIP寄存器在NTDLL.dll的範圍内,攻擊者将會恢複更複雜的惡意軟件,然後重試。
上圖為trojan.generic執行線程劫持的過程
Sha256:787cbc8a6d1bc58ea169e51e1ad029a637f22560660cc129ab8a099a745bd50e
五、通過SETWINDOWSHOOKEX進行注入
Hooking是一種用于攔截函數調用的技術,惡意軟件可以利用挂鈎功能,在特定線程觸發攻擊時加載其惡意DLL。這通常通過調用SetWindowsHookEx來将鈎子例程安裝到鈎子鍊中來完成。 SetWindowsHookEx函數有四個參數,第一個參數是攻擊的類型,這些攻擊反映了鈎子攻擊類型的範圍,并且從鍵盤上的鍵(WH_KEYBOARD)到輸入到鼠标(WH_MOUSE),CBT都不同。第二個參數是指向惡意軟件想要在攻擊中調用的函數的指針執行。第三個參數是包含該函數的模塊。因此,在調用SetWindowsHookEx之前,看到對LoadLibrary和GetProcAddress的調用是非常常見的。該函數的最後一個參數是挂鈎過程與之關聯的線程。如果此值設置為零,則所有線程在觸發事件時執行操作。然而,惡意軟件通常針對一個線程來減少對操作的幹擾,因此也可以在SetWindowsHookEx之前查看調用CreateToolhelp32Snapshot和Thread32Next來查找和定位單個線程。一旦DLL被注入,惡意軟件代表其threadId被傳遞給SetWindowsHookEx函數的進程執行其惡意代碼。在下圖中,Locky Ransomware就實現了這種技術。
上圖為使用鈎子注入的Locky Ransomware
Sha256:5d6ddb8458ee5ab99f3e7d9a21490ff4e5bc9808e18b9e20b6dc2c5b27927ba1
六、通過修改注冊的方法來注入(比如APPINIT_DLLS,APPCERTDLLS,IFEO)
通過修改注冊的方法來注入,比如APPINIT_DLLS,APPCERTDLLS,IFEO。Appinit_DLL,AppCertDlls和IFEO(圖像文件執行選項)都是注冊表項,惡意軟件可用于注入和持久性攻擊。條目位于以下位置:
HKLMSoftwareMicrosoftWindows NTCurrentVersionWindowsAppinit_Dlls
HKLMSoftwareWow6432NodeMicrosoftWindows NTCurrentVersionWindowsAppinit_Dlls
HKLMSystemCurrentControlSetControlSession ManagerAppCertDlls
HKLMSoftwareMicrosoftWindows NTcurrentversionimage file execution options
AppInit_DLLs
惡意軟件可以将其惡意庫的位置插入到Appinit_Dlls注冊表項下,以使另一個進程加載其庫。此注冊表項下的每個庫都将加載到加載User32.dll的每個進程中。 User32.dll是用于存儲圖形元素(如對話框)的非常常用的庫。因此,當惡意軟件修改此子項時,大多數進程将加載惡意庫。下圖顯示了木乃伊依賴這種注入和持久性的方法,它隻需打開Appinit_Dlls注冊表項,方法是調用RegCreateKeyEx,并通過調用RegSetValueEx來修改它的值。
上圖顯示了Ginwui修改AppIniti_DLLs注冊表項
Sha256:9f10ec2786a10971eddc919a5e87a927c652e1655ddbbae72d376856d30fa27c
AppCertDlls
這種方法與AppInit_DLLs方法非常相似,隻是将此注冊表項下的DLL加載到調用Win32 API函數CreateProcess,CreateProcessAsUser,CreateProcessWithLogonW,CreateProcessWithTokenW和WinExec的每個進程中。
圖像文件執行選項(IFEO)
IFEO通常用于調試目的,開發人員可以在此注冊表項下設置“調試器值”,将程序附加到另一個可執行文件進行調試。因此,每當啟動可執行文件時,将附加到該程序。要使用此功能,你可以簡單地給出調試器的路徑,并将其附加到要分析的可執行文件。惡意軟件可以修改此注冊表項以将其注冊到目标可執行文件中。在下圖中,Diztakun木馬通過修改任務管理器的調試器值來實現此技術。
上圖為Diztakun木馬修改IFEO注冊表項的過程
Sha256:f0089056fc6a314713077273c5910f878813fa750f801dfca4ae7e9d7578a148
七、APC注入和AtomBombing内存注入
惡意軟件可以利用異步過程調用(APC)強制另一個線程通過将其附加到目标線程的APC隊列來執行其自定義代碼。每個線程都有一個APC隊列,它們在目标線程進入可變狀态時等待執行。如果調用SleepEx,SignalObjectAndWait,MsgWaitForMultipleObjectsEx,WaitForMultipleObjectsEx或WaitForSingleObjectEx函數,線程将進入預警狀态。惡意軟件通常會查找處于可更改狀态的任何線程,然後調用OpenThread和QueueUserAPC将APC排隊到線程。 QueueUserAPC有三個參數:
1.目标線程的句柄;
2.指向惡意軟件想要運行的功能的指針;
3.傳遞給函數指針的參數。
在下圖中,Amanahe惡意軟件首先調用OpenThread來獲取另一個線程的句柄,然後使用LoadLibraryA調用QueueUserAPC作為函數指針,将其惡意DLL注入另一個線程。
2016年EnSilo網絡安全公司的研究團隊發現了一個可以繞過Windows查殺機制的方法,可以繞過所有Windows的殺毒軟件和安全機制,他們把這個方法叫做AtomBombing内存注入。
今年IBM X-Force安全團隊發現了一個Dridex銀行木馬的升級版本,該版本被稱為Dridex v4。Dridex v4的重要改進是其使用了AtomBoming技術注入惡意代碼從而躲避殺毒軟件的查殺。
另外,AtomBoming技術還依賴APC注入。但是,它使用atom表寫入另一個進程的内存。
上圖為Almanahe 病毒執行APC注入的過程
Sha256:f74399cc0be275376dad23151e3d0c2e2a1c966e6db6a695a05ec1a30551c0ad
八、通過SETWINDOWLONG提供EXTRA WINDOW MEMORY INJECTION(EWMI)
EWMI依靠注入資源管理器托盤窗口以外的窗口内存,并被惡意軟件使用過幾次,如Gapz和PowerLoader。注冊窗口類時,應用程序可以指定一些額外的内存字節,稱為額外的窗口存儲器(EWM)。然而,EWM沒有太多的空間。為了規避這個限制,惡意軟件将代碼寫入explorer.exe的共享部分,并使用SetWindowLong和SendNotifyMessage來指定一個指向shellcode的函數指針,然後執行它。
當進行共享部分的寫入時,惡意軟件有兩個辦法。第一種是可以創建共享部分,并将其映射到自身和另一個進程(例如,explorer.exe)。第二種是它可以簡單地打開已經存在的共享部分。第一種在分配堆空間和調用NTMapViewOfSection以及其他一些API調用時花費很大,因此後一種方法被使用的更多。惡意軟件在共享部分中寫入其shellcode後,會使用GetWindowLong和SetWindowLong訪問和修改“Shell_TrayWnd”的額外窗口内存。 GetWindowLong是用于将指定偏移量的32位值檢索到窗口類對象的額外窗口存儲器中的API,SetWindowLong用于更改指定偏移量的值。隻有這樣,惡意軟件才可以簡單地更改窗口類中的函數指針的偏移量,并将其指向寫入共享部分的shellcode。
像上面提到的大多數其他技術一樣,惡意軟件需要觸發它編寫的代碼。在以前讨論的技術中,我也講過,惡意軟件通過調用API(如CreateRemoteThread,QueueUserAPC或SetThreadContext)來實現這一點。通過這種方法,惡意軟件通過調用SendNotifyMessage觸發注入的代碼。在執行SendNotifyMessage之後,Shell_TrayWnd接收并将控件傳遞給由SetWindowLong先前設置的值指向的地址。在下圖中,名為PowerLoader的惡意軟件使用的就是這種技術。
上圖為PowerLoader注入由Shell對象控制的Windows 托盤窗口的額外窗口内存
Sha256:5e56a3c4d4c304ee6278df0b32afb62bd0dd01e2a9894ad007f4cc5f873ab5cf
九、使用SHIMS進行注入
微軟向開發人員提供了Shims,主要是為了向後兼容(Backward Compatibility)。Shims允許開發人員将修補程序應用于程序,而無需重寫代碼。通過利用Shims,開發人員可以命令操作系統如何處理其應用程序,Shims本質上是一種嵌入API并針對特定可執行文件進行注入的方式。惡意軟件可以利用Shims來進行持久性攻擊并注入可執行文件。 Windows運行Shim引擎時,它會加載二進制文件以檢查Shim過的數據庫,以便應用适當的修補程序。
雖然目前有許多可以應用的修複程序,但是惡意軟件還是喜歡相對安全相關一些的(例如DisableNX,DisableSEH,InjectDLL等)。要安裝Shim過的數據庫(himming database),惡意軟件可以采用各種方法。例如,一個常見的方法是簡單執行sdbinst.exe,并将其指向惡意的sdb文件。在下圖中,廣告軟件“Search Protect by Conduit”使用Shims進行持久性和注入攻擊,它在Google Chrome中執行“InjectDLL”Shims以加載vc32loader.dll。現在有一些用于分析sdb文件的工具,但是對于下面列出的sdb的分析,我使用了python-sdb。
上圖為Search Protect用于注入目的的SDB
Sha256:6d5048baf2c3bba85adc9ac5ffd96b21c9a27d76003c4aa657157978d7437a20
十、Hook導入表(IAT hooking)或 INLINE HOOKING
Hook導入表(IAT hooking)和INLINE HOOKING通常被稱為用戶級rootkit(USERLAND ROOTKITS),HOOK導入表是一種惡意軟件用于更改導入地址表的技術。當合法應用程序調用位于DLL中的API時,将執行替換的函數,而不是原始代碼。相比之下,使用INLINE HOOKING,惡意軟件可以修改API函數本身。在惡意軟件FinFisher就是通過修改CreateWindowEx指針的位置執行HOOK導入表的。
總結
在這篇文章中,我介紹了惡意軟件在另一個進程中隐藏其活動的十種不同技術。通常,惡意軟件會直接将其shellcode注入到另一個進程中,或者強制另一個進程加載其惡意庫。在下表中,我對本文所講的十種技術進行了分類,并提供了樣本。
上表為流程注入可以通過直接将代碼注入到另一個進程中,或者通過強制将DLL加載到另一個進程來完成。
攻擊者和研究人員經常會發現新的用來實現注入并提供隐身的技術,這篇文章詳細介紹了十種常見和新興的技術,但并沒有羅列全,比如COM劫持。
原PO主: xiaohui/嘶吼專業版
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!