Cobalt Strike剖析及免杀系列(四)CSbeacon端大马dll详解
本帖最后由 GalaXY403 于 2022-9-6 21:48 编辑样本信息:
MD5: 2f330d8eca0bfd3eb074352bbb27dba0
SHA1: c7dc77dbd94d2ea96e8f7a6dfec980478d5d5c6d
SHA256: 6daa192e9726a0a614d10b45ed1cb16c3330e0cee55a8f9bdf7ec8f696b918b4
前面几篇大概已经讲过关于小马payload的分析,关于后面dll的定位不过多赘述,前面定位到payload的virtualalloc函数之后通过返回值确定后面http拿到的dll的地址。
之前的文章说过传送来的dll前面会是一段加密,来解密后面的dll内容,下面是alloc申请到的首地址,也就是dll前面的加密程序。
顺着指令流往下走就ok,来到解密部分,下断点运行
前面解密不多说了,直接下到dllmain入口的断点
往上找pe标志mz
定位到复制后面数据到010editor中,生成新的pe文件,此文件就是cs的dll大马。
Dll大马定位就简略说这些,后面就直接ida对源码分析,这里命名为k.dll。
首先分析大马内容,主模块每个case应该每个都会有网络请求,所以ida导入表定位httprequest函数。
查看request函数的交叉访问
查看最多分分支模块,模块上下文大概就是大马的主要业务部分,来到下面switch/case内容,大概是101条策略。
继续做交叉,返回到调用函数,因为对switch做判断所以,大概率是cs控制端发的控制请求,所以注意第三个参数为switch判断内容
继续向上分析
这边上面部分函数就是cs控制端初始化switchflag分支条件了
后面就是src就是前面switchflag分支标志的网络请求模块, 这次的文章就主要挑前面主机通信过程说一下,后面beacon端的行为动作一百多个就不去一一做分析了
开始代码dll判断内存块查看先不去管,直接到sub_100131b,前面说了里面是有一个cs服务器交互模块的,我们看前面
刚开始的几个函数初始化buffer,一个是send的一个是recv的,由于这边的cs我们用的httplistener所以这次的分析只针对http传送后面dns类似但使用子域名的方式传送,对于buffer,cs使用数组,0号位置是buffer地址,1号位置是2参数位置截断地址,后面分别是buffer的size和截断的size
来到下面
这部分函数主要是初始化一些cs控制端的属性特征,像端口,url,还有一些其他的运行过程中的配置属性。
下面一直到91都是对属性的一些初始化
91以后是beacon与cs控制端的命令交互环节,也就是cs beacon>后面输入的命令执行循环,循环过程sleep心跳作为while条件然后一些基础代码就不说了,这边的重点来到cs 通信过程。
这些前面的第一个换行块函数做buffer初始化,然后下面注释网络连接的是初始化网络
来到103进入函数
一段前置函数,深度继续到HttpSend
这段是通信过程的关键代码,这边cs 的http还是像shellcode的网络请求相同,使用内置http请求路径然后通过post请求体携带数据。
这边对cs源码还没做逆向分析,不过根据beacon的通讯逻辑大概判断cs控制端将数据写入文件,然后beacon通过读取服务器上的文件内容作为命令传送
再通过tcp的socket recv函数作为线程wait等待服务器send继续执行,下面是recv的部分代码
这边参数的buffer是eax寄存器的,不能只分析逆向代码,来到汇编部分
可以看到eax是赋值了全局变量,也就是我这边改名的Buffer_RecvData,但是针对这个Buffer做交叉调用查看并没有哪个函数使用
所以大概的通讯过程大概如下
然后下面的sleep心跳在141行
进入就是这边的心跳判断
这个心跳变量是个全局变量,所以直接查看交叉调用,可以看到另一个分支就是我们cs经常用的sleep 5 这个命令了
也就是大马判断的case3
然后通信大概流程就差不多这样了,然后样本文件还有ida的分析文件放在下面自己拿
链接:https://pan.baidu.com/s/1QZDRVGv815iH7DhaPR0M7g
提取码:7vu4
看起来好牛马一个 楼主可以出一期修改CS特征的帖子不,跪拜学习学习!! zero57 发表于 2022-9-7 00:31
楼主可以出一期修改CS特征的帖子不,跪拜学习学习!!
后面有时间的话动态静态特征修改都会出一遍 感谢大佬,好用 学习了,感谢楼主 虽然看不懂,不过还是支持下
感谢分享
{:17_1077:} 感谢分享,学习了 现在免杀的花样层出不穷了 谢谢分享!膜拜