本文是参考了FreeBuf上的一篇文章然后再学习一遍的~
首先创建一个正常的文本文件test.txt,到命令行通过dir命令查看:
先使用echo命令吧,就是将相应的字符写入新建的交换数据流文件中,通过echo hello>>test.txt:webshell.php创建交换数据流文件,然后通过dir /r命令查看,不添加/r参数是查看不到的:
接着查看新建的webshell.php文件:
直接将内容修改为一句话木马就可以了。
当然还有个type命令,是将已经存在的一个文件,用交换数据流的方式寄生到另外一个文件或文件夹上。
先新建一个一句话木马文件:
通过命令 type muma.php>>test.txt:muma.php来创建新的交换数据流文件,然后查看:
当然,交换数据流文件还可以寄生在文件夹、磁盘根目录等,隐藏的文件除了webshell等脚本外也可以是图片格式和exe可执行文件格式,只是打开该文件的命令变为了mspaint和start。
为了测试将文件放到www目录中,这里用到一个清除交换数据流文件的工具streams,具体的网上可以下载,在本机中是放在test目录,然后在脚本中直接调用即可。
因为在www目录中删除交换数据流文件是不会有啥影响的,因而检测方法简单粗暴,只要检测到存在交换数据流文件就调用streams工具来删除:
#coding=utf-8 import os import re def checkNTFS(path): p = path.split(':')[0] command = p + ': & cd ' + path + ' & dir /r' r = os.popen(command) ret = '\s(\S+)\:\$DATA' relist = [] for i in r.readlines(): line = i.decode('gbk').strip('\r').strip('\n') result = re.findall(ret,line) if len(result) > 0: print '[*]Found: ' + result[0] relist.append(result[0]) if len(relist) > 0: for i in range(0,len(relist)): prex = relist[i].split(':')[0] delcmd = 'd: & cd d:\\test & streams.exe -d ' + path + '\\' + prex try: r2 = os.popen(delcmd) result2 = r2.read().decode('gbk') if 'Deleted' in result2: print '[+]Deleted successfully.' else: print '[-]Failed to delete.' except: print '[-]Failed to delete.' else: print '[*]Not found.' def main(): path = 'd:\\www' checkNTFS(path) if __name__ == '__main__': main()运行结果: