首页
社区
课程
招聘
[翻译]利用 FireEye 开源的 SilkETW 工具实现基于 ETW Events 的威胁检测 第一部分
2019-11-8 20:16 8299

[翻译]利用 FireEye 开源的 SilkETW 工具实现基于 ETW Events 的威胁检测 第一部分

2019-11-8 20:16
8299

第一部分:安装SilkETW

原文地址:https://medium.com/threat-hunters-forge/threat-hunting-with-etw-events-and-helk-part-1-installing-silketw-6eb74815e4a0

 

刺客信条之外,我最喜欢做的事是识别新的数据源,这些新数据源可以为我研究时的分析提供更多背景信息。 从Windows环境的角度,多数情况下,在模拟实施对抗技术后产生的event日志都来自通过制定审计策略或运行auditpol.exe启用的源。即使Windows审计策略允许启用几个有用的事件,也请记住,这些只是Windows系统中所有可用监测的一部分。

 

还有其他几种可用的数据源,但是无法通过审计策略轻松启用。但是,通过正确的工具和对Windows事件跟踪(ETW)概念的一点了解,他们很容易进行交互地探索。

 

这篇文章是一个由四部分组成的系列文章的一部分,该系列文章将涉及ETW模型的基础知识,如何安装SilkETW,使用和汇总ETW事件,同时向您展示如何利用额外的监测技术检测Hunting ELK(HELK)的用例。

 

在第一篇文章中,我将介绍ETW的基础知识,并安装鲁本·博南(@FuzzySec)的SilkETW项目。

 

其他三个部分可以在以下链接中找到:

在我们开始谈论SilkETW之前,我认为从基础开始并重新认识ETW模型的一些关键概念非常重要。我还认为,了解如何为特定的ETWprovider手动启用事件跟踪以了解其机制很重要。

什么是ETW?

Event Tracing for Windows (ETW) 是一种高效的内核级跟踪工具,可以让您记录内核或应用程序定义的事件记录到日志文件。您可以实时或从日志文件使用事件,并使用它们来调试应用程序或确定应用程序中发生性能问题的位置。ETW使您可以动态地启用或禁用事件跟踪,从而使您可以在生产环境中执行详细的跟踪而无需重新启动计算机或应用程序。

 

根据MS docs,事件跟踪API分为三个不同的组件:

Microsoft Ntdebugging博客中的下图有助于了解每个组件之间的关系。

探索ETW组件

Controllers

诸如Logman之类的工具是ETW模型中controller的一个很好的例子,因为它创建并管理事件跟踪会话性能日志。另外,您可以使用Controller来查询每个组件(即Providers)的元数据。

 

 

创建新的事件跟踪会话并启用 ETW providers 的另一种方法是通过位于"控制面板\系统和安全\管理工具\计算机管理\性能"中的内置Windows Performance System Tool。例子稍后给出。

列出事件跟踪会话

可以使用logman列出系统中正在运行的事件跟踪会话

logman query -ets

 

还可以使用Windows Performance System Tool来查看启用了哪些事件跟踪会话以及为它们提供事件的providers。

 

如果还想通过logman知道某个特定事件跟踪会话绑定了哪些事件provider,则可以运行以下命令:

logman query "EventLog-System" -ets

列出ETW Providers

接下来,您可以使用logman列出系统中所有可用的providers:

logman query providers

查询指定Providers

如果我想寻找特定的ETW Providers怎么办?可以过滤logman query providers结果并查找特定的字符串。例如,我们可以寻找名称中带有单词Security的provider,如下所示:

$ETWProviders = logman query providers
$ETWProviders | Where-Object { $_ -Like "*Security*" }

 

例如,我们可以选择Microsoft-Windows-Security-Auditing, 并查询其元数据以获取有关它的更多信息。

logman query providers Microsoft-Windows-Security-Auditing

 

还可以通过名为Windows Events Providers Explorer(WEPExplorer)的工具获取有关特定ETW providers的信息。

 

 

还可以使用wevtutil.exe检索有关事件日志和发布者的信息(感谢Marc Sherman

> wevtutil.exe get-publisher Microsoft-Windows-Security-Auditing /getevents:true /getmessage:true

Windows安全审计ETW provider事件

现在我们知道,有一个事件跟踪会话已绑定到Microsoft-Windows-Security-Auditing provider,该provider使用 Security Channel 允许通过事件日志接收Security事件。

可以通过事件日志处理任何ETW事件吗?

Matt Graeber的研究,只有有Channel特性的ETW provider适可以通过事件日志被处理。

 

例如,来自Microsoft Ntdebugging blog这篇文章是按步骤的教程,关于通过Analytic channel如何为Microsoft-Windows-WinINet provider启用事件跟踪。

 

我们可以从使用WEPExplorer工具开始,以获取有关应用于每个ETW事件的特定Channels的更多详细信息。从下面可以看到,Microsoft-Windows-WinINet/Analytic Channel已应用于Microsoft-Windows-WinINet provider中的大多数事件。因此,它们应由事件日志实时处理。

处理WinINet事件

现在我们知道可以通过事件日志实时处理Microsoft-Windows-WinINet provider的事件,我们可以通过启用“分析和调试日志”视图来启动该过程。

 

可能必须重新启动事件查看器控制台。可以在 应用程序和服务日志>Microsoft>Windows下看到一个名为WinINet(Microsoft-Windows-WinINet)的新事件日志文件夹。单击它,您将看到3个channel。右键单击分析通道,然后选择启用日志

 

单击确定。

 

如果通过Microsoft Edge访问网站,您将看到Analytic Channel的事件,如下所示:

 

 

您可以通过 计算机管理>系统工具>性能>数据收集器集>启动事件跟踪会话来验证WinINet provider的事件跟踪会话已启用,如下所示:

 

没有Property Channel的ETW事件怎么办?

如果我想为providers启用事件跟踪会话,而这些事件没有Property Channel,该怎么办?例如,在攻击者动态加载自定义.NET代码以执行的情况下,我想为Microsoft-Windows-DotNET Runtime {E13C0D23-CCBC-4E12–931B-D9CC2EEE27E4} 启用事件跟踪并浏览数据。

 

我们可以再次使用Windows Events Providers Explorer(WEPExplorer)工具,并验证是否可以通过事件日志实时处理那些ETW事件。不幸的是,没有将Channel properties应用于事件。

所以现在怎么办?

仍然可以执行此操作,但不能实时记录事件日志。你不得不:

  • 创建事件跟踪会话(手动)
  • 绑定ETW provider
  • 设置将要创建的.etl文件的位置
  • 启动事件跟踪会话
  • 生成 .etl 文件
  • 通过事件日志打开.etl日志作为已保存的日志文件

您可以通过 计算机管理>系统工具>性能 下的 性能系统工具 来创建事件跟踪会话。只需要创建一个新的数据收集器集,如下图所示:

 

给它命名并选择“手动创建(高级)”

 

接下来,选择事件跟踪provider : Microsoft-Windows-DotNETRuntime

 

可以使用下面的视图查看并修改数据收集器集的属性。例如,选择关键字,然后选择编辑。

 

例如,您可以为.NET活动收集与JitKeyword,InteropKeyword,LoaderKeyword和NGenKeyword相关的事件子集。如果您想了解为什么我感兴趣的那些事件,你可以阅读来自Countercept team的这篇博客从Countercept队。选择完这些值之后,您将获得一个位掩码:0x2038(请记住!)。接下来,单击确定和下一步。

 

选择.etl文件的位置。保存在默认位置,然后单击“ 下一步”。

 

保留默认值,然后单击完成。

 

您可以看到新的事件跟踪会话创建好了,但状态为Stopped。您也可以双击检查事件跟踪会话开始后将创建的.etl文件的位置和名称。

 

右键单击新的事件跟踪会话,然后选择“ 启动”。

 

事件跟踪会话现在正在运行,但是除非获取.etl文件的副本并将其作为已保存的日志打开,否则您将不会在事件日志中看到它。您将无法连续提取事件日志。为了作为保存的日志打开.etl文件,请转到事件查看器控制台,然后单击操作>打开保存的日志。

 

选择与事件跟踪会话关联的.etl文件,然后单击“ 打开”。

 

出现提示后,请单击“是”以创建副本

 

您可以保留默认位置以显示外部日志。单击确定。

 

就这样!那很容易吧?

 

即使我能够从Microsoft-Windows-DotNETRuntime provider获取事件,但这也不是对事件日志的连续实时提取。默认情况下,那些ETW事件没有Channel。 实现对事件日志的实时提取的一种方法是编写使用ETW API并启用该功能的应用程序。

SilkETW

Ruben Boonen提出了一种通过C#包装程序执行此操作的方法,并开发了一个名为SilkETW的工具,可为ETW事件收集,过滤和提取提供直接接口。该项目提供了两种与ETW组件进行交互的方式。一种是通过命令行,另一种是通过运行SilkETW作为服务。

 

https://twitter.com/Cyb3rWard0g/status/1108592833349464064

 

我的兄弟Jose Luis Rodriguez和我对此版本感到非常兴奋。

 

我们决定在实验室环境中对其进行测试,并使用它来处理来自 Microsoft-Windows-LDAP-Client provider 的事件,同时通过Will通过Powerview执行一些LDAP筛选器。我将在本系列的下一部分中逐步介绍一些示例。现在,我可以向您展示如何安装SilkETW。

安装

从 https://github.com/fireeye/SilkETW/releases 下载最新的发行包并解压压缩文件(撰写本文时,最新的版本是0.8)

 

您将看到两个文件夹:SilkETW和SilkService。这就是您如何区分运行SilkETW的方式。

 

此外,在Dependencies文件夹,你会发现,你需要运行前要求的二进制文件(千万不要跳过这一步!)

  • 安装VC++ 2015 x86可再发行组件包
    Dependencies\vc2015_redist.x86.exe或从 https://www.microsoft.com/zh-cn/download/details.aspx?id=48145 下载

  • 安装 v4.5 版本以上的 .NET Framework
    Dependencies\dotNetFx45_Full_setup.exe或从 https://www.microsoft.com/zh-cn/download/details.aspx?id=30653 下载

SilkETW CLI

您无需执行任何其他操作即可开始使用它的CLI版本和基本选项。以管理员身份打开一个终端,然后运行SilkETW文件夹中的二进制文件以了解该工具的可用选项。(Downloads>SilkETW_SilkService_v8>v8>SilkETW)

Microsoft-Windows-DotNETRuntime的事件跟踪

还记得我们与没有property Channel的
ETW provider进行交互所需要做的所有操作吗?这些是通过事件日志从Microsoft-Windows-DotNETRuntime provider使用相同的关键字过滤器处理ETW事件的参数:

  • -pn Microsoft-Windows-DotNETRuntime
  • -ot eventlog
  • -uk 0x2038
    > SilkETW.exe -t user -pn Microsoft-Windows-DotNETRuntime -uk 0x2038 -ot eventlog
    

这里要指出的重要一点是,事件的收集是连续的,并直接推送到SilkETW-Log事件日志。但是,正如您在cmd终端中看到的那样,它不是一个在后台无UI运行的收集器。这非常适合调试和分析研究期间任何代码执行所生成的ETW事件。使用CTRL-C停止收集器。

无头模式下的SilkETW = SilkService

根据GitHub README中的安装说明,您可以通过提升权限的(即管理员身份运行的)提示符下使用以下命令来安装服务:

sc create SillkService binPath= "C:\Path\To\SilkService.exe" start= demand

构建SilkService XML配置

在启动SilkService之前,您必须创建自己的SilkServiceConfig.xml文件并将其放置在与服务二进制文件相同的目录中(即Downloads>SilkETW_Service_v8\v8\SilkService)。这是Ruben提供的模板,提供了多个选项:

<SilkServiceConfig>
    <!--
        This is a user collector
        -> Microsoft-Windows-DotNETRuntime
        -> GUID or string based name
    -->
    <ETWCollector>
        <Guid>45c82358-c52d-4892-8237-ba001d396fb4</Guid>
        <CollectorType>user</CollectorType>
        <ProviderName>e13c0d23-ccbc-4e12-931b-d9cc2eee27e4</ProviderName>
        <UserKeywords>0x2038</UserKeywords>
        <OutputType>url</OutputType>
        <Path>https://some.elk:9200/NetETW/_doc/</Path>
    </ETWCollector>
    <!--
        This is a user collector
    -->
    <ETWCollector>
        <Guid>6720babc-dedc-4906-86b9-d0bc0089ec50</Guid>
        <CollectorType>user</CollectorType>
        <ProviderName>Microsoft-Windows-DNS-Client</ProviderName>
        <OutputType>eventlog</OutputType>
        <YaraScan>C:\Some\Path\RuleFolder</YaraScan>
        <YaraOptions>Matches</YaraOptions>
    </ETWCollector>
    <!--
        This is a kernel collector
    -->
    <ETWCollector>
        <Guid>21ac2393-3bbb-4702-a01c-b593e21913dc</Guid>
        <CollectorType>kernel</CollectorType>
        <KernelKeywords>Process</KernelKeywords>
        <OutputType>file</OutputType>
        <Path>C:\Users\b33f\Desktop\kproc.json</Path>
    </ETWCollector>
</SilkServiceConfig>

根据我们通过事件日志处理Microsoft-Windows-DotNETRuntime事件的示例,可以使用以下基本配置:

<SilkServiceConfig>
    <!--
        Microsoft-Windows-DotNETRuntime ETW Provider
    -->
    <ETWCollector>
        <Guid>072e0373-213b-4e3d-881a-6430d6d9e369</Guid>
        <CollectorType>user</CollectorType>
        <ProviderName>e13c0d23-ccbc-4e12-931b-d9cc2eee27e4</ProviderName>
        <UserKeywords>0x2038</UserKeywords>
        <OutputType>eventlog</OutputType>
    </ETWCollector>
</SilkServiceConfig>

请记住,<Guid>字段是您生成的随机GUID。当我开始使用这些配置时,我以为是provider GUID。接下来,复制DotNETRuntime配置,将其重命名为SilkServiceConfig.xml,并将其放置在与服务二进制文件相同的目录中。

启动SilkService

打开 服务>右键单击SilkService>开始。将在SilkService文件夹下创建一个名为Logs的新文件夹。在此您将找到一个日志文件,该文件将告诉您更多有关收集器状态以及SilkServiceConfig.xml提供的参数的信息是否已成功验证通过。

 

如果再次打开Event Viewer(重新启动),您将看到有一个名为SilkService-Log的新事件日志。在那里,您将能够从Microsoft-Windows-DotNETRuntime provider中连续实时提取ETW事件。

SilkService XML配置元素

如果要修改SilkService配置并添加其他XML元素,这是可以在配置上使用的选项的列表。鲁宾的repo中有很多例子,还有BH Arsenal 2019的一些演示。

// Define XML elements            
XName CI = XName.Get("ETWCollector");
XName CG = XName.Get("Guid");
XName CT = XName.Get("CollectorType");
XName KK = XName.Get("KernelKeywords");
XName OT = XName.Get("OutputType");
XName P = XName.Get("Path");
XName PN = XName.Get("ProviderName");
XName UTEL = XName.Get("UserTraceEventLevel");
XName UK = XName.Get("UserKeywords");
XName FO = XName.Get("FilterOption");
XName FV = XName.Get("FilterValue");
XName YS = XName.Get("YaraScan");
XName YO = XName.Get("YaraOptions");

此外,请确认其他人使用SilkETW的方式以获取一些想法。该博客文章马蒂亚斯·耶森,介绍了如何将事件写入一个文件(JSON)。

SilkETW事件类型

在查看事件日志时,还必须知道SilkETW提供了哪些事件。这与每个provider提供的事件完全不同。根据问题1,日志具有四种事件ID类型:
事件ID = 0->收集器启动

{
  "Collector": "Start",
  "Data": {
    "Type": "User",
    "Provider": "Microsoft-Windows-DotNETRuntime",
    "Keywords": "0x2038",
    "FilterOption": "None",
    "FilterValue": "",
    "YaraPath": "",
    "YaraOption": "None"
  }
}

事件ID = 1->收集器被用户终止

{
  "Collector": "Stop",
  "Error": false
}

事件ID = 2->收集器被错误终止

{
  "Collector": "Stop",
  "Error": true,
  "ErrorCode": 3
}

事件ID = 3->已记录的事件
这只是收集器记录的事件的原始JSON。

 

这是本系列的第一篇文章。我希望这对想要玩SilkETW并通过事件日志实时使用事件的人有所帮助。在下一篇文章中,我将向您展示如何将ETW事件从事件日志发送到HELK堆栈
感谢您的阅读!并随时欢迎反馈!

 

感谢鲁宾的所有帮助和耐心!

 

更新:
19/09/2019 马克·谢尔曼的建议

参考文献

https://docs.microsoft.com/zh-CN/windows/win32/etw/about-event-tracing
https://blogs.msdn.microsoft.com/ntdebugging/2009/08/27/part-1-etw-introduction-and-overview/
https://github.com/fireeye/SilkETW
https://github.com/FuzzySecurity/BH-Arsenal-2019
https://github.com/fireeye/SilkETW/issues/1
https://github.com/FuzzySecurity/BH-Arsenal-2019/blob/master/Ruben%20Boonen%20-%20BHArsenal_SilkETW_v0.2.pdf
https://medium.com/palantir/tampering-with-windows-event-tracing-background-offense-and-defense-4be7ac62ac63
https://medium.com/palantir/tampering-with-windows-event-tracing-background-offense-and-defense-4be7ac62ac63
https://blogs.msdn.microsoft.com/ntdebugging/2009/09/08/part-2-exploring-and-decoding-etw-providers-using-event-log-channels/
https://docs.microsoft.com/zh-CN/windows/win32/wes/defining-channels
https://www.countercept.com/blog/detecting-malicious-use-of-net-part-1/
https://www.countercept.com/blog/detecting-malicious-use-of-net-part-2/
https://blogs.technet.microsoft.com/office365security/hidden-treasure-intrusion-detection-with-etw-part-2/

 

翻译:看雪翻译小组 欢歌笑语
校对:看雪翻译小组 StrokMitream


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回