渗透技巧——利用虚拟磁盘实现的 无文件
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 小结
本文测试了利用虚拟硬盘实现“无文件”的方法,解决两个问题(删除不彻底,不支持文件夹),验证结论:无法通过恢复硬盘文件获得虚拟硬盘中的文件
最后结合利用思路,分析检测和拦截的方法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论