Sysmon实战指南:Windows系统监控与恶意行为溯源
大概每个 Windows 工程师都经历过这样的场景服务器被人动过手脚你在事件查看器里翻了一个小时只看到某个账户的登录成功记录、几条服务状态变更但真正的关键信息——恶意进程是谁用哪条命令拉起来的、它向哪个 IP 发了数据、父进程是谁——全都找不到答案。这不是你排查能力不行而是 Windows 原生日志默认就不记录这些内容。微软 Sysinternals 工具集中的 SysmonSystem Monitor就是为填补这片监控空白而生的系统监控工具它用内核驱动把进程创建、网络连接、文件变化、注册表操作这些行为逐一写进 Windows 事件日志让管理员和安全工程师能回答“系统上到底发生过什么”这个问题。很多刚接触 Sysmon 的人以为装上就算完事实际上它的真正价值完全取决于你怎么配、怎么看、怎么用日志做追溯。这篇内容我会把安装配置、事件含义、实战场景、日志量控制和排错经验放在一起讲适合正在做 Windows 安全运营、基线监控或者应急响应的朋友也适合被“服务器半夜被人动过却查不到证据”折磨过的运维同学。1. 为什么需要 SysmonWindows 自带日志覆盖不到的监控空白1.1 安全日志记的是结果Sysmon 记的是过程Windows 自带的 Security 事件日志在默认情况下并不会记录进程启动、命令行参数、网络连接这类行为。就算你开启了“审核进程创建”策略它也只给你一个进程名和 PID不告诉你完整命令行、不告诉你父进程是谁、不告诉你可执行文件的哈希是多少。等攻击者用完工具把进程一杀你想从日志里还原当时的操作链基本等于拼残缺的拼图。Sysmon 补的正是这一段过程数据。它的 Event 1进程创建会记录 Image 路径、CommandLine、Hashes、父进程的 PID、父进程镜像路径和父进程命令行。1.2 Sysmon 的底子驱动采集加事件通道Sysmon 不是普通的用户态程序它的采集核心是 SysmonDrv.sys 驱动。驱动加载后通过注册系统回调机制监听进程创建、线程远程创建、网络连接、文件读写等行为再把数据写到Microsoft-Windows-Sysmon/Operational这个事件日志通道里。因为它在内核层工作很多用户态勾子根本藏不住它。这个架构带来一个好处采集行为不依赖第三方服务的心跳驱动一旦主动加载就持续生效除非系统掉电或被人为卸载。同时也带来一个常见坑Sysmon 服务名称叫 Sysmon但它的生命周期和普通 Windows 服务不完全一样你有时候在服务管理器里看到它已经停止实际驱动可能还挂着排查时别只看服务状态。2. 从安装到第一份配置不写配置文件直接装等于没装2.1 安装与卸载的标准操作Sysmon 从微软官方 Sysinternals 页面上可以下载64 位系统使用sysmon64.exe32 位系统使用sysmon.exe。下载后放到固定目录比如C:\Sysmon\建议不要放在用户目录或者临时目录因为后续更新配置、卸载都要引用这个文件文件被移动会导致服务无法正常加载配置。安装前需要管理员权限。最简单的安装命令是sysmon64.exe -accepteula -i C:\Sysmon\sysmon-config.xml-accepteula表示接受许可协议-i表示安装驱动并加载配置。安装完成后事件查看器里就会出现Microsoft-Windows-Sysmon/Operational通道。后续要修改配置不需要重新安装。用-c参数重新加载配置文件即可sysmon64.exe -c C:\Sysmon\sysmon-config.xml如果只是想确认某个配置文件语法是否正确、是否和当前 Sysmon 版本兼容用-s参数做校验sysmon64.exe -s C:\Sysmon\sysmon-config.xml卸载 Sysmon 也很简单sysmon64.exe -u我在实际部署中遇到过一个很尴尬的情况公司在很低版本的 Windows Server 上装了 Sysmon后来又下载了新版 sysmon64.exe 直接覆盖结果驱动签名信息不匹配服务一直起不来。所以升级时请先把旧版本卸载干净再安装新版本不要直接覆盖二进制。2.2 给一份最小可用配置Sysmon 默认配置几乎不记录任何详细行为必须靠 XML 文件控制。下面是一份适合刚上手的最小配置作用是记录所有进程创建并记录除内网和回环地址以外的网络连接Sysmon schemaversion4.90 HashAlgorithmsSHA256/HashAlgorithms EventFiltering RuleGroup nameminimal groupRelationor NetworkConnect onmatchexclude DestinationIp127.0.0.1/DestinationIp DestinationIp::1/DestinationIp DestinationIp192.168.0.0/16/DestinationIp DestinationIp10.0.0.0/8/DestinationIp DestinationIp172.16.0.0/12/DestinationIp /NetworkConnect /RuleGroup /EventFiltering /Sysmon这里面的逻辑是onmatchexclude表示“匹配到就排除没匹配到的其余事件全部记录”。因为我们没有给 ProcessCreate 写任何 include 或 exclude 规则所以进程创建事件会默认全部记录。DestinationIp支持 CIDR 网段写法这是配置网络过滤时很实用的特性。HashAlgorithms我建议只写SHA256哈希越多资源开销越大没必要同时算 MD5 和 SHA1。2.3 怎样确认 Sysmon 已经正常记录装完以后不能直接丢在一边。先打开事件查看器在左侧导航栏展开“应用程序和服务日志 → Microsoft → Windows → Sysmon → Operational”如果通道存在且能看到事件说明驱动加载成功。再做一个最普通的验证在命令行里开一个记事本进程然后立即查看日志Get-WinEvent -LogName Microsoft-Windows-Sysmon/Operational -MaxEvents 10 | Select-Object TimeCreated, Id, LevelDisplayName, Message | Format-List正常情况下应该能看到一条 Event 1里面包含了 notepad.exe 的完整路径、命令行和 SHA256 哈希。看到这条Sysmon 才算是真的开始工作了。3. 一组事件日志看懂系统行为核心 Event ID 盘点拿到日志只是开始关键是知道每个 Event ID 代表什么、什么场景下应该看哪个。这里先放一张常用事件总表再逐个拆重点。Event ID事件名称含义常用排查场景1进程创建进程启动含命令行、父进程、哈希恶意命令、钓鱼脚本、可疑程序启动2文件时间戳变更文件创建/修改时间被改动攻击者反取证抹时间3网络连接进程发起或接受网络连接挖矿外联、C2 通讯、端口扫描5进程终止进程结束判断恶意进程是否已退出6驱动加载内核驱动被加载可疑驱动、Bootkit 排查7镜像加载DLL/模块被进程加载DLL 劫持、白加黑漏洞利用8远程线程创建在其它进程里创建远程线程进程注入、恶意模块驻留10进程访问一个进程打开另一个进程句柄读取 lsass 凭据、提权行为11文件创建文件被创建或写入勒索软件释放文件、Webshell 落地12/13注册表事件注册表项、值被创建或修改自启动持久化、服务注册15备用数据流ADS 流被创建文件隐藏、恶意代码藏匿18命名管道连接进程连接命名管道横向移动、远控管道通信22DNS 查询DNS 客户端发出的解析请求恶意域名查询、DNS 隧道排查23文件删除文件被删除攻击者清理痕迹、勒索删除原文件25进程篡改已知进程内部被非法修改ProcGhost 等进程伪装攻击3.1 进程、镜像与注入事件 1、7、8、10Event 1 是大家最常用的事件也是还原攻击链的地基。它记录的 ParentProcessGuid 和 ParentImage 能告诉你当前进程是被谁拉起来的。举个例子如果看到powershell.exe的父进程是winword.exe脑子里就要立刻绷一根弦这大概率是文档宏或者漏洞利用导致的执行链。Event 7 镜像加载非常适合查“白加黑”和 DLL 劫持。正常程序加载的 DLL 大多来自系统目录或程序自身目录如果某个受信任进程加载了一个来自临时目录、用户下载目录或者共享目录的 DLL并且签名状态异常那基本可以断言出了问题。Event 8 和 Event 10 则更多用来查进程注入比如攻击者想要读取 LSASS 进程里的凭据就必须打开 lsass.exe 的进程句柄Event 10 会完整记录这个过程。3.2 网络、文件与隐蔽数据流事件 3、11、15、23Event 3 记录了进程发起的每条出站连接包含本机 IP、进程路径、目标 IP、目标端口、协议。挖矿木马一般会高频连接矿池地址勒索组织入侵后也会先进行内网横向扫描这些行为都会在 Event 3 里留下非常扎实的线索。Sysmon 记录的是 IP 和端口不记录域名和 URL所以定位域名层面的问题要配合 Event 22 DNS 查询一起看。Event 11 文件创建事件能捕捉到很多攻击工具落地的瞬间因为它们的释放器通常会把恶意文件写到临时目录、启动目录或C:\Windows\Temp。Event 15 记录备用数据流创建这个技术经常被用来把恶意载荷藏进正常文件的 ADS 流里命令行工具 dir 根本看不到。Event 23 文件删除事件在勒索软件场景下特别有用因为很多勒索软件加密前会先清理系统备份和卷影副本这个删除动作本身就是一个强烈的告警信号。3.3 注册表、管道与 DNS事件 12、13、18、22Event 12 和 Event 13 覆盖了注册表项创建、修改和值变更。攻击者要做持久化最常用的位置就是HKCU\Software\Microsoft\Windows\CurrentVersion\Run、服务项和各类自启动位置。在这些位置上已经部署了 Sysmon 监控的机器运行 Run 注册表项一旦被改动立刻能定位到是哪个进程改的。Event 18 命名管道事件经常被忽略但横向移动里非常值得关注。很多内网穿透工具、远程控制工具之间的通信依赖于命名管道攻击者建立管道的动作会在日志里留下精确的进程和管道名称。Event 22 有一个天然限制它只记录 System 进程发出的 DNS 查询因为普通进程的 DNS 最终由 Windows DNS Client 服务统一转发。所以它不能精确告诉你“哪个进程访问了那个恶意域名”更适合用来做全局限定和长期告警。4. 实战侧写用 Sysmon 复盘三类真实攻击链4.1 钓鱼进门的脚本执行某次应急响应的场景是财务人员打开了一封带附件的外部邮件随后终端频繁外联。因为机器上提前部署了 Sysmon排查时我直接在日志平台里搜索 Event 1筛出 24 小时内的 powershell.exe 记录很快定位到一条可疑执行链WINWORD.EXE作为父进程加载了宏之后cscript.exe启动并运行了一段 JScript 脚本中间还出现过FromBase64String这类解码函数。这个场景真正值钱的信息不是“有 powershell 执行了”而是完整的父子进程关系。如果只看 Windows 自带日志你只知道某个进程启动了但有了 Sysmon 的 ParentImage、ParentCommandLine你就能把“Excel 文档 → 宏 → cscript → powershell → 下载器”这条链路完整还原出来。排查时可以直接过滤特征Get-WinEvent -FilterHashtable {LogNameMicrosoft-Windows-Sysmon/Operational; Id1; StartTime(Get-Date).AddDays(-3)} | Where-Object { $_.Message -match -enc |FromBase64String|Invoke-Expression|cscript|mshta } | Select-Object TimeCreated, Message | Format-List这里提醒一句-enc这类关键词不要只查完全不区分大小写的简单匹配攻击者会做各种变形和拼接。但不管怎么绕Sysmon 记录的是最终进程的实际命令行只要变形后的字符串还经过 PowerShell 执行引擎高价值特征通常还会留在 CommandLine 字段里。4.2 挖矿木马的回连外联挖矿类问题的排查通常从 Event 3 网络连接入手。常见现象是 CPU 飙高、风扇狂转任务管理器里能看到一个名字比较可疑的进程但它伪装成 svchost.exe。我会先把最近一小时的外联记录全部拉出来重点看进程路径不在系统目录、目标端口不是 80/443/53 这些常规端口的连接。挖矿木马连接矿池时目标 IP 往往是境外 IDC 段端口多为随机高端口或固定矿池端口。Sysmon 事件里网络连接的目标 IP 直接可见不需要额外抓包Get-WinEvent -FilterHashtable {LogNameMicrosoft-Windows-Sysmon/Operational; Id3; StartTime(Get-Date).AddHours(-6)} | Where-Object { $_.Message -notmatch DestinationIp: (127\.|10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.) } | Select-Object -First 30 TimeCreated, Message | Format-List筛选出来后立刻反向关联 Event 1按 ProcessGuid 找到这个外连进程对应的完整命令行和父进程信息。这套组合拳基本能覆盖大多数挖矿木马的定位需求。要注意的是Sysmon 不记录进程的 CPU 内存占用所以它更适合回答“谁在什么时候连接了哪里”而不是“谁在吃 CPU”。前者用来溯源后者用来实时抓现形两者互补。4.3 白加黑与 DLL 劫持白加黑是这几年非常主流的一种攻击方式攻击者把恶意 DLL 放在某个合法软件的目录里利用合法 EXE 启动时自动加载同目录 DLL 的机制把代码跑在可信进程内部。这种情况下进程名是正常的路径是正常的证书也是真的单看进程列表完全发现不了。Sysmon 的 Event 7 镜像加载事件能管住这种攻击。排查时重点看一个正常进程加载的 DLL其 ImageLoaded 路径是否出现在不该出现的目录比如临时目录、用户下载目录、共享目录。还有签名状态正常微软签名的组件在 Sysmon 日志里 SignatureStatus 通常是“签名验证通过”如果看到某个受信任的程序加载了一个未签名或者签名描述驴唇不对马嘴的 DLL就要重点核实。另外Event 10 进程访问事件在横向渗透里也有很强的指向性。攻击者提取本机管理员密码或者哈希时通常会访问 lsass.exe 进程内存。如果日志中出现非系统进程反复访问 lsass.exe尤其是来自某个不相关业务进程的访问几乎可以直接判定为凭据窃取行为。5. 日志量控制和集中采集Sysmon 的最后一公里5.1 本地事件日志的大小与保留Sysmon 记录得越全日志增长得越快尤其是进程创建、镜像加载、网络连接这几类高频事件。如果不控制默认的事件日志大小很快就会被写满旧日志被覆盖关键证据丢了都不知道。我建议至少把 Sysmon 日志通道设到 1GB并且根据业务保留需求配置覆盖策略。命令行修改大小wevtutil set-log Microsoft-Windows-Sysmon/Operational /ms:1073741824这里的单位是字节1073741824就是 1GB。如果内存充足的服务器可以调到 2GB。业务量很大的机器建议在前端过滤高频噪音的同时把日志实时转发出去本地只作为短期缓冲。5.2 把 Sysmon 日志送到 SIEM 或日志平台单机看 Sysmon 日志效率太低尤其是几十台、上百台服务器的时候。最稳妥的做法是把所有机器的 Sysmon 日志集中到统一平台再在平台上做检索和告警。对于还没有 SIEM 的团队最简单的一条路是用 Winlogbeat 把 Sysmon 日志直接送进 Elasticsearch。Winlogbeat 天然支持读取 Windows 事件日志通道配置非常直接winlogbeat.event_logs: - name: Microsoft-Windows-Sysmon/Operational event_id: 1,3,7,8,11,13,15,18,22,23 ignore_older: 72h output.elasticsearch: hosts: [https://192.0.2.10:9200] username: winlogbeat password: 换成你的密码如果公司已经用了微软自家的 Windows Event Collector 或者第三方日志系统原理一样把 Sysmon 通道加入日志订阅即可。集中采集后在平台上可以做更多事按 ProcessGuid 把一次进程生命周期串起来、用父子进程关系画出攻击链、对外联 IP 做威胁情报比对。这些才是 Sysmon 真正的威力所在。5.3 过滤规则不是越多越好很多人在配置 Sysmon 时容易走向两个极端要么什么都不过滤导致日志爆炸要么在客户端把 Event 1、Event 3 全排除结果安全事件发生时日志里一片空白。我个人的实践是客户端尽量少做“一刀切”的排除先把数据记下来高噪音的过滤放到 SIEM 查询层去做。因为客户端一旦排除数据就是永久性丢失后面再想回溯就没有了。只有在日志量确实撑不住、带宽成本很现实的情况下才考虑在客户端排除掉明确无威胁的重复事件比如网络监控整体扫描产生的连接记录、系统服务反复加载自身 DLL 的镜像加载事件。6. 故障排查实录Sysmon 不干活时我怎么办6.1 装了但看不到任何日志装完 Sysmon 后发现 Operational 通道里空无一物这个场景我见过太多次。先查三件事第一事件通道是否真的存在如果事件查看器里根本没有这个通道多半是安装阶段出了问题驱动没有正常加载第二当前用户是否有读取该日志的权限普通用户默认是看不到的需要以管理员身份打开事件查看器第三确认配置里没有把所有事件全部排除比如把 Event 1 写了 include 规则但条件永远无法匹配日志自然为空。另外Sysmon 的配置出现语法错误时服务不一定崩溃但驱动会停止写入。这时可以用sysmon64.exe -c重新加载配置如果命令行界面有报错信息说明配置有问题。也可以直接到安装目录执行sysmon64.exe -?查看当前版本支持的 schema 版本避免用旧版本 Sysmon 去读新版配置文件。6.2 配置加载报错与兼容性问题Sysmon 配置有一套 schema 版本机制配置文件顶部的schemaversion必须和当前 Sysmon 版本匹配。比如 Sysmon 14 系列的配置schema 版本通常在 4.90 左右老版本工具读取高版本配置会直接报错反过来太高版本工具用太老的 schema 也可能不兼容。遇到配置报错先用-s参数校验sysmon64.exe -s C:\Sysmon\sysmon-config.xml-s会明确告诉你哪一行、哪个标签不被当前版本支持。常见的坑是配置文件里用了中文注释导致编码问题、文件路径包含空格或者特殊字符导致加载失败。这类问题通常把配置文件另存为 UTF-8 无 BOM 格式放到纯英文路径下就能解决。6.3 噪音排除的优先级顺序上线一段时间后你可能会发现 Event 3 和 Event 10 成了噪音大户。Event 3 的噪音通常来自监控系统、备份系统、数据库心跳这类连接固定且可预测Event 10 的噪音往往来自杀毒软件、EDR 自身频繁扫描进程它们会大量访问其他进程的句柄。处理这些噪音的优先级我习惯按“先排固定行为、再排重复行为、最后排宽泛规则”的顺序。第一步排除已知的内网网段和监控系统第二步排除频繁产生但语义相同的进程行为第三步才考虑从进程名层面做排除。任何一条排除规则都要写下原因不然三个月后配置改来改去谁也分不清哪条规则是业务需要、哪条规则是误删漏删造成的漏洞。装完 Sysmon 之后我个人的习惯是在配置文件旁边放一个README.txt记清楚每台机器的部署日期、schema 版本、排除规则理由。这个习惯救过我很多次尤其是服务器数量多起来之后一份可维护、有备注的配置比任何复杂的高级规则都更值钱。监控这个东西做得越久越能感受到Sysmon 的核心价值不在于单个事件告警而是它把系统的每一个关键行为变成了一串可以回溯、可以对比、可以复现的时间线你越早把这条基线建立起来后面排查问题就越轻松。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →