标题 简介 类型 公开时间
关联规则 关联知识 关联工具 关联文档 关联抓包
参考1(官网)
参考2
参考3
详情
[SAFE-ID: JIWO-2025-3490]   作者: ShYLie 发表于: [2025-01-14]  [2025-01-14]被用户:ShYLie 修改过

本文共 [3] 位读者顶过

基于网络连接的规避

除了直接使用高级恶意软件技术与 EDR 对抗外,还有其他实现规避的方法,如利用 EDR 配置错误或漏洞、卸载 EDR 代理,或使用自带易受攻击的驱动程序 (BYOVD) 来终止 EDR 进程。在这些间接规避技术中,我特别对基于网络连接的规避感兴趣。

这个概念并不完全新颖。EDR 代理通过发送遥测数据与中央或云服务器定期通信,这些数据包括主机信息、诊断警报、检测结果和其他数据。对于更复杂的恶意软件,EDR 代理可能不会立即终止它。相反,代理会监控恶意软件的行为,并在云端利用机器学习。一旦收集到足够的证据,恶意软件的执行就会被终止。这表明 EDR 严重依赖云端。当然,代理仍然可以检测经典的恶意软件和技术,比如原版的 Mimikatz。但是,没有互联网连接,EDR 就会失去大部分效力,SOC 团队也无法通过 EDR 管理面板监控终端。

我在测试物理服务器上安装了 Microsoft Defender for Business 和 Elastic Endpoint。根据以下截图,这些传感器与各种服务器通信,每个服务器都有不同的角色。一些服务器收集遥测数据进行进一步分析,而其他服务器则收集恶意软件样本等。

为了更方便地观察明文遥测数据,在故意运行一些原版恶意软件后,我使用mitmproxy检查了以下 HTTP 数据包。数据确实包含检测和警报信息。

[出自:jiwo.org]


除了遭遇互联网中断或断电外,如何让终端主动离线呢?原理并不复杂。几年前,一篇文章展示了通过使用 Windows Defender 防火墙规则来实现这一点。设置规则以阻止 EDR 进程向云端发送数据听起来很简单。然而,除了需要管理员权限外,还有其他缺点和缓解措施。

一篇简短文章提供了两个快速缓解方案。通过启用篡改保护,利用防火墙规则使 MDE 进程静音的尝试将被阻止。虽然篡改保护专门保护 MDE 进程,但其他 EDR 供应商也可能采用类似的保护机制。禁用防火墙规则合并是另一个有效的对策。特别是对于使用 Active Directory 的组织,组策略 (GPO) 可以覆盖终端本地防火墙设置。

Windows Defender 防火墙支持基于远程地址和端口的规则。不幸的是,一些 EDR 产品与数百甚至数千个联系服务器通信,这使得在保持隐蔽的同时包含每个联系服务器变得困难。对于 Microsoft Defender for Endpoint/Business,我们可以参考配置设备连接性Azure IP 范围的文档。数据可能会在数千个云服务器中的任何一个发送到云端,这种复杂性仅适用于单个 EDR,更不用说其他 EDR 产品了。



WFP 和 EDRSilencer

由于对 Windows Defender 防火墙的更改很容易被观察到,在更低层次进行篡改可能是更好的方法。这就引出了 Windows 筛选平台 (WFP)。

根据Microsoft 文档,WFP 是一组 API 和系统服务,为开发人员提供了在各个层次上与数据包处理交互和操作的灵活性和能力。WFP 允许用户按应用程序、用户、地址、网络接口等过滤连接。WFP 的功能被用于内容过滤、家长控制、规避审查、深度数据包检测等。因此,WFP 被 IDS/IPS、广告拦截器、防火墙、EDR 和 VPN 等安全产品广泛使用。Windows Defender 防火墙也是基于 WFP 的。以下截图显示AdGuard使用 WFP 驱动程序来扩展其功能。






WFP 非常复杂,这里不可能涵盖每个功能。Microsoft 有关于 WFP 的详细文档,你可以查阅获取详细信息。但是,我会以简化的方式解释一些关键概念,以避免后面的混淆。

回调函数

回调函数是由驱动程序公开并用于专门过滤的一组函数。WFP 包含一些内置回调函数,每个函数都由 GUID 标识。

过滤引擎

过滤引擎由用户模式组件基本过滤引擎 (BFE) 和内核模式组件通用过滤引擎组成。这些组件协同工作以执行数据包的过滤操作。内核模式组件在网络和传输层执行过滤。在对网络流量应用过滤器的过程中,内核模式组件调用可用的回调函数。

过滤器

过滤器是与数据包匹配的规则,告诉过滤引擎如何处理流量。例如,一条规则可能是"阻止所有到 TCP 端口 9200 的出站数据包"。过滤器可以是启动时过滤器或运行时过滤器。启动时过滤器在启动过程中 tcpip.sys 启动时强制执行,而运行时过滤器更灵活。

回调驱动程序

要实现更具体的目标,如 DPI 或网站家长控制,需要自定义回调驱动程序来扩展 WFP 功能。Microsoft 提供了一个 WFP 回调驱动程序示例项目,可以在这里找到。如这里所解释的,WFPSampler.exe 使用示例回调驱动程序来定义策略。

我们可以使用netsh.exe程序或WFPExplorer来查看 Windows 筛选平台对象。

  • netsh wfp show filters

使用 WFPExplorer,我们可以更方便地查看回调函数、WFP 提供程序、层、过滤器、网络事件等。从截图中可以看到,许多安全产品和内置应用程序都在使用 WFP。



已经有多个工具利用 WFP 来阻止 EDR 进程发送遥测数据,包括来自 MdSec NightHawk C2 的FireBlockShutter和 EDRSilencer。Shutter 似乎是最早使用 WFP 来使 EDR 进程静音的项目(如有错误请指出),它还可以基于 IP 地址阻止流量。然而,如前所述,要包含所有可能的 EDR 的所有可能 IP 是不切实际的。由于 FireBlock 是闭源的,让我们来分析 EDRSilencer 的代码片段。

EDRSilencer 硬编码了一个常见 EDR 和防病毒进程的列表。这些产品中的每一个可能都有多个运行进程,具有不同的功能,包括发送遥测数据和上传恶意软件样本。

char* edrProcess[] = {

// Microsoft Defender for Endpoint and Microsoft Defender Antivirus

"MsMpEng.exe"

"MsSense.exe",

"SenseIR.exe",

"SenseNdr.exe",

"SenseCncProxy.exe",

"SenseSampleUploader.exe",

// Elastic EDR  "winlogbeat.exe"  "elastic-agent.exe",  "elastic-endpoint.exe",  "filebeat.exe", // Trellix EDR  "xagt.exe", // Qualys EDR  "QualysAgent.exe", ... //TrendMicro Apex One  "CETASvc.exe",  "WSCommunicator.exe",  "EndpointBasecamp.exe",  "TmListen.exe",  "Ntrtscan.exe",  "TmWSCSvc.exe",  "PccNTMon.exe",  "TMBMSRV.exe",  "CNTAoSMgr.exe", "TmCCSF.exe"  };

FwpmEngineOpen0函数打开一个到过滤引擎的会话,这是设置 WFP 过滤器的关键步骤。EDRSilencer 依赖于内置的 WFP 功能。

result = FwpmEngineOpen0(NULL, RPC_C_AUTHN_DEFAULT, NULL, NULL, &hEngine);

使用内核模式过滤引擎需要提升的权限,因此必须具有高完整性级别。EDRSilencer 确保它具有修改过滤引擎所需的权限。

然后,EDRSilencer 使用OpenProcess获取正在运行进程的可执行文件的完整路径。打开 EDR 进程的句柄可能存在风险,因为这可能触发安全警报或检测。

HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe32.th32ProcessID);


 if (hProcess) { WCHAR fullPath[MAX_PATH] = {0};  DWORD size = MAX_PATH;  FWPM_FILTER_CONDITION0 cond = {0};  FWPM_FILTER0 filter = {0};  FWPM_PROVIDER0 provider = {0};  GUID providerGuid = {0}; FWP_BYTE_BLOB* appId = NULL;  UINT64 filterId = 0;  ErrorCode errorCode = CUSTOM_SUCCESS;               QueryFullProcessImageNameW(hProcess, 0, fullPath, &size); ····


接下来,EDRSilencer 设置 WFP 过滤器和条件。使用的过滤器层是FWPM_LAYER_ALE_AUTH_CONNECT_V4。根据微软的说明,"此过滤层允许授权传出 TCP 连接的连接请求,以及基于发送的第一个数据包授权传出的非 TCP 流量。"根据文档的定义,该过滤器是持久性的,分类操作被设置为阻止(BLOCK)。


条件标识符是FWPM_CONDITION_ALE_APP_ID,这是一个从文件名派生的应用程序标识符,由FwpmGetAppIdFromFileName0函数填充。为了避免对CreateFileW的内部调用(这可能被微过滤器驱动程序拦截并阻止访问 EDR 可执行文件),EDRSilencer 实现了该函数的自定义版本。匹配类型是FWP_MATCH_EQUAL,确保应用程序标识符与指定值完全匹配。


最后,过滤器被同时添加到 IPv4 和 IPv6 层以确保全面覆盖。


result
= FwpmFilterAdd0(hEngine, &filter, NULL, &filterId);

网络连接断开的其他可能变体

像 Fireblock、Shutter 和 EDRSilencer 这样的工具通过为 EDR 可执行文件添加过滤器来工作。因此,也有一些工具被设计用来检测这些过滤器。例如,EDRNoiseMaker项目可以检测添加到预定义 EDR 可执行文件列表中的异常 WFP 过滤器,并相应地删除它们。

那么,是否还有其他可能的基于网络连接断开的规避方法呢?这里有两种潜在的方法。第一种变体涉及修改系统上的 hosts 文件。这个想法也在这篇文章中讨论过。通过将 EDR 联系服务器绑定到预期的错误地址 (如 127.0.0.1),遥测数据将被发送到错误的目的地。虽然这种方法听起来很简单,但需要考虑几个实际问题:

  1. 全面映射:我们需要将所有可能的联系服务器绑定到一个错误的 IP 地址,这需要添加数百或数千个条目。
  2. 缺乏隐蔽性:修改 hosts 文件不够隐蔽,很容易被监控工具检测到。
  3. 直接使用 IP:某些 EDR 可能使用 IP 地址而不是域名,从而绕过 hosts 文件修改。
  4. 缓存地址:除非重启 EDR 服务或操作系统,否则正确的 IP 地址可能仍然缓存在内存中,使 hosts 文件修改失效。

第二种变体涉及为 EDR 代理设置一个恶意代理。这个代理可以是攻击者控制的服务器或无效代理,如 127.0.0.1:8080。在我对恶意代理方法的实验中,我遇到了几个挑战,这些挑战导致了一个兔子洞。

恶意代理:通向兔子洞的路径

我花了几天时间探索恶意代理方法,但遇到了多个死胡同,这可能是由于对某些概念不熟悉。我们的目标是强制 EDR 代理将遥测数据发送到恶意代理服务器,该服务器可以是攻击者控制的或无效的。无论哪种方式,数据都无法到达云服务器。

代理的应用可能相当棘手,特别是因为不同的程序对代理设置的优先级不同。有些程序默认不启用代理,而其他程序则将其代理选择与操作系统的全局代理配置保持一致。各种程序优先考虑不同的设置:

  1. 全局代理设置:某些程序遵循操作系统设置的全局代理配置。
  2. 环境变量:其他程序可能优先考虑在环境变量 (如HTTPS_PROXYHTTP_PROXY) 中指定的代理设置。
  3. 应用程序特定设置:某些程序有独立于系统或环境变量的自己的代理配置设置。

在 Windows 中配置代理有几种方法:

  1. Netsh 命令:通过netsh命令配置 HTTP 代理。

  2. 网络和互联网 > 代理:通过 Windows 设置中的网络和互联网 > 代理页面设置代理,该设置与注册表HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings同步。

  3. 环境变量:使用HTTPS_PROXYHTTP_PROXY等环境变量设置代理。

尽管有这些方法,但我们不太可能直接修改正在运行的 EDR 服务的代理设置。

此外,由于 EDR 服务通常以 NT AUTHORITY\SYSTEM 身份运行,代理设置需要是系统范围的。

根据Elastic 文档,在企业环境中,代理设置通常启用用于监控和日志记录目的。Elastic Endpoint 支持服务器端指定的代理设置和环境变量。如果在服务器端指定了代理设置,它将忽略终端上的所有代理设置。即使代理设置基于环境变量,我们也需要重启服务才能应用新设置,这是有风险的,可能需要我们没有的权限。这让我进入了一个兔子洞:我能否实时更改服务的环境变量?

我们可以使用dir env:命令列出 shell 会话中的所有环境变量。

通过使用 WinDBG 附加到 PowerShell 进程,我们可以通过 PEB 遍历定位环境变量。当前环境块的大小是 0x1340。

不幸的是,没有额外的空间来添加其他环境变量。

在 PowerShell 中,添加新的环境变量很简单。

然而,当我们添加新变量时,Environment 元素的地址会发生变化,而不是将新变量附加到列表中。

要理解 Environment 元素的地址是如何被修改的,我们可能需要对 powershell.exe 进行逆向工程,这使过程更加复杂。此外,即使我们破译了 PowerShell 添加环境变量的模式,还有更多的挑战等待着:

  1. 程序特定逻辑:处理环境变量的逻辑可能因程序而异。虽然在 PowerShell 会话中添加或修改环境变量很简单,但这对其他进程不一定适用。
  2. 远程进程修改:为远程进程 (特别是 EDR 进程) 添加环境变量更加困难和危险。
  3. 静态变量存储:根据程序的代码,某些应用程序可能在初始运行时读取并将环境变量值存储在静态变量中。即使在执行过程中添加或更改了环境变量值,代码中静态变量的值也不会更新。

此外,Elastic Endpoint 的代理设置可以在服务器上指定,从而覆盖终端上的任何系统设置。另外,根据 Microsoft 关于配置 MDE 代理设置的文档,MDE 的代理配置有多个具有不同优先级的来源。因此,至少在用户模式下,没有通用和有效的方法来强制使用恶意代理。

借用合法驱动程序进行伪装

EDRSilencer 使用内置的回调函数,消除了加载外部驱动程序的需求。虽然 WFP 允许过滤和基本的数据包操作,但其较高级别的抽象可能不适合所有低级网络操作。为了获得更大的灵活性,外部 WFP 回调驱动程序可能非常有用。

如前所述,Microsoft 提供了一个 Windows 过滤平台示例。主程序是一个示例防火墙,驱动程序暴露了用于注入、基本操作、代理和检查的回调函数。我们讨论了在用户层实现恶意代理方法的可能性,并遇到了死胡同。然而,通过自定义回调驱动程序,在内核模式下实现这一点是可行的。WFP Sampler 就是一个很好的例子。

不幸的是,Microsoft 只提供了 WFP Sampler 的源代码,没有编译好的驱动程序和程序。虽然该项目是学习 WFP 编程的宝贵资源,但这意味着我们需要自己签名驱动程序。我们的目标是依赖现有的合法 WFP 回调驱动程序,它提供更多的灵活性,如数据包拦截、数据包注入、深度数据包检查等。由于 WFP 被许多合法软件应用程序广泛采用,特别是安全产品,找到合适的驱动程序并不困难。

然而,对于闭源软件,我们无法访问其源代码。虽然逆向工程闭源回调驱动程序是一种选择,但是否有任何功能强大的 WFP 回调驱动程序是已签名且开源的?WinDivert(https://github.com/basil00/Divert) 就是这样一个驱动程序。

WinDivert 是一个为 Windows 设计的用户模式数据包捕获和网络数据包操作工具。它提供了一个强大而灵活的框架,用于在网络栈级别拦截、修改、注入和丢弃网络数据包。它作为一个轻量级、高性能的驱动程序运行,直接与网络栈接口,允许实时详细的数据包检查和操作。

由于以下关键特性,WinDivert 可用于实现数据包过滤器、嗅探器、防火墙、IDS、VPN、隧道应用程序等:

  • 数据包拦截:从网络栈捕获数据包,允许实时监控和分析。
  • 数据包注入:支持将修改过的或新的数据包重新注入网络栈。
  • 数据包修改:支持详细操作数据包内容,包括头部和负载。
  • 协议支持:支持广泛的网络协议,包括 IPv4、IPv6、TCP、UDP、ICMP 等。
  • 过滤:使用灵活而强大的过滤语言来指定数据包拦截和修改的标准。

一些安全软件使用 WinDivert,使该回调驱动程序具有普遍良好的声誉。

WinDivert 作为内核模式驱动程序运行,挂钩到 Windows 网络栈。它为应用程序提供用户模式 API 与驱动程序交互,实现数据包拦截、修改和注入。驱动程序使用自定义过滤引擎根据用户定义的规则确定要拦截哪些数据包。

WinDivert 相比内置 WFP 有以下优势:

  1. 数据包注入:内置回调不原生支持将数据包重新注入网络栈。虽然可以对数据包进行修改,但重新注入需要标准 WFP 回调未提供的额外机制。WinDivert 为数据包注入提供了直接支持,使应用程序能够将修改过的或新创建的数据包直接重新注入网络栈。

  2. 扩展功能:内置 WFP 回调仅限于 WFP API 提供的特性和功能,这可能限制了超出这些预定义功能的定制范围。相比之下,WinDivert 显著扩展了功能,提供了对更广泛协议的支持、更灵活的过滤标准和高级数据包操作选项。

  3. 直接网络栈交互:内置回调是 WFP 框架的一部分,该框架抽象了许多低级细节,减少了直接网络栈交互的灵活性。作为独立驱动程序,WinDivert 提供了对网络数据包的直接访问,实现了更多控制和定制,包括与硬件级数据包处理的直接交互。

  4. 易用性:内置 WFP 的配置和使用可能很复杂,需要详细了解 WFP API 及其复杂性。WinDivert 为数据包拦截、修改和注入提供了更简单和直观的 API,使开发人员更容易实现复杂的网络处理任务。

WinDivert 官方仓库包含示例程序,如网络流跟踪应用程序、简单的数据包捕获和转储应用程序、简单的防火墙应用程序、多线程骨架应用程序、套接字操作转储程序、TCP 流重定向到本地代理服务器程序以及简单的 URL 黑名单过滤程序。在这些示例中,steamdump 可作为在内核模式下实现恶意代理的良好参考,netfilter 可用于开发改进的静默 EDR 解决方案,passthru 演示了有效使用多线程来提高性能。此外,我注意到webfilter示例,它可以作为实现 HTTP 数据包检查程序的绝佳模板。我有一个想法:通过利用 WinDivert 在 EDR 代理和云服务器之间创建透明代理,我们可以解密它们的通信并检查遥测数据。如果遥测数据包含检测或警报信息,我们可以丢弃数据包以防止在 EDR 管理面板上出现新警报。否则,我们可以安全地允许数据包通过。这种方法将只选择性地阻止触发警报的数据包,允许代理在管理面板上显示为在线和健康状态。

不同的 EDR 解决方案对于被认为是不健康或离线有不同的标准。例如,根据我的观察,Elastic Endpoint 和 Microsoft Defender for Business 有以下模式:

  1. 如果 elastic-agent.exe 可以到达服务器但 elastic-endpoint.exe 不能,或者如果遥测数据损坏,代理将在大约 5 分钟后被标记为不健康。
  2. 如果 elastic-agent.exe 和 elastic-endpoint.exe 都无法到达服务器,代理将在大约 7 分钟后被标记为离线。
  3. 对于 MDE,即使传感器无法到达任何云服务器,终端仍被标记为活动状态。然而,最后的设备更新时间戳可能会显示断开连接,在撰写本文时,时间戳落后 2 天。

通过理解这些标准,我们可以定制我们的透明代理解决方案,确保 EDR 代理保持在线和健康的外观,同时选择性地过滤可能触发警报的遥测数据。

恶意代理第二轮

考虑到遥测数据通常包含在 HTTPS 数据包中,检查它们以识别哪些数据包包含警报或检测信息是理想的。通过过滤这些特定数据包,我们可以避免在管理面板上出现新警报。对于实现 TLS 透明代理,HttpFilteringEngine(https://github.com/TechnikEmpire/HttpFilteringEngine) 及其继任者 CitadelCore(https://github.com/TechnikEmpire/CitadelCore) 提供了出色的解决方案。它们提供强大的功能,包括:



WinDivert 相比内置 WFP 有以下优势:

  1. 数据包注入:内置回调不原生支持将数据包重新注入网络栈。虽然可以对数据包进行修改,但重新注入需要标准 WFP 回调未提供的额外机制。WinDivert 为数据包注入提供了直接支持,使应用程序能够将修改过的或新创建的数据包直接重新注入网络栈。

  2. 扩展功能:内置 WFP 回调仅限于 WFP API 提供的特性和功能,这可能限制了超出这些预定义功能的定制范围。相比之下,WinDivert 显著扩展了功能,提供了对更广泛协议的支持、更灵活的过滤标准和高级数据包操作选项。

  3. 直接网络栈交互:内置回调是 WFP 框架的一部分,该框架抽象了许多低级细节,减少了直接网络栈交互的灵活性。作为独立驱动程序,WinDivert 提供了对网络数据包的直接访问,实现了更多控制和定制,包括与硬件级数据包处理的直接交互。

  4. 易用性:内置 WFP 的配置和使用可能很复杂,需要详细了解 WFP API 及其复杂性。WinDivert 为数据包拦截、修改和注入提供了更简单和直观的 API,使开发人员更容易实现复杂的网络处理任务。

WinDivert 官方仓库包含示例程序,如网络流跟踪应用程序、简单的数据包捕获和转储应用程序、简单的防火墙应用程序、多线程骨架应用程序、套接字操作转储程序、TCP 流重定向到本地代理服务器程序以及简单的 URL 黑名单过滤程序。在这些示例中,steamdump 可作为在内核模式下实现恶意代理的良好参考,netfilter 可用于开发改进的静默 EDR 解决方案,passthru 演示了有效使用多线程来提高性能。此外,我注意到webfilter示例,它可以作为实现 HTTP 数据包检查程序的绝佳模板。我有一个想法:通过利用 WinDivert 在 EDR 代理和云服务器之间创建透明代理,我们可以解密它们的通信并检查遥测数据。如果遥测数据包含检测或警报信息,我们可以丢弃数据包以防止在 EDR 管理面板上出现新警报。否则,我们可以安全地允许数据包通过。这种方法将只选择性地阻止触发警报的数据包,允许代理在管理面板上显示为在线和健康状态。

不同的 EDR 解决方案对于被认为是不健康或离线有不同的标准。例如,根据我的观察,Elastic Endpoint 和 Microsoft Defender for Business 有以下模式:

  1. 如果 elastic-agent.exe 可以到达服务器但 elastic-endpoint.exe 不能,或者如果遥测数据损坏,代理将在大约 5 分钟后被标记为不健康。
  2. 如果 elastic-agent.exe 和 elastic-endpoint.exe 都无法到达服务器,代理将在大约 7 分钟后被标记为离线。
  3. 对于 MDE,即使传感器无法到达任何云服务器,终端仍被标记为活动状态。然而,最后的设备更新时间戳可能会显示断开连接,在撰写本文时,时间戳落后 2 天。

通过理解这些标准,我们可以定制我们的透明代理解决方案,确保 EDR 代理保持在线和健康的外观,同时选择性地过滤可能触发警报的遥测数据。

恶意代理第二轮

考虑到遥测数据通常包含在 HTTPS 数据包中,检查它们以识别哪些数据包包含警报或检测信息是理想的。通过过滤这些特定数据包,我们可以避免在管理面板上出现新警报。对于实现 TLS 透明代理,HttpFilteringEngine (https://github.com/TechnikEmpire/HttpFilteringEngine) 及其继任者 CitadelCore (https://github.com/TechnikEmpire/CitadelCore) 提供了出色的解决方案。它们提供强大的功能,包括:

  1. 数据包捕获和转移:利用 WinDivert 驱动程序和库自动捕获和转移数据包,实现透明的 TLS 代理。
  2. 受信任根证书管理:高效管理受信任的根证书。
  3. 自动建立操作系统信任:使用一次性根 CA 和密钥对自动建立与操作系统的信任。
  4. 非 HTTP 数据包处理:允许非 HTTP 数据包不受阻碍地通过。
  5. 负载管理:根据需要保留请求或响应的整个负载,以进行详细检查和操作。
  6. 响应操作:根据特定要求修改响应负载。

理论上,这些工具可以有效检查某些 EDR 的遥测数据包。然而,一些 EDR 供应商意识到潜在的中间人攻击并实施了对策。例如,Elastic 允许管理员指定受信任的证书,这使得在没有正确证书的情况下无法建立 TLS 连接。

总之,虽然检查代理的出站数据包并选择性地过滤那些包含警报或检测信息的数据包可能是避免管理面板上出现警报同时保持代理在线和健康状态的理想方法,但这种方法并非普遍适用。一些供应商已经实施了防止中间人攻击的措施,这限制了这种策略的有效性。因此,虽然这种方法很有前景,但需要仔细考虑具体使用的 EDR 解决方案及其安全机制。

我还尝试了一种侧信道方法来确定可能包含警报或检测信息的基准数据包大小。然而,我没有观察到任何明显的模式。有时,一个小数据包可能包含警报信息,而其他时候,一个大数据包可能只包含主机操作系统信息,没有任何警报或检测数据。此外,为每个 EDR 确定正确的基准大小所需的工作量将是巨大的。因此,虽然识别和选择性过滤包含警报信息的数据包在理论上是可能的,但由于缺乏一致的数据包大小模式和所涉及的繁重工作量,这在实践中是不可行的。每个 EDR 都有自己打包遥测数据的方式,这使得建立通用基准变得具有挑战性。

改进的遥测静默方法

虽然我尝试了一种更具创新性的方法——使用 TLS 透明代理选择性地过滤数据包,以拦截警报数据同时保持终端的在线和健康状态——但由于可能的中间人攻击缓解措施,这种方法可能会失效。因此,如果我们能够提高 EDRSilencer 的隐蔽性同时保持其功能,这仍将被视为一种改进。接下来,我将详细说明 EDRPrison 工具的特性和改进。

EDRSilencer 硬编码了一个可能的 EDR 进程名称列表,然后在主机上搜索这些进程并检索它们的 PID。它继续使用 OpenProcess 打开这些进程的句柄并获取这些进程的可执行地址。然后将持久性 WFP 过滤器添加到这些 EDR 可执行文件。这些过滤器在程序关闭时不会自动删除,除非手动清除。这个过程有几个可能触发检测的点:

  1. 调用 OpenProcess 获取 EDR 进程的句柄。
  2. 持久性 WFP 过滤器。

我的工具 EDRPrison 同样硬编码了一个可能的 EDR 进程名称列表,然后在主机上搜索这些进程并检索它们的 PID。在获取 PID 后,EDRPrison 持续拦截并从数据包中检索相关的 PID。WINDIVERT_ADDRESS 结构包含数据包的详细信息,包括远程地址、远程端口、协议、PID 等,这很方便。通过这种方式,我们不必频繁调用 GetExtendedTcpTable 来将进程与其网络活动关联,这是非常消耗性能的。通过利用 WINDIVERT_ADDRESS 提供的信息,我们可以直接将数据包与其源进程关联,减少开销并提高监控和过滤操作的效率。这种方法允许我们在确保有效的数据包拦截和检查的同时保持高性能。


如果检索到的 PID 在已识别的 PID 列表中,这表明该数据包是由 EDR 进程发起的,应该被阻止或丢弃。为了获得更好的性能,建议设置适当的过滤器,利用多线程技术,并根据需要采用批处理来优化性能。

针对各种 EDR 产品的测试

基于我们的理论,我们对一些 EDR 产品进行了测试。受限于可用资源,我在物理服务器上针对 Elastic Endpoint 和 MDE 测试了 EDRPrison。

我硬编码了 Elastic Endpoint 和 MDE 的所有相关进程,编译并运行了程序。该程序以及 WinDivert 完全没有被检测到。考虑到从 EDR 的角度来看它们可能被视为防火墙程序,这是意料之中的。

接下来,我运行了一些经典的恶意软件样本,如原版 Mimikatz、Rubeus 等。这些样本仍然被阻止,因为即使 EDR 代理离线,它仍保留基本功能,如基于哈希的签名检测。此外,在几秒钟内,被阻止的数据包数量显著增加,表明它们包含警报数据。




幸运的是,我们在 Elastic 和 MDE 面板上都没有看到任何新的警报。即使有一些本地检测,我们也不需要担心,因为 SOC 人员在面板上看不到它们。此外,如果我们运行更复杂的恶意软件,由于缺乏云端的机器学习和分析,它们可能不会被阻止。



检测和缓解

我们已经介绍了 EDRPrison 的优势,那么如何检测或缓解这种攻击呢?以下是一些需要考虑的方法:
驱动程序加载事件
如果系统上未安装 WinDivert 驱动程序,EDRPrison 将在首次执行时安装回调驱动程序。操作系统和遥测都会记录此事件。但是,驱动程序加载事件默认不会被评为高风险,因此管理员可能会忽视它们。此外,一些合法软件也会加载此驱动程序。
WinDivert64.sys 和 WinDivert.dll 的存在
EDRPrison 和其他依赖 WinDivert 的程序需要在磁盘上存在WinDivert64.sys和WinDivert.dll。通常,这些文件不会被检测为恶意软件,但一些供应商认识到 WinDivert 可能被用于恶意目的。例如,2019 年,Divergent 恶意软件在无文件攻击中使用 NodeJS 和 WinDivert,详情可以在这里找到。此外,根据一个问题,如果检测到安装了 WinDivert,一些反作弊系统会拒绝运行游戏。WinDivert 使用检测工具
WinDivert 使用检测工具
WinDivert 的作者还编写了一个程序WinDivertTool,用于检测当前使用 WFP 的进程。输出非常详细。WinDivertTool 甚至可以终止相关进程或卸载 WinDivert。


针对 EDR 进程的数据包丢弃/阻止操作
Elastic 有一个针对 WFP 过滤器滥用的检测规则,可以在这里找到。它可以检测针对任何安全产品进程的数据包丢弃或阻止操作。Windows 基于此操作提供事件日志,详细信息在这里。
审查已注册的 WFP 提供程序、过滤器和回调
工具WFPExplorer也可用于取证目的。它为用户提供了一个 GUI 界面来查看活动的 WFP 会话、已注册的回调、提供程序和过滤器。这个工具可以帮助识别和分析任何可疑的 WFP 配置。


Adminless
在与 jdu2600 的对话中,提到未来的保护措施可能会进一步加强新驱动程序的安装,这可能在 Adminless 功能下得到解决。有关此功能的更多详细信息可以在这个演示中找到。Adminless 的好处可以用来限制未经授权的驱动程序的安装和执行,使得像 EDRPrison 使用的攻击性驱动程序更难运行。随着 Adminless 的广泛采用,它可能会显著限制安装和利用此类驱动程序的能力,从而缓解这种攻击向量。
红队的复仇:规避上述检测
从红队的角度来看,我们如何规避上述一些检测?根据目标组织的安全配置,存在潜在的解决方案。但是,至少仍然需要管理员权限。
避免使用 WinDivert
如果 WinDivert 在组织内被标记为恶意,我们可以寻找满足以下标准的替代方案:
  1. 回调驱动程序已签名。
  2. 允许数据包拦截、重注入和其他操作。
  3. 开源。
  4. 较少被用于潜在的恶意用途。
  5. 有优秀的文档。
我已经确定了一个合适的替代方案。你能找到它吗?
避免使用外部驱动程序
如果所有外部驱动程序除非获得批准否则都被视为未经授权,那么逆向工程已安装或内置的 WFP 回调驱动程序并重用其回调函数虽然具有挑战性但是可行的。许多安全软件解决方案,如 Elastic Endpoint、Norton 和 ESET,都有自己的 WFP 回调驱动程序用于流量日志记录、DPI、家长控制和其他目的。这篇文章提供了一个逆向工程闭源驱动程序的优秀示例。
规避 Elastic 规则

我们讨论的 Elastic 规则可以识别针对安全产品进程的数据包阻止/丢弃操作。

sequence by winlog.computer_name with maxspan=1m

  [network where host.os.type == "windows" and

   event.action : ("windows-firewall-packet-block", "windows-firewall-packet-drop") and

   process.name : (

"bdagent.exe", "bdreinit.exe", "pdscan.exe", ...... "taniumclient.exe"

    )] with runs=5

然而,如果我们不是阻止或丢弃数据包,而是将其重定向或代理到一个虚拟代理服务器,就不会满足这些检测条件。streamdump示例提供了一个相关的实现:streamdump.c

评论

暂无
发表评论
 返回顶部 
热度(3)
 关注微信