样本调试之木马程序快速调试出C2

admin 2024年11月11日21:18:21评论20 views字数 3510阅读11分42秒阅读模式

0x01 前言

  作为一名网络保安,在日常搬砖和攻防演练中,拿到一个木马样本后,最重要的分析内容应该就是IOC提取了,通常我们需要快速提取出木马样本的IOC进行置黑封禁,防止攻击进一步扩散。本篇文章将讲述在拿到一个木马样本时,如何快速用调试器调试出C2(当然最快的方法是直接运行起样本观察程序的网络连接情况,该方法不在本篇讲述范围内)。

0x02 网络通信协议与API函数

  我们知道,木马程序主要做两个层面的对抗:终端检测与流量检测。对于终端层的检测,木马通常需要进行免杀和混淆,为了使其shellcode化,通常需要木马程序体积小、实现简单,而这就需要利用系统API进行网络连接,避免自己封装协议增加样本体积。

  而对于流量层面的检测,木马通常会对自己与C2服务器的通信流量进行加密(HTTPS)和伪装(伪装成常见的网络流量,例如DNS、HTTP、ICMP等),而这些协议,均有对应的Windows系统API可以调用来实现它们。

  木马程序要调用网络连接相关的API函数,首先要导入API函数所在的DLL文件。如下是木马常见上线协议通常会使用的API函数,以及API函数所在的DLL。

·HTTP(s)协议:

··WinINet.dll:

···InternetConnectA()

···InternetConnectW()

··WinHTTP.dll:

···WinHttpConnect()

·TCP协议

··ws2_32.dll

···connect()

···WSAConnect()

···sendto()

···WSAsendto()

·DNS协议

··dnsapi.dll:

···DnsQuery_A()

···DnsQuery_W()

···DnsQuery_UTF8()

UDP协议

··ws2_32.dll:

···sendto()

···WSASendto()

·ICMP协议

··Iphlpapi.dll:

···IcmpSendEcho()

···IcmpSendEcho2()

···IcmpSendEcho2Ex()

  Winsock1版的函数,无WSA前缀;Winsock2版的函数,加了WSA前缀。 

  TCP和UDP协议调用的API函数大致相同,它们的区别在于有连接和无连接,所以TPC协议会比UDP协议多使用connect()或WSAConnect()函数来进行连接建立。

  HTTP(s)是应用层协议,底层的传输层协议是TCP,有的HTTP(s)上线样本可能会自己实现和封装HTTP(s)协议,直接调用更底层的函数;同理,DNS的传输层协议是UDP协议,攻击者也可能会自己在DNS上线样本中自己实现和封装DNS协议,直接调用更底层的函数。但是这样可能会使得样本的体积变大。

  如下是HTTPS(s)和TCP协议相关API函数所在DLL的调用关系,可以看到WinINet.dll和WinHTTP.dll、ws2_32.dll的底层调用的都是mswsock.dll,而mswsock.dll底层调用的是网络连接驱动。

样本调试之木马程序快速调试出C2

  注:mswsock.dll中常用的网络连接API函数是MSAFD_ConnectEx()。

  知道了这些API函数及其所在DLL之后,还需要了解这些API函数的传参。我们知道,要使用一个函数,需要给这个函数传入参数。而上面的API函数中,都需要传入目标IP和端口(ICMP协议除外,它不需要端口)作为参数,我们需要分别知道这些函数第几个参数是我们要找的目标IP和端口,这样才能调试定位到C2。

  函数的参数说明都可以在微软的官方文档中找到,这里以InternetConnectA()和connect()函数来举例说明。

  InternetConnectA()的参数构成如下,第二个参数和第三个参数分别是目标地址和目标端口:

样本调试之木马程序快速调试出C2

  connect()的参数构成如下,与InternetConnectA()不同的是,目标IP和端口是保存在一个结构体中的,也就是第二个参数,我们还需要了解这个结构体的组成。

样本调试之木马程序快速调试出C2

  上面就是sockaddr这个结构体的组成,它等同于sockaddr_in这个结构体,所以只需要看下面的部分就好。可以看到,sockaddr_in结构体第二个成员和第三个成员分别是目标端口和目标地址。所以对于使用connect()进行外联(建立连接)的样本,我们需要在先调试器中找到sockaddr结构体的位置,然后在结构体数据中找到C2信息。

0x03 调试思路

  由于样本可能使用动态导入的方法来导入上述的DLL文件,所以程序挂上调试器之后,可以下一个系统DLL导入的断点,在每次系统DLL导入时断下来。

样本调试之木马程序快速调试出C2

  当看到有网络连接相关的DLL导入后,对DLL中相关的API函数下断点即可。

样本调试之木马程序快速调试出C2

  如果已经提前知晓样本使用的通信协议,可以有针对性的断。如果不知道,可以在观察到的所有相关API函数上都断下来,包括mswsock.dll中的MSAFD_ConnectEx()。

  设置好断点之后,继续运行程序,直到在目标API函数调用上断下来,然后进行传参分析,找到C2信息。

0x04 调试实战

  这里准备了两个64位的MSF的样本,分别利用HTTPS协议上线和TCP协议上线,C2都是192.168.52.137:2333。

  注:x64位的程序,函数在被调用的时候,前四个参数信息依次保存在rcx、rdx、r8、r9四个寄存器,第五个参数位于rsp+28h,第六个参数位于rsp+30h,依次加8个字节(十六进制)类推。

  将HTTPS协议上线的样本拖入调试器,像上面一样在系统DLL导入时机下断点。由于我已经提前知道了样本所使用的通信协议,观察到wininet.dll和winhttp.dll导入后,在相关的API函数上下断点。

样本调试之木马程序快速调试出C2

样本调试之木马程序快速调试出C2

  取消DLL载入断点,继续运行程序,可以看到首先在InternetConnectA()函数上断了下来,这里C2的IP信息调试器已经直接取出来了。那如果调试器没有取出来,就需要进行一些分析。

样本调试之木马程序快速调试出C2

  由于InternetConnectA()函数的第二个参数是指向目标IP的指针,所以IP这个字符串所在的地址保存在rdx寄存器中。在rdx上转到内存窗口,也就是转到rdx寄存器中保存的地址,内存窗口以十六进制ASCII的方式展示,可以直接看到目标IP是192.168.52.137。

样本调试之木马程序快速调试出C2

  然后再看目标端口,根据之前InternetConnectA()函数的参数构成,我们知道第三个参数是端口信息,是直接传入的端口数据,而不是指针(地址)。所以r8寄存器中保存的直接就是端口的十六进制数据。91D转换成十进制就是2333。

样本调试之木马程序快速调试出C2

  至此,该样本的C2信息已经被提取到。

  接下来对TCP协议上线的样本进行调试。将样本拖入调试器,跟之前一样在系统DLL导入时机下断点,观察到ws2_32.dll的导入,在connect()和WSAConnect()两个函数上下断点。

样本调试之木马程序快速调试出C2

样本调试之木马程序快速调试出C2

  取消DLL导入断点,继续运行程序,发现断在了connect()函数上。connect()函数中,IP和端口信息保存在第二个参数,也就是sockaddr结构体中。rdx中保存了sockaddr结构体所在地址,在rdx上转到内存窗口,可以在地址对应的内存窗口看到结构体中的数据。

样本调试之木马程序快速调试出C2

  根据结构体的构成,我们知道结构体的第二个成员和第三个成员分别是目标端口和目标地址。根据每个成员所占字节大小,可以知道091D是第二个成员,转换成十进制是2333,也就是目标端口;C0 A8 34 89是第三个成员,按字节拆开分别转换成十进制就是192、168、52和137,所以目标IP就是192.168.52.137。至此,该样本的C2信息也就提取出来了。

样本调试之木马程序快速调试出C2

  其他协议上线的样本调试也是同理,大家可以根据上面总结的DLL和API函数,去微软文档了解一下每个函数的参数信息,然后自己拿样本调试一下。

0x05 注意事项

  该方法并不直接适用于所有的木马程序,以下场景不适用于无脑使用这种方法:

  1 样本带反虚拟机,无法在虚拟机中用进行动态调试,需要绕过或使用物理机;

  2 样本带反调试,无法直接使用调试器进行调试,需要进行反调试绕过;

  3 样本使用了更底层的技术进行外联 (直接调用驱动进行网络连接,需要进行内核级调试) ;

  4 样本启动一个子进程去外联C2,而不是在当前进程去外联C2,需要找到新进程刚启动的时机,将调试器挂上去;

  5 样本在真正外联C2之前,还调用了网络连接的相关API去测试网络连通性,这种情况要多加辨别;

  6 或许还有更多,只是暂时没想到.....

原文始发于微信公众号(红蓝攻防研究实验室):样本调试之木马程序快速调试出C2

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月11日21:18:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   样本调试之木马程序快速调试出C2https://cn-sec.com/archives/1942756.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息