WNF注入:让EDR的线程检测彻底失明

admin 2026-08-05 04:52:32 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍了WNF回调劫持注入技术,该技术利用Windows通知设施机制,通过篡改目标进程WNF订阅的回调指针指向shellcode,并使用NtUpdateWnfStateData触发执行,全程不创建远程线程,从而绕过EDR的CreateRemoteThread检测。文章分析了技术原理、实战应用场景(如红队无文件落地、绕过线程启发式)及防御建议(如监控回调指针异常、关联内存写入与通知触发)。该技术已被真实APT组织(如BlindEagle)采用,并存在开源工具SharpWnfSuite。 综合评分: 95 文章分类: 红队,渗透测试,免杀,安全工具,实战经验


cover_image

WNF注入:让EDR的线程检测彻底失明

原创

星夜AI安全 星夜AI安全

星夜AI安全

2026年8月4日 09:08 吉林

在小说阅读器读本章

去阅读

🌈

Windows Notification Facility(WNF)回调劫持注入技术,利用系统原生通知机制触发shellcode,全程不创建远程线程,直接绕过EDR的CreateRemoteThread检测启发式。

一、技术全貌:这是什么?

WNF(Windows Notification Facility,Windows 通知设施) 是微软从 Windows 8 引入的一套内核态到用户态的异步状态通知机制。系统用它在内核与用户态组件之间推送大量低延迟事件——电源状态、网络连接变化、Shell 触发、剪贴板变更等都走这条通道。每个通知由一个 64 位的 State Name 标识,订阅者通过 NtSubscribeWnfStateChange 注册回调,发布者通过 NtUpdateWnfStateData 更新状态数据,内核随即把变更异步投递给所有订阅进程的回调函数。

WNF 回调劫持注入,正是把这套”合法通知 → 回调执行”的机制武器化:攻击者不改写任何线程创建逻辑,而是直接篡改目标进程里某个 WNF 订阅的回调指针,让它指向自己的 shellcode,再用一次普通的 NtUpdateWnfStateData 触发通知——shellcode 就在目标进程上下文里”名正言顺”地跑起来了。

这项技术已经被公开工具化(如 SharpWnfSuite / SharpWnfInject),并在 2026 年真实 APT 活动中出现:安全厂商 Cyfar 披露哥伦比亚盲鹰组织(Blind Eagle / APT-C-36)的 JC-46 升级版 AsyncRAT 就采用了”通过 NtUpdateWnfStateData 的 WNF 注入”来规避 EDR 的 CreateRemoteThread 启发式检测。

二、为什么这个技术如此重要

传统进程注入的”标准姿势”早已被 EDR 标记得明明白白:VirtualAllocEx + WriteProcessMemory + CreateRemoteThread 这套组合,几乎每一家 EDR 的线程创建遥测(Sysmon Event ID 8、各厂商的远程线程告警)都会优先捕获。

WNF 注入的精妙之处在于它根本不走这条路

  • 不创建远程线程:没有 CreateRemoteThread / NtCreateThreadEx / RtlCreateUserThread,EDR 最灵敏的”跨进程新建线程”信号直接哑火。
  • 触发是内核合法行为:shellcode 的执行由内核投递的 WNF 通知驱动,与系统正常通知(如 Shell 状态变更)在遥测层面几乎无法区分。
  • 跨进程写入可被低优处理:注入确实需要 NtWriteVirtualMemory + NtProtectVirtualMemory,但多数 EDR 对”内存写入+改保护”的告警优先级远低于”远程线程创建”,且这类操作在正常调试、注入框架里也常见,容易淹没在噪声中。

换句话说,它把攻击面从”EDR 盯得最紧的线程创建”挪到了”EDR 看得最模糊的内存写入 + 系统通知”上——这正是它能让 EDR 线程检测彻底失明的原因。

三、技术原理解析(核心部分)

WNF 的订阅信息存储在目标进程 ntdll.dll.data 段里,以 WNF_SUBSCRIPTION_TABLE 为根。Windows 10 下是一串 LIST_ENTRY 双向链表,Windows 11 起改为 RTL_RB_TREE 平衡树。每个订阅对应一个 WNF_USER_SUBSCRIPTION 结构,其中最关键的是 Callback 字段(Win10/Win11 x64 偏移均为 0x20)。

注入分三步:

技术要点 1:定位订阅表与回调指针

先在目标进程的 ntdll 数据段扫描出 WNF_SUBSCRIPTION_TABLE,再按目标 State Name 找到对应的 WNF_USER_SUBSCRIPTION。并不是所有 State Name 都能用——公开研究确认 WNF_SHEL_WINDOWSTIP_CONTENT_PUBLISHED(State Name 0x0D83063EA3BE10F5)在 Windows 11 23H2 的 explorer.exe 中注册了可用回调,是实战首选。

技术要点 2:覆盖回调指针到 shellcode

拿到 WNF_USER_SUBSCRIPTION 后,备份原始 Callback 地址,在目标进程分配 RW 内存写入 shellcode,改保护为 RX,然后把 Callback 字段覆盖为 shellcode 地址

// 概念性伪代码(基于 SharpWnfInject 公开实现,仅用于教学)
HANDLE hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE |
                           PROCESS_VM_READ, FALSE, targetPid);

// 1) 在目标进程分配 shellcode 内存
PVOID shellAddr; SIZE_T sz = sizeof(shellcode);
NtAllocateVirtualMemory(hProc, &shellAddr, 0, &sz,
                        MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

// 2) 写入 shellcode(唯一跨进程写入动作)
NtWriteVirtualMemory(hProc, shellAddr, shellcode, sizeof(shellcode), NULL);

// 3) 改可执行
DWORD old; NtProtectVirtualMemory(hProc, &shellAddr, &sz, PAGE_EXECUTE_READ, &old);

// 4) 读订阅结构里的 Callback 字段(偏移 0x20,Win10/Win11 x64)
ULONG_PTR callbackPtr = 0;
NtReadVirtualMemory(hProc, userSub + 0x20, &callbackPtr, 8, NULL);
ULONG_PTR origCallback = callbackPtr;

// 5) 劫持:把回调指向 shellcode
NtWriteVirtualMemory(hProc, userSub + 0x20, &shellAddr, 8, NULL);

技术要点 3:用合法通知触发执行并还原

回调指针就位后,不调用任何线程 API,而是让本进程(或任意能触碰该 State Name 的上下文)更新一次状态数据——内核会把通知投递给 explorer.exe 的订阅回调,shellcode 随即执行。执行完再用原始指针把 Callback 还原,抹掉痕迹:

// 触发:一次普通的 WNF 状态更新,内核回调目标进程的 shellcode
WNF_STATE_NAME name = 0x0D83063EA3BE10F5; // WNF_SHEL_WINDOWSTIP_CONTENT_PUBLISHED
BYTE dummy[8] = {0};
NtUpdateWnfStateData(&name, dummy, sizeof(dummy), 0, 0, 0, 0);

// 还原原始回调,消除内存痕迹
NtWriteVirtualMemory(hProc, userSub + 0x20, &origCallback, 8, NULL);

整条链路里唯一跨进程的”高危”动作是 NtWriteVirtualMemory 改一处指针 + 写一段 shellcode,没有 CreateRemoteThread,没有 NtQueueApcThread,也没有 SetThreadContext——EDR 线程创建类检测项全程沉默。

四、实战应用场景

  • 红队无文件落地:配合 DLL 侧加载或合法二进制,把 C2 beacon 注入 explorer.exe 等常驻系统进程,规避基于”非预期进程新建线程”的行为规则。
  • 绕过线程启发式:对依赖 CreateRemoteThread 遥测的 EDR(CrowdStrike、SentinelOne、Defender for Endpoint 的线程创建 IOA)尤为有效,这也是 Blind Eagle 在 JC-46 工具集里采用它的直接原因。
  • 持久化与横向:WNF 还支持永久性 State Name,数据在内核池中持久存活、重启后仍可从注册表恢复,可被用作反取证”隐形存储”藏匿配置或第二跳载荷。

实战中要成功,需先确认目标进程确实订阅了可用 State Name(不同 Windows 版本/架构的 State Name 枚举不同,工具需按 build 解析),并具备对目标进程的 VM_* 权限(通常需要注入进程本身有足够令牌,或借助 SeDebugPrivilege)。

五、防御对抗建议

蓝队可从”行为关联”而非”单点告警”入手:

  1. 监控 WNF 回调指针异常:对 explorer.exe 等系统进程里 WNF_USER_SUBSCRIPTION.Callback 指向非镜像内存(RX 堆/私有内存)的行为告警;关注 NtWriteVirtualMemory 改写 .data 段订阅结构。
  2. 关联内存写入 + 通知触发:单独的内存写入可能正常,但”写 shellcode → 改 RX → 改回调 → 紧接 NtUpdateWnfStateData“的时序组合极具攻击特征。
  3. 启用脚本块日志与 ETW:WNF 注入常由 PowerShell/.NET 加载器驱动,PowerShell Script Block Logging(Event 4104)+ .NET ETW 可补线程遥测的盲区。
  4. 进程权限最小化:收紧 SeDebugPrivilege 分配,阻止普通红队工具随意打开系统进程句柄。
  5. 已知良性基线:维护 explorer.exe 等进程的合法 WNF 订阅回调基线,偏离即告警。

六、技术延伸阅读(工具/GitHub 链接)

  • SharpWnfSuite / SharpWnfInject(daem0nc0re / cvlabsio):开源 WNF 回调劫持注入工具,支持 Win10/Win11、x86/x64,含详细结构解析。 https://github.com/cvlabsio/SharpWnfSuite[1]
  • WNF 内核利用研究(Alex Plaskett、Gabrielle Viala、odzhan):WNF 作为池喷射原语与内核 UAF 利用的经典论文。
  • Blind Eagle JC-46 工具链(Cyfar,2026):真实 APT 采用 WNF 注入规避 EDR 的实战披露。
  • WNF 幽灵状态与反取证(GhostWolf Lab):关于永久性 WNF 状态持久化与 WNF_SHELLEXECUTE 触发器的分析。

🌈

关注「星夜AI安全」,每天带你拆解一个真实可用的红队 / 蓝队技术。技术无止境,攻防永循环。

圈子介绍

现任职于某头部网络安全企业攻防研究部,核心红队成员。2021-2023年间累计参与40+场国家级、行业级攻防实战演练,精通漏洞挖掘、红蓝对抗策略制定、恶意代码分析、内网横向渗透及应急响应等技术领域。在多次大型演练中,主导突破多个高防护目标网络,曾获”最佳攻击手””突出贡献个人”等荣誉。

已产出的安全工具及成果包括:

  • 多款主流杀软通杀工具(兼容卡巴斯基、诺顿、瑞星、360等终端防护,无感知运行,突破多引擎联合检测)
  • XXByPassBehinder v1.1 冰蝎免杀生成器(定制化冰蝎免杀工具,绕过主流终端防护与EDR动态检测,支持自定义载荷)
  • 哥斯拉二开免杀定制版(二开优化,深度免杀,突破终端防护与EDR检测,适配多场景植入)
  • NeoCS4.9终极版(高级免杀加载工具,强化载荷注入与进程劫持,适配多系统版本,无兼容问题)
  • WinDump_免杀版(浏览器凭证窃取工具,支持Chrome/Edge/Firefox等主流浏览器,一键提取敏感数据,免杀过防护)
  • DumpBrowser_V1_免杀版(浏览器凭证窃取工具,专攻浏览器密码、Cookie、历史记录提取,免杀性能拉满)
  • fscan二开版(二开优化内网扫描工具,增强指纹精度、弱口令爆破与结果标准化输出,适配复杂内网)
  • RingQ加载器二开版(二开优化免杀加载器,支持Shellcode内存执行,绕过各类终端防护与EDR检测)
  • 多款免杀Webshell集合(覆盖PHP/JSP/ASPX,过主流WAF与终端防护,适配不同Web场景)
  • 免杀360专属加载器(支持Shellcode内存执行,针对性绕过360全系防护检测,无感知运行)
  • 一键Kill 火绒 defender 工具 HDKiller(包含源码)
  • win11 一键kill 360工具 InjectKill(包含源码)
  • win11 一键kill defender工具win11_df-killer(包含源码)
  • 免杀火绒6.0内存防护加载器BypassMemLoader
  • 单文件过360 免杀loader exe_bypass_360
  • 单文件过火绒 df 免杀loader exe_bypass_df(包含源码)
  • LNK钓鱼文件生成工具V1.0
  • EXE捆绑启动器 v2.0
  • 火绒6内存免杀加载器bypasshr6
  • 火绒一键Kill专杀工具HRKiller
  • Ring3 内存免杀工具Ring3bypasshr.exe

后续将不断更新到内部圈子中 欢迎加入圈子

引用链接

[1]https://github.com/cvlabsio/SharpWnfSuite


免责声明:

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

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

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

本文转载自:星夜AI安全 星夜AI安全 星夜AI安全《WNF注入:让EDR的线程检测彻底失明》

评论:0   参与:  0