从零开始开发CS beacon(一)

 

0x00 前言

​ 前段时间,出了一个beaconEye的项目,以及golang版本的EvilEye通过扫描内存,由于以前为了防止被扫描beacon配置都是改XOR值,但是最终内存里面的都已经被还原出来,所以也是能此工具被解析出配置。网上也有给出一个hook sleep的bypass方法,以及一些bypass想法的文章,但是这些byapss方案都是基于去改CS 中的DLL,对于我这种逆向不行的人,感觉麻烦又有难度。

 

0x01 基本通信协议解析

​ 要实现开发beacon与teamserver 交互?其实也简单,我们首先需要了解CS整个通信协议的过程,例如http请求,进而通过代码实现模拟请求。下面以http 协议作为例子,通过抓包查看http流量,可以发现依据sleep时间,就会隔几秒发送GET请求(心跳包),一旦接收到要执行的指令后,把执行的结果通过POST方式发送到teamserver:

​ 1.当启动teamserver后,会把.cobaltstrike.beacon_keys反序列化为Keyparis对象,并把publickey和privatekey保存为AsymmetricCrypto对象中相应的属性,通过RSA传递AES密钥,达到数据加密安全。其中如果删除.beacon_keys,teamserver会重新生成新的公私对。

​ 2.收集metadata信息(代码页、时间戳、程序id等信息并生成hash值),流程如下:收集数据->RSA加密->base64编码

​ 3.beacon 解密返回包(根据profile不同,编码方式不同),获取要执行的指令,由于我这里使用的是默认profile(更多profile),利用POST传输保存在cookie字段的数据,通过RSA+AES-CBC加密。

以此往复就做到了基本的通信,更多的具体协议分析:https://www.52pojie.cn/thread-1426936-1-1.html

 

0x02 当前免杀现状

  1. CS 默认可生成多种形式shellcode,比如dll,raw,源码等,有shellcode与loader分离,也有单个文件的免杀。多是通过各种可执行shellcode的函数,比如我前面讲的apc方式。有时候某些函数被Hook或者被监控,就要去修改函数进行unhook或者直接调用底层函数等。
  2. CobaltStrikeScan可以利用cs 版本默认的xor值,扫描进程或者导出的内存解析配置来发现beacon进程。对此我们可以修改资源里的dll xor值达到免杀的效果,但是beaconEye又阻止了此种方式。
  3. 由于CS采用“Fork-n-Run”。Fork-n-Run模式会产生一个新的进程(也被称为Sacrificial Process),并将功能注入到其中。这种模式有很多好处,其中之一就是可以执行需要长时间运行的任务,不会阻塞Beacon主线程,键盘记录器Keylogger就是一个很好的例子。通常情况下,这些功能需要以反射式DLL的方式来实现,通过命名管道传输数据,这也是被杀软监控的点。

 

0x03 突破现状

​ 突破的构想:既然我们上面已经列出了当前免杀现状,以及局限性。其实还有一个重要点,经常有linux下控制的需求,但是CS都只支持windows。看到这里,应该很多人都想到了,有种方式可以直接解决这些弊端。那就是—-Golang。

​ 对于我逆向不太会,只能对资源简单的修改,beacon行为被检测也不好分析调试,在实际渗透中,CS有时会被行为查杀(杀软开某种模式),但是你用msf或者简单反弹端口的beacon,反而能上线。这就给我有了一点启发,由于全球很多安全研究员都有分析CS特征行为等,可能还会出现下一个beaconEye。对此,我们如果能自己实现开发CS beacon与teamserver交互,用golang开发的beacon,手拿源码想怎么改都行,而且支持跨平台,简单好用。

​ 现有已经有两个项目:CrossC2Geacon,对比下两个项目,CrossC2源码未开源,存在安全疑虑,不能很好适配自己的各种profile,而且也不好用(它主要是想实现CS中多个内置命令)。而我现在只想要一个简单功能的beacon,且开源(方便自己修改和添加功能),Geacon就完全符合此需求,它实现了默认的beacon通信。下一章,将会讲解如何去修改geacon适配自己的自定义profile,实现windows与linux上线。

(完)