渗透技巧——利用虚拟磁盘实现的“无文件”

0x00 前言


在渗透测试中,常常会使用代码注入、内存执行、注册表、powershell或是wmi等无文件的技术,增加被检测和分析的难度。

站在渗透的角度,某些条件下并不能做到整个过程的“无文件”,需要向硬盘写入文件,这就很有可能被取证和分析。

最近我看到了一篇文章介绍了利用虚拟磁盘的方法,正好能解决这个问题。

而站在防御的角度,针对这种方法该如何检测和拦截呢?

参考的文章地址:

https://diablohorn.com/2018/08/06/creating-a-ram-disk-through-meterpreter/

本文将要对其进行测试,介绍实现细节,解决原文中未解决的问题,结合利用思路,分析检测和拦截的方法。

0x01 简介


本文将要介绍以下内容:

  • 实现原理
  • 方法复现
  • 删除残留的硬盘图标
  • 支持对文件夹的操作
  • 取证分析
  • 检测拦截

0x02 实现原理


Windows系统硬盘上对文件的删除操作,只修改了文件的MFT,如果文件内容尚未被覆盖,就能恢复文件

详细的删除和恢复介绍可参考之前的文章《渗透技巧——Windows系统的文件恢复与删除》

如果使用虚拟磁盘,将内存映射到本地,创建内存磁盘,使用上同真正的硬盘没有区别,并且有如下两个优点:

  1. 不会对硬盘进行写操作,也就不存在硬盘文件的恢复
  2. 系统重启后,内存磁盘中的文件自动删除

0x03 方法复现


对文章的实现方法进行复现,地址:

https://diablohorn.com/2018/08/06/creating-a-ram-disk-through-meterpreter/

ImDisk

开源工具,能够创建虚拟磁盘,介绍和下载地址:

http://www.ltr-data.se/opencode.html/

安装时会弹框提示用户,如下图

Alt text

安装成功后在C:\Windows\System32\drivers\下释放驱动文件imdisk.sys,在C:\Windows\System32\释放启动程序imdisk.exe及其支持文件

安装成功后,命令行输入imdisk启动ImDisk,回显命令说明

二次利用

作者DiabloHorn借助开源工具ImDisk,对其进行二次利用,实现命令行下的安装、加载和虚拟磁盘的创建删除

准备工作:

1、编写代码实现驱动的安装、加载和虚拟磁盘的创建删除

代码地址:

https://github.com/DiabloHorn/cliramdisk

我的测试编译环境是VS2015,将工程中头文件stdafx.h中包含的内容保存到cliramdisk.cpp中,直接编译通过,生成文件cliramdisk.exe

2、测试系统安装ImDisk获得驱动文件imdisk.sys

安装后,在位置``C:\Windows\System32\drivers`复制驱动文件imdisk.sys

值得注意的是驱动文件imdisk.sys包含数字签名

3、编写注册表文件,添加驱动文件信息

内容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ImDisk]
"DisplayName"="ImDisk Virtual Disk Driver"
"Description"="Disk emulation driver"
"Type"=dword:00000001
"Start"=dword:00000004
"ErrorControl"=dword:00000000
"ImagePath"=hex(2):5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
  74,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,52,\
  00,49,00,56,00,45,00,52,00,53,00,5c,00,69,00,6d,00,64,00,69,00,73,00,6b,00,\
  2e,00,73,00,79,00,73,00,00,00
"DeleteFlag"=dword:00000001

保存为imdiskdriver.reg

###实际测试

1、导入注册表,添加驱动文件信息

reg import imdiskdriver.reg

2、上传驱动文件

copy imdisk.sys C:\Windows\System32\drivers\

3、加载驱动文件

cliramdisk.exe i

4、创建虚拟磁盘(大小200MB)

cliramdisk.exe c 209715200 R: 0

5、格式化为NTFS

format R: /FS:NTFS /Q /y

之后就可以向R盘上传文件,在系统重启后会自动删除

6、查看虚拟磁盘

cliramdisk.exe l

7、删除虚拟磁盘

cliramdisk.exe d 0

删除不彻底,仍会显示磁盘图标

如下图

Alt text

注:

使用ImDisk删除虚拟磁盘时不存在这个bug

不足

  1. 删除不彻底,仍会显示磁盘图标
  2. 不支持对文件夹创建虚拟磁盘

0x04 优化


为了解决上节提到的两个不足,可以考虑直接使用ImDisk,只是需要实现命令行下ImDisk的安装和使用

这是给出一种解决方法

准备工作

1、测试系统安装ImDisk获得支持文件

  • C:\Windows\System32\drivers\imdisk.sys
  • C:\Windows\System32\imdisk.exe
  • C:\Windows\System32\imdisk.cpl

2、编写代码实现驱动的安装

代码地址:

https://github.com/DiabloHorn/cliramdisk

这里可以直接使用代码中的驱动加载功能

注:

测试需要的所有文件已上传至github,下载地址:

https://github.com/3gstudent/test/raw/master/cliramdisk%26imdisk.rar

实际测试

1、添加注册表,添加驱动文件信息

reg add hklm\SYSTEM\CurrentControlSet\Services\ImDisk /v DisplayName /t REG_SZ /d "ImDisk Virtual Disk Driver"
reg add hklm\SYSTEM\CurrentControlSet\Services\ImDisk /v Description /t REG_SZ /d "Disk emulation driver"
reg add hklm\SYSTEM\CurrentControlSet\Services\ImDisk /v Type /t REG_DWORD /d 1
reg add hklm\SYSTEM\CurrentControlSet\Services\ImDisk /v Start /t REG_DWORD /d 4
reg add hklm\SYSTEM\CurrentControlSet\Services\ImDisk /v ErrorControl /t REG_DWORD /d 0
reg add hklm\SYSTEM\CurrentControlSet\Services\ImDisk /v ImagePath /t REG_EXPAND_SZ /d "\SystemRoot\system32\DRIVERS\imdisk.sys"

2、上传驱动文件

copy imdisk.sys C:\Windows\System32\drivers\

3、加载驱动文件

cliramdisk.exe i

4、创建虚拟磁盘Z:,大小10Mb,自动格式化为NTFS

imdisk -a -s 10M -m Z: -p "/FS:NTFS /Y /Q"

5、删除虚拟磁盘Z:

imdisk -d -m Z:

注:

不会存在硬盘图标存留的bug

6、文件夹操作

(1)创建

md C:\Windows\Temp\test
imdisk -a -s 10M -m C:\Windows\Temp\test -p "/FS:NTFS /Y /Q"

注:

需要空文件夹,否则创建失败

(2)删除

卸载虚拟盘:

imdisk -d -m C:\Windows\Temp\test

或者直接删除文件夹:

rd C:\Windows\Temp\test

7、卸载驱动文件

cliramdisk.exe u

0x05 取证分析


1、对文件夹创建虚拟磁盘

md C:\Windows\Temp\test
imdisk -a -s 10M -m C:\Windows\Temp\test -p "/FS:NTFS /Y /Q"

2、写入测试文件

echo AAAAAAAAAAAAAAAAA>C:\Windows\Temp\test\1.txt

3、使用WInHex查看文件内容

下载地址:

http://www.x-ways.net/winhex/

选择Tools -> Open Disk,选择盘符c:

找到文件夹C:\Windows\Temp\test

无法找到测试文件1.txt

证明文件没有被写到硬盘

0x06 检测拦截


无法通过恢复硬盘文件获得攻击者上传的文件

结合利用思路,可以考虑监控驱动文件,拦截驱动文件imdisk.sys的加载

0x07 小结


本文测试了利用虚拟硬盘实现“无文件”的方法,解决两个问题(删除不彻底,不支持文件夹),验证结论:无法通过恢复硬盘文件获得虚拟硬盘中的文件

最后结合利用思路,分析检测和拦截的方法


LEAVE A REPLY


为您推荐了相关的技术文章:

  1. 漏洞检测的那些事儿 - 从理论到实战
  2. [独家]蓝牙App漏洞系列分析之三CVE-2017-0645|漏洞研究 - 安全技术社区
  3. 蓝牙App漏洞系列分析之一CVE-2017-0601
  4. Petya勒索病毒技术分析 | 天融信阿尔法实验室
  5. 构造PPSX钓鱼文件 - Evi1cg's blog

原文链接: 3gstudent.github.io