新闻动态

News information

CobaltStrike 远控木马分析

<<返回

2022年01月10日 16:32

 

1. CobaltStrike 木马分类

CobaltStrike 生成恶意 payload 一共分为5种:

1)     HTML Application 生成 hta 形式的恶意 payload

2)     MS Office Macro 生成宏文档的 payload

3)     Payload Generator 生成各种语言的 payload

4)     Windows Executable 生成可执行的分段 payload

5)     Windows Executable(S) 生成可执行的不分段 payload

Windows 平台的 payload 有分段和不分段两种,若选择分段,则生成的原始文件会很小,原始文件就是一个 download,用于从 C2 下载并加载后续的 payload;若选择不分段,则原始文件是一个 loader 加载器,可以直接将 shellcode 加载执行。

查看当前要分析的程序,大小只有17.5k,应该是分段的 Beacon。

 1.png


2. 分段 Beacon 分析 

使用 ida 打开恶意文件,找到 main 函数,跟进其中的 sub_401795 函数(由于多次重新调试,导致截取的图片中显示的内存地址不同)。

 2.png

3.png

4.png

 

再进入函数 sub_401685 和 sub_4015D0,函数 sub_4015D0 是进行命名管道创建和连接的,将其重命名为 “my_CreatePipeAndConnect”,管道名为 “.pipeMSSE-2914-server”,每次重新调试时管道名都会改变。

 5.png

6.png


管道链接之后通过 WriteFile 函数将缓冲区,即 v5(0x404014)中的第一段数据写入到管道 v4 中。该段数据硬编码在文件的 .data 段偏移 0x14 处:

7.png


写完数据之后该线程的功能就完成了,主要就是创建管道并将 .data 段预编码的数据写到管道中。之后,程序会进入到函数 sub_401742。

8.png


该函数首先申请一块空间并 Sleep,然后在 sub_4016A2 中创建一个文件,地址就是申请的空间的初始地址,然后调用 ReadFile 函数读取管道中的数据到新建文件中。

9.png


申请的地址为 0x454A50

10.png


读取到数据之后,进入函数 sub_40152E,通过 API VirtualAlloc 分配一块内存空间,然后开始一个循环进行异或运算。

11.png


异或的第一段数据是4个固定字节,存储于 .data 段 0x404008 中:

0xBD 0xE9 0x7D 0x08

这4个字节通过 (i & 3) 依次循环利用

 12.png

13.png


异或的第二段数据就是之前从管道读取到文件中的数据,依次获取其中的每个字节与固定的4字节值依次进行异或,结果保存到 VirtualAlloc 分配的地址 0x270000 中。

14.png


从这也能看出此恶意程序是分段的 Beacon,若是不分段的,这里会直接计算解密出一段 shellcode,应该是 PE 文件的格式并加载执行。解密之后通过 VirtualProtect API 修改解密的 shellcode 为可执行的,然后创建线程去执行该段 shellcode。

将内存中的 shellcode 在反汇编中转到,在 CreateThread 的 sub_4014F0 处下断点,然后 F9 运行,断在了该函数,然后跳转到 shellcode,开始 F8 单步分析。

15.png

16.png


该 shellcode 主要是通过动态解密和 jmp rax 方式完成相关 API 的调用

 17.png

 18.png


发现动态获取连接的目标主机 IP:13.75.68.24

19.png


进行连接

20.png


发起 HTTP 请求

 21.png

 22.png

 23.png

24.png

25.png


请求的 URL 为:http://13.75.68.24/IqYJ,其中的恶意文件为 IqYJ,是一段 shellcode,称其为 shellcode2。

浏览器访问后会自动下载文件 IqYJ

26.png


申请一段内存空间,地址为 0x31E0000,用来存放从 URL 下载的 shellcode2

 27.png

28.png


多次调用 InternetReadFile 从 URL 中获取 shellcode2,每次读取 0x2000 个字节,直到下载完所有的 shellcode2

 29.png

30.png


之后进入 shellcode2 执行,会 取 shellcode2 的值进行循环异或解密操作,解密后从 0x3400047 开始就是 PE 文件

31.png


之后在 0x3400078 地址处调用 call rax,跟进去单步跟踪

32.png


获取请求头和请求路径

33.png


与目标服务器建立连接

34.png


访问的 url 为 13.75.68.24/ca

35.png


获取计算机名称,用户名等系统相关的信息

"DESKTOP-AQEDP10\t14622\t507b3769cdfd3e2fed776ec17c58abc1eea1c718affbacb06aad52603cc0a3f5.exe"

36.png


HTTP 通信,发送 GET 请求

37.png


若成功通信,程序最后会进行一个 Sleep,Sleep 时间被设置成2710s,攻击者在其 CobaltStrike 控制端上可以更改这个时间,默认为60s。

38.png


之所以 Sleep 时间如此设置是为了拖慢逆向的进度,此外 Beacon 还有一个区段为 tls 段,具有 tls 回调的功能,也是用于反调试。

39.png


到此,对 Beacon 的分析就基本完成了,当计算机受到该木马攻击后会在攻击者的 CobaltStrike 控制端通过循环上线。

不过访问 13.75.68.24/ca 下载的 ca 文件内容为空

40.png


通过以上分析可以知道 CobaltStrike 生成的分段 Beacon 木马其实是一个加载器,将自身保存的2处数据进行循环异或解密出一个 shellcode,然后去加载执行。执行过程中会发起 HTTP 请求,连接 url:http://13.75.68.24/IqYJ 下载数据到内存,然后执行,再次进行循环异或解密并加载执行,期间会获取计算机相关的系统信息,向目标网络发起 GET 请求,若成功就能顺利控制受害计算机并施行相关操作。

 

3. CobaltStrike 木马的防护

cobaltstrike 最先开始设计时反沙箱的思路就是通过管道读取数据,若沙箱不模拟管道,就不能执行后续的 dll,虽然目前不依靠这个进行免杀和反沙箱,但默认生成的 Beacon 还是保留了管道协议。所以一般情况下,攻击者使用默认配置生成 cobaltstrike 木马的特征比较明显,在主函数开始处会进行管道创建和连接,管道命名格式为:%c%c%c%c%c%c%c%c%cMSSE-%d-server。在解密内层 dll 时会从 .data 段某偏移处取4个字节与后面偏移处的字节进行循环异或计算(不同的 cobaltstrike 版本可能偏移位置不同)。

针对木马的防护要做到以下几点:

(1). 规范上网行为,不下载安装未知的软件;

(2). 不点开来历不明的文档、图片、音频视频等;

(3). 及时安装系统补丁,修复漏洞;

(4). 加强密码复杂度,定期更改密码;

(5). 进行严格的隔离,有关系统、服务尽量不开放到互联网上,内网中的系统也要通过防火墙、VLAN或网匣等进行隔离。

必要的安全防护设备:

(1). 网络出口位置部署六方云防火墙,并及时更新特征库;

(2). 终端部署六方云安全卫士,并及时更新特征库;

(3). 部署六方云神探产品,及时发现未知威胁;