剥茧之书

事件日志分析

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*'