Windows 机器中的 dir /r 和输出流

bas*_*bin 5 windows stream

今天我们在网络安全课程中遇到了挑战,在某个时间点(通过终端在 Windows 机器中)我发现了一个有趣的文件,dir名为root.txt

通过more root.txt我得到的输出Look deeper...,这促使我尝试dir /a查看是否隐藏了某些内容。然而,没有结果。

过了一会儿,教授给了我们一个使用提示,dir /r其输出如下:

..
05/24/2018  05:25 PM                14 root.txt
                                    137 root.txt:confidential.txt:$DATA
..
Run Code Online (Sandbox Code Playgroud)

有人发现我们可以confidential.txt使用more < root.txt:confidential.txt

这里到底发生了什么?做什么呢/r

Ery*_*Sun 5

NTFS 将文件存储为的集合,也称为 NTFS“属性”。我更喜欢使用“流”这个名称,因为“属性”通常指文件$STANDARD_INFORMATION流中的文件属性标志,例如“隐藏”、“系统”和“只读”。Windows 程序通常直接使用的两种流类型是数据和索引(即 和$DATA$INDEX_ALLOCATION

NTFS 文件始终具有默认(匿名)数据流,例如“filename::$DATA”,或更简单地说,只是“filename”。它还可以具有备用(命名)数据流,例如“文件名:流名称:$DATA”。目录可以有命名数据流,但不能有默认数据流,因为它的匿名流是文件名索引。/rCMDdir命令的选项调用列表中的每个文件或目录上的FindFirstStreamWFindNextStreamW来列出其$DATA流。

NTFS 目录有一个$FILE_NAME名为“$I30”的索引,例如“dirname:$I30:$INDEX_ALLOCATION”。该索引也可以匿名别名,例如“dirname::$INDEX_ALLOCATION”,或更简单地说,只是“dirname”。FindFirstFile它可以通过和列出FindNextFile

其他流类型上的命名索引也是可能的。例如,NTFS 卷在其保留的“$Reparse”目录中具有重分析点索引,位置为“\$Extend\$Reparse:$R:$INDEX_ALLOCATION”。列出此索引需要特定的目录查询,因此FindFirstFile无法使用。FindFirstVolumeMountPointFindNextVolumeMountPoint列出此索引以便搜索卷上的安装点,即IO_REPARSE_TAG_MOUNT_POINT目标卷 GUID 路径的重新分析点。