欺骗调用堆栈以混淆 EDR

调用堆栈是 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 驱动程序订阅,以便接收有关系统事件的通知。例如,这包括进程创建/删除事件 ( PsSetCreateProcessNotifyRoutineEx )、线程创建/删除事件 ( PsSetCreateThreadNotifyRoutine ) 和对象访问 ( ObRegisterCallbacks ) 等。

许多回调都在 触发操作的线程上下文中运行 。因此,当调用内核驱动程序的进程通知例程时,它将在触发回调的进程上下文中运行(例如通过调用 CreateProcess),并在该用户进程上下文中解释用户模式虚拟地址。此外,回调将以内联方式运行;操作系统正在等待回调返回,然后才能完成目标操作,例如创建进程或新线程。下面设计的内核调用堆栈(通过内核调试从 windbg 获得)演示了这一点。这显示了在自定义 ObRegisterCallback 例程(在本例中为进程处理操作)上设置的断点,该例程通过 Outflank 的dumpert 工具

触发 :

1: kd> k
00 ffff9387`368011f0 fffff806`2e0a78cc exampleAVDriver!ObjectCallback+0x50
01 ffff9387`36801b70 fffff806`2e0a7a3a nt!ObpCallPreOperationCallbacks+0x10c
02 ffff9387`36801bf0 fffff806`2e015e13 nt!ObpPreInterceptHandleCreate+0xaa
03 ffff9387`36801c60 fffff806`2e086ca9 nt!ObpCreateHandle+0xce3
04 ffff9387`36801e70 fffff806`2e09a60f nt!ObOpenObjectByPointer+0x1b9
05 ffff9387`368020f0 fffff806`2e0f27b3 nt!PsOpenProcess+0x3af
06 ffff9387`36802480 fffff806`2de272b5 nt!NtOpenProcess+0x23
07 ffff9387`368024c0 00007ff7`ef821d42 nt!KiSystemServiceCopyEnd+0x25
08 0000000f`f4aff1e8 00007ff7`ef8219b2 Outflank_Dumpert+0x1d42
09 0000000f`f4aff1f0 00007ff7`ef821fb0 Outflank_Dumpert+0x19b2
0a 0000000f`f4aff890 00007ffd`6c317034 Outflank_Dumpert+0x1fb0
0b 0000000f`f4aff8d0 00007ffd`6d862651 KERNEL32!BaseThreadInitThunk+0x14
0c 0000000f`f4aff900 00000000`00000000 ntdll!RtlUserThreadStart+0x21

通过此回调,AV/EDR 驱动程序可以检查对象访问请求并采取直接操作,例如在需要时从请求的句柄中剥离权限位。同样,从进程或线程回调的角度来看,AV/EDR 可以检查新进程/线程并采取预防措施,例如根据某种检测逻辑/启发式方法阻止其执行(线程是否指向可疑内存?等)。

此外,为了支持调用堆栈收集有多有用的论点,上面的示例清楚地演示了直接系统调用的使用,因为在 nt!KiSystemServiceCopyEnd 之前的调用堆栈中没有列出 ntdll。

需要注意的是,ObjectCallback

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值