0x00 前言
在渗透测试中,常常会使用代码注入、内存执行、注册表、powershell或是wmi等无文件的技术,增加被检测和分析的难度。
站在渗透的角度,某些条件下并不能做到整个过程的“无文件”,需要向硬盘写入文件,这就很有可能被取证和分析。
最近我看到了一篇文章介绍了利用虚拟磁盘的方法,正好能解决这个问题。
而站在防御的角度,针对这种方法该如何检测和拦截呢?
参考的文章地址:
https://diablohorn.com/2018/08/06/creating-a-ram-disk-through-meterpreter/
本文将要对其进行测试,介绍实现细节,解决原文中未解决的问题,结合利用思路,分析检测和拦截的方法。
0x01 简介
本文将要介绍以下内容:
实现原理
方法复现
删除残留的硬盘图标
支持对文件夹的操作
取证分析
检测拦截
0x02 实现原理
Windows系统硬盘上对文件的删除操作,只修改了文件的MFT,如果文件内容尚未被覆盖,就能恢复文件
详细的删除和恢复介绍可参考之前的文章《渗透技巧——Windows系统的文件恢复与删除》
如果使用虚拟磁盘,将内存映射到本地,创建内存磁盘,使用上同真正的硬盘没有区别,并且有如下两个优点:
不会对硬盘进行写操作,也就不存在硬盘文件的恢复
系统重启后,内存磁盘中的文件自动删除
0x03 方法复现
对文章的实现方法进行复现,地址:
https://diablohorn.com/2018/08/06/creating-a-ram-disk-through-meterpreter/
ImDisk
开源工具,能够创建虚拟磁盘,介绍和下载地址:
http://www.ltr-data.se/opencode.html/
安装时会弹框提示用户,如下图
安装成功后在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
删除不彻底,仍会显示磁盘图标
如下图
注:
使用ImDisk删除虚拟磁盘时不存在这个bug
不足
删除不彻底,仍会显示磁盘图标
不支持对文件夹创建虚拟磁盘
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 小结
本文测试了利用虚拟硬盘实现“无文件”的方法,解决两个问题(删除不彻底,不支持文件夹),验证结论:无法通过恢复硬盘文件获得虚拟硬盘中的文件
最后结合利用思路,分析检测和拦截的方法