介绍
监控父进程和子进程之间的关系是威胁检测团队检测恶意活动的常用方法。例如,如果 PowerShell 是子进程,而 Microsoft Word 是父进程,则表明存在入侵。各种 EDR(端点检测和响应)可以轻松检测到这种异常活动。Windows API 调用“ CreateProcess ”支持一个参数,允许用户分配父 PID。这意味着恶意进程在创建时可以使用与实际执行的父进程不同的父进程。这导致攻击方使用父 PID 欺骗作为逃避方法
最初,这项技术是由Didier Stevens 于 2009 年引入到更广泛的信息安全受众中的 。当时发布了一个用 C++ 编写的概念验证 ( SelectMyParent ),该验证允许用户通过指定 PID(进程标识符)来选择父进程。“ CreateProcess ”函数与“ STARTUPINFOEX ”和“ LPPROC_Thread_ATTRIBUTE_LIST ”结合使用 。
Shell |
PID 508 对应于“ lsass.exe ”进程,该进程负责登录活动、密码更改等。记事本将在 lsass.exe 进程下创建。
调查该进程的属性会发现 Notepad 是以 SYSTEM 级权限运行的。这是因为子进程 (notepad.exe) 将获得父进程 (lsass.exe) 的权限。
从 Meterpreter 会话中,以下命令可用于检索当前会话的 PID,并通过指定进程名称,结果将仅过滤到该特定进程。
利用方式
C++
APC-PPID
根据 Microsoft 文档,“ 异步过程调用 ”是在特定线程上下文中异步执行的函数。这是 Halil Dalabasmaz 在其 C++ 工具 APC-PPID 中使用的一种进程注入方法,可实现父 PID 欺骗。
最初,函数“ getParentProcessID() ”用于检索父进程的 PID。“ TlHelp32.h ”标头( 工具帮助库 的一部分)支持“ CreateToolhelp32Snapshot ”函数,该函数负责对指定进程 (explorer.exe) 进行快照。拍摄快照时,将检索进程大小和 PID,然后关闭句柄。
Shell |
Windows API“ CreateProcess ”用于在系统(iexplore.exe)上创建一个具有“ STARTUPINFOEXA ”结构的新进程。
Shell |
可以使用 Metasploit 实用程序“msfvenom”或任何其他替代方法以 C 语言生成 shellcode。代码将写入创建的进程 (iexplore.exe) 的地址空间。
Shell |
在目标系统上执行二进制文件将创建一个新进程(iexplore.exe),其父进程为 explorer.exe。shellcode 将使用用户模式异步过程调用在 Internet Explorer 进程的内存空间中执行。
将与目标主机建立 Meterpreter 会话。
查看目标系统的进程将显示“ iexplore.exe ”已成功创建。
查看进程属性将验证父进程是否为“ explorer.exe ”。此概念验证实现了一种更隐蔽的进程注入方法,以将 shellcode 隐藏在进程内,并且由于 explorer 和 Internet Explorer 是有效的 Microsoft 系统进程,因此将绕过端点检测和响应产品融入环境。
spoof
该工具可用于父 PID 欺骗,因为它允许用户选择父 PID 进程。
Shell |
一旦在目标主机上创建了进程,就会执行任意负载并打开会话。
查看进程资源管理器中 PID 的进程详细信息将验证该进程是 explorer.exe 的子进程。
Powershell
PPID-Spoof
F-Secure 发布了一个可执行父 PID 欺骗的 PowerShell 脚本 ( PPID-Spoof )。该脚本包含嵌入式 C# 代码,以便与“ CreateProcess ”Windows API 进行交互。
Shell |
该工具接受 3 个参数,即父进程的 PID、子进程的系统路径和用于代码执行的任意 DLL 的路径。
Shell |
记事本将在 PowerShell 上下文中执行,并且 DLL 将在 notepad.exe 内加载。
由于 DLL 将在进程内部加载,因此与命令和控制框架的通信通道将会打开。
更隐蔽的方法可能是在“ LSASS ”进程内加载 DLL 。威胁搜寻团队必须检查 EventHeader ProcessId 和 ParentProcessID,才能识别进程欺骗。
Shell |
系统上将创建一个新的“ LSASS ”进程,该进程将加载任意 DLL。这种情况允许红队融入环境中的合法进程。
Meterpreter 会话将以进程 ID 1312 打开,该进程对应于“ rundll32 ”进程,该进程是执行 DLL 的“ lsass.exe ”的子进程。
psgetsys
Andrea Pierini 通过在 PowerShell 脚本中嵌入 C# 代码实现了父 PID 欺骗技术。该脚本将创建一个新的子进程,该子进程的父进程为用户定义的任何进程。与 F-Secure Labs 脚本类似,“ CreateProcess() ” API 用于执行欺骗。
Shell |
创建的进程将获得父进程(winlogon.exe)的权限(SYSTEM)。
C#
GetSystem
GetSystem 程序使用 C# 开发,并实现父进程 ID 欺骗,以便将权限提升至 SYSTEM。这是通过“ CreateProcess ”API 实现的。.NET 二进制文件仅接受两个参数,即任意可执行文件和将充当父进程的进程名称。
Shell |
进程“ pentestlab.exe ”将在目标主机上创建为“ lsass.exe ”的子进程。
将与具有 SYSTEM 级别权限的相应命令和控制框架建立通信。
由于“ GetSystem ”基于 C#,因此可以通过 Covenant 或任何其他可以加载汇编二进制文件的相关框架(Cobalt Strike)来实现此技术。
Shell |
父进程将是“ LSASS ”或以 SYSTEM 级权限运行的任何其他进程。
ProcessInjection
Chirag Savla 使用 C# 开发了一个执行进程注入的 工具 ,能够利用所有常见的 Windows API(CreateProcess、VirtualAllocEx、OpenProcess 等)执行父 PID 欺骗。此工具的优点是支持具有父 PID 欺骗的不同进程注入技术。该工具接受 base-64、C 和十六进制的 shellcode。Metasploit“ msfvenom ”实用程序可以生成这些格式的 shellcode。
Shell |
该工具需要注入进程的路径、shellcode 的路径、父进程名称、payload 的文件格式和进程注入技术。执行以下命令将把 shellcode 注入到以 explorer.exe 为父进程的新进程 (calc.exe) 中。
Shell |
监控进程将验证计算器是否已在 explorer.exe 的上下文中创建。
shellcode 将在 calc.exe 的虚拟地址空间中执行,并与命令和控制建立通信。
ProcessInjection 还支持使用 DLL 注入进行父 PID 欺骗。可以使用 Metasploit“msfvenom”生成任意 DLL 文件。
Shell |
需要指定DLL的路径而不是shellcode,并且技术值应该更改为5。
Shell |
当在进程内部创建远程线程时,shellcode 将执行,并且 Meterpreter 会话将打开。
该会话将在“ rundll32 ”进程的上下文中运行 。
指定技术编号 6 将使用进程填空技术执行父进程欺骗。
Shell |
该工具还支持使用异步过程调用进行进程注入。为了实现更隐秘的方法,shellcode 的执行将在目标进程主线程的入口点之前发生。
Shell |
RemoteProcessInjection
它能够执行进程注入。该工具专为 Cobalt Strike 设计,接受基于 base-64 的有效负载。Metasploit 实用程序“msfvenom”可以生成原始 shellcode,然后可轻松转换为 base-64。
Shell |
shellcode 将被注入到目标进程中。尽管它不使用“ CreateProcess ”API 来欺骗父进程,但它却能够将恶意软件隐藏在合法的 Windows 进程中。
Shell |
远程进程注入
有效载荷将从目标进程的内存地址空间执行。进程注入方法与“ migrate ”Metasploit 命令有相似之处,因为它使用相同的 Windows API。
VBA
Microsoft Office 一直是恶意软件非常流行的传播机制,因为它可以帮助威胁参与者和红队在组织内部获得初步立足点。然而,以宏形式执行恶意代码将创建一个任意子进程,EDR 可以轻松发现该进程,因为 EDR 能够分析进程父子关系之间的异常。
有多种方法可用于逃避调查父/子关系的 EDR 产品的检测。例如,VBScript 可以调用其他系统资源来执行恶意软件,如 WMI、COM 或计划任务。因此,父进程将不是 WINWORD,而是 Windows 操作系统的进程。
以下宏将使用 WMI(Windows 管理规范)来创建新进程。
Shell |
这种方法的好处是,创建的进程将在“ WmiPrvSE.exe ”下生成,而不是办公进程。
将会开通与C2的沟通渠道。
COM 对象也可用于执行新进程。
Shell |
使用此方法执行恶意可执行文件的结果是, 即使执行发生在办公产品内部,父进程也将是“ explorer.exe ”。
下图演示了会话将通过执行任意有效负载的 COM 对象在 Meterpreter 中打开。
计划任务 通常用作持久性方法,因为它允许红队在特定日期或时间执行其交易。但是,它也可以用于父 PID 欺骗,因为可以直接从 vbscript 创建计划任务。以下代码将注册一个新的计划任务,该任务将在 30 秒后触发有效载荷的执行。
Shell |
新的进程将不再以微软产品的进程作为父进程,而是以“ svchost.exe ”作为更隐秘的进程。
查看任意进程的进程属性将验证其父进程是“ svhcost.exe ”。
工具包
工具 |
语言 |
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检测
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论