CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

admin 2022年3月9日02:04:31CobaltStrike逆向学习系列(4)-Beacon 上线协议分析已关闭评论100 views字数 1337阅读4分27秒阅读模式

在上一篇讲解 C2Profile 解析的时候,已经提到过如何断入到真正的 beacon.dll 当中,并且也清楚了它执行时的调用顺序,Beacon 上线的所有流程也都是在第二次主动调用 DLLMain 时执行的。

因为主要说明的是上线流程,功能性的暂且不提,但是中间会穿插 C2Profile 的读取操作。

0x01 Beacon 发送

通过导入表能够很明显的看到通信相关的函数,所以就直接在关键函数上下断

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

首先调用 InternetOpenA 传入了 agent

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

接着是 InternetConnectA 传入 IP 与端口

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

之后便是 HttpOpenRequestA 传入了请求类型和 URI

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

最后便是 HttpSendRequestA 发送请求了,很明显能看到 COOKIE 已经被加密

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

接下来就需要往回跟,看它是从哪里进行加密的,最终发现,在进入功能性的 while 循环之前,就已经完成了信息收集和加密操作

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

这里也就顺带理一下 C2Profile 的解析,在加密之前,会先从 C2Profile 中取出一个值

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

回到 BeaconPayload 查一下 index 为 7 的就是 publickey,这也就说明了,在取值的时候是通过 index 来取对应内容的

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

然后分析一下 GetPtrValue,这里用 F5 就很不友好了,还是看汇编更容易理解一些

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

中间的 GetValue 也就是根据 index,取出来其中的值,并返回

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

整体下来的逻辑就是,根据 index 跳到对应的偏移,前八个字节用来判断类型,后八个字节是取出真正的值或地址,其他几个类型的取值也是一样的。

到这里为止,对于 C2Profile 的全部逻辑也就理清楚了,之后就可以对 BeaconEye 进行分析了。

0x02 TeamServer 处理

在 TeamServer 中使用了 NanoHTTPD 库来处理 HTTP 请求,并且写了一个 WebServer 类,继承了 NanoHTTPD,并在里面写了处理函数,我们就直接在这个位置下断即可

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

在接到流程以后,继续往下跟,会跟入 MalleableHook.serve(),它实际上调用的是 BeaconHTTP.serve(),在这里进行了解析操作

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

到这里也就到了真正处理的地方了,它判断了长度是否是 128 位

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

跟进以后,直接就进行了解密操作

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

直接初始化私钥,然后进行解密

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

随后判断了标志位 48879,然后读取长度,看是否小于 117,接着把剩余的字符返回

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

接着会保留前 16 个字节,然后 16-20 判断字符集

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

之后在获取了 Listener 的名字以后,就来初始化 BeaconEntry 了

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

就是不断从中间取值,所以 metadata 主要的作用就是填写 Beacon 所需要的信息

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

接着调用 this.getSymmetricCrypto().registerKey 方法来注册加密 Key,这里传入的 var8 就是刚开始保留的前十六个字节

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

会先判断当前 BeaconId 是否存在,存在的话会直接 return,如果是第一次上线的话,肯定是不存在的,然后将传进来的十六字节 sha265,前一半作为 AESKey,后一半作为 HmacSHA256Key,接着将他们与 BeaconId 做成 Map

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

最后就调用 sendResponse 返回信息了

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

0x03 流程图

CobaltStrike逆向学习系列(4)-Beacon 上线协议分析

0x04 参考文章

快乐鸡哥:https://bbs.pediy.com/thread-267208.htm

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月9日02:04:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CobaltStrike逆向学习系列(4)-Beacon 上线协议分析https://cn-sec.com/archives/823146.html