这是接下来一系列关于通过驱动漏洞进行Windows内核驱动攻击里的第一部篇。
在这个项目里我将会使用的带漏洞驱动是HackSys Extreme Vulnerable Driver, 你可以写一系列的基于IOCTL的攻击。
这个驱动可以下载x86和amd64两个已编译版本。这篇文章中我将使用x86版本, 因为会更好理解。
为了热插拔加载驱动到Windows里,HackSys推荐使用OSR Driver Loader。
虚拟机通信设置
我的操作系统是Linux,所以我无法在我的电脑上跑WinDbg来与win7虚拟机通信。
所以我最后设置了两个虚拟机(均使用相同的Win7 Sp1 x86 镜像)。然后我使用Virtual Box来在我的Linux上设置了一个文件,我通过这个文件来建立两个虚拟机之间的通信。
在虚拟机电源关闭的情况下,我设置了第一个虚拟机的Serial Port。这个虚拟机将被用于运行WinDbg的调试。
第二个用于安装HackSys驱动的虚拟机的设置和第一个类似。
这样,两个虚拟机间通过/tmp/win_link的通信就完成了!
虚拟机调试设置
现在虚拟机配置好了,我们要做些设置来让通信运行起来。
打开用于调试的虚拟机并且安装WinDbg。完成后我们需要设置环境变量来告诉WinDbg内核符号的来源。设置_NT_SYMBOL_PATH环境变量到https://msdl.microsoft.com/download/symbols。搞定!
现在打开被攻击的虚拟机,我们需要打开Windows调试启动的选项。
首先我们到command prompt里把现在的启动设置复制到一个我们将编辑的新入口:
bcdedit /copy {current} /d "Debug"
这个命令会产出一个我们将要用于引用新的调试选项的GUID。现在我们开通启动选项的调试模式。
bcdedit /debug on
搞定!我们在这个虚拟机上现在拥有一个打开了调试选项的开机设置,它将会通过我们的通信文件传递信息给用于调试的虚拟机。
现在我们回到用于调试的虚拟机并打开WinDbg。去到File -> Kernel Debug并输入115200来进行通信,使用com1当接口。
重启被攻击的虚拟机,并在启动菜单里选择“Debug”。让他进入到桌面,之后通过选择
Debug -> Break 在WinDbg里创建一个中断使被调试的Windows虚拟机中断。如果WinDbg给你一个
kd> 命令行,并且被攻击的虚拟机卡住了,那恭喜你,成功中断了!
安装HackSys驱动
现在虚拟机已经被设置成可以调试,我们将要把HackSys驱动装到被攻击的虚拟机来攻击他。
驱动默认使不会很多调试信息,所以我们要打开这些调试信息。
当虚拟机被中断时,我们可以通过以下命令来改变WinDbg里的 Default Mask。
ed nt!Kd_Default_Mask 8
你可以通过在kd> 里输入 g 来继续虚拟机的运行。我们将这样做,进而安装驱动。
假设你已经有了一开头我提到的那些驱动以及安装程序,我们就可以开始装驱动了。打开OSR你可以设置浏览到驱动路径并且让服务自动开启,然后注册这个服务。当注册完成直接开始服务。
做了这些以后,WinDbg会有些调试的信息。
现在驱动安装好了并且在运行了,我们将安装HackSys驱动的符号,这样WinDbg才可以更有用。
我们可以通过以下命令在WinDbg里找到HEVD模块
最后一行就是HEVD驱动,deferred代表WinDbg没有加载任何符号。
我们可以通过以下命令打开路径调试信息来找到放HEVD的pdb的位置:
1: kd> !sym noisy
noisy mode - symbol prompts on
尝试打印全部HEVD的函数,我们可以找到Windbg需要我们放HEVD pdb文件的位置。
1: kd> x HEVD!*
SYMSRV: https://msdl.microsoft.com/download/symbols/HEVD.pdb/D241CC04CE0B472CB88B1476958369FB1/HEVD.pdb not found
SYMSRV: C:\ProgramData\dbg\sym\HEVD.pdb\D241CC04CE0B472CB88B1476958369FB1\HEVD.pdb not found
DBGHELP: c:\hacksysextremevulnerabledriver\compile\drv\vulnerable\i386\HEVD.pdb - file not found
*** ERROR: Module load completed but symbols could not be loaded for HEVD.sys
DBGHELP: HEVD - no symbols loaded
如果它没法在线找到,第二选择就是这个地方
C:\ProgramData\dbg\sym\HEVD.pdb\D241CC04CE0B472CB88B1476958369FB1\HEVD.pdb.
在调试的虚拟机上存个和你的驱动版本相同的pdb文件并且运行.reload来重新加载符号。所以你现在可以运行:
0: kd> x HEVD!*
SYMSRV: C:\ProgramData\dbg\sym\HEVD.pdb\D241CC04CE0B472CB88B1476958369FB1\HEVD.pdb - file not found
DBGHELP: HEVD - private symbols & lines
c:\symbols\HEVD.pdb\D241CC04CE0B472CB88B1476958369FB1\HEVD.pdb
a159f018 HEVD!g_UseAfterFreeObject = 0x00000000
a159f004 HEVD!__security_cookie_complement = 0x5ea60d27
a159e030 HEVD!KeTickCount = struct _KSYSTEM_TIME
a159e110 HEVD!__safe_se_handler_table = void *[]
a159e060 HEVD!_load_config_used = struct IMAGE_LOAD_CONFIG_DIRECTORY32
a159f000 HEVD!__security_cookie = 0xa159f2d8
a159f008 HEVD!__NLG_Destination = struct _NLG_INFO
a15a0006 HEVD!TriggerDoubleFetch (struct _DOUBLE_FETCH *)
a15a0be0 HEVD!TriggerNullPointerDereference (void *)
a159d059 HEVD!__SEH_epilog4 (void)
a159d3b1 HEVD!_NLG_Notify (void)
a159d014 HEVD!__SEH_prolog4 (void)
[...]
来得到所有HEVD里的符号。成功!
测试驱动
最终我们可以测试已经写好的驱动攻击来确保所有的东西正常运行,然后编写我们自己的攻击。
它可以通过pool overflow攻击来使用系统权限打开cmd.exe。准备完毕,下一个阶段,让我们开始逆向吧!
本文由看雪论坛 wx_rd.cheung 原创,转载请注明来自看雪社区