THMWindowsEventLogs
What are event logs?
根据维基百科,“事件日志记录系统执行过程中发生的事件,以提供审计跟踪,可用于了解系统活动和诊断问题。它们对于了解复杂系统的活动至关重要,特别是在用户交互很少的应用程序中(例如服务器应用程序)。”
此定义适用于系统管理员、IT 技术人员、桌面工程师等。如果端点遇到问题,可以查询事件日志以查看导致问题的原因的线索。默认情况下,操作系统会将消息写入这些日志。
作为防御者(蓝队成员),事件日志还有另一个用例。“将来自多个来源的日志文件条目组合起来也很有用*。这种方法与统计分析相结合,可能会产生不同服务器上看似不相关的事件之间的相关性。”
这就是 SIEM(安全信息和事件管理)发挥作用的地方,例如 Splunk 和 Elastic。
如果您不知道 SEIM 的具体用途,下面是其功能的直观概述。
尽管可以访问远程计算机的事件日志,但在大型企业环境中这不可行。相反,人们可以在 SIEM 中查看来自所有端点、设备等的日志。这样您就可以查询来自多个设备的日志,而不是手动连接到单个设备来查看其日志。
Windows 不是唯一使用日志系统的操作系统。 Linux 和 macOS 也是如此。例如,Linux 系统上的日志系统称为 Syslog。不过,在这个房间里,我们只关注 Windows 日志系统,即 Windows 事件日志。
Event Viewer
Windows 事件日志不是可以使用文本编辑器查看的文本文件。但是,可以使用 Windows API 将原始数据转换为 XML。这些日志文件中的事件以专有二进制格式存储,扩展名为 .evt 或 .evtx。文件扩展名为 .evtx 的日志文件通常位于 C:\Windows\System32\winevt\Logs
。
Windows 事件日志的元素
事件日志对于解决任何计算机事件都至关重要,有助于了解情况以及如何补救事件。要很好地了解这一情况,您必须首先了解信息的呈现格式。Windows 提供了一种传递此系统信息的标准化方法。
首先,我们需要知道 Windows 系统中的事件日志由哪些元素组成。这些元素是:
- 系统日志:记录与操作系统段相关的事件。它们可能包括有关硬件更改、设备驱动程序、系统更改以及与设备相关的其他活动的信息。
- 安全日志:记录与设备上的登录和注销活动相关的事件。系统的审核策略指定了这些事件。日志是分析师调查未遂或成功的未经授权活动的绝佳来源。
- 应用程序日志:记录与系统上安装的应用程序相关的事件。主要信息包括应用程序错误、事件和警告。
- 目录服务事件:Active Directory 更改和活动记录在这些日志中,主要在域控制器上。
- 文件复制服务事件:记录在将组策略和登录脚本共享到域控制器期间与 Windows 服务器相关的事件,用户可以通过客户端服务器从域控制器访问它们。
- DNS 事件日志:DNS 服务器使用这些日志记录域事件并映射
- 自定义日志:事件由需要自定义数据存储的应用程序记录。这允许应用程序控制日志大小或附加其他参数(例如 ACL),以达到安全目的。
在此分类下,事件日志可以进一步分为不同类型。其中,类型描述导致记录事件的活动。可以记录 5 种类型的事件,如下表所述,来自 docs.microsoft.com。
在 Windows 系统中,访问这些事件日志的主要方式有三种:
事件查看器(基于 GUI 的应用程序)
Wevtutil.exe(命令行工具)
Get-WinEvent(PowerShell cmdlet)
事件查看器
在任何 Windows 系统中,事件查看器(一个 Microsoft 管理控制台 (MMC) 管理单元)只需右键单击任务栏中的 Windows 图标并选择 事件查看器 即可启动。对于每天大部分时间使用 CLI 的精明系统管理员,可以通过键入“eventvwr.msc”来启动事件查看器。它是一个基于 GUI 的应用程序,可让您快速与日志交互并分析日志。
事件查看器有三个窗格。
左侧窗格提供了事件日志提供程序的分层树列表。
中间的窗格将显示所选提供商特定事件的概述和摘要。
右侧的窗格是操作窗格。
我们之前在左侧窗格中定义的标准日志在 Windows 日志 下可见。
以下部分是 应用程序和服务日志。展开此部分并向下钻取“Microsoft > Windows > PowerShell > 操作”。PowerShell 会将引擎、提供程序和 cmdlet 中的操作记录到 Windows 事件日志中。
右键单击 操作,然后单击 属性。
在属性中,您可以看到日志位置、日志大小以及创建、修改和上次访问的时间。在“属性”窗口中,您还可以看到最大设置的日志大小以及满足条件后要采取的操作。这个概念称为日志轮换。这些是与不同规模的公司进行的讨论。保留日志需要多长时间,以及何时允许用新数据覆盖它们。
最后,请注意右下角的清除日志按钮。使用此按钮有正当理由,例如在安全维护期间,但对手可能会试图清除日志以不被发现。注意:这不是删除任何给定事件提供程序的事件日志的唯一方法。
将注意力集中在中间窗格上。从前面的描述中记住,此窗格将显示特定于所选提供程序的事件。在本例中为PowerShell/Operational。
从上图中,请注意事件提供程序的名称和记录的事件数。在本例中,记录了 44 个事件。您可能会看到不同的数字。不过不用担心。窗格的每一列都显示一种特定类型的信息,如下所述:
- 级别:根据先前指定的已识别事件类型突出显示日志记录类型。在本例中,日志标记为信息。
- 日期和时间:突出显示记录事件的时间。
- 来源:识别记录事件的软件的名称。从上图中,来源是 PowerShell。
- 事件 ID:这是一个预定义的数值,根据日志源映射到特定操作或事件。这使得事件 ID 不唯一,因此上图中的“事件 ID 4103”与执行管道相关,但在另一个事件日志中具有完全不同的含义。
- 任务类别:突出显示事件类别。此条目将帮助您组织事件,以便事件查看器可以过滤它们。事件源定义此列。
中间窗格有一个拆分视图。对于您单击的任何事件,中间窗格的下半部分将显示更多信息。
此部分有两个选项卡:常规 和 详细信息。
- 常规是默认视图,显示渲染的数据。
- 详细信息视图有两个选项:友好视图和 XML 视图。
以下是常规视图的片段。
最后,查看操作窗格。有多个选项可用,但我们仅关注其中几个。如果您不熟悉 MMC 管理单元,请检查所有可以随时执行的操作。
您应该已经注意到,您可以在操作窗格中打开已保存的日志。如果无法访问远程计算机,这将非常有用。日志可以提供给分析师。您将稍后执行此操作。
创建自定义视图和过滤当前日志几乎相同。两者之间的唯一区别是过滤当前日志中的“按日志”和“按来源”单选按钮呈灰色。原因是什么?您可以使用此特定操作进行的过滤仅与当前日志有关。因此没有理由启用“按日志”或“按来源”。
为什么这些操作是有益的?例如,您不希望与 PowerShell/Operational 相关的所有事件使窗格中的所有空间变得杂乱。也许您只对 4104 个事件感兴趣。这可以通过这两个操作实现。
要从另一台计算机查看事件日志,请右键单击“事件查看器(本地)> 连接到另一台计算机…”
以上就是事件查看器的总体概述——是时候熟悉该工具了。
wevtutil.exe
好的,您已经尝试过事件查看器。想象一下,您必须坐在那里手动筛选数百甚至数千个事件(即使在过滤日志之后)。这可不是什么乐趣。如果您可以编写脚本来为您完成这项工作,那就太好了。我们将探索一些允许您通过命令行和/或 PowerShell 查询事件日志的工具。
让我们先看看 wevtutil.exe。根据 Microsoft 的说法,wevtutil.exe 工具“使您能够检索有关事件日志和发布者的信息。您还可以使用此命令安装和卸载事件清单、运行查询以及导出、存档和清除日志。”
与任何工具一样,访问其帮助文件以了解如何运行该工具。执行此操作的命令示例是 wevtutil.exe /?
。
Powershell - wevtutil.exe
PS> C:\Users\Administrator> wevtutil.exe /? |
从上面的屏幕截图中,在使用下,为您提供了如何使用该工具的简要示例。在此示例中,使用了ep
(enum-publishers)。这是 wevtutil.exe 的命令。
下面,我们可以找到可以与 Windows 事件实用程序一起使用的常用选项。
Powershell - wevtutil.exe
Common Options: |
请注意上面快照底部的“wevtutil COMMAND /?”。这将提供特定于命令的附加信息。我们可以使用它来获取有关命令“qe”的更多信息(query-events)。
Powershell - wevtutil.exe
PS> C:\Users\Administrator> wevtutil qe /? |
查看帮助菜单中的信息,以充分了解如何使用此命令。
好的,太棒了!您有足够的信息来使用此工具——是时候回答一些问题了。始终建议您在闲暇时查看该工具及其相关信息。
注意:您可以通过访问在线帮助文档 docs.microsoft.com 获取有关进一步使用此工具的更多信息。
Get-WinEvent
Get-WinEvent
接下来介绍下一个工具。这是一个名为 Get-WinEvent 的 PowerShell cmdlet。根据 Microsoft 的说法,Get-WinEvent cmdlet“从本地和远程计算机上的事件日志和事件跟踪日志文件中获取事件”。它提供有关事件日志和事件日志提供程序的信息。此外,您还可以使用 XPath 查询、结构化 XML 查询和哈希表查询将来自多个来源的大量事件组合成单个命令和过滤器。
注意:Get-WinEvent cmdlet 取代了 Get-EventLog cmdlet。
与任何新工具一样,阅读 Get-Help 文档以熟悉其功能是一种很好的做法。请参阅 docs.microsoft.com 上的在线 Get-Help 信息。
让我们看几个如何使用 Get-WinEvent 的示例,这些示例由文档提供支持。有些任务可能需要一些 PowerShell-fu,而其他任务则不需要。即使您的 PowerShell-fu 达不到标准,也不要担心;每个示例都对所使用的命令/cmdlet 进行了详细说明。
示例 1:从计算机获取所有日志
在这里,我们在本地获取所有事件日志,列表首先从经典日志开始,然后是新的 Windows 事件日志。日志的 RecordCount 可以为零或空。
Powershell - Get-WinEvent Logs
Get-WinEvent -ListLog * |
示例 2:获取事件日志提供程序和日志名称
此处的命令将生成事件日志提供程序及其相关日志。Name 是提供程序,LogLinks 是写入的日志。
Powershell - Get-WinEvent Providers
Get-WinEvent -ListProvider * |
示例 3:日志过滤
日志过滤允许您从事件日志中选择事件。我们可以使用 Where-Object cmdlet 过滤事件日志,如下所示:
Powershell - Get-WinEvent Filters
PS C:\Users\Administrator> Get-WinEvent -LogName Application | Where-Object { $_.ProviderName -Match 'WLMS' } |
提示:如果您正在使用最终与互联网断开连接的 Windows 评估虚拟机,它将每小时关闭一次。;^)
根据 Microsoft 的说法,处理大型事件日志时,将对象通过管道发送到“Where-Object”命令效率低下。建议使用 Get-WinEvent cmdlet 的 FilterHashtable 参数来过滤事件日志。我们可以通过运行以下命令获得与上述相同的结果:
Powershell - Get-WinEvent Filters
Get-WinEvent -FilterHashtable @{ |
哈希表的语法如下:
哈希表语法
@{ <name> = <value>; [<name> = <value> ] ...} |
定义哈希表的准则如下:
- 以 @ 符号开始哈希表。
- 将哈希表括在括号 {} 中
- 输入一个或多个键值对作为哈希表的内容。
- 使用等号 (=) 将每个键与其值分隔开。
注意:如果使用新行分隔每个键/值,则无需使用分号,如上图所示,-FilterHashtable 中的 ProviderName='WLMS'
。
下表显示了 Get-WinEvent FilterHashtable 参数接受的键/值对。
使用哈希表构建查询时,Microsoft 建议每次将哈希表设置为一个键值对。事件查看器可以快速提供有关构建哈希表所需内容的信息。
根据这些信息,哈希表将如下所示:
有关使用 FilterHashtable 创建 Get-WinEvent 查询的更多信息,请查看 Microsoft 官方文档 docs.microsoft.com。
既然我们讨论的是 Get-WinEvent 和 FilterHashtable,这里有一个命令可能会对你有帮助(由 @mubix 分享):
Powershell - Get-WinEvent Filters
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-PowerShell/Operational'; ID=4104} | Select-Object -Property Message | Select-String -Pattern 'SecureString' |
您可以在 docs.microsoft.com 上阅读有关创建哈希表的更多信息。
XPath Queries
现在我们将使用 XPath 检查过滤事件。W3C 创建了 XPath,即完整的 XML 路径语言,以提供用于处理 XML 文档各部分以及操作字符串、数字和布尔值的标准语法和语义。Windows 事件日志支持 XPath 1.0 的子集。
以下是示例 XPath 查询及其说明:
XPath Query
// The following query selects all events from the channel or log file where the severity level is less than or equal to 3 and the event occurred in the last 24 hour period. |
根据 docs.microsoft.com,XPath 事件查询以“**”或“Event*”开头。上面的代码块证实了这一点。但我们如何构建查询的其余部分?幸运的是,事件查看器可以帮助我们。
让我们为上一节中的同一事件创建一个 XPath 查询。请注意,wevtutil 和 Get-WinEvent 都支持 XPath 查询作为事件过滤器。
请注意中间窗格的下半部分。在事件查看器部分,简要介绍了“详细信息”选项卡。现在您将看到此部分中的信息如何有用。
单击“详细信息”选项卡并选择“XML 视图”单选按钮。如果您正在查看的日志详细信息略有不同,请不要担心。重点是了解如何使用 XML 视图构建有效的 XPath 查询。
第一个标签是起点。这可以是 *
或单词 Event
。
到目前为止,命令如下所示:Get-WinEvent -LogName Application -FilterXPath '*'
现在我们沿着 XML 树向下移动。下一个标签是“System”。
让我们添加它。现在我们的命令是:“Get-WinEvent -LogName Application -FilterXPath ‘*/System/‘”
注意:最佳做法是明确使用关键字“System”,但您可以像使用“Event”关键字一样使用“”。查询“-FilterXPath ‘/*’”仍然有效。
事件 ID 是 100。让我们将其插入命令中。
我们现在的命令是:Get-WinEvent -LogName Application -FilterXPath'*/System/EventID=100'
XPath Query Powershell
PS C:\Users\Administrator> Get-WinEvent -LogName Application -FilterXPath '*/System/EventID=100' |
当使用 wevtutil.exe 和 XPath 查询相同的事件日志和 ID 时,我们的结果如下:
使用 Wevtutil.exe 进行 XPath 查询
C:\Users\Administrator>wevtutil.exe qe Application /q:*/System[EventID=100] /f:text /c:1 |
注意:上面的命令中使用了 2 个附加参数。这样做是为了仅检索 1 个事件,并且不包含任何 XML 标签。
如果您要查询其他元素,例如“Provider Name”,语法将有所不同。要筛选提供程序,我们需要使用“Provider”的“Name”属性
XPath 查询为:
Provider 的 XPath 查询
PS C:\Users\Administrator> Get-WinEvent -LogName Application -FilterXPath '*/System/Provider[@Name="WLMS"]' |
如果您想合并 2 个查询怎么办?这可能吗?答案是肯定的。
让我们根据上面的屏幕截图构建此查询。提供商名称为 WLMS,根据输出,有 2 个事件 ID。
这次我们只想查询 事件 ID 101 的事件。
XPath 查询将是 Get-WinEvent -LogName Application -FilterXPath '*/System/EventID=101 and */System/Provider[@Name="WLMS"]'
XPath 两个查询
PS C:\Users\Administrator> Get-WinEvent -LogName Application -FilterXPath '*/System/Provider[@Name="WLMS"]' |
最后,让我们讨论如何为“EventData”中的元素创建 XPath 查询。查询会略有不同。
注意:EventData 元素并不总是包含信息。
下面是我们将为其构建 XPath 查询的事件的 XML 视图。
我们将为“TargetUserName”构建查询。在本例中,它将是 System。XPath 查询将是“Get-WinEvent -LogName Security -FilterXPath ‘*/EventData/Data[@Name=”TargetUserName”]=”System”‘”
TargetUserName 的 XPath 查询
PS C:\Users\Administrator> Get-WinEvent -LogName Security -FilterXPath '*/EventData/Data[@Name="TargetUserName"]="System"' -MaxEvents 1 |
注意:使用了 -MaxEvents
参数,并将其设置为 1。这将仅返回 1 个事件。
此时,您已经掌握了足够的知识来为 wevtutil.exe 或 Get-WinEvent 创建 XPath 查询。为了进一步了解这些知识,我建议阅读官方 Microsoft XPath 参考 docs.microsoft.com。
Event IDs
在监控和搜索方面,您需要知道您在寻找什么。有大量的事件 ID 正在使用中。本节旨在帮助您完成此任务。关于这个主题有很多博客、文章等。本节将分享一些资源。请注意,这不是一份详尽的清单。
列表中的第一个是 Windows 日志记录备忘单(Windows 7 - Windows 2012)。最新版本更新于 2016 年 10 月,但它仍然是一个很好的资源。该文档涵盖了需要启用和配置的一些内容以及根据不同类别(例如帐户、流程、日志清除等)查找的事件 ID。
以上是摘自备忘单的片段。想要检测是否安装了新服务?在系统日志中查找事件 ID 7045。
接下来是使用 Windows 事件日志监控发现对手。这个 NSA 资源也有点过时,但足以在您的基础上继续发展。该文件涵盖了本会议室及其他会议室中涉及的一些概念。您必须点击“获取文件”才能下载资源。
以上是文档的片段。也许您想监控防火墙规则是否从主机中删除。即事件 ID 2006/2033。
我们还能在哪里获取要监控/搜寻的事件 ID 列表?MITRE ATT&CK!
如果您不熟悉MITRE或MITRE ATT&CK,我建议您查看MITRE Room。
让我们看看 ATT&CK ID T1098(帐户操纵)。每个 ATT&CK ID 将包含一个部分,分享缓解技术和检测技巧。
最后两个资源来自 Microsoft:
- 要监视的事件(保护 Active Directory 的最佳实践)
- Windows 10 和 Windows Server 2016 安全审计和监视参考(综合列表 [超过 700 页])
注意:某些事件不会默认生成,某些功能需要在端点上启用/配置,例如 PowerShell 日志记录。此功能可以通过组策略或注册表启用。
Local Computer Policy > Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell |
以下资源提供了有关启用此功能的更多信息以及其相关事件 ID:
- About Logging Windows
- Greater Visibility Through PowerShell Logging
- Configure PowerShell logging to see PowerShell anomalies in Splunk UBA
另一个要启用/配置的功能是审计流程创建,它将生成事件 ID 4688。这将允许命令行流程审计。此设置在虚拟机中未启用,但您可以随意启用它并观察执行某些命令后生成的事件。
Local Computer Policy > Computer Configuration > Administrative Templates > System > Audit Process Creation |
要了解有关此功能的更多信息,请参阅 docs.microsoft.com。测试配置的步骤位于文档底部。
最后,需要重申的是,这不是一份详尽的清单。关于这个主题的博客、文章、威胁情报报告等数不胜数。
为了有效地监控和检测,您需要知道要寻找什么(如前所述)。
Conclusion
在这个房间里,我们介绍了 Windows 事件日志、它们是什么以及如何使用各种工具和技术查询它们。
我们还简要讨论了 Windows 中的各种功能,您需要启用/配置这些功能来记录其他事件,以便了解默认情况下关闭的进程/功能。
本房间中涵盖的信息将作为其他房间的入门知识,这些房间涵盖 Windows Internals、Sysmon 和各种 SIEM 工具。
我将通过提供其他阅读材料来结束这个房间:
- EVTX Attack Samples (a few were used in this room)
- PowerShell <3 the Blue Team
- Tampering with Windows Event Tracing: Background, Offense, and Defense