一、为什么需要 Sysmon — 从一次 DNS 恶意解析排查讲起

应急场景中,我们或许会遇到这样的情况:网络侧检测到某台内网 Windows 主机在不定时的尝试解析一个已知的恶意域名(比如 C2 域名或 DGA 域名),威胁情报明确判定为高风险,但你登录这台机器后,任务管理器里看不到任何明显异常进程,杀软也毫无反应。你想知道是哪个进程在解析这个域名,却发现 Windows 内置日志在这个问题上几乎是“盲视”的。

Windows 提供的审计策略中,的确可以开启进程创建审计(Event ID 4688)和网络连接审计(Event ID 5156 等),但它们的共同缺陷是无法直接关联 DNS 查询与发起该查询的进程

  • 进程创建审计的命令行记录不全,;

  • 网络审计事件只能告诉你某个进程访问了某个 IP,不包含域名信息;

  • DNS 客户端日志(Microsoft-Windows-DNS-Client/Operational)虽然能记录域名和查询结果,却不记录发起进程的 PID 或路径

这就造成了一个断层:你看到域名解析请求,却追不到发起它的进程。于是你只好祭出实时抓包,逐个手动 netstat -ano 碰运气,但是恶意域名的请求不是时刻发生的。

Sysmon(System Monitor) 的出现,正是为了解决这类行为溯源断层。它是微软 Sysinternals 工具套件中的一款免费工具,以驱动+服务的形式深入 Windows 内核,将系统关键行为(进程创建、网络连接、DNS 查询、文件操作、注册表修改等)记录到 Windows 事件日志中。对于 DNS 恶意解析排查这个具体场景,它提供了 Event ID 22 (DnsQuery) 事件,可以直接告诉你:“哪个进程(含 PID 和完整路径)在什么时间查询了哪个域名”

二、Sysmon 基础介绍 — 它到底能做什么

2.1 Sysmon 是什么

Sysmon 是 Windows Sysinternals 工具集的一员(与 Process Explorer、Autoruns 等属于同一家族),由微软官方开发和维护,完全免费。它本质上是一个系统活动监视器,通过在内核中安装驱动程序并配合用户态服务,持续采集系统上发生的各类安全相关行为,并将它们以结构化事件的形式写入 Windows 事件日志的 Microsoft-Windows-Sysmon/Operational 通道。

2.2 与 Windows 事件日志的关系

已经开启了 Windows 安全审计策略,为什么还需要 Sysmon?二者的关系是互补而非替代。Windows 安全日志覆盖面广,但细节不足;Sysmon 则针对特定高价值事件提供深度字段。下面列举几个关键区别:

行为

Windows 安全日志能提供什么

Sysmon 能额外提供什么

进程创建

Event ID 4688,有命令行(需设置),无哈希,父进程信息需关联

Event ID 1,包含完整命令行、文件哈希(SHA256)、父进程路径及命令行

DNS 查询

DNS-Client 日志有域名和查询结果,无进程信息

Event ID 22,直接包含进程 ID、进程路径、查询域名和状态

网络连接

Event ID 5156/5158,基于 IP 层,无域名

Event ID 3,包含目标 IP、端口,且可直接记录目标域名(这是标志性差异)

文件时间篡改

无专门事件

Event ID 2,专门记录文件创建时间被修改的操作(针对反取证)

Sysmon 的作用不是让 Windows 安全日志变得冗余,而是填补它最致命的行为上下文缺失(尤其是进程与网络/DNS 的关联)。

2.3 独立版与内置版的选择

从 Windows 11 (部分版本) 和 Windows Server 2025 开始,Sysmon 以可选功能的形式内置到操作系统中。需要了解这两种部署形态的差异:

  • 独立版 (Sysinternals 下载):需要手动从微软官网下载 Sysmon64.exe,通过命令行安装为服务。拥有最完整的功能和最快的社区更新支持,配置文件语法也有更多灵活特性。

  • 内置版 (Windows 可选功能):通过“设置 → 系统 → 可选功能”添加名为“System Monitor”的组件。优点是作为系统组件跟随 Windows 质量更新升级,操作更简单;缺点是功能同步滞后,且与独立版不能共存,二选一。

本文以下内容均基于独立版 Sysmon 展开,你需要从 Sysinternals 官方页面 下载最新版本。

三、安装与命令行参数完全解读

3.1 下载与安装前的准备

部署 Sysmon 非常简单,几乎没有依赖性,但要注意:

  • 需要管理员权限

  • 如果系统之前启用过内置版 Sysmon,需先将其卸载,否则独立版安装可能会失败。

3.2 核心命令行参数详解

打开管理员权限的命令行,进入 Sysmon 程序所在目录。最常用的命令格式如下:

sysmon64.exe -accepteula -i config.xml

下面逐一解释每个关键参数。

-i [configfile]
安装 Sysmon 服务和驱动。如果不指定配置文件,则安装后会处于“空规则”状态,不记录任何事件。因此,安装时必须同时指定一个有效的 XML 配置文件。

-c [configfile]
更新 Sysmon 的配置文件。当你需要修改过滤规则时,无需重装,直接使用此参数指定新的 XML 文件即可,服务会自动应用新配置。示例:

sysmon64.exe -c updated_config.xml

-u
卸载 Sysmon 服务和驱动。卸载后所有 Sysmon 日志仍保留在事件查看器中,但不会再产生新事件。

-accepteula
接受微软软件许可条款。首次安装必须带此参数,否则交互式弹窗可能会阻断自动化部署。

-t [driver]
指定日志驱动类型。默认情况下 Sysmon 使用事件日志驱动 (EventLog),可通过参数选择其他方式(如使用 SysmonDrv 输出到二进制文件等)。一般无需修改。

-?
查看所有可用参数和相关说明。

3.3 服务管理与状态验证

安装完成后,Sysmon 会以 Windows 系统服务的形式运行,服务名称为 SysmonSysmon64(视版本而定)。你可以用以下命令验证状态:

sc query Sysmon

如果 STATE 显示为 RUNNING,说明服务正常运行。同时检查 Windows 事件查看器,在“应用程序和服务日志 → Microsoft → Windows → Sysmon → Operational”路径下,应能看到初始日志条目(如 Event ID 16 服务配置更改,或 Event ID 255 服务状态)。

四、配置文件是灵魂 — 从语法到最佳实践

4.1 为什么必须用配置文件

许Sysmon 出厂默认是“全关闭”状态。你需要通过配置一个 XML 文件,明确告诉它以哪些事件类型、哪些过滤条件来记录日志。

4.2 XML 配置文件结构解析

一个典型 Sysmon 配置文件基本骨架如下:

<Sysmon schemaversion="4.90">
  <EventFiltering>
    <RuleGroup name="" groupRelation="or">
      <ProcessCreate onmatch="exclude">
        <!-- 排除规则 -->
      </ProcessCreate>
      <NetworkConnect onmatch="include">
        <!-- 包含规则 -->
      </NetworkConnect>
      <DnsQuery onmatch="include">
        <!-- 包含规则 -->
      </DnsQuery>
    </RuleGroup>
  </EventFiltering>
</Sysmon>

关键结构要素说明:

  • <Sysmon>:根节点,schemaversion 需与 Sysmon 版本匹配(如 4.90)。

  • <EventFiltering>:事件过滤部分,所有规则必须包在它里面。

  • <RuleGroup>:规则组,可定义多个。groupRelation="or" 表示组内各事件类型的关系(大部分情况用 or)。

  • 事件类型标签:如 <ProcessCreate><DnsQuery><NetworkConnect><FileCreateTime> 等,对应不同的 Sysmon Event ID。

  • onmatch 属性:定义该事件类型的过滤逻辑。有两个值:

  • include:仅记录与规则匹配的事件;

  • exclude:记录所有事件,但排除匹配规则的事件。

理解这个逻辑至关重要。例如:

  • 如果 <ProcessCreate onmatch="include"> 里写了 Image condition is "cmd.exe",则只会记录 cmd.exe 的进程创建。

  • 如果 <ProcessCreate onmatch="exclude"> 里写了 Image condition is "cmd.exe",则会记录所有进程创建,但 cmd.exe 的会被过滤掉。

规则条件写在事件标签内部,常见条件字段有:

  • Image:可执行文件完整路径

  • CommandLine:完整命令行

  • ParentImage:父进程路径

  • User:用户名

  • QueryName:DNS 查询域名(仅 DnsQuery 事件)

  • DestinationHostname:网络连接目标域名(仅 NetworkConnect 事件)

条件可组合使用(用逻辑操作符 and/or),并支持通配符 *

4.3 社区优质模板推荐

强烈建议从社区的高质量模板开始,避免从零造轮子。

SwiftOnSecurity/sysmon-config
这是目前 Github 上最知名的 Sysmon 配置仓库。它通过 onmatch="exclude" 排除了海量已知的良性系统活动和常见软件行为,达到“记录所有事件,但排除正常行为”的目的。直接使用此模板可以让你的 Sysmon 立即生效,且噪音控制较好。缺点是可能会在你特殊环境中漏掉一些正常但小众的软件活动,需要自定义再添加排除项。

下载后,你可以直接在安装命令中引用它:

sysmon64.exe -accepteula -i sysmonconfig-export.xml

Olaf Hartong/sysmon-modular
这个仓库将配置按 MITRE ATT&CK 技术模块化拆分,更便于根据威胁模型选择性启用。例如你想重点监控凭证窃取,就加载对应模块。

4.4 编写一个最小化配置:只记录 DNS 和进程

针对本文的 DNS 排查场景,我们可以写一个极致精简的配置文件,只开启 DnsQuery 和 ProcessCreate 两个事件,并不过滤(记录所有):

<Sysmon schemaversion="4.90">
  <EventFiltering>
    <RuleGroup name="" groupRelation="or">
      <ProcessCreate onmatch="exclude">
      </ProcessCreate>
      <DnsQuery onmatch="exclude">
      </DnsQuery>
    </RuleGroup>
  </EventFiltering>
</Sysmon>

这里我们用了 onmatch="exclude" 但内部不加任何规则,结果就是记录所有进程创建和 DNS 查询。这样的配置在测试环境可以快速验证功能,但在生产中使用时日志量会非常大,建议配合过滤规则优化。

五、读懂 Sysmon 的关键事件 — 以 DNS 溯源为线索

Sysmon 的强大之处在于它定义了近 30 种精细的事件类型,覆盖了从进程创建到内核级行为的方方面面。下面,我们首先重点剖析与 DNS 溯源直接相关的三个核心事件,然后提供一个完整的事件类型速查表,供在日后排查其他威胁时参考。

5.1 核心事件深度解析

Event ID 1 (Process Creation) — 还原进程全貌
进程创建事件提供有关新创建的进程的扩展信息。拿到 ID 22 提供的 PID 只是第一步,要弄清楚这个进程从何而来,就需要此事件提供的丰富上下文:

  • ImageCommandLine:进程的完整路径和启动命令(这对检测无文件攻击极为重要)

  • ParentImageParentCommandLine:父进程的路径及命令行

  • User:以谁的身份运行

  • Hashes:进程文件的哈希值,包含“HashType”字段中注明的算法,可用于威胁情报匹配

  • IntegrityLevel:进程完整性级别

  • ProcessGuid:进程在整个域中的唯一 ID,是关联其他事件的绝佳纽带

通过 PID 关联 Event ID 22 和 Event ID 1,你就能画出:域名 → 进程 → 父进程 → 启动命令的全链路。

Event ID 3 (Network Connection) — 网络连接的补充证据
网络连接事件记录 TCP/UDP 连接,能直接揭示数据外传行为。其突出特点是可以解析目标主机名(字段 DestinationHostname),而不仅仅是 IP。关键字段包括:

  • ImageProcessIdProcessGuid:关联到具体进程

  • Protocol:TCP 或 UDP

  • SourceIpSourcePortDestinationIpDestinationPort

  • DestinationHostname:目标主机名(亮点字段)

此事件默认禁用,会产生大量日志,建议在配置文件中谨慎启用,并与 ID 1 配合使用,以确认解析恶意域名后是否建立了真实连接。

5.2 Sysmon 全事件类型速查表

理解了上述核心事件后,我们扩展到 Sysmon 支持的全部事件类型。下表为微软官方定义的精炼版本,是你在日常监控和应急响应中不可或缺的“字典”。

事件ID

事件名称

核心记录内容与用途

1

ProcessCreate

进程创建。记录完整命令行、哈希、父进程等。是还原攻击链的基础。

2

FileCreateTime

进程修改文件创建时间。用于检测反取证行为(Timestomping),但也存在大量合法修改,需仔细鉴别。

3

NetworkConnect

网络连接。记录 TCP/UDP 连接,包含源/目标 IP、端口及域名。默认禁用

4

Sysmon Service State Changed

Sysmon 服务状态更改。报告服务启动或停止,可用于检测攻击者试图关闭监控。

5

ProcessTerminate

进程终止。记录进程的退出,提供其 ProcessGuid 和 ProcessId。

6

DriverLoad

驱动加载。记录驱动加载信息及签名,用于检测 Rootkit 或恶意驱动。

7

ImageLoad

映像(DLL)加载。记录进程加载的模块,用于检测 DLL 劫持或注入。默认禁用,日志量大

8

CreateRemoteThread

远程线程创建。检测一个进程在另一进程中创建线程,是代码注入的典型特征。

9

RawAccessRead

原始访问读取。检测进程通过 \.\ 直接读取磁盘,常用于数据窃取或绕过文件审计。

10

ProcessAccess

进程访问。报告一个进程打开了另一个进程,常用于检测凭证窃取(如读取 LSASS 内存)。启用后会显著增加日志量。

11

FileCreate

文件创建。监控文件的创建或覆盖,是检测恶意软件释放载荷的关键事件。

12

RegistryEvent (Object create and delete)

注册表对象创建与删除。用于监控持久化位置(如 Run 项)的更改。

13

RegistryEvent (Value Set)

注册表值设置。记录注册表值的修改,会记录 DWORD 和 QWORD 的具体数值。

14

RegistryEvent (Key and Value Rename)

注册表键和值重命名。记录重命名后的新名称。

15

FileCreateStreamHash

文件流创建哈希。用于捕获浏览器下载时附加的“Web标记”流(Zone.Identifier)等信息。

16

Sysmon Config State Changed

Sysmon 配置更改。记录配置文件更新的时间。

17

PipeEvent (Pipe Created)

管道创建。恶意软件常利用命名管道进行进程间通信。

18

PipeEvent (Pipe Connected)

管道连接。记录客户端和服务器之间命名管道连接的建立。

19

WmiEvent (WmiEventFilter activity detected)

WMI 事件筛选器注册。用于检测通过 WMI 实现持久化的攻击(Event Filter)。

20

WmiEvent (WmiEventConsumer activity detected)

WMI 事件消费者注册。记录消费者名称和目的地(Event Consumer)。

21

WmiEvent (WmiEventConsumerToFilter activity detected)

WMI 消费者绑定到筛选器。记录消费者和筛选器的绑定关系。

22

DnsQuery

DNS 查询。记录进程执行的所有 DNS 查询,是本文的核心。需 Windows 8.1 及以上。

23

FileDelete (A file has been archived)

文件删除(已存档)。记录文件删除的同时,将文件副本保存在 C:\Sysmon 目录下。

24

ClipboardChange

剪贴板内容变化。监控系统剪贴板活动。

25

ProcessTampering

进程篡改。检测“进程镂空(hollowing)”等映像替换技术。

26

FileDeleteDetected

文件删除检测。记录文件被删除,但不保存文件副本(与 ID 23 的主要区别)。

27

FileBlockExecutable

阻止可执行文件创建。Sysmon 检测并阻止创建 PE 格式文件。

28

FileBlockShredding

阻止文件粉碎。Sysmon 检测并阻止 SDelete 等工具的文件粉碎行为。

29

FileExecutableDetected

检测到可执行文件创建。当 Sysmon 检测到新建 PE 文件时生成。

255

Error

错误。报告 Sysmon 自身运行中的错误,如系统过载或 bug。

这张表为你提供了一个全景视图。在无 EDR 环境下,你可以根据威胁模型,有选择地在配置文件中启用这些事件,构建起纵深的行为监控体系。

六、总结

回到本文开头的场景。当一台主机疯狂解析恶意域名,你却一脸茫然时,Sysmon 就是那块掉在你面前的拼图—Event ID 22 直接告诉你发起进程,Event ID 1 帮你还原完整的攻击链,Event ID 3 确认外联。整个过程无需复杂的抓包或在注册表中瞎翻,简单而高效。

应急场景中,或许我们没有 EDR,但我们可以临时使用 Sysmon ,从容揪出那个“偷偷解析恶意域名”的幕后黑手。


参考链接: