实验性的 Windows x64 内核 Rootkit。
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/eversinc33/Banshee
Banshee项目简介
Banshee是一个Windows Rootkit的实现,用于学习内核驱动程序的开发。Banshee主要实现以下技术:
技术点
- Windows Rootkit技术
- 内核驱动程序开发
- Direct Kernel Object Modification(DKOM)
项目用途
- 通过调用ZwTerminateProcess函数在内核模式下终止任何进程
- 通过设置内核回调到进程创建来“屏蔽”进程,如果目标进程被创建,Banshee会将目标进程的CreationStatus设置为STATUS_ACCESS_DENIED。
- 通过修改EPROCESS结构体来更改任何进程的保护级别
- 将任何进程令牌提升到SYSTEM
- 隐藏任何进程
由于该项目的代码质量较差,该项目主要用于教育目的。可以将Banshee集成到您的工具中,在您的项目中包含Banshee.hpp文件,调用相应函数即可。Banshee的功能可以通过BansheeClient.exe来测试,但需要注意的是,该项目可能会导致蓝屏,建议在虚拟机中运行。
猫头鹰

最近学习了一些关于Windows rootkit的知识,这里是我自己实现的一些技术。有关概述,请参见下面的特性。
由于代码质量不好,我只是在学习内核驱动程序开发,因此主要是为了教育目的,不适用于实际使用。
什么是Rootkit?
http://phrack.org/issues/55/5.html
用法
您可以将猫头鹰集成到您的工具中,方法是在您的项目中包含Banshee.hpp文件,例如:
Banshee banshee = Banshee();
banshee.Install(driverPath);
banshee.Initialize();
int targetPid = GetDefenderPID(); // 这将是您的实现
banshee.IoCtlKillProcess(targetPid); // 指示猫头鹰杀死目标进程
所有特性的示例实现在./BansheeClient/BansheeClient.cpp的命令行客户端中找到。

测试和调试驱动程序
您需要启用测试签名才能加载驱动程序。我还建议为内核启用调试。
从管理员提示符运行以下命令,然后重新启动:
bcdedit /set testsigning on
bcdedit /debug on
之后,您可以在编译解决方案后使用以下命令运行客户端:
.\x64\Debug\BansheeClient.exe C:\Users\eversinc33\source\repos\Banshee\x64\Debug\Banshee.sys
在虚拟机中运行此命令并创建快照。在开发时可能会经常出现蓝屏并可能会损坏系统。请注意。
特性
让我们所有人都进入内核空间!
通过PID杀死任何进程
从内核空间简单地调用ZwTerminateProcess来终止任何进程。
“埋葬”进程
终止进程,但它们会复活?通过设置内核回调来避免它重启以埋葬进程创建。
如果创建目标进程,则Banshee将将目标进程的CreationStatus设置为STATUS_ACCESS_DENIED。
匹配不区分大小写的子字符串 - 例如,要阻止defender,请使用defender运行bury,然后kill <defender pid>,它将不再返回,因为所有具有defender的映像完整路径的进程创建事件都将被阻止。
对于此功能,必须在链接时指定INTEGRITYCHECK(https://learn.microsoft.com/en-us/cpp/build/reference/integritycheck-require-signature-check?view=msvc-170)。
通过PID更改任何进程的保护级别
这是通过修改描述进程属性的内核对象EPROCESS结构完成的。它还保存一个指定进程保护级别的值。
在我的机器上,该值可以在偏移量0x87a找到。由于该偏移量是动态的,因此我们可以从PspIsProtectedProcessLight中动态解析它,而不是硬编码它(感谢@never_unsealed的技巧):

由于我们在Ring 0中操作,因此可以直接修改此值(即直接内核对象修改或DKOM)。
不同保护级别的值可以在Windows Internals Part 1(第7版(英文)第115页)中找到。
将任何进程令牌提升为SYSTEM
EPROCESS还保存了当前访问令牌的指针,因此我们只需将其指向例如进程4(SYSTEM)的令牌即可将任何进程提升为SYSTEM。
隐藏PID进程
同样,EPROCESS对此有所帮助-它包含一个名为ActiveProcessLink的双向链接列表的LIST_ENTRY,Windows通过查询此列表来枚举正在运行的进程。如果我们简单地取消链接一个条目,我们就可以将我们的进程从Process Monitor或任务管理器等工具中隐藏。
*这可能会导致蓝屏,例如当隐藏的进程关闭或由于Patchguard扫描内核内存而关闭时。
待办事项* 从内核空间进行Shellcode注入
- ETW提供程序禁用,如https://securityintelligence.com/posts/direct-kernel-object-manipulation-attacks-etw-providers/
- 注册表键和文件保护
- MSR挂钩,如https://www.cyberark.com/resources/threat-research-blog/fantastic-rootkits-and-where-to-find-them-part-1
- GPU恶作剧
- 可用性
- 直接TCP通信以绕过
netstat等 - 锁定,取消引用等-基本稳定性
- 仅在特殊场合隐藏,例如打开任务管理器,以避免PatchGuard崩溃
- 如上所述,在phrack文章中进行后门验证
鸣谢
- 一些偏移代码来自:https://github.com/Idov31/Nidhogg
- 驱动程序的出色介绍:https://www.codeproject.com/articles/9504/driver-development-part-1-introduction-to-drivers
- 技术概述:https://www.cyberark.com/resources/threat-research-blog/fantastic-rootkits-and-where-to-find-them-part-1
- WinDbg和Windows Internals书籍帮助我(有点)理解我在这里做什么