剥茧之书

事件日志分析

Sysmon日志是由Microsoft系统监视器(Sysmon)生成的事件日志,它们提供有关Windows上的系统级操作的详细信息,并记录进程启动、网络连接、文件和注册表修改、驱动程序和服务活动以及WMI操作等活动,通过分析Sysmon日志,安全专家可以检测潜在风险、发现异常并响应安全事件,以增强整体系统监控和安全性。在不断变化的网络安全环境中,提前防范威胁非常重要。

sysmon部署

下载

https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon

激活

sysmon.exe -i -accepteula -h md5,sha256,imphash -l -n

导入sysmon配置,可以使用下面这个,能检测常见的dll注入lsass抓取等

https://github.com/SwiftOnSecurity/sysmon-config/blob/master/sysmonconfig-export.xml

下载后将配置文件中需要检测的部分中的参数进行修改

#include更改为exclude
# 比如
	<RuleGroup name="" groupRelation="or">
		<FileCreateTime onmatch="include">
			<Image name="T1099" condition="begin with">C:\Users</Image> <!--Look for timestomping in user area, usually nothing should be doing that here-->
			<TargetFilename name="T1099" condition="end with">.exe</TargetFilename> <!--Look for backdated executables anywhere-->
			<Image name="T1099" condition="begin with">\Device\HarddiskVolumeShadowCopy</Image> <!--Nothing should be written here | Credit: @SBousseaden [ https://twitter.com/SBousseaden/status/1133030955407630336 ] -->
		</FileCreateTime>
	</RuleGroup>
#改为
	<RuleGroup name="" groupRelation="or">
		<FileCreateTime onmatch="exclude">
			<Image name="T1099" condition="begin with">C:\Users</Image> <!--Look for timestomping in user area, usually nothing should be doing that here-->
			<TargetFilename name="T1099" condition="end with">.exe</TargetFilename> <!--Look for backdated executables anywhere-->
			<Image name="T1099" condition="begin with">\Device\HarddiskVolumeShadowCopy</Image> <!--Nothing should be written here | Credit: @SBousseaden [ https://twitter.com/SBousseaden/status/1133030955407630336 ] -->
		</FileCreateTime>
	</RuleGroup>

导入配置

C:\Tools\Sysmon> sysmon.exe -c sysmonconfig-export.xml

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

特殊安全事件速查

痕迹清除痕迹

事件 ID 1102 (The audit log was cleared) :清除审计日志通常是试图删除入侵或恶意活动证据的迹象。

登陆相关(爆破)

事件 ID 4625 (Failed Logon) :此事件记录登录失败的次数。多次登录失败可能意味着正在进行暴力攻击。
事件 ID 4624 (Successful Logon) :此事件记录成功登录事件。此信息对于建立正常的用户行为至关重要。异常行为(例如在非正常时间或从不同地点尝试登录)可能预示着潜在的安全威胁。
事件 ID 4672 (Special Privileges Assigned to a New Logon) :每当帐户以超级用户权限登录时,都会记录此事件。跟踪这些事件有助于确保超级用户权限不会被滥用或恶意使用
事件 ID 4648 (A logon was attempted using explicit credentials) :当用户使用显式凭据登录并运行程序时,会触发此事件。这些登录事件中的异常可能表明网络内存在横向移动,这是攻击者常用的技术。
事件 ID 4771 (Kerberos pre-authentication failed) :此事件与 4625(登录失败)类似,但专用于 Kerberos 身份验证。此类日志数量异常可能表明攻击者正在尝试暴力破解您的 Kerberos 服务。
事件 ID 4776 (The domain controller attempted to validate the credentials for an account) :此事件用于跟踪域控制器凭据验证的成功和失败尝试。多次失败可能表明存在暴力攻击。
事件 ID 5140 (A network share object was accessed) :每当访问网络共享时都会记录此事件。这对于识别未经授权的网络共享访问至关重要。

defender检测相关

事件 ID 1116 (Antivirus malware detection) :此事件尤为重要,因为它会在 Defender 检测到恶意软件时进行记录。此类事件的激增可能表明存在针对性攻击或大范围恶意软件感染。
事件 ID 1118 (Antivirus remediation activity has started) :此事件表示 Defender 已开始删除或隔离检测到的恶意软件。监控这些事件对于确保补救措施成功至关重要。
事件 ID 1119 (Antivirus remediation activity has succeeded) :此事件表示检测到的恶意软件的修复过程已成功。定期监控这些事件将有助于确保有效消除已识别的威胁。
事件 ID 1120 (Antivirus remediation activity has failed) :此事件与 1119 对应,表示补救过程失败。应密切监控并立即处理此类事件,以确保有效消除威胁。
事件 ID 5001 (Antivirus real-time protection configuration has changed) :此事件表示 Defender 的实时保护设置已被修改。未经授权的更改可能表示有人试图禁用或破坏 Defender 的功能。

敏感行为

事件 ID 4656 (A handle to an object was requested) :请求对象(例如文件、注册表项或进程)的句柄时会触发此事件。此事件对于检测访问敏感资源的尝试非常有用。
事件 ID 4698 (A scheduled task was created) :创建计划任务时触发此事件。监控此事件有助于检测持久性机制,因为攻击者经常使用计划任务来维持访问权限并运行恶意代码。
事件 ID 4700 和事件 ID 4701 (A scheduled task was enabled/disabled) :记录计划任务的启用或禁用。计划任务经常被攻击者操纵,以实现持久化或运行恶意代码,因此这些日志可以为可疑活动提供有价值的洞察。
事件 ID 4702 (A scheduled task was updated) :与 4698 类似,此事件在计划任务更新时触发。监控这些更新有助于检测可能存在恶意意图的更改。
事件 ID 4719 (System audit policy was changed) :此事件记录了计算机上审核策略的更改。这可能表明有人试图通过关闭审核或更改要审核的事件来掩盖其踪迹。
事件 ID 4738 (A user account was changed) :此事件记录对用户帐户所做的任何更改,包括权限、组成员身份和帐户设置的更改。意外的帐户更改可能是帐户被接管或内部威胁的征兆。
事件 ID 5142 (A network share object was added) :此事件表示创建了新的网络共享。未经授权的网络共享可能被用于窃取数据或在网络中传播恶意软件。
事件 ID 5145 (A network share object was checked to see whether client can be granted desired access) :此事件表示有人尝试访问网络共享。频繁进行此类检查可能表明用户或恶意软件正在尝试映射网络共享,以备将来利用。
事件 ID 5157 (The Windows Filtering Platform has blocked a connection) :当 Windows 筛选平台阻止连接尝试时,会记录此事件。这有助于识别网络上的恶意流量。
事件 ID 7045 (A service was installed in the system) :突然出现未知服务可能表明安装了恶意软件,因为许多类型的恶意软件都会将自身安装为服务。

流量分析

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

恶意软件分析相关

linux静态分析(pe载荷)

类型相关

识别文件类型

file $file

基础hash相关

转md5指纹识别

md5sum $file
#之后去沙箱查找https://www.virustotal.com/gui/home/search

导入hash生成脚本

import sys
import pefile
import peutils

pe_file = sys.argv[1]
pe = pefile.PE(pe_file)
imphash = pe.get_imphash()

print(imphash)

模糊散列碰撞(SSDEEP)

# 也称为上下文触发分段哈希 (CTPH),是一种哈希技术,旨在计算指示两个文件之间内容相似度的哈希值。该技术将文件分解成较小的固定大小的块,并计算每个块的哈希值。然后将生成的哈希值合并,生成最终的模糊哈希值。

输出模糊散列

ssdeep $file

匹配同目录下是否有相似程序

ssdeep -pb *

pe部分hash

# (对 PE 段进行哈希处理)是一种强大的技术,它允许分析人员识别可移植可执行 (PE) 文件中已被修改的段

脚本

import sys
import pefile
pe_file = sys.argv[1]
pe = pefile.PE(pe_file)
for section in pe.sections:
    print (section.Name, "MD5 hash:", section.get_hash_md5())
    print (section.Name, "SHA256 hash:", section.get_hash_sha256())

字符串分析

strings

strings -n 15 $file
# -n 指定打印至少指定数字的序列 - 在我们的例子中为 15 。

floss

# FLOSS 是“FireEye Labs 混淆字符串解析器”的缩写,是由 FireEye 的 FLARE 团队开发的一款工具,用于自动对恶意软件中 FLOSS 字符串进行反混淆处理
floss $file

脱壳

upx壳

upx -d -o $file $out_file

windows静态分析(pe载荷)

文件类型

这个可以使用die或者cff等pe查看器,不想贴图暂时不记录

基础hash相关

利用powershell生成载荷md5或者sha256hash

Get-FileHash -Algorithm MD5 $file
Get-FileHash -Algorithm SHA256 $file
#之后去沙箱查找https://www.virustotal.com/gui/home/search

导入hash脚本与linux一直,都用python

import sys
import pefile
import peutils

pe_file = sys.argv[1]
pe = pefile.PE(pe_file)
imphash = pe.get_imphash()

print(imphash)

模糊散列碰撞(SSDEEP)

windows上的操作与linux一致,不做复述

pe部分hash

脚本与linux一致

import sys
import pefile
pe_file = sys.argv[1]
pe = pefile.PE(pe_file)
for section in pe.sections:
    print (section.Name, "MD5 hash:", section.get_hash_md5())
    print (section.Name, "SHA256 hash:", section.get_hash_sha256())

也可以使用pe工具(pestudio)

拖入载荷,在footprints中找到section>.text>md5

字符串分析

strings和floss一样能用,不复述,在linux静态分析中

脱壳

upx操作与linux一致,不复述

动态分析

Noriben配合Process Monitor

准备虚拟环境,同时部署Process Monitor以及Noriben脚本

Noriben会在启用后调用Process Monitor过滤无用信息,记录当前的异常访问或系统事件

分析流程

首先启动Noriben

PS C:\Tools\Noriben-master> python .\Noriben.py

--===[ Noriben v1.8.8
[*] Using filter file: ProcmonConfiguration.PMC
[*] Using procmon EXE: C:\ProgramData\chocolatey\bin\procmon.exe
[*] Procmon session saved to: Noriben_27_Oct_25__03_28_473199.pml
[*] Launching Procmon ...
[*] Procmon is running. Run your executable now.
[*] When runtime is complete, press CTRL+C to stop logging.

之后启动恶意载荷,运行一段时间,觉得差不多的时候终止Noriben分析

终止时首先需要使用任务管理器关闭 Procmon,再关闭 Noriben(Ctrl+C),要不然有几率报错

之后会看到生成的txt报告,Noriben会输出载荷运行过程中的典型恶意行为

[*] Procmon is running. Run your executable now.
[*] When runtime is complete, press CTRL+C to stop logging.

[*] Termination of Procmon commencing... please wait
[*] Procmon terminated
[*] Saving report to: Noriben_27_Oct_25__03_28_473199.txt
[*] Saving timeline to: Noriben_27_Oct_25__03_28_473199_timeline.csv
[*] Exiting with error code: 0: Normal exit

逆向工程及调试

二进制内容已经转移,请移步至深渊之书