巅峰极客丨如何使用ThreadStackSpoofer隐藏Shellcode的内存分配行为

0收藏

0点赞

浏览量:308

2021-11-29

举报

关于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寄存器存储其指向。为了在堆栈上找到它们,我们需要首先收集帧指针,然后取消对它们的引用以进行覆盖:

*(PULONG_PTR)(frameAddr + sizeof(void*)) = Fake_Return_Address;

工具下载

广大研究人员可以使用下列命令将该项目源码克隆至本地:

git clone https://github.com/mgeeky/ThreadStackSpoofer.git

工具使用

使用样例

C:\> ThreadStackSpoofer.exe <shellcode> <spoof>

其中:

<shellcode>:Shellcode的文件路径;

<spoof>:“1”或“true”代表启用线程栈内存欺骗,其他参数表示禁用该技术;

欺骗Beacon的线程调用栈示例

PS D:\dev2\ThreadStackSpoofer> .\x64\Release\ThreadStackSpoofer.exe .\tests\beacon64.bin 1
[.] Reading shellcode bytes...
[.] Hooking kernel32!Sleep...
[.] Injecting shellcode...
[+] Shellcode is now running.
[>] Original return address: 0x1926747bd51. Finishing call stack...
===> MySleep(5000)
[<] Restoring original return address...
[>] Original return address: 0x1926747bd51. Finishing call stack...
===> MySleep(5000)

 

[<] Restoring original return address...

[>] Original return address: 0x1926747bd51. Finishing call stack...

工具使用演示

下面的例子中,演示了没有执行欺骗技术时的堆栈调用情况:

开启线程堆栈欺骗之后的堆栈调用情况如下图所示:

上述例子中,我们可以看到调用栈中最新的帧为MySleep回调。我们可以通过搜索规则查找调用堆栈未展开到系统库中的线程入口点:

kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21

上图所示为未修改的Total Commander x64线程。正如我们所看到的,它的调用堆栈在初始调用堆栈帧方面与我们自己的调用堆栈非常相似。

项目地址

ThreadStackSpoofer:GitHub传送门

参考资料

https://www.arashparsa.com/hook-heaps-and-live-free/

https://github.com/mgeeky/ShellcodeFluctuation

https://twitter.com/namazso

https://docs.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-rtllookupfunctionentry

https://docs.microsoft.com/ru-ru/windows/win32/api/winnt/nf-winnt-rtlvirtualunwind

https://github.com/mgeeky/unhook-bof

https://github.com/Cobalt-Strike/unhook-bof/pull/1

https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-160

https://github.com/mic101/windows/blob/master/WRK-v1.2/base/ntos/rtl/amd64/exdsptch.c

https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#the-pdata-section

https://github.com/hzqst/unicorn_pe/blob/master/unicorn_pe/except.cpp#L773


(来源:FreeBuf)

(原文链接:https://www.freebuf.com/articles/system/305486.html

发表评论

点击排行

钓鱼邮件-如何快速成为钓鱼达人

一、前言在大型企业边界安全做的越来越好的情况下,不管是 APT 攻击还是红蓝对抗演练,钓鱼邮件攻击使用的...

【渗透实战系列】| 1 -一次对跨境赌博类APP的渗透实战(getshell并获得全部数据)

本次渗透实战主要知识点:1.app抓包,寻找后台地址2.上传绕过,上传shell3.回shell地址的分析4.中国蚁剑工...

HTTPS - 如何抓包并破解 HTTPS 加密数据?

HTTPS 在握手过程中,密钥规格变更协议发送之后所有的数据都已经加密了,有些细节也就看不到了,如果常规的...

无线电安全攻防之GPS定位劫持

一、需要硬件设备HackRFHackRF 连接数据线外部时钟模块(TCXO 时钟模块)天线(淘宝套餐中的 700MHz-2700MH...

记一次Fastadmin后台getshell的渗透记录

1.信息搜集先来看看目标站点的各种信息后端PHP,前端使用layui,路由URL规则看起来像ThinkPHP,那自然想到...

华为防火墙实战配置教程,太全了

防火墙是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出。防火墙是系...

ADCS系列之ESC1、ESC8复现

对原理感兴趣的可以去https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf看原文,这里只...

【干货分享】利用MSF上线断网主机的思路分享

潇湘信安&nbsp;Author 3had0w潇湘信安一个不会编程、挖SRC、代码审计的安全爱好者,主要分享一些安全经验、...

扫描二维码下载APP