Streams 学习笔记(12.2):看见 NTFS 隐藏的备用数据流(ADS)
- [Streams 学习笔记(12.2):看见 NTFS 隐藏的备用数据流(ADS)](#Streams 学习笔记(12.2):看见 NTFS 隐藏的备用数据流(ADS))
-
- [一、Streams 是什么?它在 Sysinternals 里负责哪一块?](#一、Streams 是什么?它在 Sysinternals 里负责哪一块?)
- [二、先搞清概念:NTFS 备用数据流(ADS)是什么?](#二、先搞清概念:NTFS 备用数据流(ADS)是什么?)
- [三、Streams 基本用法:列出 / 递归扫描 / 删除 ADS](#三、Streams 基本用法:列出 / 递归扫描 / 删除 ADS)
-
- [1. 查看单个文件的 ADS](#1. 查看单个文件的 ADS)
- [2. 递归扫描整个目录树](#2. 递归扫描整个目录树)
- [3. 删除 ADS(慎用!)](#3. 删除 ADS(慎用!))
- [四、典型实战场景:为什么你需要 Streams?](#四、典型实战场景:为什么你需要 Streams?)
-
- [场景 1:安全告警里经常出现的 Zone.Identifier](#场景 1:安全告警里经常出现的 Zone.Identifier)
- [场景 2:怀疑有人"藏文件"或数据异常](#场景 2:怀疑有人“藏文件”或数据异常)
- [场景 3:恶意软件/红队隐藏持久化痕迹](#场景 3:恶意软件/红队隐藏持久化痕迹)
- [五、Streams 常用参数小抄(适合贴在笔记里)](#五、Streams 常用参数小抄(适合贴在笔记里))
- 六、搭配其它工具的"组合拳"思路
- [七、使用 Streams 时的注意事项与经验小结](#七、使用 Streams 时的注意事项与经验小结)
- [八、总结 & 下一步学习建议](#八、总结 & 下一步学习建议)
Streams 学习笔记(12.2):看见 NTFS 隐藏的备用数据流(ADS)
适用读者:Windows 运维 / 安全 / 取证 / 开发同学,尤其是负责排查"磁盘空间被吃掉但找不到文件"的那种。
你将收获:
- 搞懂 NTFS 备用数据流(ADS)到底是个啥
- Streams 工具的核心用法:发现 + 查看 + 删除 ADS
- 常见安全场景:恶意代码隐藏、Zone.Identifier 等
- 一套可以直接用在日常巡检/脚本里的命令模板
一、Streams 是什么?它在 Sysinternals 里负责哪一块?
在 Sysinternals 文件工具家族里:
- Strings:扫文件里的可打印字符串
- Streams:扫 NTFS 文件系统里的"备用数据流"(Alternate Data Streams, ADS)
简单说:
NTFS 上一个文件可以不仅有一个"内容" ,还可以挂很多"隐藏内容"。
这些隐藏内容就是 备用数据流,默认你在资源管理器里看不到大小变化,也不会单独显示出来。
Streams 的职责就是:
把这些你"看不见"的流,全部列出来,必要时顺手帮你删掉。
二、先搞清概念:NTFS 备用数据流(ADS)是什么?
标准文件我们习惯的名字是这样:
text
report.docx
在 NTFS 里,它其实是这样的三段式:
text
文件名 : 数据流名 : 类型
report.docx : $DATA
而备用数据流则长这样:
text
report.docx:HiddenStream:$DATA
特点:
- 同一个文件可以有多个数据流
- 每个数据流本质上都是"一个独立的小文件"
- 资源管理器默认只统计"主数据流"的大小
- 绝大多数用户完全意识不到这些流的存在
典型例子:从浏览器下载来的 exe 文件,经常带一个 :Zone.Identifier 流,用来记录这个文件来自 Internet 区域,打开时会弹出安全警告。
三、Streams 基本用法:列出 / 递归扫描 / 删除 ADS
1. 查看单个文件的 ADS
bash
streams somefile.exe
示例输出(简化版):
text
C:\Tools>streams putty.exe
Streams v1.xx - Enumerate alternate NTFS data streams
Sysinternals - www.sysinternals.com
C:\Tools\putty.exe:
:Zone.Identifier:$DATA 26
解读:
putty.exe这个文件上挂了一个Zone.Identifier流- 大小为 26 字节,用来记录"文件来自互联网"
2. 递归扫描整个目录树
bash
streams -s C:\Data
常用套路:
- 对服务器某个逻辑盘做一次全盘扫描
- 重点看"不该有 ADS 却有 ADS"的路径(比如某些业务目录)
结合 more/findstr 做简单筛选:
bash
streams -s D:\ | findstr /i "Zone.Identifier"
3. 删除 ADS(慎用!)
如果你确认某个流是可以安全删除的,比如想去掉浏览器下载警告:
bash
streams -d putty.exe
示例输出(简化):
text
C:\putty.exe:
Deleted :Zone.Identifier:$DATA
此后再双击运行,就不会弹"来自 Internet 的文件安全警告"了。
递归删除某目录下所有 ADS(极度慎重):
bash
streams -s -d D:\Downloads
建议做法:
- 先
streams -s看清楚有哪些流,导出一份报告- 再针对性
-d删除单个文件或小范围目录- 生产环境一定要先在测试环境演练
四、典型实战场景:为什么你需要 Streams?
场景 1:安全告警里经常出现的 Zone.Identifier
很多安全加固文档会提到:
- Windows 会在从网络下载的文件上加
:Zone.Identifier:$DATA - 内容类似:
text
[ZoneTransfer]
ZoneId=3
代表这个文件来自"Internet 区域"。某些脚本会批量检查/清理这些流,用于:
- 部署前清理告警弹窗
- 检测是否有大批从外网下载但未审计的可执行文件
Streams 可以:
bash
streams -s D:\ | findstr /i "Zone.Identifier"
找出所有带标记的文件,便于进一步安全审查。
场景 2:怀疑有人"藏文件"或数据异常
备份、审计或取证时,常见疑惑:
磁盘用量明显升了,但文件总大小对不上。
其中一种可能:有人用 ADS 藏数据,比如:
powershell
# 举个例子(PowerShell),往 ADS 写东西:
Set-Content .\readme.txt:secret -Value "top secret"
资源管理器里看 readme.txt 大小完全正常,但真实占用会更大。
Streams 可以一键扫:
bash
streams -s C:\ | more
快速确认哪些文件"多出来了"数据流。
场景 3:恶意软件/红队隐藏持久化痕迹
攻击者可能利用 ADS 做:
- 隐藏恶意脚本(如
good.exe:evil.vbs) - 用计划任务/服务去调用这些流
- 普通查杀/巡检极容易漏掉
蓝队或安全运维可以:
- 对关键目录周期性跑 Streams
- 将扫描结果归档,对比新增的 ADS 项
- 一旦发现可疑流名(如
:evil,:payload等),进一步分析内容
五、Streams 常用参数小抄(适合贴在笔记里)
根据 Sysinternals 官方用法,Streams 的核心参数非常少:
text
streams [-s] [-d] <file or directory>
-s 递归扫描子目录
-d 删除扫描到的所有 ADS
一些实践中的组合命令:
bash
:: 1)查看某目录下所有 ADS(不递归)
streams D:\Data
:: 2)递归扫描整棵目录树
streams -s D:\Data
:: 3)只删除某个文件上的所有流
streams -d D:\Deploy\app.exe
:: 4)递归删除某目录下所有 ADS(高风险操作)
streams -s -d D:\Downloads
如果你从 GUI 启动 Streams,也可以拖文件/文件夹进去,它会弹出同样的结果窗口,适合临时排查。
六、搭配其它工具的"组合拳"思路
Streams 本身只做一件事:列出/删除 ADS 。
真正实战中,它通常这样配合使用:
- 配合 Strings / Hex 编辑器
- 用 Streams 找流 → 用其它工具打开流内容分析
- 配合任务计划/服务列表
- 看看是否有任务引用了
filename:streamname的路径
- 看看是否有任务引用了
- 配合 Procmon / Sysmon 日志
- 监控是否有进程频繁访问 ADS,定位可疑操作
可以把 Streams 扫描动作放进你的日常脚本,比如月度安全巡检:
bat
@echo off
set OUT=C:\Reports\streams-%DATE:~0,10%.txt
echo ==== Streams Scan on %DATE% %TIME% ==== > "%OUT%"
streams -s C:\ >> "%OUT%"
echo Done. Report: %OUT%
七、使用 Streams 时的注意事项与经验小结
- 不要一上来就全盘 -d
- 很多合法软件也会利用 ADS(比如下载标记、索引信息)
- 一刀切删除可能影响某些安全提示或兼容性行为
- 对生产环境要"先看后动"
- 先做扫描报告,落地成文档
- 再与开发/安全团队核对哪些流是正常的
- ADS 不是"洪水猛兽",但非常适合被滥用
- 作为管理员,至少要"看得见"它
- Streams 就是你打开这扇门的那把小钥匙
八、总结 & 下一步学习建议
这一篇你可以带走三个关键点:
- NTFS 文件可以挂多个数据流,备用数据流(ADS)默认"隐身"
- Streams 是枚举/删除 ADS 的轻量级命令行工具,核心参数只有
-s和-d - 在安全巡检、下载文件审计、疑似"藏数据"场景里,都非常好用
下一步建议:
- 自己找一个测试目录,用 PowerShell 建几个 ADS,亲手用 Streams 扫描/删除感受一下
- 配合 Sysinternals 的 Junction / FindLinks / PendMoves 等其它文件工具一起看,会对 "NTFS 的隐藏玩法" 有整体认知
等你把整个第 12 章的工具都按这套方式实战一遍,你看文件系统的视角就会从"二维"升级到"4D IMAX"。