0%

CS4.0木马逆向分析

这个是一个课程作业,但是我真的搞了可久了,重新整理记录一下。分析的恶意样本就是CS工具生成的64位EXE文件,生成过程这里就不赘述了。目前现有的分析CS木马的博客还是挺多的。

先用了奇安信的在线沙箱看了一下具体功能。

没有文件操作,没有注册表操作,但是和服务器进行了通信。

静态分析

首先分析了一下main函数,main函数中包含sub_402A20sub_401755两个函数,然后进行一个休眠10s的循环中。

sub_401755函数中包含该程序的一些主要功能。GetTickCount返回的是从操作系统启动到现在所经过的毫秒数,这里GetTickCount模了0x26AA,这一步的操作是为了获取一个随机数,用于后续字符串的拼接。

这里的sprintf是对字符串MSSE-%d-server进行一个拼接,MSSE-%d-server是Cobalt Strike的一个很明显特征。

因为反编译的代码里面每个参数不是很清晰,所以这里从汇编代码看一下拼接的结果。

一开始就是对GetTickCount的一个除法,结果存放在EAX中,再往后看的话,有一个mov [rsp+68h+var_10], edx的操作,是把GetTickCount取模的结果放入了栈中。

这里是用了sprintf函数,关于函数参数传参,在Windows X64中,函数参数的前四个参数是从左至右依次存放于RCX、RDX、R8、R9寄存器里面,剩下的参数从右至左顺序入栈;栈的增长方向为从高地址到低地址。

在回到汇编代码,首先RCX中传入SecurityAttributes,RDX中为aCCCCCCCCCmsseD,即%c%c%c%c%c%c%c%c%cMSSE-%d-server,r8d即r8寄存器的低32位存放\,r9d中也是\,剩下的参数是从右至左入栈,依次是GetTickCount%0x24aa\epip\.,那么从右往左是.\pipe\ GetTickCount%0x24aa

Sprintf函数是用来拼接字符串的,那么结合传参的顺序来看,整个的结果就是\\.\pipe\MSSE-v2-server, 存放在SecurityAttributes里面,就是管道名称,是一个全局变量。

之后是创建线程,继续跟进查看。

sub_401645函数里面继续调用了一个sub_401590函数,unk_404010是一连串不可读的字符,目前不太清楚具体功能,只能看看sub_401590的内容。

sub_401590中函数还是比较多的,看了一下调用函数的名称,应该就是核心功能实现的地方了。首先是CreateNamedPipeA函数,用来创建一个命名管道;ConnectNamedPipe函数用于等待客户端连接命名管道;WriteFile用于写文件;CloseHandle用于关闭线程。

那么可以合理假设该函数的整个功能是先创建一个命名管道,然后等待连接,WriteFile函数就是用于向管道中写入命令。

查看汇编代码,看具体创建管道的过程,和反编译出来的结果差不多,但是多了很多标识,创建管道的话应该需要指定管道名称,这里推测SecurityAttributes应该就是之前拼接而成的管道名称。

文件的写入应该是一个循环写入,v5>0就是判断条件,应该是字符长度,看v5参数传递过程,就是函数传入的第三个参数a3,即dword_404004,大小是0x3FA00,写入内容就是从unk_404010开始的字符,这些字符都是不可读的,应该经过了加密。这里没有看的太详细,直接推测0x3FA00时shellcode大小,unk_404010开始就是加密后的shellcode,后续再求证。

完成文件的写之后,再回到创建线程的函数sub_401755中,该函数最后返回的是sub_401702函数。该函数先malloc了一个内存,之后进入休眠,休眠1024ms,然后进入sub_401662函数,这个地方是循环执行Sleep、sub_401662函数,基本逻辑就是监听管道,如果创建成功,就进行连接。

接下来关注sub_401662函数,里面是创建文件和读取文件的操作。这里用CreateFileA打开管道,这里都比较直观,之后的ReadFile又是一个循环读文件的操作。这里就是把先前的shellcode从管道里面读出来。

当函数完成管道内容的读之后,调用sub_4014F3函数,改函数主要完成两个功能,一个是异或解密,一个是创建新线程。

具体看异或的过程,反编译出来的代码也很直接,原始需要解密的内容shellcode和一个解密数组异或,就得到解密后的shellcode,这里通过模3来看,解密数组的长度应该为3,这个地方没办法定位到具体的解密数组,没有其他信息,但是之前在分析的时候,在dword_404004unk_404010中间有一个很短的数组unk_404008unk_404008的前三个字节应该就是用来解密的字节。

之后一步一步返回到main函数,下一步是想通过动态调试来dump解密的shellcode。

动态调试

这里使用x64dbg来对程序进行分析。这里先在sub_401755里面拼接字符串的地方下了断点,想核对一下拼接结果(其实是想截图糊报告),可以看到和静态分析中一样,GetTickCount获取系统时间之后,随机数计算结果为5505,拼接管道名为\\.\pipe\MSSE-5505-server,不过x64dbg显示的时候对\进行了转义。

之后关注异或解密的地方,因为想通过动态调试dump解密后的shellcode。解密函数辨识度还是挺高的,就是异或操作。

在异或解密的地方看了几轮,关注用于异或解密的数组,长度应该为4,[‘5D’,’CC’,’E1’,’31’],是之前提到的unk_404008的前四位。

但是之前反编译结果是模3,我就很迷,仔细看一下汇编代码,并没有shr或者idiv、div一类的指令,也不太像编译器优化后的结果。

这里想要获取解密后的Shellcode,把它dump出来,首先在VirtualProtect的地方下断点(这个思路是参考了一篇博客),这里结合ida反编译的代码来看,v9是VirtualAlloc出来的一片内存空间,用来存放解密后的shellcode,VirtualProtect中的v9是第四个参数,对应的是rbx寄存器。

运行到VirtualProtect之后,查看rbx,对应地址是190000,点击右键->在内存窗口中转到,就可以看见解密出来的结果了,开头就是4D5A,典型的PE文件,大小是以前静态分析的时候看到的dword_404004,大小为3FA00h,直接把从0x190000到0x1CFA00的内容dump出来另存为shellcode.bin文件,这个文件中就是Cobalt Strike实现主要功能的部分。

后续对shellcode.bin文件进行分析,这个文件比较大256k,先用PEID看一下文件信息。是一个64位的PE文件,同时关注了一下文件的导入表,wininet主要是windows中网络相关模块dll文件,这里就应该是网络通信相关的一些协议。除此之外,kennel32里面也有一些文件操作相关的函数。

Shellcode分析

使用ida静态分析,发现整个程序比较大,函数也比较多,先看一下DLLMain函数,发现里面有一个fdwReason参数,只有fdwReason为4的时候,会进行一些恶意操作。

因为函数非常多,不太好直接分析,所以选择从InternetOpenA函数入手,该函数是调用WinINet的第一个函数。查看一下函数的引用,在sub_18000D858中被调用。

查看一下反编译的sub_18000D858函数,通过传入的参数名称和函数内部调用的一些函数都可以发现,该函数就是进行网络连接的函数。

再一层一层向外跳,看一看该函数的调用具体情况。调用逻辑如下:

DLLMain->sub_18000CA74-> sub_18000D858

这里还用了一个修复DLL文件的插件,下载地址

想通过动态调试看看连接到服务器的过程(没错依旧是为了截图糊报告),但是调着调着调不动了,报告DDL也要到了,我真的不太会动态调试,虽然很久没做题了,我真的会找几个题目练练手的我保证。

还有感谢教我动态调试的同学,估计被我气的够呛,然后友链也没做出来,下个月一定弄上。

参考博客

[1]https://blog.nviso.eu/2021/04/26/anatomy-of-cobalt-strike-dll-stagers/

这是一篇国外的分析CS的DLL Stager的博客,比较详细,原理细节都讲的很清楚,而且代码反汇编结果和我的样本反汇编结果很像,可惜没有shellcode的分析。

[2]https://bbs.pediy.com/thread-264470.htm

看雪上面的一篇分析博客,很详细,还有shellcode的调试过程,但是我跟着调硬是不太一样。

[3]https://mp.weixin.qq.com/s/iTzZGKkXK48NR8YT1OTw_Q

这一篇后面的特征分析写的很有参考价值。

[4]https://blog.csdn.net/JiangBuLiu/article/details/107788203

动态调试就是参考的这一篇,里面在VirtualProtect下断点的思路就是从这篇看的。

[5]https://blog.csdn.net/LoopherBear/article/details/106230996

这一篇主要是分析shellcode部分,因为我没怎么分析后面就没细看。

[6]https://www.anquanke.com/post/id/237127

印象有点模糊了。

所以,我是,为什么,看了,这么多,博客,还,分析了,那么,久……