事件日志分析
Sysmon日志是由Microsoft系统监视器(Sysmon)生成的事件日志,它们提供有关Windows上的系统级操作的详细信息,并记录进程启动、网络连接、文件和注册表修改、驱动程序和服务活动以及WMI操作等活动,通过分析Sysmon日志,安全专家可以检测潜在风险、发现异常并响应安全事件,以增强整体系统监控和安全性。在不断变化的网络安全环境中,提前防范威胁非常重要。
Event ID(事件id)
https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon#events
Sysmon日志中所使用的全部Event ID都已经在微软的Sysmon页面上进行了介绍,其中包括:
1:进程创建
2:文件创建时间修改
3:网络连接
5:进程终止
11:文件创建
12:注册表对象创建和删除
13:注册表值设置
22:DNS查询
23:文件删除(带归档)
26:文件删除(不带归档)
分析
此日志一般后缀为.evtx,要进行分析需要转换为json
https://github.com/EricZimmerman/evtx
.\EvtxECmd.exe -f $待转换日志.evtx --json $输出.json
在转换过程中,我们会看到此日志事件记录条数以及各事件的出现次数类似如下
Records included: 169 Errors: 0 Events dropped: 0
Metrics (including dropped events)
Event ID Count
1 6
2 16
3 1
5 1
7 15
10 1
11 56
12 14
13 19
15 2
17 7
22 3
23 26
26 2
Processed 1 file in 0.9008 seconds
各事件次数
第一种方式就是利用EvtxECmd.exe转换json的时候会简单看到,第二种是利用jq查询此json的时候使用如下命令
cat .\Output.json | jq -sc 'group_by(.EventId) | map({EventId: .[0].EventId, count: length}) | .[]'
jq会将输入的json当作一个json处理,并依据EventId进行分组并记录次数后输出,效果如下
PS C:\Users\wacky\Desktop\code\tools\EvtxECmd\EvtxeCmd\nite42.json> cat .\20250818040123_EvtxECmd_Output.json| jq -sc 'group_by(.EventId) | map({EventId: .[0].EventId, count: length}) | .[]'
{"EventId":1,"count":6}
{"EventId":2,"count":16}
{"EventId":3,"count":1}
{"EventId":5,"count":1}
{"EventId":7,"count":15}
{"EventId":10,"count":1}
{"EventId":11,"count":56}
{"EventId":12,"count":14}
{"EventId":13,"count":19}
{"EventId":15,"count":2}
{"EventId":17,"count":7}
{"EventId":22,"count":3}
{"EventId":23,"count":26}
{"EventId":26,"count":2}
单独事件分析(举例分析事件1)
利用jq以EventId为参数分离某类事件,这里分类的是1类事件
cat .\20240408132435_EvtxECmd_Output.json | jq -c 'select(.EventId == 1)' > eventid1.json
之后可以取出第一条事件,我们可以了解此json的字段
cat .\eventid1.json | jq -s '.[0]'
事件1信息如下
1️⃣ 基础事件信息
包括 EventId、时间戳、EventRecordId、Channel、Provider、Level、SourceFile 等
描述了这条事件本身的元信息,即日志是谁生成的、什么时候生成、记录编号是多少。
2️⃣ 进程相关信息
包括 PayloadData1~6、ExecutableInfo、ProcessId、ThreadId、UserName、Hashes 等
描述了事件关联的进程及其父进程的详细信息:路径、ID、GUID、命令行、父进程信息、哈希值、执行用户等。
对应输出类似如下
1️⃣ 基础事件信息
字段 示例 说明
EventId 1 Sysmon 事件类型:1 表示 进程创建
EventRecordId 118772 日志在 Sysmon 日志文件中的记录编号
TimeCreated 2024-02-14T03:41:45.3058822+00:00 事件发生的 UTC 时间
Level Info 日志级别
Keywords Classic 日志关键字类别
Channel Microsoft-Windows-Sysmon/Operational Sysmon 日志通道
Provider Microsoft-Windows-Sysmon 生成事件的提供者
SourceFile …\Microsoft-Windows-Sysmon-Operational.evtx 原始 EVTX 文件路径
RecordNumber 26 事件记录编号(局部顺序)
HiddenRecord false 是否为隐藏记录(通常为 false)
2️⃣ 进程相关信息
字段 示例 说明
PayloadData1 ProcessID: 5584, ProcessGUID: 817bddf3-3679-65cc-2902-000000001900 当前进程 ID 和 GUID
PayloadData4 ParentProcess: C:\Program Files\Mozilla Firefox\firefox.exe 父进程路径
PayloadData5 ParentProcessID: 4292, ParentProcessGUID: 817bddf3-3514-65cc-0802-000000001900 父进程 ID 和 GUID
PayloadData6 ParentCommandLine: "C:\Program Files\Mozilla Firefox\firefox.exe" 父进程启动命令行
ProcessId 3028 当前事件的 Windows 进程 ID(与 PayloadData1 中 5584 对比,可能是 EvtxECmd 内部映射)
ThreadId 4412 触发事件的线程 ID
ExecutableInfo "C:\Program Files\Mozilla Firefox\pingsender.exe" … 当前进程完整路径及命令行参数
UserName DESKTOP-887GK2L\CyberJunkie 执行进程的用户
3️⃣ 文件/哈希信息
字段 示例 说明
PayloadData3 SHA1=282F…, MD5=…, SHA256=…, IMPHASH=… 进程可执行文件的哈希值,IMPHASH 用于检测恶意文件家族
PayloadData2 RuleName: technique_id=T1027, technique_name=Obfuscated Files or Information MITRE ATT&CK 对应技术(这里表示混淆文件或信息)
4️⃣ Parent / 上级进程信息
字段 示例 说明
ParentProcess C:\Program Files\Mozilla Firefox\firefox.exe 父进程路径
ParentProcessID 4292 父进程 ID
ParentProcessGUID 817bddf3-3514-65cc-0802-000000001900 父进程 GUID
ParentCommandLine "C:\Program Files\Mozilla Firefox\firefox.exe" 父进程启动命令行
ParentUser DESKTOP-887GK2L\CyberJunkie 父进程执行用户
5️⃣ Sysmon EventData 字段(Payload)
Payload 内部是 Sysmon 原始 XML EventData 转成 JSON
包含详细字段如:
Image → 进程路径
CommandLine → 启动参数
Hashes → 文件哈希
User → 执行用户
ParentImage / ParentCommandLine / ParentUser → 父进程信息
IntegrityLevel → 进程权限级别(这里是 Medium)
接下来我们可以用下面的语法输出整个事件1当中我们感兴趣的所有字段
cat .\eventid1.json | jq -s '.[] | [.TimeCreated, .PayloadData4, .ExecutableInfo, .PayloadData1, .PayloadData5]'
就像这里我输出了.TimeCreated → 事件发生时间 .PayloadData4 → 父进程路径 .ExecutableInfo → 当前进程完整路径及命令行 .PayloadData1 → 当前进程 ID 和 GUID .PayloadData5 → 父进程 ID 和 GUID
#示例输出
[
"2024-02-14T03:41:56.5596188+00:00",
"ParentProcess: C:\\Windows\\explorer.exe",
"\"C:\\Users\\CyberJunkie\\Downloads\\Preventivo24.02.14.exe.exe\" ",
"ProcessID: 10672, ProcessGUID: 817bddf3-3684-65cc-2d02-000000001900",
"ParentProcessID: 1116, ParentProcessGUID: 817bddf3-311f-65cc-0a01-000000001900"
]
简单的利用分析就是这样
常用分析命令
cat .\20240408132435_EvtxECmd_Output.json | jq -c 'select(.EventId == 11)' | findstr 10672 | jq -s '.[] | [.TimeCreated, .PayloadData4]'
这条命令效果是筛选事件id为11的事件,并进一步筛选出包含10672字段的事件 并输出其中的TimeCreated, PayloadData4字段
隼鸟快速使用
筛选出存在关键词的事件输出为json
hayabusa search -f Windows-Powershell-Operational.evtx -k "keyword“ -J -o "this.json"
以时间线输出csv,可以手动选择匹配模式,一般选最大
hayabusa csv-timeline -f Windows-Powershell-Operational.evtx -o time_powershell.csv
流量分析
tcpdump使用
需要root权限,并且如果需要生成数据包,请在tmp目录生成
开关级参数
参数 | 口语化说明 |
---|---|
-D | 显示所有可用的网络接口 |
-i | 指定要抓包的网络接口,例如 -i eth0 |
-n | 不把 IP 地址或端口号转换成名字,直接显示数字 |
-e | 抓包时连以太网头也抓上 |
-X | 以十六进制和 ASCII 显示数据包内容 |
-XX | 跟 -X 一样,但同时显示以太网头 |
-v / -vv / -vvv | 增加输出的详细程度,越多 v 信息越详细 |
-c | 抓指定数量的数据包后退出,例如 -c 10 |
-s | 设置每个数据包抓多少字节,-s 0 表示抓完整包 |
-S | 显示绝对序列号,而不是相对序列号 |
-q | 输出更简略的协议信息 |
-r 文件.pcap | 从指定文件读取抓包数据,例如 -r /tmp/capture.pcap |
-w 文件.pcap | 把抓到的数据写入指定文件,例如 -w out.pcap |
-A | 仅显示数据包行后的 ASCII 文本 |
-w 文件.pcap | 把抓到的数据写入指定文件,例如 -w out.pcap |
-l | 快速检查捕获,可以利用管道符号配合,例如 `sudo tcpdump -Ar http.cap -l |
过滤器
过滤器 | 说明 |
---|---|
host x.x.x.x | 仅捕获与特定主机相关的流量 |
net x.x.x.x/24 | 捕获进出特定网络的流量(斜杠表示法指定掩码) |
src net x.x.x.x/24 | 仅捕获来自指定网络的流量 |
dst net x.x.x.x/24 | 仅捕获发往目标网络的流量 |
port # | 只捕获指定端口的流量,其余端口过滤掉 |
not | 捕获除指定条件之外的所有流量,例如 not port 80 |
and | 连接多个过滤条件,例如 host 192.168.1.1 and port 80 |
portrange x-x | 捕获指定端口范围内的流量 |
ip / ether / tcp | 只抓指定协议的流量 |
broadcast | 捕获广播流量(一对所有) |
multicast | 捕获多播流量(一对多) |
unicast | 捕获单播流量(一对一) |
列出可用接口
sudo tcpdump -D
大参数抓取流量包命令示例
sudo tcpdump -i eth0 -nnvXX -c 100 -w /tmp/output.pcap
#禁用名称解析且启用ascii和十六进制的详细抓前100个完整数据包并输出到目标文件
快速读取数据包中的人类可读信息
sudo tcpdump -Ar telnet.pcap
当然也可以配合-l进行查找效果
sudo tcpdump -Ar telnet.pcap -l | grep 'flag*'