关于ThreadStackSpoofer
ThreadStackSpoofer它是一种先进的内存规避技术,可以帮助研究人员或红色/蓝色团队更好地隐藏注入的内存Shellcode为避免被扫描程序或分析工具检测到内存分配行为。
ThreadStackSpoofer实现线程堆栈欺骗技术的示例,旨在避免恶意软件分析、反病毒产品和EDR检查线程调用堆栈Shellcode引用帧。其思想是隐藏线程调用堆栈Shellcode从而伪装包含恶意代码的内存分配行为。
在这个工具的帮助下,它可以帮助现有的商业C2提高产品安全性,协助红队研究人员开发更好的安全产品/工具。
工具运行机制
ThreadStackSpoofer如下所示:
- 读取文件Shellcode的内容;
- 从dll获取所有必要的函数指针,然后调用SymInitialize;
- 设置kernel32!Sleep狗,并指向我们的回调;
- 通过VirtualAlloc memcpy CreateThread注入并启动Shellcode。线程应该通过我们的runShellcode为了避免线程StartAddress节点进入一些事故或异常的地方(例如ntdll!RtlUserThreadStart 0x21);
- 当Beacon当我们眠,我们的MySleep回调会被调用;
- 接下来,我们将栈内存中返回的最新地址重写为0;
- 最后,会发送一个针对:SleepEx的调用来让Beacon继续等待后续连接;
- 休眠后,我们将恢复以前存储的原始函数返回地址,并继续执行悬挂任务;
函数返回地址将分散在线程堆栈内存区周围,由RBP/EBP存储器的方向。为了在堆栈中找到它们,我们需要先收集帧指针,然后取消它们的引用来覆盖它们:
工具下载
大多数研究人员可以使用以下命令将项目源代码克隆到当地:
工具使用
使用样例
其中:
- <shellcode>:Shellcode文件路径;
- <spoof>:“1”或“true”代表线程栈内存欺骗,其他参数表示禁用该技术;
欺骗Beacon线程调用栈示例:
演示工具
在以下例子中,展示了未执行欺诈技术时的堆栈调用情况:
打开线程堆栈欺骗后的堆栈调用如下图所示:
在上面的例子中,我们可以看到最新的帧被调用到栈中MySleep回调。通过搜索规则,我们可以找到调用堆栈未扩展到系统库的线程入口点:
上图为未修改的Total Commander x64线程。正如我们所看到的,它的调用堆栈在初始调用堆栈帧方面与我们自己的调用堆栈非常相似。
项目地址
ThreadStackSpoofer:【GitHub传送门】