搜索全站

输入至少 2 个字符,查找相关内容。

↑↓ 选择 Enter 打开Esc 关闭

远程勘验与在线取证

离线镜像是主战场,但有一类案子没有关机的那一刻:服务器还在跑、勒索还在加密、业务还在被入侵者登录。

最后更新 2026-10-09版本 v2.0维护 DigiForensics查看历史 1

一、概述

离线镜像是主战场,但有一类案子没有关机的那一刻:服务器还在跑、勒索还在加密、业务还在被入侵者登录。

此时任何关机动作都会永久销毁正在发生的犯罪现场——内存中的凭据、已解密的数据、正在运行的恶意进程。

于是产生了在线取证这个两难命题:

诉求 冲突
保住现场 需要立即采集,尤其内存
不破坏现场 登录、读文件、跑命令本身就是破坏

关键认知:在线取证不存在"零影响"操作。你每敲一条命令,目标主机就多一条日志、一次登录记录、一个被更新的 atime。本篇要处理的问题是:

如何让每一处不可避免的痕迹都可解释、可归因、可在报告中明确定位。

这决定了本篇的写作取向:它不是一份"在线取证操作手册",而是一份**"哪些痕迹是我造成的,怎么说清楚"的方法论**。技术命令在第三章,但那只是骨架;真正决定结论能不能被采信的是第四章。

本篇处理的证据形态(按易失程度排序,这个顺序就是采集顺序):

证据 位置 采集窗口 手段
物理内存 RAM 秒级(断电即失) WinPmem / LiME / AVML;或 AFU、USB/PCIe 直连采集器
页面文件 pagefile.sys / swapfile.sys 分钟级 与内存镜像同期导出
运行中进程与网络连接 进程表、连接表、监听端口 秒级 Get-CimInstance / Get-NetTCPConnection / ss
易失日志 事件日志、journalctl、Sysmon 小时级 导出 .evtx / 文本
临时目录与回收站 各类临时路径 分钟级 归档导出
远程接入通道自身的日志 RDP 客户端日志、OpenSSH/Operational、WinRM 活动 天级 既是痕迹也是证据

最后一行值得特别说明:你选择什么通道接入,就在目标机上留下了什么日志。RDP 会产生 4624 类型 10 的登录事件、SSH 相对最干净、WinRM 留痕最多,而商用远控工具留下的痕迹是黑盒——法庭上很难解释"这次连接是不是勘验行为"。通道选择不是技术偏好,是证据能力的选择。

还有一种痕迹几乎所有人都会漏:若你用共享的管理员凭据登录,会更新域控上的 lastLogonTimestamp、触发 Kerberos 票据签发,并留下"有人正在使用这台机器"这个事实——而这本身可能触发攻击者的自毁逻辑或反取证行为。

一条登录动作改变了现场的状态,而现场还在被对方控制。

本篇的操作主链是七步,顺序本身就是纪律:

步骤 动作 关键约束
1 前置准备与授权留痕 书面授权先于任何连接
2 先观察,后操作 不登录就拿不到的先想清楚;能观察就不要动手
3 优先采内存 采集窗口以秒计,这一步永远排第一
4 抽取易失日志 事件日志、journal、系统状态
5 远程录屏与命令留痕 每条命令都要有可回溯的记录
6 在线检查项清单 按"只读、低扰动、可解释"排序逐项执行
7 收工、验证与归档 校验所有导出文件、记录目标机最终状态

第 2 步"先观察、后操作"是本篇最有价值的一条经验:很多信息在你登录之前通过委托方配合就能拿到(比如让对方管理员导出日志、提供带外访问方式),而不需要你亲手在目标机上留下痕迹。能用带外方式拿到的,就不要登录进去拿。

在取证流程中的位置:本篇是采集环节的一条并行路径,与镜像制作平级。上游是授权与接入准备(远程通道怎么开、委托方配合义务、以及跨境取证的司法边界),见合规授权与法律边界与证据保管链与委托证明。下游是内存分析,本篇的操作直接产出 DigiForensics-mem.raw,分析入口见内存取证总览与内存采集方法;网络连接侧的分析见网络连接与流量痕迹。最终还要回到离线镜像做文件系统与元数据分析——在线不能替代离线,本篇的结论只能作为补充,两类证据必须分节陈述。

系统当前有哪些进程、父子关系是什么、有哪些网络连接与监听端口、有哪些计划任务与自启动项、此刻在场的登录会话是谁、内存里有什么(已解密凭据、注入代码、明文数据)、以及远程接入者在本次勘验之前做过什么。

在线证据无法证明"未发生的行为"。你只能证明"此刻是这个状态",不能证明"某件事没发生过"——系统在全程在线运行,攻击者可以随时删除证据再重建。

其次,在线采集的完整性无法验证(没有可复算的原始态哈希),可重复性也差(状态已改变,不能重来)。这两条限制必须在报告里明写,否则整个在线部分会在质证环节被整体推翻。

读者前提:你需要先掌握远程接入的操作能力(SSH / RDP / WinRM 至少一种)、命令执行的证据留痕习惯(录屏、命令日志、每条操作的时间戳),以及最关键的一条——清楚"只读"指的是"不改变被取证对象的状态语义",而不是"零副作用"。内存采集的具体工具与完整性验证见内存采集方法。如果你还没拿到书面授权,本篇第三章不应该开始执行。

二、核心原理

2.1 远程操作会改变什么

远程接入后,以下变化会在秒级内发生且多数不可撤回:

痕迹 产生方式 对取证的影响
登录事件 RDP/SSH/WinRM 会话建立 4624/4625 事件、登录类型 10
会话与授权 LogonSession、Kerberos TGT 签发 新增的域凭据使用记录
文件 atime 读取文件即更新访问时间(NTFS 默认延迟更新) 破坏"最后访问时间"证据
内存转储 写文件会分配页、污染空闲列表 内存布局变化、部分内存残留
远程工具留痕 服务、计划任务、注册表 Run 新增"非原始"痕迹
事件日志 每次查询都产生事件 4625 失败登录、Microsoft-Windows-Sysmon 若已装
网络状态 建立连接、会话保活 攻击者的现有连接可能被打断

最隐蔽的一种:若用共享的管理员凭据登录,会更新域控上的 lastLogonTimestamp、触发 Kerberos 票据签发,并留下"有人正在使用这台机器"的事实。这本身可能触发攻击者的自毁逻辑或反取证。

2.2 只读命令也未必只读

"我只用了 tasklist 和 netstat"是常见辩解,但二者都可能有害:

  • netstat/Get-NetTCPConnection 枚举连接不打断连接,但向对方暴露了枚举行为,某些攻击者会据此判断"有人在查"。
  • 进程枚举 会为每个进程创建句柄,某些自保护驱动会响应。
  • 读取 MFT/目录 更新 atime(NTFS 延迟写入,但无法撤销已发生的更新)。

因此"只读"应理解为不改变被取证对象的状态语义,而不是"零副作用"。

2.3 内存是最易失的证据

介质 内容 采集窗口
物理内存 运行进程、解密后的密钥、注入代码、网络连接 秒级(断电即失)
页面文件 已被换出的部分内容 分钟级
休眠文件 hiberfil.sys 休眠前内存快照 持久

采集内存的代价:写大文件会污染空闲内存池、可能覆盖尚未换出的页。缓解手段是先固定证据再采——用 AFU 或 USB 直连采集器先拷走关键区域,采完立刻做物理内存镜像而非仅转储。

2.4 远程接入通道本身也是证据

选择什么通道,决定了你留下什么痕迹:

通道 客户端留痕 服务端留痕 适用性
RDP TerminalServices 客户端日志、ClientCore 日志 4624 类型 10、TSRemote* 日志 需图形界面与录屏
SSH(OpenSSH) OpenSSH/Operational 事件 4624 类型 5、.bash_history 最干净,Linux 首选
WinRM/PSRemoting Microsoft-Windows-WinRM/Operational 大量 WMI/WSMan 活动 留痕最多,不建议
商用远控(向日葵/TeamViewer 等) 工具自身日志 服务项、驱动、日志 举证时难解释,慎用

原则:优先使用操作系统自带、有文档、可逐条对应的通道。商用远控工具的痕迹往往是黑盒,法庭上难以说明"这次连接是不是勘验行为"。

2.5 证据效力:在线 vs 离线

维度 在线采集 离线镜像
完整性可验证 弱(无法与原始态比对) 强(哈希可复算)
采集时点可证明 依赖操作日志与录屏 弱(无法知道取证前发生过什么)
内存与易失数据 ✅ 唯一来源 ❌ 完全丧失
可重复性 差(状态已改变) 强(可反复分析)
抗辩能力 中(取决于留痕质量) 高

结论:在线采集不能替代离线镜像,只是补充。两者必须分节陈述,并明确"系统全程在线运行,不存在对'未发生行为'的证明力"。


三、操作步骤

3.1 第 1 步:前置准备与授权留痕

远程勘验的前提是书面的、范围明确的授权。开始前必须固定:目标主机、时间窗、允许与禁止的操作、授权人。

每条远程操作都要记录,且与会话录屏时间戳对齐。远程环境的记录要求比本地更严,因为操作人和设备往往不在同一现场,格式见 证据保管链与委托证明。

cat > /lab/remote-session-log.md <<'EOF'
# 远程勘验操作日志 CASE-2026-0142
- 操作人 / 授权人:<姓名 + 授权文书编号>    - 目标:DigiForensics-FIN-01 (10.20.5.30)
- 通道:RDP over VPN,全程录屏             - 原则:只读优先;不安装软件;不重启;不修改文件
EOF

录屏从连接前就开始:授权确认、目标确认、每条命令的输入与输出都要在画面里。

3.2 第 2 步:先观察,后操作

连接后的前 60 秒不要敲任何命令:先看屏幕、桌面、告警弹窗、有没有正在传输的进度条。

这本身就是高价值信息,且不产生任何日志。

# 只读基线快照:时间、用户、启动项、会话
Get-Date -Format "yyyy-MM-ddTHH:mm:ssK"
whoami /all
query user
Get-CimInstance Win32_OperatingSystem | Select-Object LastBootUpTime,LocalDateTime

Get-NetTCPConnection -State Established | Select-Object LocalPort,RemoteAddress,OwningProcess

3.3 第 3 步:优先采内存

内存采集必须最先做,因为它最易失。用工具前先确认它是否写盘到目标机。

# 方案 A:AVML(微软官方,内存不足时自动分块写入,兼容性最好)
.\WinPmem.exe /acquiresetting .\DigiForensics-mem.raw 2>&1 | Tee-Object .\acquire-mem.log
# 方案 B:WinPmem(需签名驱动)
.\winpmem_mini_x64_rc2.exe .\DigiForensics-mem.raw

采集后立刻做三件事:计算哈希、记录文件大小、保留采集工具本身的哈希。

sha256sum /evidence/DigiForensics-mem.raw | tee /evidence/DigiForensics-mem.raw.sha256
# 立即把内存镜像复制到干净介质,再继续在线操作

顺序铁律:内存 → 关键日志 → 进程/网络信息 → 最后才考虑全盘。反过来做,内存里的东西就说不清了。

3.4 第 4 步:抽取易失日志

不要试图"导出全部日志"——那会产生大量新事件。只取关键项,且用 -Path 精确指定。

# 安全日志:登录与提权(远程接入的核心痕迹)
wevtutil epl Security D:\Forensics\Security.evtx /ow:true
# 系统日志:服务与网络
wevtutil epl System D:\Forensics\System.evtx /ow:true
# 远程会话专用日志(判断"谁、何时、从哪来")
wevtutil epl Microsoft-Windows-TerminalServices-LocalSessionManager/Operational D:\Forensics\TSLocal.evtx /ow:true
wevtutil epl "Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational" D:\Forensics\RdpCore.evtx /ow:true

# 当前登录会话:按字段名取值,不用 Properties[18] 这类魔法下标(下标随版本变化,靠不住)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 20 | ForEach-Object {
  $d = @{}; ([xml]$_.ToXml()).Event.EventData.Data | ForEach-Object { $d[$_.Name] = $_.'#text' }
  [PSCustomObject]@{ Time=$_.TimeCreated; User=$d.TargetUserName; SrcIP=$d.IpAddress; Type=$d.LogonType }
} | Format-Table -AutoSize

epl 是导出而非渲染,不会像 Get-WinEvent 那样在渲染过程中产生额外事件——这是"在线取证"与"事后离线取证"必须分开的根本原因。

3.5 第 5 步:远程录屏与命令留痕

SSH 用客户端侧 script 记录输入输出;RDP 用宿主机侧录屏。

# SSH:客户端侧记录全部输入输出,不在目标机安装任何东西
ssh -tt dgf-incident@10.20.5.30 |& tee -a /lab/ssh-session.log
# RDP:宿主机侧录屏,帧率 15 足够,文件可控
vlc --intf dummy --sout '#transcode{vcodec=h264,vb=2000}:std{access=file,mux=mp4,dst=/lab/remote-session.mp4}' screen:// --screen-fps 15

3.6 第 6 步:在线检查项清单

按"只读、低扰动、可解释"排序,逐项执行并记录:

# 进程与父子关系(找异常命名、找注入)
Get-CimInstance Win32_Process |
  Select-Object ProcessId,ParentProcessId,Name,CommandLine |
  Sort-Object ParentProcessId | Format-Table -AutoSize

# 网络连接与监听端口(不打断)
Get-NetTCPConnection -State Established,Listen |
  Select-Object LocalPort,RemoteAddress,State,OwningProcess

# 持久化(在线视角的启动项)
Get-CimInstance Win32_StartupCommand | Select-Object Name,Command,Location
Get-ScheduledTask | Where-Object {$_.State -ne 'Disabled'} | Select-Object TaskPath,TaskName
Get-CimInstance -Namespace root\subscription -Class __EventConsumer -ErrorAction SilentlyContinue

# 登录会话(在线在场的人)
query user
Get-Process | Where-Object {$_.MainWindowTitle} | Select-Object Id,ProcessName,MainWindowTitle

# 转储与抓包须单独授权(会挂起进程 / 产生巨量数据)
# procdump -ma <pid> D:\Forensics\proc.dmp
# dumpcap -i eth0 -w D:\Forensics\	raffic.pcap

3.7 第 7 步:收工、验证与归档

结束判定:主要线索已固定、继续在线的风险已大于收益,收工时按序执行: