2022年6月28日:微软已推出补丁,阻止打开 MsMpEng.exe 令牌的句柄,因此本工具的 KillDefender 部分不再可用。Backstab 仍应有效。尚不清楚补丁 ID,可能在未打补丁的旧系统上仍可工作。已在 Win10 21H2 和 Win11 上验证。
这是一个结合了 Yaxser 的 Backstab 和 pwn1sher 的 KillDefender 的 Beacon 对象文件实现,用于 Cobalt Strike。

KDStab 是一款后渗透工具,用于击败 Windows Defender(理论上也可用于其他安全解决方案,但未经测试),从而让其他后渗透工具在使用时减少被检测的风险。它利用 Backstab 和 KillDefender 实现这一目的,两者均通过 kdstab 的 Cobalt Strike 命令在适当时调用。
KDStab 已在 x64 Windows 10、Windows 11 和 Server 2019 上成功测试。
KDStab 需要管理员或系统级访问权限。
主要功能:
检查进程的完整性级别

剥离进程的特权并将其令牌设置为不可信

/STRIP 命令的结果

杀死受 PPL 保护的进程

我在 pwn1sher 的 KillDefender 发布后不久偶然发现了它,觉得它很厉害;除了让 MsMpEng.exe(Defender)失效外,它还保持进程运行,这在 OPSEC 角度看来是可取的(此外,WinDefend 服务的默认行为是在失败时重启 MsMpEng.exe——这个特性稍后会很有用)。
虽然在渗透测试中让 Defender 失明很棒,但作为专业人员,我们有责任将客户的资产恢复到我们发现时的状态;此外,我们并不希望因为 Kill(ed)Defender 而让他们的系统暴露给其他攻击者。
问题在于“恢复” MsMpEng.exe 到工作状态非常困难。KillDefender 的工作原理是剥离目标进程的特权(如 SeDebugPrivilege 等),并将其令牌完整性设置为不可信。你不能简单地“重新提升”令牌到系统级并恢复特权,必须杀死进程并启动一个新实例。当然,MsMpEng.exe 同时也是 PsProtectedSignerAntimalware-Light 进程,即使作为系统也无法直接结束进程。令人沮丧的是,TrustedInstaller 组最近已从 MsMpEng.exe 中移除(你可以找到其他相关研究),使得这种长期以来用于真正杀死 MsMpEng.exe 进程(或 WinDefend 服务)的技术失效。在这种情况下,唯一看似可行的选择是重启机器,这可能会给客户带来问题,尤其是在服务器和域控制器上。
带着这个问题,我开始研究并很快找到了 Yaxser 的 Backstab。Backstab 能够通过利用 ProcExp 驱动程序杀死受 PPL 保护的进程;这是一个 Microsoft 签名的 sysinternals 驱动程序,对我们有利。Backstab 确实执行了一些 OPSEC 不安全的操作;它将驱动程序写入磁盘并创建注册表项。但是,如果 Defender 已经失明……:)。
我着手将这两个工具移植到 BOF 格式,以便通过 Cobalt Strike Beacon 使用,而无需将它们写入磁盘(原始的 Backstab 二进制文件在运行时被 Defender 阻止)。
我是 C/C++ 和编写 BOF 的新手,在过程中学到了很多。你会在代码中发现一些不一致之处(比如 Backstab_bof 在 Linux 上使用 gcc 编写和编译,而 KillDefender_bof 在 Visual Studio 中编写和编译),这是由于我在创建过程中的学习所致,但我已经进行了大量测试以确保功能,并且在 aggressor 脚本中构建了许多约束,以确保对 BOF 的正确使用和输入。希望这个工具对你有用。
对工具的源代码进行了一些值得注意的更改,并做出了一些编程选择,在此说明:
我没有尝试为 x86 编译这两个工具;如果你确实需要此工具的 x86 版本,请自行解决。
使用 gcc 编译 Backstab_bof:
x86_64-w64-mingw32-gcc -o backstab.x64.o -Os -c main.c -DBOF -D_UNICODE
确保已将 mingw 更新到最新版本!我之前遇到过版本中头文件过时的问题,但最新版本的头文件是正确的。
使用 x64 本机命令提示符编译 KillDefender_bof:
cl.exe /c /GS- /TP killdefender_bof.cpp /FoKillDefender.x64.o