调用堆栈是 EDR 产品中一个不被重视但往往非常重要的遥测来源。它们可以为事件提供重要背景信息,并且是区分误报和真报的极其强大的工具(尤其是对于凭证盗窃事件,例如句柄访问 lsass)。
例如,攻击者通常通过注入代码驻留在内存中。这种未备份或浮动的内存将在进行 API 调用时显示在调用堆栈中,并且显得非常异常。
已经有一些关于欺骗调用堆栈的公开研究(最著名的是 https://github.com/mgeeky/ThreadStackSpoofer 和 https://github.com/Cracked5pider/Ekko),但这些研究似乎主要集中于隐藏睡眠线程的调用堆栈以免受 AV/EDR 检测(例如 Cobalt Strike 睡眠掩码)。
这与主动欺骗 EDR(或 ETW 提供程序)从内核驱动程序为特定 TTP 记录虚假调用堆栈形成对比,比如打开 lsass 的句柄以准备转储凭据。这篇博文将演示一种 PoC 技术,该技术将允许使用任意调用堆栈(即真正的调用堆栈欺骗器)调用 NtOpenProcess。
技术演练
Windows 内核提供了许多回调函数供 AV/EDR 驱动程序订阅&#