Zion是一套Rootkit攻防函数库,我(Liang)负责全部的攻击部分,检测部分由另一实习生同学完成,能够躲避常见的安全检测工具这是本次练习中的关键任务,针对这些流行的内核级Rootkit隐藏技术,我一一对它们进行了实现。用户可通过命令行输入特定命令,达到特定的隐藏目的,效果图如下:
目前的实现包括:
A 挂钩系统服务描述表隐藏进程与文件
用户可在用户模式下自定义挂钩函数,放在缓冲区中传入内核态。进入内核态后,程序分配一段非分页区存放该例程。利用这种方式,即使检测软件发现了SSDT HOOK的存在,也无法得知该HOOK 例程属于哪一驱动模块(因为分配的这段非分页区不在任何模块的地址空间范围中),达到了其隐藏目的。因而是本次练习的一个亮点所在。
B DKOM方式隐藏进程、驱动模块
对于DKOM,没有很好的创新思路,唯一的原则便是分析检测工具的原理,然后制定相应的执行体对象修改方案。在隐藏驱动以及注册表部分可以绕过ICESword检测。然而,IceSword检测进程使用了四种不同的方式,其中直接搜索内存的方式无法通过DKOM方式绕过。
C 驱动派遣例程挂钩方式隐藏网络连接信息
在《Subverting the Windows Kernel》中给出了隐藏TCP连接的示例代码,本次练习中我在此基础上对其进行了完善,使其能够绕过一些Anti-rootkit如IceSword 的检测(原版并不能绕过),并增加了过滤功能(例如用户可自定义需要隐藏的ip信息与端口,操作非常友好)。另外,逆向了tcpip中查询连接信息的代码,分析出UDP的相关查询结构,实现了UDP通信的隐藏。
D 文件过滤驱动实现隐藏文件或文件夹
修改自Winodws DDK的Sample Code: Sfilter。 删去了很多功能:例如,动态绑定卷等。 这种方式与驱动派遣例程挂钩原理类似,并没有实际意义,仅仅为了Zion的完整性而加入。
E 挂钩注册表储巢查询例程实现注册表隐藏
参考Pediy的《也谈rootkit 注册表信息隐藏》。
F 对检测工具的一点总结
无论是Cross-View检测技术还是扫描内核代码检测Hook的技术,要确保检测结果的正确性,就必须保证检测所采用的技术比Rootkit本身更底层。而Zion Rootkit之所以能绕过IceSword对内核模块、端口信息、注册表的检测,正是因为在隐藏手段上,Zion使用了更为底层的技术。
从本质上讲,内核态Rootkit之所以存在,是因为Windows为了提高查询操作的效率,在内核中预留了许多冗余信息,例如:Windows采用遍历 EPROCESS链表的方式枚举进程,然而CPU调度的最基本单位是线程,断链EPROCESS并不会影响到CPU对线程的调度。如果检测工具能够找到 CPU调度线程的真实链表对其进行枚举,那么得到的结果必将是准确的(这里排除了Shadow Walker这类Rootkit技术),因为一旦Rootkit断链了CPU调度线程列表,那么被断链的线程将永远得不到执行,这种操作应当视为“删除”,而非“隐藏”。
可以这么说,运行于Windows内核级的所有检测技术,永远是不可靠的。必须比内核级Rootkit优先级别高,才能真正实现可靠检测。将操作系统以虚拟化模式运行,在其之上进行实时监测,是一种比较理想的方法(如North Security Labs 推出的Hypersight RD),因为在这种情况下,Rootkit理论上不可能知道运行在其之上的检测程序的存在。(但是,对于目前最新的硬件级Rootkit,这种检测方式也是不可靠的。比如Bluepill Rootkit) - END by Liang