NTFS数据流漏洞

    NTFS数据流(ADS,Alternate Data Streams,附加数据流)通常用于保存文件额外信息,例如文件属性中的摘要信息就是以流的形式存储的。每个文件默认都有一个没有名字的主流,然后它还可以有其它若干附加流,这些流都为$Data属性,也就是数据属性,用WinHex查看一个文件的MFT,如果含有两个以上0x80属性,说明该文件存在附加流。主流是没有名字的,但附加流都有属性名,附加数据在Windows资源管理器里是不显示的,需要其它软件查看,所以,它可以用来隐藏数据。cmd下用Type命令可以建立附加流,格式为:Type 流文件>宿主文件:流名。例如Type C:\Windows\notepad.exe>D:\1.txt:test.exe,作用是将notepad.exe(记事本)这个文件附加到D:\1.txt文件中,附加后查看1.txt文件的大小,发现并没有改变,但实际上,1.txt藏着一个数据流,也就是notepad.exe,流名是test.exe,在cmd下输入start ./D:\1.txt:test.exe,即可运行notepad.exe,但仅xp下能执行EXE,其它系统不能直接执行EXE,因微软为了安全考虑将其禁用了(注意是禁止EXE流运行,而非禁止创建流)。而D:\1.txt:test.exe正是流的全路径。宿主文件可以是文件,也可以是目录,比如将流附加到根目录,这样流就无法删除了。

    然而,原本以为这个机制可能有利用价值,谁料偶然间却发现了NTFS流的一个问题。起初以为,流只会随着宿主文件的删除而消失,可没想到还有种情况,就是当宿主文件改变大小后,流文件居然莫名其妙地不见了。测试方法像上面说的一样,先在D盘建一个1.txt的空文件,大小是0字节,然后附加一个流进去,仍然是上面的命令,把记事本藏进去,这时用winhex查看1.txt的MFT记录,发现有两个0x80属性,第1个0x80属性长度是24字节,正好是属性头的长度,因为1.txt文件0大小,所以该文件没有内容,因而没有为此分配属性内容。接下来看第2个0x80属性,发现是test.exe流文件,是一个非常驻属性(因为notepad.exe文件比较大),此时还是没什么问题的,用AlternateStreamView软件扫描是能扫到test.exe流的。这时,我们打开1.txt,随便输入一个字符,比如“A”,保存。这时我想,此时文件的第二个0x80属性应该向下移动了一些位置,因为1.txt里面添了东西,所以它的数据属性会增加长度,结果用winhex查看发现,主流数据属性确实增加了8字节,第1个字节为字符A,剩下则是FF FF FF,不知是什么意思,感觉有问题,往下看果然如此,第二个0x80属性不见了,貌似是被覆盖了,WinHex已经无法识别到附加$Data属性。再在cmd下输入start来执行流,提示找不到文件,然后用AlternateStreamView和数据流扫描专家扫描,都扫不到流文件,看来流文件的记录已经被破坏了。这么说,如果宿主文件是EXE格式的倒影响不大,如果是txt等可编辑的文档,那就麻烦了,txt改变大小后,流便会丢失。以上是在XP/sp3下测试的结果,NTFS版本为3.1,不知道Vista/win7以上系统是否存在这个问题。

猜你喜欢

转载自blog.csdn.net/zzmzzff/article/details/80298402