问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
用 Yara 对红队工具 打标(四)——cobaltstrike 生成马浅析(三)
安全工具
本篇是 "用 Yara 对红队工具 "打标"" 系列文章第七篇,是对前面 "用 Yara 对红队工具 打标(四)——cobaltstrike 生成马浅析(二)" 文章中剩余部分的一点补充。
用 Yara 对红队工具 打标(四)——cobaltstrike 生成马浅析(三) ========================================= 前言: --- 该系列文章是对 [红队知识仓库 ](https://github.com/Threekiii/Awesome-Redteam)这个高赞项目中所提到的红队工具进行 "打标"的知识分享。前面已经整理了 [用Yara 对红队工具 "打标"](https://forum.butian.net/share/1913) 、 [用 Yara 对红队工具 "打标"(二) ](https://forum.butian.net/share/1954)、[用 Yara 对红队工具 "打标"(三)——免杀类规则提取](https://forum.butian.net/share/2008),[用 Yara 对红队工具 "打标"(三)——免杀类规则提取(二)](https://forum.butian.net/share/2016),[用 Yara 对红队工具 打标(四)——cobaltstrike 生成马浅析](https://forum.butian.net/share/2070)、[用 Yara 对红队工具 打标(四)——cobaltstrike 生成马浅析(二)](https://forum.butian.net/share/2073) 这里继续跟随 [Google 云情报威胁团队开源的 YARA 规则集](https://cloud.google.com/blog/products/identity-security/making-cobalt-strike-harder-for-threat-actors-to-abuse),分析 Stagerless Payload Generator 生成的部分。  环境准备: ----- 工具:Cobalt Strike 4.7 Google 开源的 YARA 规则集:[GCTI/YARA/CobaltStrike](https://github.com/chronicle/GCTI/tree/main/YARA/CobaltStrike) Payload Generator (stageless) ----------------------------- 在上一篇中我们分析了 Payload Generator ,现在来看看 stageless 版。前面说过 stageless 就是无阶段的stager,即 stager 与它所请求的数据的集合体,所以体积会大很多,常用于内网穿透。 首先看官网介绍怎么用:  和上一次的介绍一样,都是只给了核心源码,不过这次没有了 stager 了,是完完全全的监听-通信-执行的 shellcode 代码了,同样需要我们把其加载到 msf 等工具生成的免杀框架中加载。 从参数列表中可以看到这次只有 Raw 不是纯字节码数组,相比于上次 stager 少了 COM Scriptlet、PowerShell、PowerShell Command、Veil 类型,因为这些都是纯纯的 stager 框架。  Google Yara 规则匹配: ----------------- 对于纯 code 数组的类型,在 "[用 Yara 对红队工具 打标(四)——cobaltstrike 生成马浅析(二)](https://forum.butian.net/share/2073)" 中说过 Google 的研究人员不会和这种隐晦的类型硬碰硬。这里生成了 Process 类的 64 位和 32 位来做实验,可以看到一个都没匹配,所以 thread 类型也不用尝试了。   现在我们把 Raw 类型 32 位、64 位、Process、Thread 共 4 种类型生成出来看一下匹配了谷歌那些规则:  由于匹配的规则集中不止一个规则,所以我修改了一下匹配代码,加多了打印规则部分:  匹配结果如下:  从结果集中可以发现虽然匹配了 6 行,但实际上只匹配了 2 个规则集,并且 process 和 thread 类型在规则集中没有差别。32 位匹配了 2 个规则集,64 位匹配了 1 个规则集。 Raw 类型分析: --------- ### payload64\_process.bin 同样的我们只以 64 位为例,exit 类型不影响规则匹配,所以我随便挑了 process。首先是字节码转 C 风格 16 进制数组,由于内容太多了,原先的脚本无法在控制台上全部输出,所以改成如下的写入到文件的形式: ```python import os f = open("D:\Cobaltstrike_payload\payload64_process.txt","w") file_bytes = list() for a in open("D:\Cobaltstrike_payload\payload64_process.bin","rb").read(): file_bytes.append(hex(a).replace("0x","\\x")) f.write(''.join(i for i in file_bytes)) f.close() ```  同样的把其插入到 64 位免杀框架中生成 exe 文件,运行后成功上线: ```c #include<stdio.h> #include<windows.h> #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") unsigned char shellcode[]= 这里填shellcode; void main(){ LPVOID Memory = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(Memory, shellcode, sizeof(shellcode)); ((void(*)())Memory)(); } ```  #### 转换思路——局部分析: 由于程序体积太大,短时间内无法完全分析,所以我们先来看 Google 规则中给出的部分,并在定位代码之后根据局部上下文和经验判断是否较为特殊:   #### core\_sig 规则分析: 规则中有两个要匹配的字节码,第一个看起来像是动态加载中的使用的,而第二个不是很懂,那就先定位到第一个字节码$core\_sig。 首先把前面搭配免杀框架生成的 exe 扔入 IDA 中,由于是字节码输入嵌入的动态调用,所有代码都是未反编译形式,所以我们要先用热键 P 初始化所有相关的函数引用:    通过 search 将第一块匹配的字节码定位到函数 sub\_1A1E6ED75BC 中:  该函数的反编译如下, 从逻辑上看是动态加载操作,a1 数组存的应该是函数地址,无非是 GetProcAddress 这些:  在附近函数中定位到 sub\_1D1E53071CC 函数,该函数执行的便是动态获取函数操作:   获取的 dll 是 kernel32,而最后 a1 中函数地址的顺序分别是 GetModuleHandleA、GetProcAddress、LoadLibraryA、LoadLibraryExA、VirtualAlloc、VirtualProtect  那么这一轮操作下来就是反复动态获取。。。。不过在恶意软件中也确实经常有这种操作,虽然以我的水平暂时理解不了:  ##### 规则评估 那么这个规则提取得怎么样呢?我觉得还是很好的,因为要满足这个规则首先他的相对位置要对的上,它得恰好是 var\_40 开始赋值。  第二个就是它相对 rsp 这个位置,要刚好在 rsp+88h 处就得有一样的局部变量的数量,也就是 sub rsp,80h 这个操作。  所以总得来说该规则还是很独特的。 #### deobfuscator 规则分析: 现在来看第二个 deobfuscator 规则,这代码我也不知道啥意思,先定位看看:  结果定位到 sub\_1F0636A70CC 函数中,如下所示,看上去像是一个异或加密或解密函数:  查看一下调用位置,发现回到了最外层那部分,现在我们分析前面部分来获取传入参数的含义:  第一个参数值 v10 = sub\_1F0636A713C() 中函数内容如下所示,0x5A4D 和 0X4550 分别是 MZ 和 PE,所以这是要定位到给定范围内的 PE 结构文件。 而 sub\_1F0636A70BC() 返回的 \[rsp+0\] 得关联到免杀框架层中 call Memory 那里,只有那里才是最近的 rsp 的赋值,所以这里 \[rsp+0\] 得到的是自己 shellcode 的起始位置。   所以 v5 的值是 NT 头,v8 的值不明觉厉,因为 0x8000属性是被废弃的:   接下来是 v6 = sub\_1F0636A780C(v14, v5, v10, v8) 传入的分别是前面获取的函数地址数组,NT 头,DOS 头,和不明觉厉的 v8,函数内容如下所示。 可以看到其想加载DOS的0x44位置处的模块,但是那里没有东西,所以最后调用的是 VirtualAlloc 分配了一个和该 bin 文件同样大小的镜像区域作为后续填充。  然后来到v7 = sub\_1F0636A79DC(v6, v5, v10, v4) 中,传入的参数分别是前面开辟的同样大小的内存块,NT 头,DOS 头,和调试符号数量(为0)。 函数的内容是把自己的 PE 头复制填充过去,而且由于充定位值为 0 ,里面的 IF 语句并不执行。     继续定位到 sub\_1F0636A7B9C(v14, v7, v5, v10, v3)中,传入的参数分别是函数地址数组,开辟的内存,NT 头,DOS头,v3 也是调试符号数量(为0),该函数是要分析的 sub\_1F0636A70CC 引用之一。 函数先定位到自己 bin 文件中导入表的 name 字段处复制 40 字节过去,然后调用 sub\_1F0636A70CC 函数进行异或处理,可是 a5=v3=调试符号数量(为0),所以并没有进行异或计算。   后面就交叉着走了,导入表——>DLL——>导出表——>函数地址: 1:对于前面获取的导入 dll 名,通过 LoadLibraryA 加载其基址 2:对于自身则进一步定位到桥1指向的 IAT 获取 dll 内相关导入函数名字,符号等信息。 3:对于每个获取到的导入函数名,如果是符号导入的(有函数名),则以偏移量定位的方式定位到 dll 的导出表中来获取导入函数地址。反之如果是序号导入的(无导入名),则用 GetProcAddress 函数搭配 dll 基址来获取导入函数的地址。  ##### 规则评估: 到这里基本局部分析完了,sub\_1F0636A70CC 由于第三个参数是 IMAGE\_NT\_HEADERS64->FileHeader.NumberOfSymbols 调试符号表中的符号数,而该值为 0 所以一直没有执行异或处理。  更关键的是在整个流程中这个异或函数一直很突兀,因为全部都是依据 PE 文件结构特性的操作,都是导入表、导出表、数据目录表,DOS头、NT头这些。这个异或如果根据 NumberOfSymbols 调试符号数进行异或操作的话则应该是作者有意为值,比如特定的解密什么的,因为CS生成的bin文件确实和普通文件很不一样。  所以这个规则也很不错,提取出了 PE 操作之外的特殊部分. 总结: --- 一开始的计划是先分析再看规则的,结果由于体积太大直接被绕晕了,来来回回断了好几次。最后想先放弃的时候突然想到先从规则的局部范围入手,结果还真的把第一个函数块给梳理出来了。再透过局部逻辑反观 Google 规则,便是这篇文章的由来。 上面的分析中,如有错误还请指正! 参考链接: ----- [Memory Protection Constants (WinNT.h) - Win32 apps | Microsoft Learn](https://learn.microsoft.com/en-us/windows/win32/memory/memory-protection-constants) [IMAGE\_FILE\_HEADER (winnt.h) - Win32 apps | Microsoft Learn](https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_file_header) \[Vergilius Project | 2104 21H1 (May 2021 Update)\](<https://www.vergiliusproject.com/kernels/x64/Windows> 10 | 2016/2104 21H1 (May 2021 Update)) [User-driven Attack Packages (helpsystems.com)](https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/init-access_user-driven-attack-packages.htm#_Toc65482753) <https://www.cnblogs.com/YenKoc/p/14532409.html> [IDA Help: The Interactive Disassembler Help Index (hex-rays.com)](https://hex-rays.com/products/ida/support/idadoc/index.shtml) [奇安信攻防社区-用 Yara 对红队工具 打标(四)——cobaltstrike 生成马浅析(二) (butian.net)](https://forum.butian.net/share/2073)
发表于 2023-01-05 10:44:27
阅读 ( 7450 )
分类:
安全工具
1 推荐
收藏
0 条评论
请先
登录
后评论
沐一·林
20 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!