NTFS格式下的Alternate Data Streams
今天我写点NTFS的交换数据流以及其带来的安全问题(Alternate Data Stream/ADS)
=========================================================================================================================================================================
1.什么是ADS?
要了解什么是ADS我们必须先了解一点关于NTFS的知识,文件在NTFS 和FAT中的结构的区别
Microsoft于90年代初期引入了一种称为“数据流”的概念,从而使NTFS可以作为Macintosh客户端访问文件服务器的文件系统。因为Mac OS 是利用Mac的分层式文件系统(HFS)上所谓的资源分支数据流,用于存放图标等应用程序的元数据。NTFS和FAT的差别就是FAT由一个数据流构成,而NTFS可以在一个文件内存里面存储多个数据流。
在windows协议MS-FSA中ADS的定义:
一个被命名的数据流是一个文件或者目录的一部分,它们可以独立于默认数据流被单独的打开。许多数据流的操作之影响数据流并不影响其他数据流,文件和目录
======================================================================================================================================================================
2.Stream的特性
在windows协议MS-FSCC中对NTFS stream的介绍:
所有的文件在NTFS中至少包含一个主数据流,一个文件NTFS中真正的文件名称格式是:
<文件名>:<流名>:<流种类>
默认的数据流没有名字,如果我们创建一个文件sample.txt实际在NTFS中全名是sample.txt::$DATA
不过不一样的是,如果我们创建一个文件夹,它并没有默认的数据流(Data Stream),不过它有一个默认的目录流(Default Directory Stream)是$INDEX_ALLOCATION默认的流名是I30,所以如果我们创建了一个文件夹sample,它的全名是sample:I30:$INDEX_ALLOCATION
=========================================================================================================================================================================
3.利用Stream特性隐藏文件
在CMD下输入以下代码来测试
echo test1 > test1.txt //将test1写入test1.txt中
echo test2 > test2.txt //将test2写入test2.txt中
type test2.txt > test1.txt:test2.txt //将test2.txt内容写入1.txt的ADS 1.txt:2.txt中
del test2.txt //删除test2.txt
type test1.txt //内容显示为test1
type test2.txt //已经删除了这个文件所以找不到内容
type test1.txt:test2.txt //内容显示为test2
这里我们可以清楚的看见,test2.txt中的test2已经被写入了test1.txt的流中了。
同理,我们可以把任意格式文件写入任意文件的流中,同时可以正常打开执行。
例如~将恶意VBS写入txt中之类~
========================================================================================================================================================================
4.stream特性引来的其他安全问题
这个话题有个前辈总结的不错:
::$DATA请求泄露
MicrosoftIIS 3.0/4.0 ::$DATA请求泄露ASP源代码漏洞(MS98-003)CVE-1999-0278这是一个很古老的漏洞,早期版本的IIS在处理文件请求时会先判断文件扩展名是否在可执行文件扩展名列表中,如果在,则执行并返回结果,如果不在,则直接返回文件内容。NTFS文件系统支持 在文件中包含额外的数据流。$DATA是在NTFS文件系统中存储数据流的属性。当我们对一个在NTFS分区中的ASP文件发出包含$DATA请 求,IIS会检查最后一个“.”后面的扩展名,因为多了“::$DATA”,结果IIS不认为这是一个ASP文件,而文件系统可以识别该请求,于是ASP 的源代码被返回。在高版本的IIS以及其他的Web Server中测试没有发现该问题
隐藏webshell
这种利用思路最早由80sec提出,很好的利用了ADS的隐蔽性。由于目前的webshell检测程序都还没能考虑到ADS层面的检测,所以,这是种隐藏web后门的很好的方式。来看一个很简单的demo:在test.php中添加<?phpinclude(“1.php:.jpg”); ?>,在1.php:.jpg中写入后门代码。访问test.php时,后门代码能成功解析。
Bypass HTTP Basic Authentication
对于IIS6.0+PHP、IIS7.5+asp、IIS7.5+php环境下,如果某目录通过HTTP Basic来认证,假设其目录下有index.php文件,我们可以通过构造如下方式来绕过认证直接访问其目录下的文件。/admin::$INDEX_ALLOCATION/index.php/admin:$i30:$INDEX_ALLOCATION/index.aspBypass黑名单验证上传对于windows环境的服务器,上传1.asp:.jpg类型的文件,当文件传到服务端时,windows会将该文件识别成ADS,从而认为其宿主文件名为1.asp而将.jpg识别为流名。在测试过程中(测试环境中WEB Server为IIS、Apache、Nginx)无论如何构造都无法访问可以解析的文件。前面我们提到,对于1.asp:.jpg这类ADS,其完整的全称为1.asp:.jpg:$DATA,stream name可以省略但stream type是不能省略且不能自定义的。我们在测试中发现,当上传1.php::$DATA时(文件内容为phpinfo),在存储时会出现逻辑问题,导致生成非空的1.php文件,当中的内容为1.php::$DATA的内容且可以正常在webserver下解析。该逻辑问题与语言无关与web server无关,也就是说上传1.asp::$DATA也会生成非空的1.asp文件,1.jsp::$DATA同样。另外,当1.php::$INDEX_ALLOCATION或1.php:$I30:$INDEX_ALLOCATION时,存储时逻辑同样会出现问题,会把该文件误认为是文件夹,从而建立一个1.php的空文件夹。(注:directory流默认stream name为$I30)Windows还有个特性,就是当文件夹名或文件名末尾的任意个数的空格或点,在存储时都会自动去除,所以当上传1.php::$DATA………….或1.php::$INDEX_ALLOCATION……………此类文件同样会造成上述的存储时的逻辑错误。在MySQL UDF提权中的利用MySQL5.1及其之后的版本,使用UDF提权时,指定UDF必须导出在MySQL目录下的libplugin下才有用,而非完全版的Mysql默认安装后没有plugin这个目录,且在MySQL中没有可创建文件夹的函数。(通常很多时候在webshell中也无权限建立该目录),可用如下的SQL建立文件夹select‘xxx’ into outfile ‘c:\test::$INDEX_ALLOCALTION\’;同样由于windows在处理时会把c:test::$INDEX_ALLOCALTION当做ADS处理,从而生成一个test文件夹
这里的总结原文来自:http://www.xcl0ud.net/?p=9
==========================================================================================================================================================================
5.ADS的黑历史
国内最早的关于ADS利用的文献我找到的是lu0(驱动之家创始人)在2001年的时候写的,而国外文献我找到的最早的是在2002年,我想说十几年过去了,关于ADS特性引发的漏洞由IIS 4.0到5.0到6.0到7.5多多少少都有,所以我认为NTFS的这个特性非常值得深入研究。没准以后在别的地方还能挖掘出一些价值
=========================================================================================================================================================================
Thanks for read this article。
NTFS格式下的Alternate Data Streams的更多相关文章
- CentOS6.5下挂载NTFS格式的文件系统
下载对应CentOS版本的rpmforge,下载地址:http://pkgs.repoforge.org/rpmforge-release/ 安装rpmforge,输入命令:# rpm -ivh rp ...
- 解决ntfs格式的移动硬盘mount到Linux下时变成只读文件系统的问题
环境介绍 主机: XP 虚拟机:VirtualBox+Debian6 遇到的问题 我有一块西部数据的移动硬盘,虚拟机中有一些资料需要拷贝到移动硬盘中,然后我将移动硬盘插上后,执行如下设置,将移动硬盘分 ...
- Linux下不能挂载NTFS格式硬盘/U盘
如果大家以后在Ubuntu系统下面遇到NTFS格式的移动硬盘哪个分区不能挂载的话,可以尝试sudo ntfsfix /dev/你相应的分区
- mac下对NTFS格式的磁盘进行读写操作
mac对NTFS格式的分区读写有很大的限制,网上看到很多相关的文章,都表明了一个信息:需要购买类似NTFS for mac这样的软件才能实现对NTFS格式的分区读写的权限,其实不然,mac自带的hdi ...
- Centos 7系统挂载NTFS格式移动硬盘
有些时候做大数据量迁移时,为了快速迁移大数据,有可能在Linux服务器上临时挂载NTFS格式的移动硬盘, 一般情况下,linux是识别不了NTFS格式移动硬盘的(需要重编译Linux核心才能,加挂NT ...
- CentOS 挂载(U盘NTFS格式,新硬盘,增加交换分区,扩展根分区等)
1.挂载fat或者fat32分区的U盘 如果是用VM安装的linux,在vm里挂载U盘有两个前提: 第一,主机里的service要启动: 第二,U盘是连接到虚拟机,而不是主机,需要确认这点: 2.使用 ...
- Mac怎么读写NTFS格式?Mac读写NTFS格式硬盘教程
我们都知道NTFS 格式的 Windows 硬盘在Mac OS X系统下只能读取不能写入,这一问题一直困扰着很多新老Mac 用户,一般的的解决办法就是安装 NTFS 插件来让 OS X 支持 NTFS ...
- [整理]Ajax Post请求下的Form Data和Request Payload
Ajax Post请求下的Form Data和Request Payload 通常情况下,我们通过Post提交表单,以键值对的形式存储在请求体中.此时的reqeuest headers会有Conten ...
- Linux挂在ntfs格式的U盘
工作中遇到linux系统 Red Hat Enterprise5.7 挂载希捷ntfs格式移动硬盘,会跳出一个ERROR提示框:The volume ‘EAGET-NQH’user the ntfs ...
随机推荐
- java中的spi
JAVA中的SPI机制 1.SPI简介 SPI机制(Service Provider Interface)其实源自服务提供者框架(Service Provider Framework),是一种将服务接 ...
- mybatis(CRUD)
3.mybatis(CRUD) 有了mybatis,我们要对数据库进行增删改查只需要操作接口和mapper.xml文件,然后进行测试就可以了. 实例代码如下: 接口 public interface ...
- 浅讲EF高级用法之自定义函数
介绍 好久没给大家更新文章了,前2个月因家庭原因回到青岛,比较忙所以没有什么时间给大家更新知识分享,这2个月在和同事一起做项目,发现了很多好意思的东西拿出来给大家讲一讲. 正文 大家先来下面这幅图,这 ...
- HDU 1312 Red and Black (DFS & BFS)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 题目大意:有一间矩形房屋,地上铺了红.黑两种颜色的方形瓷砖.你站在其中一块黑色的瓷砖上,只能向相 ...
- JuiceFS 即将发布 1.0 并调整开源许可
开源一周年 JuiceFS 开始于 2017 年,是一款云原生分布式文件系统,旨在帮助企业解决多云.跨云.混合云环境下所面临的诸多挑战:数据安全和保护.大数据架构升级.海量小文件访问.Kubernet ...
- 使用nginx访问FastDFS fastdfs nginx
文中所有~~~均为同一个自定义文件夹名字,一般使用项目名称 2.1.为什么需要用Nginx访问? FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要 ...
- 打印十字码 DataMatrix
nuget 安装 DataMatrix.net //示例 DmtxImageEncoder Die = new DmtxImageEncoder(); DataMatrix.net.DmtxImage ...
- mysql新增用户无法登陆问题解决ERROR 1045 (28000)
mysql增加新用户无法登陆解决方法 ERROR 1045 (28000): Access denied for user 'appadmin'@'localhost' (using password ...
- X-former:不止一面,你想要的Transformer这里都有
原创作者 | FLPPED 参考论文: A Survey of Transformers 论文地址: https://arxiv.org/abs/2106.04554 研究背景: Transforme ...
- Swift 介绍
简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 几家欢喜,几家愁 愁者:只学Object-C的人 欢喜者: ...