0x01 前言

Nighthawk于2026年7月16日宣布Nighthawk 1.0发布,代号为Apex,Apex是顶峰的意思,之前版本号都是0.x系列,本次是1.0,足见MDSec团队对此次更新是相当满意

Nighthawk堪称世界顶级C2之一,在某些底层对抗场景中,甚至比Cobalt Strike还要硬核,本文就来拆解一下,目前世界最顶级的C2在使用哪些Evasion技术

如果你是红队,可以参考它的技术扩展自己的C2,如果你是蓝队,可以参考它的技术提取检测特征

0x02 介绍

2.1 UI重构

基于Avalonia重构客户端,Avalonia是一个开源的、跨平台的.NET UI框架,一套CSharp代码,可以构建运行在Windows、MacOS、Linux、iOS、Android以及Web上的现代桌面和移动端应用程序

关于Nighthawk的UI部分,MDSec提到了2点优势:

  1. 可以同时开启多个窗口,一个用于Hidden Desktop Session监控桌面,一个用于交互式Terminal操作
  2. 前端UI的每个元素都可以通过配置文件配置,包括字体、布局、颜色、背景等等

这对于想开发C2的同学,可以借鉴参考

2.2 可躲避CET的调用栈伪装技术

这里涉及到了CET,有些同学可能没听过,先介绍一下CET

CET

CET(Control-flow Enforcement Technology),控制流强制技术,是Intel/AMD公司在CPU层面实现的防御技术

我们都知道CPU执行call指令时,会将返回地址压入栈中,对于开启CET的进程,CPU在执行call指令时,会同时将返回地址压入用户栈(RSP)和影子栈(SSP),当执行ret指令时,CPU会强制比较RSP和SSP的值是否一致,如果不一致则会抛出异常并强行终止进程

至于SSP所在的内存,是由Windows内核专门分配,且受CPU硬件强行保护的一块特殊虚拟内存页

技术1:gadgets

这是2个可躲避CET的调用栈伪装技术中的一个,另一个MDSec团队命名为syscalls

MDSec团队声称,早在2024年,随着操作系统和硬件对CET的支持日益普及,他们就意识到CET是必须解决的难题,于是他们在2024年11月的v0.4版本中,对beacon内部的很多免杀技术添加了CET支持,因此可以注入到开启CET的进程,如Edge、Chrome(例如执行Syscall时的Stack Spoofing、Thread Hijacking在未适配CET前,是直接修改内存或栈帧的,直接修改内存或栈帧会导致和影子栈不一致,触发CET,进而导致进程崩溃,所以添加CET支持可以绕过影子栈,不让程序崩溃)

其中一项没添加CET支持的是beacon进入睡眠时的Stack Masking

在2025年9月,他们借助Process Instumentation Callback技术,可以在NHLoader加载Nighthawk本体的过程中绕过CET,以及sRDI期间加载任何第三方DLL时绕过CET,这在当时是第一个实现这个技术的商业或开源Implant,然而有一个缺点,就是在beacon睡眠时的Stack Masking不支持CET

Nighthawk 1.0引入的2个新的技术gadgets和syscalls,都支持兼容CET的睡眠时Stack Masking,可应用在Nighthawk本体和后渗透工具中

其中gadgets技术用到了COOP(伪造面向对象编程),复用内存中已有的小的代码片段:https://www.matteomalvica.com/blog/2022/09/22/bypassing-intel-cet-counterfeit-objects/

技术2:syscalls

这项技术允许对syscall进行混淆,包括由导入函数发起的syscall,相比gadgets技术关键的不同是,混淆发生在通往内核的入口

这部分内容本来已经翻译了,不过主要是讲在Nighthawk中如何使用,参考意义不大,还是删掉,有兴趣可以看原文,其中提到的通过汇编指令动态计算偏移,值得学习

2.3 BOF加载器改进

早在2023年9月份的0.2.6版本中,MDSec团队为PE和COFF的执行添加了Module Stomping支持,用于规避PE执行或COFF执行时memory private的问题,使用Module Stomping后,函数的返回地址最终落在了合法dll的地址空间中,但现代EDR不仅检查返回地址,在x64 Windows中,SEH和栈展开依赖.pdata节的metadata,里面记录着每一个函数的起始地址,以及应该如何恢复栈帧,如果module-stomped code没有相应的metadata,则视为恶意代码

本次发布添加了在Module-Stomped过程中,对.pdata节中metadata的支持,提供了一个更高级的Module Stomping

2.4 新的NHLoader功能

  1. 新的二进制文件感染技术,可以嵌入或分离payload在感染的二进制文件中
  2. 支持在感染的二进制文件中以多种形式编码shellcode,包括BMP、base32、WAV、PNG、XML
  3. 支持读取shellcode从大量额外的位置,包括备用文件(可以ini配置文件,或者ADS数据流等等)、URL、注册表
  4. 一个新的持久化模式,除了服务二进制和COM hijacking DLLs外,还允许注册新的WMI事件订阅,或者任务计划创建
  5. 对命令行下json配置提供新的支持

2.5 其他改进

  1. C2监听器用.NET重写允许多个监听器共享同一个端口
  2. API支持对于,除了发送给beacon之前修改请求,返回给操作者之前修改相应,还可以接收提醒拦截命令的运行
  3. 重新引入spri和stag命令,用于在报告期间的日志输出中标记重要事件
  4. 添加了对Cobalt Strike BeaconDownload API的支持
  5. 大量bug修复用于增强性能和稳定性

0x03 尾语

所以一个顶级的Implant应该是什么样:

经典三部曲是:
VirtualAlloc + memcpy + CreateRemoteThread

VirtualAlloc -> 换成Module Stomping + Unwind Data Masking
参考:https://github.com/klezVirus/BYOUD

CreateRemoteThread -> 换成Thread Hijacking

Sleeping Masking

每一个API的调用 -> 换成Indirect Syscall + syscall时Stack Spoofing

Process Instumentation Callback是Windows操作系统内核中一个未公开文档的功能,它允许用户态程序在内核即将返回用户态时,拦截并接管执行流程,借助Process Instumentation Callback实现载入时兼容CET

借助COOP实现睡眠时Stack Masking兼容CET
参考:https://www.matteomalvica.com/blog/2022/09/22/bypassing-intel-cet-counterfeit-objects/