扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
对注入放火墙驱动程序的思考
当在防火墙驱动程序中注入一个内核级漏洞时,将需要考虑很多问题。我们将要示范的漏洞是由处理DNS反馈信息过程引起的,DNS反馈信息是由SYMDNS.SYS处理的。如果DNS处理过程不能成功返回,那么就不能用socket来通信。在研究这个问题之前,首先必须理解多种协议层的通信机制。
下面是网络层的概要:
1).网络驱动程序接口规范(Network Driver Interface Specification Layer)
NDIS 为从物理设备到网络传输提供一个通路
NDIS驱动程序直接与网络适配器打交道。
2).网络协议层(Network Protocol Layer)
此处为 TCP/IP. (TCPIP.SYS)
3).传输层驱动接口(Transport Driver Interface Layer)
TDI为网络协议、客户端协议、以及网络API例如Winsock提供接口。
4).网络应用程序接口(Network API Layer)
网络应用程序接口例如Winsock,为网络应用程序提供编程接口。
所有基于主机的放火墙的限制策略都工作在内核模式,通常可以通过TDI过滤驱动程序或者 NDIS 挂钩过滤驱动程序。虽然我没有见过这一类的放火墙产品,但是挂钩AFD接口也是可能的。
我们所面对的问题:SYMDNS.SYS必须返回到TDI过滤驱动程序SYMTDI.SYS,不幸的是一旦执行我们的shell code,通信就不会结束。这里有一些的解决方案:
(a) “clean” 返回
Clean返回包括在没有出现BSOD的情况下从shell code返回,有包括能继续正常的通信,这个是很难实现的。经过攻击后的堆栈不是处于最佳状态,所以必须返回到原来堆栈桢的状态
(b) 卸载 TDI 或者 NDIS 的过滤驱动
卸载过滤驱动是另外一个可行的方法。我们可以很方便的调用驱动程序的卸载程序,这就相当于从DriverEntry程序调用DriverObject->DriverUnload。这个驱动程序的偏移地址可以通过目标驱动程序的DRIVER_OBJECT获得。
如果DriverUnload的成员DRIVER_OBJECT为空,意味目标驱动程序的卸载程序不存在。DRIVER_OBJECT可以被DEVICE_OBJECT的成员所引用,可以通过把驱动程序名作为参数传递给IoGetDeviceObjectPointer,取得指向DEVICE_OBJECT的指针。
(c) 分离或删除驱动程序(Detach/delete the devices)
驱动可以通过调用 IoAttachDevice 或 IoAttachDeviceToDeviceStack 把自身的设备对象附加到其它设备,因而对原始设备的请求首先被传递到立即设备。我们可把DEVICE_OBJECT作为参数传递给IoDetachDevice来分离驱动程序,有可以把DEVICE_OBJECT作为参数传递给IoDeleteDevice来移除设备。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。