10
Fuzzing Windows
驱动
对于
hacker
来说,攻击
Windows
驱动程序已经不再神秘。从前,驱动程序常被远程溢出,而
如今驱动漏洞越来越多的用于本地提权。
在前面我们使用
Sulley
找出了
WarFTPD
的溢出漏洞
。
WarFTPD
在远程的机器上由一个受限的用户启动,我们在远程溢出它之后,就会获得一个受限的权限,这个权限一般是很小的,如果似乎,很多信息都无
法获取,很多服务都访问不了。如果这时候我们拥有一个本地驱动的
exploit
,那就能够将权限提升到系统级别,
you are god now!
驱动在内核模式下运行,
而我们的程序在用户模式下运行,
为了在两种模式之间进行交互,
就要使用
IOCTLs
(
input/output controls
)
。
当
IOCTLs
处理代码有问题的时候,我们就能利用它获取系统权限。
接下来,我们首先要介绍下如何通过实现
IOCTLs
来和本地的设备进行联系,并且尝试使用
Immunity
变形
IOCTLs
数据。然后,学会使用
Immunity
提供的
driverlib
库获取驱动信息,以及从一个编译好的驱动文件中解码出重要的控制流程,设备名,和
IOCTL
代码。最后用从
drivelib
获得的数据构建测试数据,使用
ioctlizer
(我写的一个驱动
fuzzer
)进行一次
driver fuzz
。
10.1
驱动通信
几乎每个在
Windows
上注册了的驱动程序都有一个设备名和一个符号链接。用户模式的程序能够通过符号链接获得驱动的句柄,然后使用这
个句柄和驱动进行联系。具体函数如下:
HANDLE WINAPI CreateFileW(
LPCTSTR lpFileName,
DWORD
dwDesiredAccess,
DWORD
dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttribute
DWORD
dwCreationDisposition,
DWORD
dwFlagsAndAttributes,
HANDLE
hTemplateFile
);
第一个参数,填写文件名或者设备名,这里填写目标驱动的符号连接。
dwDesiredAccess
表示访问方式,读或者写(可以既读又写,也可以
不读不写)
,
GENERIC_READ
(0x80000000)
读,
GENERIC_WRITE
(0x40000000)
写。
dwShareMode
这里设置成
0
,表示在
CreateFileW
返回并且
安全关闭了句柄之后,
才能访问设备。
lpSecurityAttributes
设置成
NULL
,
表示使用默认的安全描述符,
并且不能被子进程继承。
dwCreationDisposition
参数设置成
OPEN_EXISTING (0x3)
,表示如果设备存在就打开,其余情况返回错误。最后两个参数简单的设置成
NULL
。
当
CreateFileW
成功返回一个有效的句柄之后,我们就能使用
DeviceIoControl
(由
kernel32.dll
导出)传递一个
IOCTL
给设备。
BOOL WINAPI DeviceIoControl(
HANDLE hDevice,
DWORD
dwIoControlCode,
LPVOID lpInBuffer,
DWORD
nInBufferSize,
LPVOID lpOutBuffer,
DWORD
nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped
);
第一个参数由
CreateFileW
返回的句柄。
dwIoControlCode
是要传递给设备启动的
IOCTL
代码。这个代码决定了调用驱动中的什么功能。参
数
lpInBuffer
指向一个缓冲区,
包含了将要传递给驱动的数据。
这个缓冲区是我们后面要重点操作的地方,
fuzz
数据将存在这。
nInBufferSize
为传
递给驱动的缓冲区的大小。
lpOutBuffer
和
lpOutBufferSize
,和前两个参数一样,不过是用于接收驱动返回的数据。
lpBytesReturned
为驱动实际返
回的数据的长度。最后一个参数简单的设置成
NULL
。
现在对于驱动的交互,大家应该不陌生了,接下来就祭出我们的
Immunity
,用它
Hook
住
DeviceIoControl
然后变形输入缓冲区内的数据,最
后
fuzzing every driver
。
10.2
用
Immunity fuzzing
驱动
我们需要使用
Immunity
强大的调试功能,挂钩住
DeviceIoControl
函数,在数据到达目标驱动之前,截获它们,这就是我们
Driver Fuzzing
的