首页 > 编程笔记 > 通用技能 阅读:126

Windows系统日志分析详解

Windows 系统会记录大量日志数据,这些数据在没有被攻击者清痕、篡改的情况下对事件分析有极大帮助。

Windows 日志统一存储于“C:\Windows\System32\ winevt\Logs\”目录下,Windows 日志以“.evtx”结尾,是一种 BinXml 类型的二进制数据文件。

这里我们参照 Windows 的“事件查看器”窗口(其在部分Windows发行版上也叫作“事件管理器”窗口)将 Windows 日志大致分为以下几类,如下图所示。


图 1 Windows 的“事件查看器”窗口

1) 应用程序日志:应用程序日志记录 Windows 服务器上安装的一些应用程序或系统默认程序的事件。例如 Windows 服务器上运行的站点服务,MySQL、PHP、IIS 等相关应用程序的事件。

2) 安全日志:安全日志记录许多与安全相关的重要事件和活动,如登录和注销、文件和对象的访问、特权使用、系统状态更改等。这些事件可以提供有关计算机系统的安全状态和潜在风险的有用信息。

安全日志对于安全管理和审计非常重要,因为它可以帮助管理员了解系统的安全状况,并追踪可能存在的安全问题或攻击。通过分析安全日志,管理员可以识别系统中的异常或潜在风险,并及时采取措施保护系统的安全。

此外,安全日志还可以用于满足监管合规性要求,遵循ISO 27001、PCI DSS等标准,这些标准要求组织必须记录和审计其信息系统的安全事件和活动。

3) Setup日志:在 Windows 操作系统中,Setup 日志负责记录安装过程和结果,它包含在 Windows 的安装程序中。

当 Windows 进行安装、升级或修复时,Setup 日志会记录一些关键事件和活动,如文件复制、注册表修改、设备驱动安装、应用程序安装等。

通过分析 Setup 日志,管理员可以了解 Windows 安装过程中发生的情况,识别可能存在的问题,并采取适当的措施解决这些问题。此外,Setup 日志还可以用于排查 Windows 安装失败或出现其他问题的原因。

对于开发人员而言,Setup 日志也能为其提供帮助,因为它可以提供有关应用程序安装和配置的信息,从而帮助开发人员了解应用程序在不同环境下的部署情况。

4) 系统日志:系统日志是 Windows 操作系统中的一个事件日志,它记录了与操作系统核心相关的系统事件和活动,如启动、关闭、错误、警告等。

系统日志是 Windows 日志中最重要的日志之一,因为它记录了操作系统本身的运行状况,包括硬件、软件、驱动程序和服务等方面的状况。

系统日志对于 Windows 系统的管理和维护非常重要,因为它可以帮助管理员快速定位并解决各种与操作系统相关的问题,例如系统崩溃、驱动程序故障、服务停止、硬件故障等。此外,系统日志还可以用于监视服务器的性能和资源利用率,以及检测可能存在的安全问题或攻击。

5) Forwarded Events日志:Forwarded Events(转发事件)日志是 Windows 操作系统中的一种特殊的事件日志,它记录了来自其他计算机的事件。

Forwarded Events 日志通常用于集中式事件管理和监视,例如在大型企业网络中,管理员可以将所有关键事件从不同计算机转发到一个中央服务器上的 Forwarded Events 日志,以便更方便地分析和管理这些事件。

“事件查看器”窗口的打开方式比较多,比较简便的方式是按 Win+R 键,打开 Windows的“运行”对话框,再输入“eventvwr.msc”并按 Enter 键即可打开“事件查看器”窗口。

当我们打开任意一种类型的 Windows 日志时可以发现,单条事件一定会包含事件的“日期和时间”、“来源”、“事件ID”、“任务类别”,这些都是事件的基本属性。

“事件ID”可以用于区分不同的事件,单击任何一条事件,我们都能在窗口上看到该事件的详细信息。同时,“事件查看器”窗口右侧,提供了筛选功能,该功能使我们可以按需筛选特定的事件进行分析,如下图所示。


图 2 根据事件ID进行筛选

事件记录的信息是丰富的,当我们查看任意一条事件的详细信息,并以“XML视图”的方式将其展开时,可以看到事件的详细信息分为“System”(系统数据)及“EventData”(事件数据)两部分,如下图所示。


图 3 事件的详细信息

System 部分包含“事件查看器”窗口记录的事件的一些基本属性,其中部分基本属性直接展示在事件条目栏中,可供我们快速预览。EventData 部分用于记录事件的详细数据,而且针对不同的事件 ID,其记录的条目种类及内容存在一定的差异,需要结合实际场景进行讨论。

在实际分析时,我们的思路是先通过事件的基本属性(往往是事件 ID)筛选出待分析的目标事件,然后进一步分析事件数据,查找可疑问题。

除此之外,在日常应急响应时我们还需要关注一些其他有用的日志。严格来说,它们不是 Windows 日志,而是应用程序和服务日志,但也可以通过“事件查看器”窗口查看,它们包括 PowerShell 日志、Sysmon 日志等。这些日志在特定的条件下能帮助相关技术人员更好地定位系统上发生的安全问题,了解攻击者的攻击方式。当然,对这些日志的分析思路与前面提到的对 Windows 日志的分析思路是一致的。

虽然 Windows 日志的功能很强大,但是它也存在不少问题,需要我们加以关注。

1) 日志大小限制问题。考虑到 Windows 系统盘存储资源的宝贵性,Windows 在默认条件下一般将日志大小设置为 68 KB、1 MB、20 MB,且设置了超量覆盖。某个安全事件发生的时间如果过于久远,那么可能会有丢失的风险。

下图所示为在“日志属性-系统(类型: 管理的)”对话框中将日志大小设置为 20MB。


图 4 日志属性设置

2) 人工操作问题。分析人员为了获取有价值的信息,需要频繁单击不同的事件,切换视图并上下滚动窗口。随着目标事件数的增加,分析人员的时间和精力将面临巨大的消耗,这在应急响应工作中是难以容忍的。

下图所示为在存在多种事件 ID 的场景下进行分析时需要频繁单击的位置。


图 5 人工操作问题

3) 需要额外配置。Windows 默认开启了部分审核策略,能够对系统运行时的一些基本信息进行日志记录,但是这些审核策略是通用的,并未贴近实际系统面临的使用场景。

为了提升事件发生后的应急响应效率及提升还原攻击手法的成功率,我们需要在日常安全建设过程中考虑对与日志相关的审核策略进行调整。

4) 修改审核策略。微软官方对外提供了推荐的审核策略,在实际工作中可以酌情对这些审核策略进行修改。

由于实际应急响应工作中,我们很难对所有日志进行分析,因此我们重点讲解和安全事件排查紧密相关的一些日志。

安全日志分析

由于安全日志会记录与账户审核策略相关的事件,诸如 Windows 账户的登录尝试、凭据读取等事件。在常见的上机排查工作中,对账户登录尝试事件的提取与分析操作几乎是日志分析中的惯例操作。

Windows 以不同的事件 ID 区分不同类型的事件。在安全日志分析中,我们需要特别关注的事件如下表所示。

表:需要特别关注的事件
事件ID 事件说明
1102 清理审计日志
4624 账户登录成功
4625 账户登录失败
4634 账户注销成功
4647 由用户发起的注销
4648 试图使用明确的凭据登录
4672 使用超级用户(如管理员)进行登录
4720 创建账户
4726 删除账户
4732 将成员添加到启用安全的本地组中
4733 将成员从启用安全的本地组中移除
4688 创建进程
4689 结束进程

例如,微软针对事件 ID 为 4648 的安全事件,给出的解释是“当进程尝试通过显式指定该账户的凭据登录账户时生成此事件。这种情况经常发生在计划任务之类的批量配置中,或者发生在使用 Runas 命令时”。


图 6 事件ID为4648的事件的详细信息

如上图所示,我们通过查看事件 ID 为 4648 的事件能发现一次登录尝试,在查看事件的详细信息时,可以看到事件会记录登录源的请求 IP 地址和端口以及进程信息,如果发现登录尝试来自外部主机,那么我们需要特别关注。

涉及登录尝试的除了事件 ID 为 4648 的事件,最常见的是事件 ID 为 4624 和 4625 的安全事件,它们分别会在登录成功或登录失败时,在尝试登录的计算机上生成。在这两类事件的详细信息中,我们还可以看到“登录类型”字段,由此可以了解具体的登录方式,如交互式登录、远程交互等。下表给出了对“登录类型”的具体说明。

表:登录类型
登录类型ID 登录类型 说明
2 交互式登录 用户通过本地登录界面登录系统。这种登录类型需要在本地物理终端输入用户名和密码或者使用指纹或面部识别等进行登录
3 网络 用户通过网络登录系统。这种登录类型需要使用远程协议进行连接和身份验证
4 批处理 系统执行的批处理程序自动登录。这种登录类型常用于自动化任务或服务,通常没有用户交互界面
5 服务 每种服务都被配置在某个特定的用户账户下运行,这种登录类型常用于 Windows 服务或者其他系统级别的程序,通常不需要用户交互界面
7 解锁 用户从屏幕保护或者睡眠状态解锁系统。这种登录类型不需要重新输入用户名和密码,只需要解锁即可
8 网络明文 这种登录类型表示用户通过网络以明文方式登录到计算机系统上。这种登录类型通常不安全,因为登录信息可能会被截获和窃取
9 新凭据 这种登录类型表示用户提供了新的凭据,例如使用不同的用户名和密码登录到系统
10 远程交互 通过终端服务、远程桌面或远程协助访问计算机时,Windows 将登录类型 ID 记为 10,以便将这种登录类型与真正的控制台登录区别开来,请注意 Windows XP 之前的版本不支持这种登录类型
11 缓存交互 当用户登录了系统后,其登录凭据会被缓存到本地计算机中。当用户再次登录该系统时,可以使用缓存的凭据进行登录,而无须再次验证用户的身份。这种缓存的凭据通常被称为“本地缓存的登录口令”

注意,这种登录类型只适用于本地计算机上的用户登录场景,而不适用于远程登录场景。如果用户通过远程方式登录到计算机系统上,则不会产生这种登录类型对应的事件

如果我们在针对安全事件进行审计时,发现某一段时间存在大量的事件 ID 为 4625 的事件且登录源 IP 地址并非本地 IP 地址,那么被登录的设备极有可能正在遭受口令爆破攻击。此时如果我们查看尝试登录时使用的用户名,往往可以发现口令爆破攻击使用的相关用户名从未在企业的网络中被使用,且存在一些明显的爆破字典特征,如常见的公共用户名、带有遍历猜解特征的姓名简称。

随着经验的积累,通过爆破字典特征,我们也可以从侧面推断攻击者的专业程度,甚至将该事件与其他事件相关联,综合判定攻击者的身份。

如果我们在日志分析中发现存在登录源 IP 地址并非本地 IP 地址的事件 ID 为 4624 的事件,那么需要咨询相关人员被登录设备平时是否有远程登录的使用场景,并核实登录源 IP 地址是否为登录时的惯用 IP 地址。如果该事件记录的登录行为被确认为异常登录行为,则需要对被登录设备进行进一步分析。同时,如果发起登录的设备为内部非常用设备,也需要进一步分析,以判断该设备是否已经处于攻击者的控制下。

接下来我们介绍事件 ID 为 4688 的事件,该事件记录创建进程行为。该事件的详细信息会包含相关的进程名,这里需要关注是否存在诸如“mimikatz.exe”“lazagne.exe”“Synaptics.exe”等可疑进程名。

事件 ID 为 4688 的事件的详细信息如下图所示:


图 7 事件 ID 为 4688 的事件的详细信息

除了以上几种事件类型,根据 Windows 发行版及开启策略的不同,可能还有一些其他事件类型,我们需要在实际场景下有针对性地进行分析。

应用程序和服务日志分析

除了前面介绍的安全日志,在实际场景下,应用程序和服务日志中的一些日志也需要我们重点关注。这些日志保存在“事件查看器→应用程序和服务日志→Windows”路径下。

1) TerminalServices-LocalSessionManager日志:用于管理远程桌面会话连接和本地会话。当用户登录或注销远程桌面会话连接或本地会话时,相关事件会记录在此日志中。

下表所示为 TerminalServices-LocalSessionManager 日志中常见的事件 ID 及事件说明。

表:TerminalServices-LocalSessionManager日志中常见的事件ID及事件说明
事件ID 事件说明
21 表示本地会话已经结束。此事件包含有关本地会话结束的详细信息,如会话ID、用户名、结束时间等
22 表示已创建新的本地会话。此事件包含有关新的本地会话的详细信息,如会话ID、用户名、创建时间等
25 表示会话状态已更改。此事件包含有关会话状态更改的详细信息,如会话ID、新状态、状态更改的原因等
40 表示远程桌面会话已连接。此事件包含有关连接的详细信息,如连接的协议、客户端名称和IP地址、服务器名称和IP地址等
41 表示远程桌面会话已断开连接。此事件包含有关断开连接的详细信息,如断开连接的原因、客户端名称和IP地址等

2) TerminalServices-RemoteConnectionManager日志:记录远程用户与计算机之间的连接、断开、重连等事件,以及与远程桌面会话相关的用户身份验证、会话状态、会话连接断开原因等信息。

下表所示为 TerminalServices-Remote ConnectionManager 日志中常见的事件 ID 及事件说明。

表:TerminalServices-RemoteConnectionManager 日志中常见的事件 ID 及事件说明
事件ID 事件说明
260 远程桌面会话已连接
261 远程桌面会话已断开连接
1149 用户已注销远程桌面会话
4624 成功的远程登录事件
4778 远程登录的会话重新连接
4779 远程登录的会话已断开连接
7040 远程会话协议组件已被加载

这些事件可以帮助系统管理员了解远程桌面连接的使用情况,以及检查是否存在未经授权的远程访问。此外,它们还可以用于故障排查,例如查找远程会话连接失败的原因和确定会话断开连接的原因。

3) TerminalServices-RDPClient日志:记录了使用远程桌面协议(Remote Desktop Protocol,RDP)的客户端(即远程桌面客户端)连接到远程主机时的详细信息。该日志记录的信息包含与远程连接相关的事件和错误信息,例如连接成功、连接断开、连接失败等。

下表所示为 TerminalServices-RDPClient 日志中常见的事件 ID 及事件说明。

表:TerminalServices-RDPClient 日志中常见的事件 ID 及事件说明
事件ID 事件说明
1024 表示远程桌面客户端已连接到远程桌面会话。此事件包含与连接相关的详细信息,如连接的协议、服务器名称和 IP 地址、客户端名称和 IP 地址等
1103 表示远程桌面会话已断开连接。此事件包含与断开连接相关的详细信息,如断开连接的原因、客户端名称和 IP 地址等
1149 表示远程桌面客户端连接到远程桌面会话时出现了内部错误。此事件包含有关内部错误的详细信息,如错误代码、错误消息等
1306 表示远程桌面客户端连接到远程桌面会话时出现了协议错误。此事件包含有关协议错误的详细信息,如错误代码、错误消息等
1311 表示远程桌面客户端连接到远程桌面会话时出现了身份验证错误。此事件包含有关身份验证错误的详细信息,如错误代码、错误消息等
1406 表示远程桌面客户端连接到远程桌面会话时遇到了加密错误。此事件包含有关加密错误的详细信息,如错误代码、错误消息等

4) RemoteDesktopServices-RdpCoreTS日志:记录了与远程桌面服务(Remote Desktop Service,RDS)和 RDP 相关的详细信息。该日志记录的信息包含与 RDS 连接、用户会话和 RDP 相关的事件和错误信息,例如连接成功、连接断开等。

下表所示为 RemoteDesktopServices-RdpCoreTS 日志中常见的事件 ID 及事件说明。

表:RemoteDesktopServices-RdpCoreTS 日志中常见的事件 ID 及事件说明
事件ID 事件说明
1024 表示新的远程桌面连接已创建。此事件包含有关连接的详细信息,如连接的协议、客户端名称和 IP 地址、服务器名称和IP地址等
1025 表示远程桌面连接已断开。此事件包含有关断开连接的详细信息,如断开连接的原因、客户端名称和 IP 地址等
1027 表示会话状态已更改。此事件包含有关会话状态更改的详细信息,如会话 ID、新状态、状态更改的原因等
1102 表示已注销远程用户。此事件包含有关注销的详细信息,如注销的用户名、会话 ID 等
1149 表示 RDS 已启动。此事件包含有关服务启动的详细信息,如服务名称、版本等

5) SmbClient日志:用于记录与服务器信息块(Server Message Block,SMB)客户端相关的事件和错误信息。SMB 是一种在计算机之间共享文件、打印机和其他资源的协议,SmbClient 日志可用于调试 SMB 客户端连接和文件共享问题。

下表所示为 SmbClient 日志中常见的事件 ID 及事件说明:

表:SmbClient 日志中常见的事件ID及事件说明
事件ID 事件说明
3000 表示 SMB 客户端尝试连接共享文件夹
3004 表示 SMB 客户端已断开与共享文件夹的连接
3006 表示 SMB 客户端未能连接共享文件夹
3008 表示 SMB 客户端已成功连接共享文件夹
3010 表示 SMB 客户端已使用错误的凭据尝试连接共享文件夹
3024 表示 SMB 客户端已从共享文件夹断开连接,可能的原因是超时或连接错误
3026 表示 SMB 客户端无法连接共享文件夹,因为已达到最大的并发连接数
3027 表示 SMB 客户端尝试连接共享文件夹时发生网络错误

6) SMBServer日志:用于记录与 SMB 服务器相关的事件和错误信息。SMBServer 日志可用于调试 SMB 服务器连接和文件共享问题。

下表所示为 SMBServer 日志中常见的事件 ID 及事件说明。

表:SMBServer 日志中常见的事件 ID 及事件说明
事件ID 事件说明
8001 表示 SMB 服务器成功启动
8002 表示 SMB 服务器停止运行
8003 表示 SMB 服务器的某个共享文件夹被创建
8004 表示 SMB 服务器的某个共享文件夹被删除
8005 表示 SMB 服务器成功接受一个客户端连接
8006 表示 SMB 服务器断开一个客户端连接
8007 表示 SMB 服务器在处理客户端请求时遇到错误
8008 表示 SMB 服务器无法访问某个共享文件夹

如果需要查看 SMBServer 日志,可以通过“事件查看器”窗口将其打开。在“事件查看器”窗口中,可以选择 SMBServer 日志并查看特定时间段内的事件和错误信息。可以根据事件 ID 和关键字过滤事件,更快地找到所需信息。根据日志中的事件和错误信息,可以定位产生 SMB 服务器连接和文件共享问题的根本原因。

日志分析技巧

Windows 自带的“事件管理器”窗口是一个图形化的日志分析工具,使用难度较低。但在面对海量日志时,这一工具的操作方式和筛选效率难以满足应急响应的时效要求。

在实际场景下,我们迫切需要采用一些自动化的方式导出需要的日志进行分析,以将工作重心放在分析工作本身,而不是放在日志的寻找与定位上。

Windows 自带的 PowerShell 集成了 Get-EventLog 命令,能够帮助我们批量导出事件日志。可以通过使用 Get-EventLog 命令获取安全事件:
Get-EventLog -LogName Security | Select-Object -Property *
以上命令分为两部分:
这样可以获取安全事件的完整信息,包括事件的时间戳、事件 ID、消息、来源等。但是这种方法存在一个严重的不足,即导出的数据本身为文本格式,难以将其排版为 CSV 格式,这会导致分析日志比较麻烦。

下图所示为使用 Get-EventLog 命令导出事件日志的一个具体例子。


图 8 使用Get-EventLog命令导出事件日志

这里我们介绍 Log Parser,它是一款由微软发布的命令行工具,可以用于对各种日志进行查询、分析和处理。该工具可以支持多种类型的日志,包括 IIS 日志、Windows 事件日志、HTTP 日志、SMTP 日志等。

Log Parser 还提供预定义的查询语言,可以帮助用户从日志中提取关键信息,例如统计某段时间内的访问量、分析某个 IP 地址的访问情况、计算页面的平均响应时间等。

Log Parser 还可以将查询结果导出为多种格式,例如 CSV、XML、HTML 等,方便用户进行进一步的处理和分析。

Log Parser 非系统自带工具,读者可自行在 Windows 官网下载该工具,使用该工具时要将 C:\Windows\System32\winevt\Logs\ 下的日志复制到 Log Parser 目录下,否则该工具可能会因为没有 Logs 目录的权限而无法读取日志。

下面几个示例展示了通过 Log Parser 排查事件的命令。
【示例 1】使用 Log Parser 导出安全日志中登录失败事件的命令。
Logparser.exe-q-i:evt-o:csv "SELECT TimeGenerated AS登录时间, EventID AS事件ID, EXTRACT_ TOKEN(Strings, 5, '|') AS用户名, EXTRACT_TOKEN(Strings, 13, '|') AS计算机名, EXTRACT_ TOKEN(Strings, 10, '|') AS登录类型, EXTRACT_TOKEN(Strings, 19, '|') AS登录源IP地址, EXTRACT_ TOKEN(Strings, 17, '|') AS请求进程ID, EXTRACT_TOKEN(Strings, 18, '|') AS请求进程名, Message FROM Security.evtx WHERE eventid = 4625 AND登录类型LIKE '3' OR登录类型LIKE '10' " > Security- 4625.csv

【示例 2】使用 Log Parser 导出安全日志中登录成功事件的命令。
Logparser.exe-q-i:evt-o:csv "SELECT TimeGenerated AS登录时间, EventID AS事件ID,EXTRACT_ TOKEN(Strings,5, '|') AS 用户名, EXTRACT_TOKEN(Strings, 11, '|') AS 计算机名, EXTRACT_TOKEN (Strings, 8, '|') AS 登录类型, EXTRACT_TOKEN(Strings, 18, '|') AS 登录源IP地址, EXTRACT_TOKEN (Strings, 16, '|') AS 请求进程ID, EXTRACT_ TOKEN(Strings, 9, '|') AS 登录进程, EXTRACT_TOKEN (Strings, 17, '|') AS请求进程名,Message FROM Security.evtx WHERE eventid = 4624 "> Security- 4624.csv

【示例 3】使用 Log Parser 导出 TerminalServices-LocalSessionManager 日志中被 rdp 连接事件的命令。
Logparser.exe -q -i:evt -o:csv " SELECT TimeGenerated AS 登录时间, EventID AS事件ID,EventType AS事件类型,ComputerName AS 计算机名, EXTRACT_TOKEN(Strings, 0, '|') AS登录用户名, EXTRACT_ TOKEN(Strings, 2, '|') AS登录源, Message FROM Microsoft- Windows-TerminalServices- LocalSessionManager%4Operational.evtx">rdp被连接-Local SessionManager.csv

【示例 4】使用 Log Parser 导出 TerminalServices-RemoteConnectionManager 日志中被 rdp 连接事件的命令。
Logparser.exe -q -i:evt -o:csv "SELECT TimeGenerated AS 登录时间, EventID AS 事件ID,EventType AS事件类型,ComputerName AS 计算机名, EXTRACT_TOKEN (Strings, 0, '|') AS登录用户名, EXTRACT_ TOKEN(Strings, 2, '|') AS登录源, Message FROM Microsoft-Windows-TerminalServices- RemoteConnectionManager%4Operational.evtx">rdp被连接-RemoteConnectionManager.csv

【示例 5】使用 Log Parser 导出 TerminalServices-RDPClient 日志中主动 rdp 连接其他机器事件的命令。
Logparser.exe -q -i:evt -o:csv "SELECT TimeGenerated AS登录时间, EventID AS事件ID,EventType AS事件类型, ComputerName AS计算机名, EXTRACT_TOKEN (Strings, 0, '|') AS登录用户名, EXTRACT_ TOKEN(Strings, 1, '|') AS登录源, Message FROM "Microsoft-Windows-TerminalServices- RDPClient%4Operational.evtx" ">rdp主动连接-RDPClient.csv

【示例 6】使用 Log Parser 导出 SmbClient 日志中主动连接其他机器事件的命令。
Logparser.exe -q -i:evt -o:csv "SELECT TimeGenerated AS登录时间, EventID AS事件ID,EventType AS事件类型,EXTRACT_TOKEN(Strings,3, '|') AS路径, Message FROM Microsoft-Windows- SmbClient%4Security.evtx WHERE eventid = 31010" > SMB连接-31010.csv

【示例 7】使用 Log Parser 导出 SMBServer 日志中被其他机器 SMB 连接事件的命令。
Logparser.exe -q -i:evt -o:csv "SELECT TimeGenerated AS登录时间, EventID AS 事件ID,EventType AS事件类型, EXTRACT_TOKEN(Strings,8, '|') AS用户名, EXTRACT_TOKEN(Strings,10, '|') AS路径, Message FROM Microsoft-Windows- SMBServer%4Security.evtx WHERE eventid = 551" > SMB被连接-551.csv

相关文章