一、概述
拿到 Windows Server 镜像,最容易犯的错误是套用桌面 Windows 的思路。
去 Users\<用户名>\AppData 里翻浏览器记录、跳转列表、剪贴板——这些在服务器上大量不存在。跑的是 IIS、SQL Server、Exchange,AppData 里可能只有几个自动化服务的目录。
把它们查不到写成"未发现用户活动痕迹",等于用错误的工具得出错误的结论。
真正决定事实的工件在服务器上恰恰是另一批:站点配置、站点级访问日志、认证与系统日志、计划任务与注册表。本篇给出这张全景图,以及"百 GB 镜像先提哪一类"的优先级排序。
六条结构性差异(理解差异比记路径重要):
| 维度 |
桌面 PC |
Windows Server |
对取证的影响 |
| 运行状态 |
现场常在运行 |
7×24 常驻 |
采集难;采集瞬间日志仍在写 |
| 用户活动 |
有交互痕迹 |
无人值守,AppData 基本为空 |
桌面行为工件基本失效 |
| 日志量级 |
Security 够用 |
服务/驱动/任务全天刷屏 |
几天即可覆盖 |
| 登录类型 |
交互式(Type 2) |
网络(3)、服务(5)、批处理(4)、RDP(10) |
LogonType=3 不等于"有人上班" |
| 凭据强度 |
域账号 + 本地账号 |
大量服务账号、IIS AppPool 身份 |
横向移动优先找这些 |
| 加密 |
BitLocker 常开 |
BitLocker 覆盖很低 |
拿到镜像往往能直接读 |
在取证流程中的位置:本篇属于采集环节的前置规划层。它不产出结论,而是决定"能得出什么结论"与"先取什么"。
Security.evtx 一旦写满就循环覆盖——先做元问题检查,再谈入侵(见 3.1 第 1 步)。
上游依赖 Windows 取证工件地图 的通用体系与 NTFS 结构与 MFT 解析 的定位能力;下游是本板块其余四篇的具体分析。
涉及的证据形态(按优先级,具体到路径):
| 优先级 |
工件 |
路径 / 形态 |
典型大小 |
| P0 |
IIS 访问日志 |
C:\inetpub\logs\LogFiles\W3SVC<n>\u_ex*.log |
日增几十 MB |
| P0 |
IIS 全局配置 |
%windir%\system32\inetsrv\config\applicationHost.config + .bak |
KB 级 |
| P0 |
站点配置 |
C:\inetpub\wwwroot\<site>\Web.config、App_Offline.htm |
KB 级 |
| P0 |
事件日志 |
%windir%\system32\winevt\Logs\*.evtx |
几十 MB |
| P1 |
站点目录 |
C:\inetpub\wwwroot\<site>\(含 bin\) |
站点大小 |
| P1 |
注册表 hive |
SYSTEM、SOFTWARE |
数十 MB |
| P1 |
计划任务 |
C:\Windows\System32\Tasks\* + SYSTEM 下的 TaskCache\Tree |
几十 MB |
| P2 |
Prefetch、SRUDB |
Prefetch\*.pf、SRUDB.dat |
数十 MB |
| P3 |
Exchange .edb |
体积巨大,单独规划 |
数十至数百 GB |
★ 最易被忽略的高价值工件是 applicationHost.config.bak。 IIS 改配置时先备份原文件,若主配置被改过(关闭脚本执行、改应用池身份),.bak 保留改之前的版本——两者 diff 直接给出配置级篡改证据,比任何时间戳推理都可靠。前提是你记得去拿这个文件。
哪些高价值通道真的存在(NOT PRESENT 是结论而非失败);每条日志的覆盖时间窗与循环覆盖风险;哪个 W3SVC<n> 对应哪个域名与物理路径;站点目录里哪些文件是部署后新增的;PowerShell 4104 里有哪些脚本块内容;新增服务与计划任务落在哪。
还有一条经常被漏问的:这份检材能支撑的时间范围有多长。
没部署的组件给不了数据。Sysmon 通道不存在时,"无异常进程创建"这个结论根本不成立(见 4.1 工件选择)。
超出覆盖期的历史同样无解。FileSize ≈ MaximumSizeInBytes 意味着更早记录已被冲掉,这必须写进报告局限。
异常关机前的内存态工件也不能用(Prefetch 依赖正常关机落盘,见 4.4 在线操作)。至于 cs-username 之外的请求体内容,W3C 日志根本不记。
读者前提:需要 Windows 目录结构与 NTFS 基础(见 NTFS 结构与 MFT 解析)、HTTP 与 W3C 日志格式概念、PowerShell 基础命令。事件 ID 的基础含义见事件日志深度分析,本篇只讲服务器侧的增量。
Linux 上定位与提取的命令见 07 命令速查 的 fls / icat 部分。
二、核心原理
2.1 ★ 服务器 vs 桌面 PC:六条结构性差异
理解差异比记住路径重要。这六条决定取证策略要整体调整。
六条里最贵的两条是「日志量级」和「加密」——一条决定你能回溯多久,一条决定你能不能读。
| 维度 |
桌面 PC |
Windows Server |
对取证的影响 |
| 运行状态 |
现场常在运行 |
7×24 常驻,多在机房/云上 |
采集难;日志持续产生,采集瞬间仍在写 |
| 用户活动 |
有交互痕迹(LNK、Recent、剪贴板) |
无人值守,AppData 基本为空 |
桌面那套行为工件基本失效 |
| 日志量级 |
Security 够用 |
服务/驱动/任务全天刷屏,几天即可覆盖 |
必须先查 MaximumSizeInBytes |
| 登录类型 |
交互式(Type 2)为主 |
网络(3)、服务(5)、批处理(4)、RDP(10)为主 |
LogonType=3 不等于"有人上班了" |
| 凭据强度 |
域账号 + 本地账号 |
大量服务账号、IIS AppPool 身份、NETWORK SERVICE |
横向移动优先找这些 |
| 加密 |
BitLocker 常开 |
BitLocker 覆盖很低 |
拿到镜像往往能直接读 |
推论 1:「事件日志没有记录」的第一解释是被循环覆盖,不是"没发生"。Security.evtx 默认 20 MB 上限,有 IIS 的服务器配合应用池回收,几天就能冲掉几周前的内容。
推论 2:「无人登录」的结论要小心。按 (用户, IP, LogonType) 聚合看,而不是按总量看。
2.2 IIS 工件地图:三个层次
| 层次 |
文件 |
核查内容 |
| 站点/应用绑定 |
applicationHost.config |
哪个域名 → 哪个物理路径 |
| 应用配置 |
各站点 Web.config |
这个应用能执行什么、连哪个库 |
| 请求记录 |
W3SVC<n>\u_ex*.log |
谁在什么时候访问了什么、结果如何 |
| 文件 |
路径 |
价值 |
| 全局配置 |
%windir%\system32\inetsrv\config\applicationHost.config |
★★★★★ XML 明文,IIS 7+ 全部站点/应用池/绑定 |
| 配置备份 |
%windir%\system32\inetsrv\config\applicationHost.config.bak |
★★★★ 改配置前的版本 |
| 站点配置 |
C:\inetpub\wwwroot\digiforensics-site\Web.config |
★★★★★ 含 machineKey |
| 访问日志 |
C:\inetpub\logs\LogFiles\W3SVC<n>\u_ex*.log |
★★★★★ 见 02 |
| 元数据库 |
%windir%\system32\inetsrv\MetaBase.xml |
★★★★★ 仅 IIS 6 |
★ .bak 是最易被忽略的高价值工件:IIS 改配置时先备份原文件。若 applicationHost.config 被改过(关闭脚本执行、改应用池身份),.bak 保留着改之前的版本,两者 diff 直接给出配置级篡改证据。前提是你记得去拿这个文件。
2.3 事件日志:服务器场景的增量
事件 ID 基础表见事件日志深度分析。服务器上必须额外关注:
| 工件 |
通道 |
服务器场景意义 |
System.evtx |
Security/System/Application 同目录 |
驱动加载、7045 新服务(持久化首选) |
Security.evtx |
同上 |
4624/4625、4648 显式凭据登录、4728/4732 加组 |
Application.evtx |
同上 |
IIS / ASP.NET / SQL 的错误,应用崩溃留痕 |
| PowerShell |
Microsoft-Windows-PowerShell/Operational |
4104 记录脚本内容 |
| Sysmon |
Microsoft-Windows-Sysmon/Operational |
需事先安装启用,默认不存在 |
# 先确认哪些高价值通道真的存在
foreach ($ch in 'Security','System','Application','Microsoft-Windows-PowerShell/Operational',
'Microsoft-Windows-Sysmon/Operational','Microsoft-Windows-TaskScheduler/Operational') {
$l = Get-WinEvent -ListLog $ch -ErrorAction SilentlyContinue
if ($l) { "{0,-52} Rec={1,-8} {2,-10} Max={3}KB" -f $ch,$l.RecordCount,$l.LogMode,($l.MaximumSizeInBytes/1KB) }
else { "$ch ==> NOT PRESENT" }
}
NOT PRESENT 是结论而非失败:说明从未部署 Sysmon。报告应写"该主机无 Sysmon 部署",而非"未发现异常进程创建"。
2.4 PowerShell 4104:把"可疑请求"推进到"具体行为"
W3C 日志能告诉你"有人在 03:12:07 请求了 /upload/x.aspx 且返回 200"。
但它说不出他上传了什么、之后干了什么。4104 记录脚本块完整文本,补上这一跳。
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-PowerShell/Operational'; Id=4104} -MaxEvents 2000 |
ForEach-Object { [xml]$x = $_.ToXml()
[pscustomobject]@{
Time = $_.TimeCreated
User = ($x.Event.UserData.Data | Where-Object Name -eq 'UserId').'#text'
Text = ($x.Event.UserData.Data | Where-Object Name -eq 'ScriptBlockText').'#text' } } |
Export-Csv C:\evidence\ps4104.csv -NoTypeInformation -Encoding UTF8
| 检查点 |
说明 |
| 是否启用 |
需组策略开启"脚本块日志记录",默认关闭——没开就是没有 |
| 有 4103 没 4104 |
只开了模块日志,脚本内容未记录 |
| 内容被截断 |
长脚本分段记录,序号在 MessageNumber |
-EncodedCommand |
4104 里仍是解码后的脚本文本,可读 |
★ 关联技巧:在 4104 文本里搜 W3C 中出现的可疑路径。同一路径同时出现在 4104 脚本和 W3C 日志中,是把"网络行为"与"主机行为"钉死在同一行为体上的强证据。
2.5 计划任务与注册表:服务器侧的两个增量
服务器上没有"桌面",攻击者做持久化更倾向计划任务而非 Run 键。
| 工件 |
路径 |
说明 |
| 任务定义 |
C:\Windows\System32\Tasks\* |
XML,含触发器与操作 |
| 任务缓存 |
SYSTEM → Services\Schedule\TaskCache\Tree |
元数据、注册时间、执行次数 |
| 任务事件 |
Microsoft-Windows-TaskScheduler/Operational |
默认需启用 |
| 注册表:RDP |
HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp |
RDP 端口(非 3386 本身是线索) |
| 注册表:IIS |
HKLM\SOFTWARE\Microsoft\InetStp\Components |
IIS 版本与安装选项 |
# 列出动作指向非微软/非 Windows 目录的任务(可疑持久化)
Get-ScheduledTask | ForEach-Object { $t = $_
$t.Actions | Where-Object { $_.Execute -and $_.Execute -notmatch '\\Microsoft\\|^[Cc]:\\Windows\\' } |
ForEach-Object { [pscustomobject]@{ TaskPath=$t.TaskPath; TaskName=$t.TaskName
Execute=$_.Execute; Arguments=$_.Arguments; Author=$t.Author } } } | Format-List
2.6 C:\inetpub 与远程桌面痕迹
| 工件 |
路径 |
价值 |
| 站点根目录 |
C:\inetpub\wwwroot\digiforensics-site\ |
落地文件、webshell |
bin\ 目录 |
...\digiforensics-site\bin\ |
新增 DLL 是高危信号(无源码的托管代码) |
App_Offline.htm |
应用根目录 |
ASP.NET 停池时显示,可能被用于短暂屏蔽站点 |
| 编译临时文件 |
%windir%\Temp\ |
ASP.NET 预编译产物 |
| RDP 目标缓存 |
HKCU\...\Terminal Server Client\Servers |
曾连接过的目标主机 |
| 端口重定向 DLL |
C:\Windows\System32\ sserver\*.dll |
RDP 会话与重定向痕迹 |
2.7 ★ 取证优先级排序
镜像上百 GB 时不能无差别提取。按证据密度排序:
| 优先级 |
工件 |
理由 |
典型大小 |
| P0 |
W3SVC*\*.log |
唯一逐请求记录,体积相对小 |
日增几十 MB |
| P0 |
applicationHost.config + .bak |
站点映射 + 配置篡改对照 |
KB 级 |
| P0 |
各站点 Web.config、App_Offline.htm |
攻防焦点 |
KB 级 |
| P0 |
winevt\Logs\*.evtx |
系统/安全/PowerShell |
几十 MB |
| P1 |
wwwroot\digiforensics-site\ 全目录 |
落地文件、webshell、DLL |
站点大小 |
| P1 |
SYSTEM / SOFTWARE hive |
服务、驱动、任务、ShimCache |
数十 MB |
| P1 |
System32\Tasks\* |
计划任务 |
几十 MB |
| P2 |
SRUDB.dat、Prefetch\*.pf |
长期资源使用、程序执行 |
数十 MB |
| P3 |
Exchange .edb |
体积巨大,单独规划(见 05) |
数十至数百 GB |
提取时必须记录 inode 与文件偏移,报告要能指回镜像中的具体位置(fls/icat 命令见第七章)。
三、操作步骤
3.1 第 1 步:先问"元问题",再谈入侵
这一步决定报告的可信度上限。 委托方问"有没有人被