反沙箱CobaltStrike木马加载器分析

news/2024/11/16 7:55:39/

前言

近日,笔者参加了浙江护网,在攻击队停止攻击的那一天凌晨,Windows服务器被攻破大量失分,早晨溯源时拿到了这一份名为chrome.exe的木马样本。

木马HASH

SHA256:7fbe93d7c29b4ea4ce918f3d16a74d2930120f44d00862bdc0a1f8289954e010
MD5:a5f06c8e88e200a860e83a6bdd197752
SHA1:7e5675f8c84b800a1290dd7422be1f10c2302c4d

正文

image

这份木马被火绒报毒,从报毒界面可以得到关于此样本的两条信息,

  1. 64位Windows程序。

  2. 大概率是CobaltStrike后门。

既然很可能是CobaltStrike后门,那直接上传哈勃、微步一把梭看一看木马行为。可奇怪的是沙箱均未检测出网络连接行为,且被鉴定为安全,这激起了我的好奇心。

image

image

拖入IDA,在主函数头部发现了exit(0),则五行伪C代码很有可能是反沙箱的代码,若是沙箱直接exit,非沙箱执行下边的解密、执行操作。

为验证这五行代码是否起到我预料的效果,我用c实现了一份类似功能的exe准备传入微步沙箱,若微步沙箱的程序运行截图中存在"sandbox!!!"则代表检测到沙箱。

#define HIDWORD(x)  (*((DWORD*)&(x)+1)) //IDA
int main()
{int v3; // ebx__int64 v4; // kr00_8v3 = GetTickCount64();                        // 反沙箱Sleep(300u);v4 = (int)(-300 - v3 + GetTickCount64());printf_s("v4:%d\n",v4);if ((int)((HIDWORD(v4) ^ v4) - HIDWORD(v4)) > 100)printf_s("sandbox!!!\n");elseprintf_s("none!!\n");system("pause");return 0;
}

image

image

在微步沙箱中v4为负数,检测到沙箱,而在自家Windows虚拟机内则返回正常,可见代码有效。

猜测这段代码的原理是沙箱为了节省运行时间,处理了Sleep或SleepEx类的API,导致此类API无法正常延迟,通过记录时间检测是否跳过延时即可判断是否存在沙箱。

image

image

将jg条件跳转噶了,避免其转入exit,保存后传入沙箱。

image

可见能正常分析出网络行为。

image

运行完反沙箱部分便是解密shellcode,这里是带key的xor解密。

image

解密完毕后修改内存为PAGE_EXECUTE_READWRITE属性用于后续执行shellcode。

此样本另外有趣的一点是他没有使用CreateThread的方式执行shellcode,而是使用Crypt32.dll中的CertEnumSystemStore,降低杀软查杀样本的可能性。

image

通过查询微软官方文档可知,此API会为每个找到的系统存储调用参数四提供的回调函数,这给shellcode提供了执行的机会。

为进一步分析加载器,需得到解密后的shellcode。

image

直接对CertEnumSystemStore下断点,在执行前一刻dump下解密后的pfnEnum开头的0x40255大小的内存,拖入IDA.

image

shellcode开头,调用sub_4022F,进入函数。

image

开头pop
rdx将返回地址取到rdx,对返回地址后续进行一系列解密操作。在sub_4022f处下断,重新dump整个shellcode(这里注意断下后取消断点再dump,否则会将软件断点int3
也dump下来),拖入IDA。

image

又是解密。依法炮制。

image

这一次下方0X7D位置可见经典的PE程序特征了,未见MZ头部,但可根据PE结构推测出文件头位于0x2F位置,0x2F位置刚好又是MZ头部,将DOS头复用作为代码执行空间,节省空间。

继续看上方的loc_2F,MZ头部的0x4D5A对应的pop r10后做了一次逆向操作,随后调用了sub_16023.

image

进入25行的sub_16383。

image

根据读gs:[60h]以及ROR4可以推测sub_16383主要功能是根据HASH获取API地址。

在shellcode+0x160DF(sub_16383返回地址)打下断点,将木马运行起来,分析sub_16023的v13可知,

v13结构如下。

typedef struct _API
{PVOID GetModuleHandleA;PVOID GetProcAddress;PVOID LoadLibraryA;PVOID LoadLibraryExA;PVOID VirtualAlloc;PVOID VirtualProtect;
}API, * PAPI;

image

再下边就是在内存展开、修复导入表…最后找到入口点并执行,所以sub_16383功能为内存加载Dll。

将Dll Dump出来,拖入IDA。

image

EAT中发现ReflectiveLoader,而原生CobaltStrike木马所Map的Dll也同样导出了ReflectiveLoader,且IAT也极为相似,基本可以判断这个就是最后的功能DLL。

加载器部分分析完毕。

总结

1.计算Sleep类函数延时时间与实际流逝时间是否匹配可判断环境是否为正常。对沙箱来说,跳过Sleep节约时间成本是有必要的不可省去,但可适当处理GetTickCount类函数,使其与延时时间匹配。

2.对于动态解密,打好断点动态分析比静态分析省时间,至少对我这种刚上路的菜狗来说是这样。

3.CertEnumSystemStore可作为CertEnumSystemStore替代品用于执行Shellcode。

有必要的不可省去,但可适当处理GetTickCount类函数,使其与延时时间匹配。

2.对于动态解密,打好断点动态分析比静态分析省时间,至少对我这种刚上路的菜狗来说是这样。

3.CertEnumSystemStore可作为CertEnumSystemStore替代品用于执行Shellcode。

网络安全工程师企业级学习路线

这时候你当然需要一份系统性的学习路线

如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

一些我收集的网络安全自学入门书籍

一些我白嫖到的不错的视频教程:

上述资料【扫下方二维码】就可以领取了,无偿分享


http://www.ppmy.cn/news/26697.html

相关文章

查看当前主机最近文件(反沙箱)

手动 WinR输入Recent 如果最近文件夹中的数量少于n,那就可以断定这台主机大概率是沙箱。 代码 MFC框架中对最近文件列表的支持 MFC建立的标准框架程序中有记录最近操作文件的能力,这些最近文件的路径被记录到注册表,在程序运行时&…

Java多线程 - 利用Callable或CompletableFuture实现多线程异步任务执行

文章目录1. Callable接口源码2. Future接口的源码3. RunnableFuture接口和FutureTask实现类4. 利用线程池和Callable接口实现异步执行任务5. 利用CompleteFutable实现多线程异步任务执行1. Callable接口源码 FunctionalInterface public interface Callable<V> {// 这个…

三次握手四次挥手详细解析面试常问

文章目录1.第2次握手传回了ACK&#xff0c;为什么还要传回SYN&#xff1f;2.断开连接-TCP 四次挥手3.为什么要四次挥手&#xff1f;4.为什么不能把服务器发送的 ACK 和 FIN 合并起来&#xff0c;变成三次挥手&#xff1f;5.如果第二次挥手时服务器的 ACK 没有送达客户端&#x…

PCI设备驱动初探(仅仅是内核部分,不是具体设备驱动)

在操作系统中&#xff0c;声卡、网卡之类的设备驱动并不像硬盘、鼠标、键盘等等驱动直接编写就行了。它们是建立在内核PCI驱动基础上的&#xff0c;也就是说这类设备通过PCI总线与系统通信。所以要编写这类的驱动首先要构造一个PCI设备的内核驱动&#xff0c;这样我们才能继续正…

模拟用户登录-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-3】 模拟用户登录 【案例介绍】 1.任务描述 在使用一些APP时&#xff0c;通常都需要填写用户名和密码。用户名和密码输入都正确才会登录成功&#xff0c;否则会提示用户名或密码错误。 本例要求编写一个程序&#xff0c;模拟用户登录。程序要求如下&#xff1a; 用…

力扣mysql刷题记录

mysql刷题记录 刷题链接https://leetcode.cn/study-plan/sql/?progressjkih0qc mysql冲&#xff01;mysql刷题记录一. 1699. 两人之间的通话次数题解二、1251. 平均售价题解三. 1571. 仓库经理题解四.1445. 苹果和桔子解五.1193. 每月交易 I题解六.1633. 各赛事的用户注册率题…

如何使用Hugo Academic Theme构建自己的github主页

前期条件 自己已经注册好GitHub 搜索Hugo Academic Theme&#xff08;网址&#xff09; 进入后的网址为&#xff1a;https://academic-demo.netlify.app/ 点击Get Start 出现如下模板&#xff0c;选择一个喜欢的模板&#xff0c;点击“START WITH ACADEMIC RESUME” 点击 …

calico-kube-controllers 启动失败处理

故障描述calico-kube-controllers 异常&#xff0c;不断重启日志信息如下2023-02-21 01:26:47.085 [INFO][1] main.go 92: Loaded configuration from environment config&config.Config{LogLevel:"info", WorkloadEndpointWorkers:1, ProfileWorkers:1, PolicyW…