当前位置: 首页 > 科技观察

检测父PID欺骗?

时间:2023-03-20 23:53:59 科技观察

检测异常活动最有用的技术之一是分析父子进程关系,然而,更老练和强大的攻击者可以使用父PID(PPID)欺骗来绕过此操作,从而允许执行恶意程序来自任何父进程的进程。虽然该技术本身并不新鲜,并且虽然CobaltStrike和DidierStevens对其进行了详细描述,但很少有专门研究检测此类攻击。在本文中,我们探讨了这种技术的工作原理以及防御者如何利用Windows事件跟踪(ETW)来检测它。我们还将发布一个概念验证PowerShell脚本来执行PPID欺骗和DLL注入,以及一个利用pywintrace库检测此活动的Python脚本。为什么首先要造假?过去,攻击者通常能够在不留痕迹的情况下发动攻击,但随着EDR的兴起和威胁搜寻的兴起,这种情况开始发生变化。特别是,父子进程分析的使用已成为检测网络攻击杀伤链几乎每个阶段出现的异常活动的有用技术。我们在Countercept上使用的一些示例:宏有效载荷传递:WinWord生成进程;JS/VBSC#有效负载传递:cscript生成csc;横向移动:services/wmiprvse生成新进程;这迫使攻击者重新评估他们的方法,并研究PPID欺骗等技术来绕过现代防御策略。通过CreateProcessA进行欺骗有许多不同的方法可以欺骗父进程,在本文中,我们将重点介绍一种最简单和最常用的技术,涉及API调用CreateProcessA。毫不奇怪,CreateProcessA允许用户创建一个新进程,默认情况下,该进程将使用继承的父进程创建。但是,此函数还支持名为“lpStartupInfo”的参数,您可以在其中定义要使用的父进程。此功能是在WindowsVista中添加UAC后首次引入的,目的是正确设置父级。在更深的技术层面上,lpStartupInfo参数指向一个STARTUPINFOEX结构。这个结构包含一个lpAttributeList,可以使用UpdateProcThreadAttribute通过“PROC_THREAD_ATTRIBUTE_PARENT_PROCESS”属性设置进程的父进程。顺便说一句,这种方法也可以用于特权升级。该文档提到“从给定进程继承的属性包括句柄、设备映射、处理器关联、优先级、配额、进程令牌和作业对象”。“AdamChester有一篇博客,展示了它如何被滥用以获取对Windows系统的访问权限。如何欺骗父进程?在Web上获得立足点的最常见方法之一是使用恶意宏文档,许多有效负载经常启动新进程,如cmd、PowerShell、regsvr32或certutil。图3显示了从winword生成rundll32的示例。但是,这种行为相对异常,并且很容易被大多数防御策略检测到。为了克服这一点,攻击者可以改用CreateProcessA技术VBS宏实现从预期的父进程(例如Explorer启动cmd)启动负载以与环境混合,下图概述了这是如何完成的。我们不会发布此VBS代码,但是,可以在此处找到更多信息...但是我们可以采取进一步的措施来避免完全使用常见的Windows实用程序吗?一个选择是使用某种形式的DLL或内存注入来在已经运行的进程中加载??有效负载。为了说明这一点,我们基于DidierStevens]的代码创建了一个PowerShell脚本,该脚本可用于创建具有欺骗父进程的进程,然后将DLL注入其中。为了演示如何使用此脚本来隐藏活动,我们看一下Windows10上的一个常用进程。我们看一个非常常见的合法关系是“svchost.exe”启动“RuntimeBroker.exe”。使用PowerShell脚本,我们能够模拟此活动并强制由“svchost.exe”生成合法的“RuntimeBroker.exe”,然后注入并执行DLL负载。该向量显示了此类技术如何可能绕过针对父子关系的检测规则。如何找到攻击者?上面我们介绍了CreateProcessA如何欺骗父ID等技术,从安全团队的角度来看,如果使用任务管理器或进程资源管理器查询正在运行的进程,那么会看到一个欺骗ID。但是,有什么办法可以查出真实身份吗?Windows中取证数据的最佳来源之一是Windows事件跟踪(ETW),ETW提供有关系统上发生的事件的实时数据流,这是我们在代理中使用的CounterceptSomething端点。特别是Microsoft-Windows-Kernel-Process提供程序可以提供一些有关进程创建的有用见解,并可以帮助我们检测进程ID欺骗。在下面的示例中,您将看到如何从“winword.exe”(PID9224)生成“rundll32.exe”(PID5180)(图9)。查看收集的ETW数据(图10),您将看到多个ProcessId字段,包括EventHeaderProcessId以及实际事件ProcessID和ParentProcessID。虽然这有点令人困惑,但通过阅读MSDN文档,我们发现EventHeaderProcessId实际上标识了生成事件的进程,即父进程。在这个合法示例中,您会注意到EventHeaderProcessId和ParentProcessId正确匹配。在第二个示例中,我们执行了一个恶意的PowerShell脚本并通过“svchost.exe”(PID4652)生成了“RuntimeBroker.exe”(PID4976)。和以前一样,我们可以看到ETW生成了一个进程事件(图12);但是,这次EventHeaderProcessId和ParentProcessID不同。事实上,EventHeaderProcessId显示了真正的父关系,它是“winword.exe”(PID9224),因为我们刚刚发现有人在进行ParentPID欺骗!然而,就像在威胁检测中一样,事情并没有那么简单,如果你尝试大规模地这样做,你会看到合法欺骗的误报。一个常见的例子是用户帐户控制(UAC),它用于提升进程权限。在Windows10中,当UAC生效时,应用程序信息服务(通过svchost)用于启动提升的进程,但随后会诱使父进程透露原始调用者。下面的示例显示了提升的cmd.exe如何将explorer.exe显示为父级,而实际上它是svchost.exe。我们看到的另一个误报与WerFault的崩溃处理有关,在下面的示例中,当MicrosoftEdge崩溃时,WerFault.exe使用svchost启动,父级被欺骗为MicrosoftEdge.exe。出于测试目的,我们创建了一个简单的概念验证Python脚本,该脚本使用pywintrace记录来自ETW的事件、比较PID,然后过滤结果以消除误报(图15)。PowerShell欺骗脚本的代码以及检测脚本可以在我们的Github上找到。总结在本文中,我们展示了攻击者如何利用合法的Windows功能来愚弄防御者并可能绕过基于父子关系的检测技术。然而,从防御的角度来看,我们已经展示了对ETW进程事件的分析如何可以轻松地突出异常的父母欺骗并帮助发现进程的真正来源。本文翻译自:https://blog.f-secure.com/detecting-parent-pid-spoofing/