对用于攻击CrowdStrikeEDR的0day漏洞进行逆向工程

admin 2026-04-10 02:57:08 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档详细分析了一个针对CrowdStrikeEDR的0day漏洞利用驱动。该驱动通过内核级权限绕过PPL保护机制,使用IOCTL0x22E010直接终止受保护进程。研究发现驱动有15+变种且均持有有效微软签名,VT检测率为零。作者通过逆向工程还原了procKiller函数逻辑,并公开了符号链接与PoC代码。 综合评分: 87 文章分类: 漏洞分析,恶意软件,逆向分析,红队,终端安全


cover_image

对用于攻击 CrowdStrike EDR 的 0day 漏洞进行逆向工程

haidragon haidragon

安全狗的自我修养

2026年4月7日 12:14 湖南

官网:http://securitytech.cc

#

驱动及其变种

在这张图片中,我们可以看到该驱动及其多个变种(15+ 个变种)内部代码完全相同。


📌 已识别的驱动(Identified Drivers)

所有这些驱动都由微软签名,签名有效,并且没有被任何机构阻止或吊销。


📌 VirusTotal 检测

当我们将其中一个驱动上传到 VirusTotal 时,可以看到它没有被任何杀毒软件(AV)或 EDR 厂商检测到。

链接: https://www.virustotal.com/gui/file/6fbaad2f00afaa94723fa7d5bd46e7ea4babb7ce478a8e7229ce7bd4b85e0f51/detection


🔍 逆向工程(Reverse Engineering)

现在进入逆向工程部分,我使用 IDA Pro 打开并加载了该驱动。但 IDA Pro 无法反编译驱动中的主函数(DriverEntry)。

这是一个已知问题:当驱动使用非标准栈帧,或者其入口点被混淆时,IDA 往往无法正确反编译。 因此我没有继续纠结 DriverEntry,而是直接跳到 dispatch handler(调度处理函数),因为真正有价值的逻辑在那里。


❌ DriverEntry 反编译失败


⚙️ DeviceIoControlHandler

DeviceIoControlHandler 函数虽然被反编译出来了,但代码看起来非常糟糕:

  • 使用 CurrentStackLocation 字段的原始偏移
  • 子函数没有命名
  • 变量名毫无意义

修复前


修复后(类型和命名修正后)


我们可以看到有两个 IOCTL:

  • 第一个没有深入分析
  • 第二个(0x22E010)会进入一个用于终止进程的函数,我将其命名为 procKiller

🔪 procKiller 函数

打开 procKiller 的反编译代码后,依然非常混乱,需要像之前一样进行修复。


修复前


修复后


📌 procKiller 函数流程

  1. IOCTL 输入缓冲区被当作一个以 null 结尾的 ASCII 字符串,表示十进制 PID
  2. 驱动调用 atoi() 将其转换为整数
  3. 将该整数传递给 TerminateProcess
  4. 如果成功,则向输出缓冲区写入 "ok"

👉 这就是整个接口逻辑,非常简单粗暴


⚙️ TerminateProcess 内部逻辑

该函数执行流程如下:

  1. 使用 ZwOpenProcess 根据 PID 打开目标进程并获取句柄
  2. 使用 ZwTerminateProcess 通过该句柄终止进程

❗ 为什么可以杀死 CrowdStrike

这也解释了为什么 CrowdStrike(以及其他以 PPL 方式运行的 EDR)可以被终止:

  • 在用户态: 调用 OpenProcess 访问 PPL 进程会返回 Access Denied
  • 在内核态: ZwOpenProcess不受该限制

👉 所以内核驱动可以直接干掉受保护进程


🔗 符号链接(关键缺失点)

虽然已经找到了终止进程的 IOCTL,但还缺少一个关键组件:

👉 驱动的符号链接(symbolic link)

没有它,就无法从用户态发送 IOCTL 请求。


🔍 查找符号链接(动态分析)

我采用了动态方法:

  • 加载驱动
  • 使用 WinObj 观察是否出现新的符号链接

最终成功找到了该驱动的符号链接:


📌 关键参数总结

驱动符号链接:

\\.\{F8284233–48F4–4680-ADDD-F8284233}

终止进程 IOCTL:

0x22E010

💻 创建 PoC(概念验证)

首先将符号链接和 IOCTL 定义为变量:


📌 主函数流程

  1. 使用 CreateFileW 打开设备:
   \\.\{F8284233–48F4–4680-ADDD-F8284233}
  1. 将 PID 转换为十进制 ASCII 字符串
  2. 使用 DeviceIoControl 发送 IOCTL(0x22E010)
  3. ✅ 进程被终止

main 函数(部分1)


main 函数(部分2)


🧪 测试 PoC

📥 加载驱动

首先使用 OSRLOADER 加载驱动。

也可以使用 sc.exe

sc.exe create PoisonX binPath="C:\Path\to\Driver.sys"type=kernel
sc.exe start PoisonX


▶️ 运行前


💀 运行后(进程被终止)


📎 项目地址

PoC 和驱动已发布在 GitHub: https://github.com/j3h4ck/PoisonKiller/

  • 公众号:安全狗的自我修养
  • vx:2207344074
  • http://gitee.com/haidragon
  • http://github.com/haidragon
  • bilibili:haidragonx

#


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全狗的自我修养 haidragon haidragon《对用于攻击 CrowdStrike EDR 的 0day 漏洞进行逆向工程》

评论:0   参与:  0