← 返回博客

NTFS 反取证:攻击者实际怎么做,以及什么会让他们暴露

· 阅读 2 分钟

NTFS 上的每一种反取证手法都会留下某些东西。原因是结构性的。MFT、USN journal$LogFile 和 Volume Shadow Copy 各自记录同一组事件的不同视角,而修改其中之一这件事本身又是其他几者要记录的事件。一个想从一个工件里隐身的攻击者,几乎总会点亮另一个。把这四者放在一起走的防守者很难被击败。

下面是清单。对每种手法:攻击者做什么、留下什么残迹、哪一个工件会让他们暴露。

Timestomping

经典。SetMACEtimestomp、有名的 Invoke-TimeStomp PowerShell 脚本,以及无数红队助手都会调用 SetFileTime 或直接写 $STANDARD_INFORMATION,让文件看起来比实际更老或更新。近来的变种还会通过重命名文件来动 $FILE_NAME(这迫使 NTFS 更新 FN),然后再改回去。"双重重命名"是把合格操作员与脚本小子分开的那个手法。

什么会暴露它:

  • SI/FN 不一致。 单纯的 SetFileTime 只动 SI。对应的 FN 时间戳还是真实的创建/重命名时间。见 四个 MFT 时间戳。SI created 比 FN created 偏离几秒以上的任何记录都可疑。SI created 早于 FN created 在自然条件下不可能:文件不能在被命名之前存在。
  • 亚秒级粒度。 NTFS 用 100 纳秒粒度存储时间戳。原生操作会在低位留下噪声。多数 timestomping 工具会四舍五入到秒。多个文件上整齐排列的一列 .0000000 后缀就是一种指纹。
  • $UsnJrnl 的真相。 USN journal 在写入条目时记录的是真实修改时间。一条对某记录 $DATA 属性的 DATA_OVERWRITE USN,其时间戳与 MFT 的 SI modified 不一致,就是 timestomping 被当场抓获。
  • VSS 快照。 较旧的 Volume Shadow Copy 保留着 stomp 之前的值。对同一记录把当前 $MFT 与快照中的 $MFT 做 diff,变化可见。

双重重命名能击败 SI/FN 比较。但它击败不了 USN journal 条目,也击败不了 VSS diff。

用备用数据流隐藏载荷

带名字的 $DATA 属性(legit.docx:payload.exe)对资源管理器不可见、对 dir 不可见,且常被用来藏可执行文件、脚本或编码过的配置,可见文件本身不会出卖它。可通过 wmic process call createrundll32Get-Content -Stream 配合 Invoke-Expression 启动。

什么会暴露它:

  • 走 MFT 会把每个 $DATA 属性都暴露出来。 按文件枚举会漏掉你没想到去看的文件上的数据流。MFT 不会。见 备用数据流
  • Sysmon Event ID 15(FileCreateStreamHash) 是唯一一个对 ADS 创建做哈希记录的 Sysmon 事件。如果 Sysmon 部署并配置好,就能直接抓到数据流落地。
  • Zone.Identifier 浏览器下载会带这个 ADS。\Downloads\ 里某二进制没有它,要么是它从未来自浏览器,要么是它被刻意剥离(Unblock-File)。

擦除单个文件

成熟的擦写器会先覆盖文件簇再删除 MFT 记录。不太成熟的(默认模式的 SDelete、cipher /wdel /f)覆盖数据但留下 MFT 记录。

什么会暴露它:

  • MFT 记录本身。 一条 $FILE_NAME$STANDARD_INFORMATION 完好的已删除记录依然写着文件名、父目录,以及删除瞬间的时间戳。见 删除后还剩什么
  • $UsnJrnl 的创建与删除条目。 不论数据是否被擦除,这两个事件都独立被记录下来。
  • $LogFile 元数据操作的事务记录会留在那里直到被回收。
  • VSS 快照。 如果擦除前存在快照,文件在其中完好无损。

擦除 MFT 记录本身

更激进的攻击者会专门写入新文件以迫使 NTFS 复用槽位,从而覆盖已删除记录。这会成功:那个槽位没了。但删除本身仍然是一次事件。

什么会暴露它:

  • 序列号自增。 $UsnJrnl$LogFile 指向记录 R 序列 S 的引用如今已陈旧;当前记录是序列 S+1。交叉比对就会暴露复用。
  • $UsnJrnl 历史。 原始的创建、修改与删除依然有记录。新文件的创建也有。复用留下了 USN 痕迹。
  • VSS 快照。 复用前的 $MFT 快照副本仍然保留着序列 S 的原始记录。

$UsnJrnl 截断

变更日志是有限的。一个跑大量嘈杂操作(许多文件写入)的攻击者可以迫使 $UsnJrnl 绕回,挤掉较旧的条目。多数安装上默认大小为 32 MB;Server 上更大。

什么会暴露它:

  • 以较高起始 USN 开始的较短 $UsnJrnl 如果主机已经在线数周,journal 的第一条记录却是事件前几小时甚至几分钟,那它就是被非自然地快速轮转过。计算一下预期速率。
  • $LogFile 不按同样方式轮转。 它按卷大小定尺寸,按另一套策略覆盖。把 USN journal 挤出去的那些操作,有时仍在 $LogFile 中。
  • 那些嘈杂操作本身会留下成千上万条 MFT 记录。 让 journal 绕回所需的成千上万次文件搅动在 $MFT 中清晰可见。这个手法很吵。

$UsnJrnl 删除

fsutil usn deletejournal /D C: 整体移除 journal。重新创建的 journal 从全新的 USN 计数器开始。$Extend\$UsnJrnl 这条 MFT 记录的序列号会因为这次删除并重建而递增。

什么会暴露它:

  • 可疑地高的起始 USN,或可疑地新的第一条记录。 一份刚被创建的 $UsnJrnl,其第一条记录晚于事件本身,就是个迹象。
  • $Extend 目录条目的序列号自增。 $UsnJrnl 自身的 MFT 记录会比基线有更高的序列号。
  • VSS 快照。 删除之前的快照里仍然完整保留着原来的整份 journal。用 vshadowmount 挂载并提取。

把恶意软件改名为系统文件名

把工具伪装成 svchost.exelsass.execmd.exe 或其它常见 Windows 二进制。严格说不是 MFT 反取证,但这是实战里最容易把分析师绕进去的一招。

什么会暴露它:

  • $FILE_NAME 的父目录引用。 合法的 svchost.exe 位于 C:\Windows\System32。一个同名文件出现在 \Users\bob\AppData\Local\Temp\ 那就不是它了。请检查父引用,不是只看名字。
  • $DATA 大小与哈希。 合法二进制是众所周知的。对冒充者做 SHA-256 并比对。不一致一目了然。
  • Zone.Identifier ADS,如果它是被下载下来的。
  • 代码签名。 Microsoft 二进制都有签名。检查磁盘上文件的 Authenticode 签名;冒充者要么没签名,要么签名非 Microsoft。

硬链接操控

不那么常见,但值得知道。同一条 MFT 记录上的多个 $FILE_NAME 属性让攻击者能让同一份载荷同时出现在两个目录里。从一个里删除只是去掉一条 $FILE_NAME;文件要直到最后一个链接被移除时才真正消失。

什么会暴露它:

  • 记录头中的 hardlink_count 字段。 如果一条记录的计数 > 1,每个 $FILE_NAME 都是其中一个链接。MFT 把所有都列出来。
  • $UsnJrnl 上的 HARD_LINK_CHANGE 原因 在硬链接的创建与删除时出现。

$LogFile 操控

fsutil 没提供"删除日志文件"的选项,但日志会自行轮转,且把卷写满的操作可以把条目挤出去。成熟的操作员有时会试图清理 $LogFile,以去掉事件前后的事务记录。

什么会暴露它:

  • $LogFile 在 Windows 运行时是被锁定的。 篡改它需要先卸载卷,而那件事本身就是一次事件。
  • 篡改之前的 VSS 快照 依然保留着完整日志。

勒索软件对 MFT 的涂写

某些勒索家族(Petya、NotPetya,以及之后的少数)会刻意破坏 $MFT 以让卷无法挂载。这是破坏性的而不是规避性的;目标是拒绝服务而不是隐身。

什么会暴露它:

  • 本该出现 FILE 的位置出现了 BAAD chkdsk 对不可修复记录留下的墓碑,正是 NTFS 在擦写之后留下的标记。有时涂写者并不会写 BAAD,这种情况下记录解析不出来,但仍能按签名扫描。
  • 一台无法启动但取证上极具价值的系统。 数据簇通常完好。对该卷按 FILE 记录做签名扫描,表的大部分都是可读的。详细见 MFT 中的勒索软件模式

一般原则

NTFS 上的每一种反取证手法都会在某处留下工件。原因是结构性的:$MFT$UsnJrnl$LogFile 与 VSS 各自记录同一组事件的不同视角。擦写 MFT 的攻击者会留下 USN 条目。删除 USN journal 的攻击者会留下新的 $Extend\$UsnJrnl 序列号跳变,以及尚未被动的 VSS 快照。运行 vssadmin delete shadows 的攻击者会留下 Windows 事件日志条目(System 8224、Application VSS 8194),并且很可能留下对 vssadmin.exe 调用的 Sysmon Event ID 1。

把这四类 NTFS 工件加上事件日志与 VSS 一起走的取证方式,才能抓到成熟的操作者。只盯一种工件的取证会漏掉他们。

延伸阅读

外部资源