DLL 代理加載 shellcode
DLL側面加載或DLL代理加載允許攻擊者濫用合法的和經過簽名的可執行文件,以在受感染的系統上執行代碼。自2017年以來,這種技術一直很流行。
代理加載與DLL劫持非常相似,但是,它不會破壞原始程序的執行流程或功能。除了將惡意活動隱藏在合法應用程序之后,它還可以用作持久性方法。
總覽
為了了解DLL代理對攻擊者的加載效果如何,我們首先需要了解當今的典型應用程序如何為第三方庫加載外部函數。

使用上面的示例流程,將發生以下情況。
在啟動時,應用程序(A )需要使用名為“ GetFunkyData()”(C)的第三方函數來獲取數據,GetFunkyData()存在于名為“ DataFunctions.dll”(B)的動態鏈接庫中,該庫位于工作環境中。應用程序的目錄。
應用程序(A)嘗試按其名稱加載庫“ DataFunctions.dll”,以嘗試執行“ GetFunkyData()”(C)。由于該函數存在于庫(B)中,因此將執行該函數,并且應用程序將正常運行。
執行DLL代理加載攻擊時,流程略有不同。

在啟動時,應用程序(A)需要使用名為“ GetFunkyData()”(D)的第三方函數來獲取數據,GetFunkyData()存在于動態鏈接庫中,該動態鏈接庫位于工作目錄中,名為“ DataFunctions_Original.dll”(B)。應用程序的
應用程序(A )通過其名稱加載庫“ DataFunctions.dll”,以嘗試執行“ GetFunkyData()”(C)。該DLL實際上是攻擊者專門設計的“代理”庫,代理DLL使用外部導出/鏈接器引用將功能調用重定向到原始DLL“ DataFunctions_Original.dll”(B)。該功能由應用程序找到并執行
此時,攻擊者已經劫持了執行流程(C),并且可以代表運行中的進程(E)執行代碼,而無需用戶或應用程序的了解。
查找目標可執行文件
在尋找目標可執行文件時,應牢記以下幾點:
大小,我們通常正在尋找小于10 MB(通常小于1 MB)的可執行文件。
簽名,目標應該是經過數字簽名的“合法”可執行文件。這越多越好。
在運行時不安全地加載少量DLL ,可執行流必須是可劫持的,但我們不希望將超過1-3個DLL放到目標上以使我們的攻擊才能順利進行。
根據我們的戰術我們要如何繞過Defense
這里分享一個我的方法:
我的典型方法是前往Ninite這樣的網站,從常見的軟件供應商那里下載一些應用程序,然后開始在安裝目錄中四處瀏覽。對于此示例,讓我們嘗試FileZilla。默認情況下,FileZilla的x64位安裝最終位于“ C:\ Program Files \ FileZilla FTP客戶端”中。該文件夾包含幾個可執行文件以及DLL。

我們接下來要找出哪個DLL是軟件運行的必要DLL(也就是說如果沒有哪個DLL,軟件就運行不了),簡便的方法是將一個可執行文件簡單地復制到一個單獨的文件夾中并運行它。

真好!看來fzsftp.exe需要“ libnettle-7.dll”來執行,那么我們們從之前的“ C:\ Program Files \ FileZilla FTP Client”文件夾中復制libnettle-7.dll文件,然后重試!

可以運行,沒有任何沒有錯誤。我們可以使用Process Hacker之類的工具來檢查應用程序加載了哪些模塊,并進一步確認該DLL確實已加載。
SharpDllProxy –制作代理有效負載
下一步是制作我們的代理DLL,以將合法函數調用重定向到原始DLL,以及在后臺靜默加載我們的shellcode。為了簡化此步驟,我創建了一個名為“ SharpDllProxy”的簡單Dotnet核心應用程序。SharpDllProxy(https://github.com/Flangvik/SharpDllProxy)基于導出的函數生成代理DLL源代碼,該函數從原始DLL中提取。生成的源代碼只需將文件讀入內存,然后將其調用到新線程中即可。假設我們提供的文件是我們要部署的原始shellcode。
用法很不言自明(你懂的 繞過一下殺毒什么的)
我們把 libnettle-7.dll使用SharpDllProxy輸出一個“ / output_libnettle-7”的新文件夾。

SharpDllProxy在原始的“ libnettle-7.dll” DLL中找到了總共441個函數調用,并生成了完整的代理DLL源代碼,該函數將函數調用重定向到tmp8AA5.dll(這是原始“ libnettle-7.dll的副本” ”(剛剛重命名)。現在,我們只需要編譯保存到“ D:\ SharpDllProxy \ output_libnettle-7 \ libnettle-7_pragma.c”中的源代碼。

打開Visual Studio,單擊“創建新項目”。

選擇C ++作為您的語言,搜索“庫”,然后單擊“動態鏈接庫(DLL)”模板。

名稱應與原始DLL名稱匹配,命名“ libnettle-7”,然后單擊“創建”。默認情況下,我們將進入“ dllmain.cpp”,那么只需將“ D:\ SharpDllProxy \ output_libnettle-7 \ libnettle-7_pragma.c”的全部內容復制并粘貼到此文件中就行。

分析一下代碼,我們看到一旦觸發了DLL_PROCESS_ATTACH事件(L485-489),生成的源代碼就會創建一個新線程。然后,“ DoMagic()”繼續從本地文件“ shellcode.bin”(L455-465)中讀取二進制數據到緩沖區中。我們使用SharpDllProxy生成源代碼時定義了文件名“ shellcode.bin”。然后將該緩沖區復制到內存中并調用。

接下來我們要編譯此文件,請選擇對應的結構(x64 / x86),選擇“release”,然后選擇“Build” -> “Build Solution”.

根據我們Visual Studio保存的位置,這里我們保存在“ C:\ Users \ source \ repos \ libnettle-7 \ x64 \ Release”。

將DLL復制到由SharpDLLProxy創建的先前的輸出文件夾中,添加目標可執行文件以及任何x64 shellcode作為名為“ shellcode.bin”的原始文件。我們現在也可以刪除“ libnettle-7_pragma.c”文件。
我們可以從MSF或CS等等生成一些簡單的shellcode。例如:
msfvenom -a x64 –platform windows -p windows/x64/messagebox TEXT=”Proxy Loading worked!” -f raw > shellcode.bin
把生成的shellcode命名為shellcode.bin,然后放進fzsftp.exe文件夾中。
接下來,我們只要運行fzsftp.exe,fzsftp.exe調用libnettle-7.dll,就會從磁盤讀取我們的Shellcode.bin,然后執行它,并且不會破壞應用程序的功能。就這樣悄悄的執行了。