关于Banshee: 自动化Windows x64内核Rootkit
什么是Rootkit?
链接:http://phrack.org/issues/55/5.html
使用
您可以将Banshee集成到您的工具中,方法是在项目中包含Banshee.hpp文件,例如:
<code>Banshee banshee = Banshee(); banshee.Initialize(); int targetPid = GetDefenderPID(); // this would be your implementation banshee.KillProcess(targetPid); // instruct banshee to kill the targetprocess</code>
命令行客户端中所有功能的示例实现见。/ BansheeClient/BansheeClient.cpp:
特征
大家上车,我们要去内核乐园!
- 杀死进程:ZwTerminateProcess只是从内核区域调用来终止任何进程。
- 更改保护级别:这是通过修改EPROCESS结构来完成的,该结构是描述进程属性的内核对象。它还包含一个指定进程保护级别的值。
- 将任何进程令牌提升到SYSTEM:EPROCESS还保存了一个指向当前访问令牌的指针,所以我们可以让它指向进程4(SYSTEM)的令牌,以将任何进程提升到SYSTEM。
- 枚举和擦除内核回调:目前,只有Process-和Thread-Creation内核回调被枚举,方法是解析PsSetCreateNotifyProcess/ThreadRoutine例程以到达私有Psp*例程,然后解析存储内核回调的数组的地址。使用erase,回调可以通过将函数指针指向Banshee中的空函数来删除。
- 保护驱动程序文件:通过挂接MySQL文件系统的IRP_MJ_CREATE处理程序,我们可以阻止任何进程打开我们的驱动程序文件的句柄(这可能很快就会变成过滤器驱动程序的概念)。
- 来自内核的键盘记录:使用未文档化的gafAsyncKeyState函数,我们可以从会话中解析Replikes,除了阅读内存外,不需要使用任何API调用。
- 通过SharedMemory进行通信:Banshee不像大多数驱动程序那样通过IOCTL通信,而是通过共享内存通信。这样就没有DriverObject需要注册,这将指向我们的未备份内存区域,并将直接导致反rootkit软件到我们身上。我们仍然可以使用NMI回调,但希望我计划的自定义映射器应该可以解决这个问题。
- Patchguard触发功能:这些只能与补丁保护旁路一起使用,或者在实验室环境中使用,因为它们会触发BSOD。
- 通过PID隐藏进程:EPROCESS包含一个名为LIST_ENTRY的双向链表的ActiveProcessLink,Windows会查询该链表以枚举正在运行的进程。如果我们简单地取消链接这里的一个条目,我们就可以隐藏我们的流程,不让Process Monitor或Task Manager这样的工具看到。这可能会导致蓝屏,例如当进程被隐藏时关闭,或者由于补丁保护扫描内核内存。
测试/调试驱动程序
我建议为内核启用调试。在管理提示符下运行以下命令,然后重新启动:
<code>bcdedit /debug on</code>
然后用kdmapper加载驱动程序。
然后,您可以在编译解决方案后运行客户端,例如:
<code>.\x64\Debug\BansheeClient.exe</code>
在虚拟机中运行此程序,使用WinDbg调试此虚拟机并在此之前创建快照。你可能会蓝屏很多发展时。
项目地址:
https://github.com/eversinc33/Banshee
© 版权声明
THE END
暂无评论内容