本文只是简单分析了远控DarkCometRAT531,简要的对远控客户端进行了静态和动态分析,目前找到了客户端的一个小bug,客户端在实现上的一个小问题,能够导致服务端自动退出,更细致的分析需要一些时间来完成,远程发送数据包导致客户端远程溢出漏洞需要对客户端与服务端通讯的协议进行分析,有针对性的进行通讯协议上的漏洞挖掘,这会耗费相当长的时间来做这件事情,目前时间只做了前期的工作。
分析前的准备工作
操作系统环境为WindowsXPSP3(简体中文)虚拟机一台(客户端),WindowsXPSP3(繁体中文)虚拟机一台(服务端)。使用的工具包括OD、Windbg、wireshark-win32-1.2.9、IDAPro5.5、010Editor、PEID和DEDE(反编译Delphi程序工具)。
使用PEID查看客户端程序DarkComet,提示“BorlandDelphiv6.0-v7.0*”,认定主程序使用Delphi编写,未加壳。
分析过程
1)客户端逆向分析
使用IDA载入客户端主程序DarkComet.exe进行静态反编译。查看DarkComet.exe程序的导入表,有没有容易触发漏洞的敏感API函数,如memcpy、strcat、strcpy等,通过查找,发现使用了lstrcpynW()这个API,如图1所示。
图1导入了lstrcpynW()函数
函数原型为“lstrcpynW(LPWSTRlpString1,LPCWSTRlpString2,intiMaxLength)”,当第一个参数过小时,会导致缓冲区溢出;当第三个参数iMaxlength的长度过大时,也会发生缓冲区溢出。
通过查询函数调用发现,共有7处调用了此函数,如图2所示。
图2调用lstrcpynW的函数
经过对汇编代码流程进行分析,发现默认情况下iMaxlength的长度为0x105,第3、4、5处调用存在可以修改iMaxlength的可能,可以重点进行分析。
.text:0040A4E2 .text:0040A4E4 .text:0040A4E6 .text:0040A4E9 .text:0040A4E9loc_40A4E9: .text:0040A4E9 .text:0040A4EA .text:0040A4EB .text:0040A4EC .text:0040A4F2 .text:0040A4F4 .text:0040A4F6 .text:0040A4F8 .text:0040A4F9 sar jns adc eax,1 shortloc_40A4E9 eax,0 ;CODEXREF:sub_40A3E4+100j inc eax push push lea eax ;iMaxLength ;lpString2 esi eax,[ebp+String1] edx,ebx edx,edx eax,edx eax mov add add push call ;lpString1 lstrcpynW
程序同样也使用HeapAlloc、HeapCreate、VirtualAlloc等分配内存的函数,但是由于WindowsXPSP3以及之后的操作系统堆溢出已经很难利用,于是放弃查找相关的敏感函数。客户端程序使用wsock32.dll相关的导出函数与服务端的进行网络通讯,如图3所示。
图3调用wsock32的导出函数
使用recv()函数来接受服务端传回来的数据,并且在多个处理函数中调用了recv()这个API函数,如图4所示。
图4多个调用recv()的处理函数
静态的反汇编分析就到此,与服务端通讯都是通过recv函数来接收。远程数据接收以后接着进行的就是数据处理的流程,相应的分析过程在动态调试中完成。
配置服务端程序连接参数后,在WindowsXPSP3_Tw的操作系统中执行,OD载入DarkComet.exe程序,相应的在调用recv()函数的地址下断点。第一次就在recv的地方断了下来:
.text:00803B65 .text:00803B67 .text:00803B6A .text:00803B6F .text:00803B74 .text:00803B76 .text:00803B7B .text:00803B81 .text:00803B82 .text:00803B85 .text:00803B88 .text:00803B89 mov mov mov call eax,esi [ebx+10h],eax edx,offsetaIdtype;IDTYP sub_8037F8 push push lea 0 ;flags ;len 2000h eax,[ebp+buf] eax push mov mov push call ;buf ;s eax,[ebx+10h] eax,[eax+44h] eax recv ;
执行后接收的数据包为“08BDDF0041353744414434393542454300000000A57DAD495BEC...”,发现这是一段明文可见字符的数据,很明显数据是经过加密处理的,存在相应的解密处理过程。下硬件访问断点之后,在如下地址处断点:
;sub_427F34+1Ep... ecx,ecx .text:00408358 .text:0040835A .text:0040835C .text:0040835E .text:0040835F .text:0040835Floc_40835F: .text:0040835F .text:00408361 .text:00408363 .text:00408366 .text:00408368 .text:0040836B .text:0040836D .text:00408370 .text:00408372 .text:00408375 xor test jz edx,edx shortloc_40837F edx push ;CODEXREF:Recvdata_Deal+1Dj cmp jz cl,[edx] shortloc_40837A cl,[edx+1] cmp jz shortloc_408379 cl,[edx+2] cmp jz shortloc_408378 cl,[edx+3] cmp jz shortloc_408377 edx,4 add jmp shortloc_40835F
上述代码就是客户端接收到数据的解密函数,寄存器信息如下:
EAX08BDDEFC ECX00000000 EDX08BDDF00ASCIIA57DAD495BE EBX05FCB1F0 ESP08BDDE98 EBP08BDFF70 ESI0165E960 EDI08ADFB84 EIP00408361DarkCome.00408361
其中EDX08BDDF00ASCIA57DAD495BE即为需要解密的数据。
程序在处理过程中会多次调用recv()来接受数据,需要花费大量时间做的工作是对接收到的数据包进行解密,解密之后进行数据包结构的分析,也就是所谓的拆包,弄明白每种包的数据结构以及对应的含义。
2)网络数据包分析
通过之前的分析得出,还需要分析客户端与服务端进行网络通讯的数据包,因此使用wireshark工具进行数据包的截获,如图5所示。
图5截获到的数据包
其中IP:192.168.50.128为客户端,IP:192.168.50.129为服务端。我们会发现如下规律:
①当客户端没有启动时,服务端会通过TCP/IP协议不停的发送连接的数据包,图片中的阴影部分即为此部分数据。
客户端启动后发送连接的数据包,并带有数据长度。
加密后使用明文传输,每次发送的一个TCP/IP数据包的最大长度为1024个字节,即每次最大发送1kb的数据。
截取到数据包之后,就需要数对据包加密的过程进行分析,这会花费相当长的时间,只能在后续的工作中完成。
服务端处理文件路径的Bug在分析主程序的过程中,发现服务端在处理文件夹目录时存在一个异常退出的情况,具
体如下:
1)在服务端操作系统中构造一个目录足够深的文件夹,即文件夹中嵌套文件夹,如图6所示,并在最深的文件夹中新建一个11.txt文档。
2)客户端访问此文件夹,并修改11.txt大小,如图7所示。此时若把11.txt文件修改为一个很大的值,则客户端失去服务端的连接,服务端操作系统中相应的进程崩溃。
远程溢出漏洞挖掘的前置条件
总结以上的分析可以知道,客户端与服务端的通讯是通过TCP/IP协议且经过加密,若要进行远程溢出的漏洞挖掘,需要完成以下几个工作才能进行。
1)数据包加密算法解密
这是首先需要做的工作,只有把数据包解密以后才能进行数据包数据结构的分析,加解密的算法不会很复杂,大概花费3~4个工作日就可以分析清楚。
2)拆包
拆包的工作是最繁琐的,远控有很多种功能包括文件浏览、命令执行、添加服务、信息探测等等,每种功能都对应有特定的标志,每种功能对应数据包的格式也是不尽相同,这需要通过大量的时间和精力去分析。
3)模拟发送数据
最后要做的工作就是通过自己构造的数据模拟服务端正常登录上线,并发送大量数据结构合法的测试数据,进行漏洞挖掘操作。
总述
远控的分析需要花费大量的时间和精力去做,杀软公司中除非是对影响范围非常大的僵尸网络才会进行大量的分析,一般普通的远控不会进行详细细致的分析。针对远控的客户端进行远控漏洞挖掘就少之又少了。
需要对远控的编写有一定的基础,对TCP/IP协议也要了解,反汇编解密数据也是必须的,最终的漏洞挖掘考验的是对程序数据包处理流程的理解,所有的这些都需要在没有源码的情况下完成,所耗费的时间会非常长,最短的时间至少都是在1个月以上,目前我花费在上面的还不到一周时间,所以目前没有任何成果,若需要接着进行后续的漏洞挖掘研究,我会继续花时间去进行。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法行为。