mcpField
I
investigating-windows-endpoints

investigating-windows-endpoints

github.com/trilwu安全17749 次安装12 周前更新
代码仓库

关于 investigating-windows-endpoints

面向事件响应人员的取证技能,用于调查单台 Windows 终端,可分析在线主机或采集的镜像。它通过关联事件日志、注册表、执行记录和文件系统痕迹,还原活动并查找持久化与反取证行为。

主要功能

  1. 01规划分诊采集并保全证据
  2. 02交叉核对程序执行痕迹
  3. 03分析 Windows 事件日志
  4. 04搜寻持久化与横向移动
  5. 05检查 NTFS 和用户痕迹

适用场景

  1. 01分诊可疑的 Windows 主机
  2. 02还原程序执行和攻击者活动
  3. 03查找持久化与横向移动痕迹
  4. 04检查日志清除和时间戳篡改

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/trilwu/secskills --skill investigating-windows-endpoints

安装后在 Claude Code 中输入/investigating-windows-endpoints确认已加载。

详细介绍

调查 Windows 终端

Windows 会在数十种痕迹中记录执行、持久化和访问行为,攻击者很少能将这些痕迹彻底清除。事件日志只是表面——注册表、预取文件、amcache 和文件系统日志都可以佐证或反驳这些记录。调查的关键是交叉比对彼此独立的痕迹,构建一条无法被单个已清除日志抹去的时间线。

适用场景

  • 对已遭入侵或有可疑情况的 Windows 主机进行分诊,可分析实时主机或磁盘映像
  • 分析 KAPE、Velociraptor 或 EDR 分诊采集结果
  • 还原 Windows 机器上执行过哪些内容及其顺序
  • 解析 EVTX / Sysmon / PowerShell 日志,还原攻击者活动
  • 搜寻终端上的持久化和横向移动痕迹
  • 检测时间戳篡改、日志清除及其他主机内反取证行为

不适用场景

  • 主机运行的是 Linux——使用 analyzing-linux-persistence
  • 需要整体事件响应流程和多主机协调——使用 responding-to-incidents;聚焦于单台 Windows 主机时再使用本指南
  • 需要分析 RAM 捕获文件——使用 analyzing-memory-images;本指南 适用于磁盘上的痕迹
  • 入侵发生在云身份中,而非终端上——使用 investigating-m365-entra
  • 没有特定主机,需要主动开展全机群范围的威胁搜寻——使用 hunting-threats
  • 你是主机上的攻击者,而非响应人员——使用 escalating-windows-privileges

优先采集分诊数据

不要直接在原位置分析实时磁盘。先采集一组分诊数据,计算哈希,然后分析副本。对于大多数事件,定向分诊采集比完整磁盘映像更快地解答问题;只对关键主机制作映像。

关机与实时采集。 对已关机的主机或已挂载的磁盘映像进行采集,属于关机采集——数据一致,但会丢失正在运行的进程、网络状态和未刷新的日志。实时主机允许你捕获易失状态(内存、 netstat -anob、Get-NetTCPConnection、tasklist /svc),但每项操作都会修改磁盘;请记录所有操作。如果主机仍在运行,且尚不确定“攻击者是否仍在现场”,应先捕获内存,再交由 analyzing-memory-images 处理。

:: KAPE targeted triage -- the fastest way to a defensible artifact set
kape.exe --tsource C: --target !SANS_Triage --tdest E:\out\host01 --vhdx host01
:: Broader coverage: registry hives, event logs, $MFT/$J, browser, prefetch
kape.exe --tsource C: --target KapeTriage,RegistryHives,EventLogs,FileSystem ^
  --tdest E:\out\host01

:: Then run the parsers (Modules) over what you collected
kape.exe --msource E:\out\host01 --mdest E:\out\host01\parsed ^
  --module !EZParser

Velociraptor(Windows.KapeFiles.Targets)可通过 Agent 大规模采集同一组数据。无论使用哪种工具,都要在每次复制前后验证哈希。

关键痕迹目录,请确保采集内容包含:

C:\Windows\System32\winevt\Logs\          Event logs (.evtx)
C:\Windows\System32\config\               Registry hives: SYSTEM, SOFTWARE, SAM, SECURITY
C:\Users\<u>\NTUSER.DAT                    Per-user registry hive
C:\Users\<u>\AppData\Local\Microsoft\Windows\UsrClass.dat   Shellbags, COM
C:\Windows\Prefetch\                       *.pf execution evidence
C:\Windows\appcompat\Programs\Amcache.hve  Amcache
C:\Windows\System32\sru\SRUDB.dat          SRUM
C:\Windows\System32\Tasks\                 Scheduled task XML
C:\$MFT  C:\$Extend\$UsnJrnl  C:\$LogFile  Filesystem journals
C:\$Recycle.Bin\                           Deleted-file $I records

执行证据

多种彼此独立的痕迹都会记录某个二进制文件曾运行。交叉比对这些痕迹——相互吻合会提高可信度,不一致本身也是一项发现。

:: Prefetch -- run count, first/last run, files/dirs the binary touched.
:: Absent on most Servers; disabled on SSD-only systems -- note that, don't assume.
PECmd.exe -d C:\Windows\Prefetch --csv E:\out\parsed -q

:: Amcache -- SHA-1 of executed/present binaries, compile times, driver load
AmcacheParser.exe -f C:\Windows\appcompat\Programs\Amcache.hve ^
  --csv E:\out\parsed -i

:: Shimcache / AppCompatCache (SYSTEM hive) -- path + last-modified; presence
:: means the file was seen, NOT necessarily executed. Order is roughly LRU.
AppCompatCacheParser.exe -f C:\Windows\System32\config\SYSTEM --csv E:\out\parsed

:: SRUM -- per-process bytes sent/received and CPU over 30-60 days.
:: Ties an executable to network volume even when netflow is gone.
SrumECmd.exe -f C:\Windows\System32\sru\SRUDB.dat ^
  -r C:\Windows\System32\config\SOFTWARE --csv E:\out\parsed

从用户的(NTUSER.DAT / UsrClass.dat)配置单元中,使用 RECmd 解析 GUI 执行和文件访问证据:

:: UserAssist (GUI program launches, run count, focus time),
:: BAM/DAM (background/desktop activity moderator: last-run per exe per SID),
:: RecentDocs, and RunMRU in one pass with the bundled batch file
RECmd.exe -d C:\Users --bn BatchExamples\UserActivity.reb --csv E:\out\parsed
  • 跳转列表(...\Recent\AutomaticDestinations\*.automaticDestinations-ms) 和 LNK 文件(...\Recent\*.lnk)会记录打开过的文件或应用,包括目标 路径、卷序列号和 MAC 时间戳——使用 JLECmd 和 LECmd 解析。
  • RecentDocs 和 Shellbags(见下文)可显示曾打开的文件夹和文件。

事件日志主力

先用分诊引擎(下文的 Chainsaw / Hayabusa)解析 EVTX,再深入查看特定通道。最重要的事件 ID:

Security(Security.evtx):

  • 4624 登录成功——解码 Logon Type:2 交互式、3 网络(SMB、共享、PtH)、10 RemoteInteractive(RDP)、9 NewCredentials(runas /netonly,通常用于 Overpass-the-Hash)。通过 LogonId 关联会话活动。
  • 4625 登录失败——根据源 IP 检测密码喷洒和暴力破解。
  • 4672 分配特殊权限——相当于管理员的登录;与 4624 配对以标记特权会话。
  • 4648 使用显式凭据登录——runas 和横向移动。
  • 4688 进程创建——启用命令行审核后,可记录完整命令行和父进程。最有价值的单个 Security 事件。
  • 4720/4722/4738 创建/启用/更改帐户;4728/4732/4756 将成员添加到全局/本地/通用特权组(Domain Admins、 本地 Administrators)——攻击者帐户和组操纵。
  • 4698/4699/4702 创建/删除/更新计划任务。
  • 7045(System 日志)安装新服务;7036 服务状态更改—— PsExec 和横向工具的特征。
  • 1102 清除审核日志——属于反取证行为,本身也是一个 指标;关联它留下的日志空缺。

Sysmon(Microsoft-Windows-Sysmon/Operational),如果已部署,是 信息最丰富的来源:

  • 1 进程创建(含哈希、命令行、父进程)——3 网络 连接——7 映像/DLL 加载(未签名 DLL、侧载)——8 CreateRemoteThread(注入)——10 进程访问(LSASS 句柄 = 凭据转储)——11 文件创建——12/13/14 注册表 创建/设置/重命名(自动运行)——15 文件流创建(Zone.Identifier、 ADS)——22 DNS 查询——23/26 文件删除。

PowerShell:

  • 4104 脚本块日志记录(Microsoft-Windows-PowerShell/Operational)—— 反混淆后的脚本内容;搜索 -enc、FromBase64String、 DownloadString、IEX、AMSI 绕过字符串。4103 模块/管道 日志记录。Windows PowerShell.evtx 中的 400/800(引擎启动、版本—— 降级到 v2 属于规避行为)。

RDP / TerminalServices:

  • Security 4778/4779 会话重新连接/断开(RDP 或快速用户 切换,不是新的登录——新的登录对应 4624)。TerminalServices-RemoteConnectionManager 中的 1149(身份验证成功——用户 + 源 IP)。TerminalServices-LocalSessionManager 中的 21/22/25(登录、 Shell 启动、重新连接)。

WMI(Microsoft-Windows-WMI-Activity/Operational):5857 提供程序 已加载,5858 操作错误,5859-5861 永久事件订阅 注册——WMI 持久化。

Task Scheduler(Microsoft-Windows-TaskScheduler/Operational):106 任务已注册,140 已更新,141 已删除,200/201 操作 已执行/已完成——可佐证 Security 4698。

持久化排查

扫描所有自动启动项,而不只是工具默认检查的少数几项。这是 establishing-persistence 的防御性对应内容——请阅读该技能,了解每种机制的植入方式,然后在此处搜寻相关痕迹。

  • Run 键——...\Software\Microsoft\Windows\CurrentVersion\Run 和 RunOnce,检查 SOFTWARE 和每个 NTUSER.DAT;还要检查 ...\Policies\Explorer\Run。
  • 服务——SYSTEM hive 中的 ...\Services;将安装记录与 7045 关联。
  • 计划任务——C:\Windows\System32\Tasks\ 中的 XML(解析 Actions 和 Triggers);将其与 4698 / TaskScheduler 106 关联。
  • WMI 事件订阅——OBJECTS.DATA 存储库中的 __EventFilter、__EventConsumer、 __FilterToConsumerBinding; Get-WMIObject -Namespace root\subscription -Class __EventConsumer。
  • 启动文件夹——...\Start Menu\Programs\Startup\(逐用户和 All Users)。
  • Winlogon——...\Winlogon 下的 Shell、Userinit、Notify; 检查 explorer.exe / userinit.exe 后追加的任何内容。
  • IFEO——Image File Execution Options\<exe>\Debugger(以及 GlobalFlag + Silent Process Exit)劫持合法二进制文件。
  • COM 劫持——用户 hive 中的 Software\Classes\CLSID\...\InprocServer32 覆盖 HKLM CLSID。
  • LSA / SSP——...\Lsa\Security Packages 和 Notification Packages; ...\Lsa\OSConfig。
  • BITS 作业——使用 bitsadmin /list /allusers /verbose,或解析 ...\Microsoft\Network\Downloader\qmgr*.dat,查找下载并执行类作业。
:: Autoruns from Sysinternals, offline against a mounted image, VirusTotal + verify
autorunsc.exe -accepteula -a * -h -s -c -o autoruns.csv "\\?\E:\mount"
:: RECmd has batch files that dump every autostart location from the hives
RECmd.exe -d E:\out\host01 --bn BatchExamples\RegistryASEPs.reb --csv E:\out\parsed

横向移动痕迹

横向移动会在源端和目标端留下成对的痕迹。按时间、账户和源 IP 进行关联。

  • 网络登录——目标端 Security 4624 Type 3(SMB/管理共享、PtH)和 Type 10(RDP);源端的 4648。预期使用 Kerberos 时,向已加入域的主机进行的 Type 3 NTLM 登录是传递哈希攻击的特征。Type 9(NewCredentials)则指向 Overpass-the-Hash / runas /netonly。
  • PsExec / 基于服务的执行——目标端安装服务的 7045(名称随机或类似 PSEXESVC)以及启动服务的 7036;如果详细文件共享审核记录了对 \ADMIN$\<svc>.exe 的写入,则还会有 5145。RemCom 及类似克隆工具也会遵循相同的 7045+7036 模式。
  • WMI / WinRM 执行——WMI-Activity 5857-5861、Sysmon 1 中 wmiprvse.exe 创建子进程;通过 5985/5986(HTTP/HTTPS)使用 WinRM,并产生 Microsoft-Windows-WinRM/Operational 和 4624 Type 3 记录。
  • 管理共享访问——在 5140/5145 中查找 C$、ADMIN$、IPC$;与写入 ADMIN$ 的工具关联。
  • SMB / 文件暂存——5140/5145 和 $MFT 中记录的投放到目标端的工具条目。

文件系统取证

NTFS 元数据文件是攻击者最不可能清除的可靠依据,也是即使日志被清除,时间戳篡改检查仍能奏效的原因。

:: $MFT -- every file's four SI + four FN timestamps, parent, size, resident data
MFTECmd.exe -f "E:\out\host01\$MFT" --csv E:\out\parsed
:: USN change journal -- creates/deletes/renames even after the file is gone
MFTECmd.exe -f "E:\out\host01\$Extend\$J" --csv E:\out\parsed
:: $LogFile -- transactional, can recover changes the USN rolled past
  • 时间戳篡改检测。 $STANDARD_INFORMATION 时间可由用户态设置(SetFileTime、timestomp);$FILE_NAME 时间仅由内核在重命名/移动时设置。SI 早于 FN、SI 的亚秒部分为零,或 SI 与 USN 条目不一致,都可标记伪造。使用 MFTECmd 解析二者并进行比较。
  • USN 日志($Extend\$UsnJrnl:$J)记录更改的文件名、原因(FileCreate、RenameNew、FileDelete)和 USN——即使工具已删除,也能重建其投放、重命名和清理过程。
  • 回收站——C:\$Recycle.Bin\<SID>\ 中的 $I 文件保存每个 $R 文件的原始路径、大小和删除时间(RBCmd.exe)。
  • Shellbags(UsrClass.dat / NTUSER.DAT)可证明用户曾浏览特定文件夹,包括已删除、外部和网络路径——SBECmd.exe -d E:\out\host01 --csv E:\out\parsed。
  • 备用数据流——dir /r、Get-Item -Stream *; Zone.Identifier 标记已下载的文件(Web 来源标记),而命名数据流可用于隐藏载荷。

浏览器和账户痕迹

  • 浏览器历史记录 / 下载记录——Chrome/Edge History(SQLite, ...\User Data\Default\History),Firefox places.sqlite;downloads 表加上 Zone.Identifier ADS 可证明哪些内容被下载到了主机。
  • 本地账户——SAM hive 可记录创建 / 启用的账户、RID、上次 登录时间;与 Security 4720/4722/4732 相关联。
  • RDP 缓存 / 位图(...\Terminal Server Client\Cache\*.bmc)可 还原交互式入侵者看到的内容。

反取证检测

清理本身就是信号,并非毫无痕迹。要查找其留下的痕迹:

  • 清除日志——Security 1102(Security 日志已清除)和 System 104 (任意日志已清除)会记录账户和时间。事件日志出现缺口且没有 对应的关机记录,本身就是一项发现。
  • 篡改时间戳——SI 与 FN 不一致(见上文)。
  • 禁用 Prefetch——...\Memory Management\PrefetchParameters\EnablePrefetcher = 0。
  • 删除 USN 日志——fsutil usn deletejournal 会导致日志被截断;将缺失的历史记录 作为缺口注明。
  • 篡改 Sysmon / EDR——服务停止(驱动程序对应的 7036/7045)、 配置更改,或将 PowerShell 降级到 v2 以规避脚本块日志记录。

在时间线中明确注明每一处此类缺口是调查限制——绝不能让日志被清除 变成隐含的“什么都没发生”。

构建超级时间线

先快速分诊,再构建完整时间线。将所有时间统一为 UTC, 每一行都注明来源痕迹,并区分观察结果与推断结果。

:: Chainsaw -- fast EVTX triage with built-in + Sigma rules, minutes not hours
chainsaw hunt E:\out\host01\...\winevt\Logs -s sigma\ ^
  --mapping mappings\sigma-event-logs-all.yml -r rules\ --csv -o chainsaw_out

:: Hayabusa -- EVTX -> single timeline scored by severity, Sigma-backed
hayabusa.exe csv-timeline -d E:\out\host01\...\winevt\Logs -o hayabusa.csv -p verbose
# Plaso -- ingest the whole triage set (or image) into one storage file...
log2timeline.py --storage-file plaso.db E:\out\host01
# ...then filter and export the super-timeline
psort.py -o l2tcsv -w super.csv plaso.db "date > '2026-07-01 00:00:00'"

将解析后的 CSV(EZ Tools 输出、Chainsaw、psort)加载到 Timeline Explorer,在一个网格中对不同痕迹进行透视、标记和着色。Eric Zimmerman 工具套件——PECmd、AmcacheParser、AppCompatCacheParser、SrumECmd、 MFTECmd、RECmd、SBECmd、JLECmd、LECmd、RBCmd——加上用于 EVTX 的 Chainsaw / Hayabusa 和用于整合时间线的 Plaso,构成核心工具链。针对 发现编写检测规则,使用 writing-sigma-rules;将叙述交给 reporting-security-findings。

应当驳斥的自我安慰

  • “Security 日志被清除了,所以我们无从调查。” Sysmon、Prefetch、Amcache、 SRUM 和 USN 日志都会独立记录执行情况。1102 本身就是一个指标,并且会记录 清除日志的账户。
  • “没有 Prefetch 记录,所以它从未运行。” 大多数 Server 上都关闭了 Prefetch,某些 SSD 系统上也会将其禁用。Amcache、Shimcache、SRUM、4688 和 Sysmon 1 都能独立佐证执行情况。
  • “Shimcache 显示了它,所以它执行过。” Shimcache/AppCompatCache 记录的是 文件被 shim 引擎看到,并非文件运行过。请通过 Prefetch、Amcache 或进程创建事件确认。
  • “文件时间戳看起来很早,所以它是原始文件。” $STANDARD_INFORMATION 很容易伪造。检查 $FILE_NAME 和 USN 日志;两者不一致就是发现。
  • “没有 EDR,所以没有东西可分析。” 无论是否部署 EDR,每台 Windows 主机上都有注册表、事件日志、 prefetch、amcache、SRUM 和 $MFT。这类调查大多早于 EDR 出现。
  • “一台主机触发了警报,所以入侵只涉及一台主机。” 向外关联 4624 Type 3/10、4648 和 7045——在身份验证日志排除横向移动之前,默认应假设存在横向移动。
  • “PowerShell 被混淆了,所以我们无法读取。” 脚本块日志记录(4104)会记录 Windows 实际执行的 反混淆后内容。如果缺少 4104,这一缺口表明可能降级到了 v2——这本身就是一项发现。

参考资料

  • analyzing-linux-persistence —— Linux 上相同的主机取证扫描
  • responding-to-incidents —— 此流程所依托的事件响应(IR)流程与多主机协调
  • analyzing-memory-images —— 对主机易失性部分进行 RAM 分析
  • investigating-m365-entra —— 入侵发生在云身份系统时
  • hunting-threats —— 不针对特定主机的主动全机群威胁狩猎
  • establishing-persistence —— 对此处狩猎的自动启动项进行攻击方视角分析
  • writing-sigma-rules —— 针对发现的事件日志模式编写检测规则
  • reporting-security-findings —— 将时间线整理成最终交付物
  • Eric Zimmerman 工具(https://ericzimmerman.github.io)—— PECmd、AmcacheParser、MFTECmd、RECmd、SBECmd、Timeline Explorer
  • KAPE(Kroll Artifact Parser and Extractor)—— 分类收集与解析
  • Chainsaw 和 Hayabusa —— 快速进行由 Sigma 支持的 EVTX 分类分析
  • Plaso / log2timeline —— 生成超级时间线
  • Autoruns(Sysinternals)—— 枚举自动启动项
  • Velociraptor —— 大规模收集端点分类分析数据

评论

支持 Markdown