AD

通过DOSDevices实现持续性恶意代码注入

0x01概述


通过滥用 'DOS Devices' 注册表键,实现一个持续化注入,该注入可以隐蔽地将 DLL注入任何一个用户态进程。

0x02DosDevices


首先说明一个不太常用出名的命令:subst。该命令可以创建一个虚拟驱动器,并且将虚拟驱动器映射到任意路径。某些资料表示该命令使用“DefineDosDevice”这个WinAPI来实现。

 

此外,根据wikipedia提到,可以通过注册表中的注册项,重启启动/使用上面创建的虚拟驱动器。

“通过创建/修改一个注册表键值,可以在系统启动时,给虚拟驱动器指派一个路径或驱动器标号。这个会由系统服务注册,并且重启后依然存在。

在“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices”下面创建一个新的字符型(string)键值,键值对值即为虚拟驱动器的路径。

0x03注册表


假如要给虚拟驱动器指定一个“T:”驱动器,

在该路径下,可以看到已经存在一些注册表键值。



这些键值都是一些安装时就存在的键值,用于向后兼容,或者保存一些符号链接(例如NULL)。使用winobj可以确认这些都是符号链接(symbolic links)。




在这些键值中,“AUX”和“PIPE”是和DosDevices相关的注册表键值。


其实我们的驱动器标号实际上就是一个符号链接,因此可以利用符号链接 ,下一步需要弄清楚符号链接指向的对象。




0x04smss.exe


根据文档可以获知 ,smss.exe负责符号链接的映射过程,smss在系统引导启动时执行这些工作,因为大多数的进程需要使用符号链接。

第一次尝试将“C:”驱动器的符号链接覆盖,结果是VM在启动时崩溃蓝屏。侧面证实了smss进行符号链接的映射工作是在启动阶段,但要利用程序,需要了解smss.exe的工作流程。

smss.exe是会话管理子系统(Session Manager SubSystem)的缩写。它用于全局用户初始化工作,例如初始化系统变量、加载csrss.exe,创建页面文件,分配MS-DOS驱动名称(LPT1、COM),调用Win32壳子系统等。它负责的两个功能特点是需要重点关注的:

  1. 通过符号链接,创建DOS设备的映射

  2. 映射关联“常用的DLL文件”。


“常用的DLL文件”是,为了提高DLL文件加载性能,在一些进程启动时,可能会调用很多公共的DLL文件(例如kernel32, user32这些),为了避免频繁的硬盘读写,这些DLL文件可以映射到一个全局区块,从而实现从内存进行读取。操作系统为了减轻I/O开销,将这些全局区块映射给新的进程。

“HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs”该注册表项定义了常用的DLL文件的一些属性,"DllDirectory"键值定义常用DLL文件存放的文件夹位置,默认是"%Systemroot%\system32"目录。需要特别注意的是,只有“TrustedInstaller”(可信任的安装者)可以改变该值。而%Systemroot%指向的地址一般是"C:\Windows",所以常用DLL一般位于"C:\Windows\System32"。



另外,smss.exe只在创建符号链接后映射常用DLL,smss.exe使用kernel32!MoveFileEx对文件进行重命名来处理DOS devices映射和绑定映射常用DLL。

0x05POC


假设一个主机存在两个分区:其中C:为系统分区,映射至"\Device\HarddiskVolume1",D:为其他分区,映射至"\Device\HarddiskVolume2"。

攻击者则可以安装一下步骤进行:

  1. 创建一个“隐藏”文件,目录为"D:\Whatever\Evil\Windows\System32";

  2. 在该目录下放入一个恶意的kernel32文件;

  3. 在注册表添加一个符号链接,将C:指向"\Device\HarddiskVolume2";

  4. 为了保证攻击持续性,恶意kernel32的DLLMain通过调用DefineDosDevice API将C:的符号链接映射至"\Device\HarddiskVolume1"


这样,攻击者创建的恶意顶kernel32将作为一个常用DLL映射至内存,从而很简单的注入到任何一个用户的进程中去。并且即便重启设备,这个恶意文件也可以毫无察觉到运行。

 

 

0x06附录


URL


http://securitygodmode.blogspot.com/2016/03/devinji-novel-injection-method.html

WinObj


WinObj是关注安全的系统管理员必备的工具,它也可以帮助程序开发人员解决内核对象相关的bug,通过WinObj我们可以轻松的查看系统当前的内核对象以及命名空间。

WinObj 是一个 32 位的 Windows 内核程序,它使用本机 Windows 内核API(由 NTDLL.DLL 提供)来访问和显示有关 内核对象管理器命名空间的信息。Winobj 似乎类似于 Microsoft SDK 的同名程序,但 是SDK 版本存在许多重大的程序错误,这些错误会妨碍它显示准确的信息(例如,其句柄和引用计数信息被完全中断)。此外,我们的 WinObj 支持的对象类型更多。最后,2.0 版本的 WinObj 在用户界面方面有所增强,它知道如何打开设备对象,并允许您使用本机 NT 安全编辑器查看和更改对象安全信息。

评论

此博客中的热门博文

简单粗暴导出小米便签

我——终于一个人了

Ubiquiti_Networks_UniFi_Cloud_Key_authed_rce