2.4 绕过安全和取证软件
为了在网络上与C&C服务器通信、发送垃圾邮件和执行DDoS攻击的同时避开安全软件,Festi依赖于Windows内核模式下实现的TCP/IP协议栈。
为了发送和接收数据包,该恶意软件根据所使用的协议类型打开\Device\Tcp或\Device\Udp设备的句柄,使用一种相当有趣的技术在不引起安全软件注意的情况下获取该句柄。在设计这种技术时,Festi的作者再次展示了对Windows系统内部的高超理解。
为了控制对主机上的网络访问,一些安全软件通过拦截IRP_MJ_CREATE
请求来监视对这些设备的访问,当有人试图打开一个句柄来与设备对象通信时,这些请求被发送给传输驱动程序。这允许安全软件确定哪个进程试图通过网络进行通信。一般来说,安全软件监控设备对象访问的最常见方式有:
- 连接
ZwCreateFile
系统服务处理程序,拦截所有打开设备的尝试。 - 附加到\Device\Tcp或\Device\Udp以拦截发送的所有IRP请求。
Festi巧妙地绕过了这两种技术,通过网络与远程主机建立连接。
首先,Festi没有使用ZwCreateFile
系统服务的系统实现,而是实现了自己的系统服务,其功能几乎与最初的系统服务相同。图2-10显示了ZwCreateFile
例程的自定义实现。
图2-10 ZwCreateFile
例程的自定义实现
你可以看到Festi手动创建了一个file对象来与被打开的设备通信,并直接向传输驱动程序发送一个IRP_MJ_CREATE
请求。因此,所有连接到\Device\Tcp或\Device\Udp的设备都会错过请求,安全软件也不会注意到这一操作,如图2-11所示。
在图2-11的左侧,你可以看到IRP是如何正常处理的。IRP包经过完整的驱动程序栈,和所有钩在其中的驱动程序—包括安全软件—接收IRP包并检查其内容。图2-11的右侧显示了Festi如何绕过所有中间驱动程序,直接将IRP包发送到目标驱动程序。
图2-11 绕过网络监控安全软件
Festi同样巧妙地避开了第二种安全软件技术。要直接向\Device\Tcp或\Device\Udp发送请求,恶意软件需要指向相应设备对象的指针。负责此操作的代码片段如代码清单2-6所示。
代码清单2-6 实现网络监控安全软件绕过技术
Festi通过执行ObReferenceObjectByName
例程来获得一个指向tcpip.sys的指针。该例程是一个没有文档记录的系统例程,一个带有目标驱动程序名称的Unicode字符串的指针作为参数传递。然后,恶意软件遍历与驱动程序对象对应的设备对象列表,并将其名称与\device \Tcp❸和\ Device\Udp❹进行比较。
当恶意软件以这种方式获取打开设备的句柄时,它就会使用该句柄通过网络发送和接收数据。虽然Festi能够避免使用安全软件,但通过使用运行在比Festi更低级别(例如,在网络驱动接口规范(NDIS)级别)的网络流量过滤器,有可能看到它发送的数据包。