當前位置:
首頁 > 新聞 > 如何在內存中檢測惡意軟體

如何在內存中檢測惡意軟體

本文將介紹一些基於內存的攻擊中最常見的技術,並尋求一種低干擾方法來檢測隱藏在內存中的攻擊。

內存攻擊技術

內存攻擊常見的技術包括shellcode注入,反射式DLL注入,內存模塊,Process Hollowing,重寫模塊以及Gargoyle(ROP / APC)。

ShellCode注入技術

Shellcode注入是最基本的內存攻擊技術,也是使用時間最長的。 shellcode注入的基本方法是包含四個步驟:

1.打開目標進程(OpenProcess);

2.在進程中分配一大塊內存(VirtualAllocEx);

3.將shellcode有效內容寫入新分配的部分(WriteProcessMemory);

4.在遠程進程中創建一個新的線程來執行shellcode(CreateRemoteThread);

臭名昭著的遠程控制木馬Poison Ivy使用就是這種技術,這是多年來其吸引很多APT攻擊組織的一個重要原因。

如果你使用x64dbg提取Poison Ivy樣本並在VirtualAllocEx上設置斷點,你將能很快找到負責注射的代碼塊。

如上圖所示,調用VirtualAllocEx之前的push 40指令對應於PAGE_EXECUTE_READWRITE的頁面訪問保護值。在ProcessHacker下面的一個Poison Ivy植入的內存布局的截圖中,你可以看到它分配了以下這些RWX部分。

典型的代碼部分類型為「Image」,並映射到磁碟上的文件。不過,由於有些類型不會映射到磁碟上的文件。因此,它們被稱為未回調的可執行部分或浮動代碼。從這些類型的內存區域開始的線程是異常的,是惡意活動進行攻擊的預兆。 ProcessHacker還可以顯示惡意軟體線程的調用堆棧,調用堆棧中會有多個函數不映射到與載入的模塊相關聯的內存。

反射DLL注入

由Steven Fewer開發的反射式DLL注入是另一種內存攻擊技術。 Metasploit的Meterperter有效載荷是第一次完全把這種技術工具化的嘗試,截至目前,仍有許多惡意軟體家族在使用Meterperter有效載荷。反射式DLL注入通過創建一個DLL,在執行攻擊時會將自身映射到內存中,而不依賴於Window的載入器。除了shellcode被替換為自映射DLL,注入過程與shellcode注入是一樣的。添加到DLL的自映射組件負責解析導入地址,修復重定位以及調

用DllMain函數。攻擊者可以從C / C 而不是彙編語言編寫更高級別的語言。

經典反射式DLL注入,如Meterpreter所使用的,很容易被檢測到。因為這個過程中留下了大量的RWX內存部分,即使是關閉會話進程。這些未回執的可執行存儲器部分的開頭包含完整的MZ / PE標題,如下圖所示。但是,其他反射式DLL實現可以刪除標題並修復內存泄漏。

載入在內存中的DLL也方便地導出一個名為ReflectiveLoader()的自描述函數。

內存模塊

內存模塊是另一種內存駐留攻擊技術,它類似於反射式DLL注入,注射器或載入器負責將目標DLL映射到內存而不是DLL映射本身。本質上,內存模塊載入器重新實現了LoadLibrary函數,但它在內存中的緩衝區而不是磁碟上的文件中起作用。最初的設計是為了在當前流程中進行映射,但升級後的技術可以將模塊映射到遠程進程。大多數攻擊的實現都會使用目標DLL的部分許可權,並避免使用痕迹太重的RWX方法。

NetTraveler是一個使用內存模式攻擊技術的惡意軟體家族。NetTraveler在啟動時,它解包核心功能並將其映射到內存中。頁面許可權更接近於合法的DLL,但是內存區域仍然是私有的,而不是映像過來的。

活動線程在這些私有區域有起始地址,調用堆棧還顯示了這些惡意部分。

Winnti是使用內存模塊技術的另一個惡意軟體家族,如下所示,它們會在第一頁的部分許可權上有一小部分內存模塊。

然而,Winnti的示例顯然更加先進一些,因為DLL中的MZ / PE頭被擦除,使其更難以檢測。

Process Hollowing

Process Hollowing是現代惡意軟體常用的一種進程創建技術,雖然在使用任務管理器之類的工具查看時,這些進程看起來是合法的,但是該進程的代碼實際上已被惡意內容所替代。

它涉及創建一個暫停的進程,從進程中取消映射的原始可執行文件,為進程分配和寫入一個新的有效載荷,使用SetThreadContext將原始線程的執行重定向到新的有效載荷,最後調用ResumeThread來完成。而更加隱蔽的變體會使用創建/映射部分API來避免WriteProcessMemory。寫入代碼後,必須知道進程新的入口點在哪裡,新的Process Hollowing攻擊都會採用跳轉來修改入口點,而不是使用SetThreadContext。

DarkComet是使用Process Hollowing的許多惡意軟體家族之一,它可以同時使用幾種工具來檢測Process Hollowing,它的惡意活動會用CREATE_SUSPENDED標誌攻擊過程的發生,如以下所示的DarkComet樣本。

重寫模塊

到目前為止,所有討論的技術都能導致執行非映像支持的代碼,因此可以直接對這些代碼進行檢測。而重寫模塊技術則避開了這些,使其更難以被檢測。該技術包括將未使用的模塊映射到目標進程,然後用自己的有效載荷重寫模塊,Flame病毒是第一個大規模利用此技術的惡意軟體家族。最近,Careto和Odinaff惡意軟體家族也使用了重寫模塊技術。可以使用各種技術來檢測重寫模塊的使用,主要利用的是將存儲器與磁碟上的相關數據進行比較。

GARGOYLE

gargoyle是一個將一個程序的所有可執行代碼都隱藏在不可執行的內存塊中的技術。在一些程序員定義區間內,gargoyle會活躍起來,結合一些ROP欺騙,把自己標記為可執行並實施攻擊。

在掃描內存來尋找異常時,通常會掃描可執行的內存塊,gargoyle可以在Windows上實現將數據隱藏在不可執行的內存塊中。

檢測這種攻擊者技術的一種方法是檢查線程和用戶APC,以獲取ROP鏈的證據。

如何檢測內存中的攻擊

鑒於這些技術的廣泛應用,安全人員必須對基於內存的攻擊技術保持高度警惕。然而,目前大多數安全產品還無法大規模地對這種技術進行檢測,從而使其肆意橫行。

為此,有安全公司實現了可以廣泛進行檢測的方法,即在其PowerShell工具Get-InjectedThreads上實現了一種相對較低干擾的內存威脅檢測方法。該方法可以掃描系統上的活動線程可疑的起始地址。用戶可以利用它掃描其網路中的主機,並快速識別許多內存常駐惡意軟體技術。該腳本通過使用NtQueryInformationThread函數查詢每個活動線程來檢索其起始地址。然後,使用VirtualQueryEx函數查詢起始地址,以確定相關的節點屬性。如果線程啟動的存儲器區域是未回調的並且是可執行的,即不是映像類型並且具有執行位設置,那麼該線程就被認為是注入的。下圖就顯示了在感染9002 RAT樣本的系統上運行時的樣本檢測。

該腳本將捕獲各種惡意軟體家族利用shellcode注入,反射DLL,內存模塊和一些Process Hollowing技術。但是,它不能替代全面防止內存攻擊的安全產品,如EndGame。


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

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


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

Golang語言TLS雙向身份驗證拒絕服務漏洞分析
SNDBOX:應用AI進行惡意軟體分析

TAG:嘶吼RoarTalk |