Cobalt Strike - Beacon信标快速分析

流程

本次分析的样本为:宏代码释放的dll(也可能被其他的方式代替,初始载荷有多种方式,如压缩包等)→exe加载的.dll(常见的白加黑方式,这个dll才是Beacon)→解密ShellCode2的ShellCode1→ShellCode2→下载文件到本地
根据实际情况,可能有多种组合方式,最核心的问题是快速定位ShellCode并分析。

宏代码释放Dll1,并执行其导出函数

Dll1有80+MB没法跟:
在这里插入图片描述
宏代码执行Dll1的导出函数后,通过动态可以看到,最后会释放白加黑的exe和dll,所以基本不跟。

白加黑的Dll2

执行后通过VirtualAlloc申请一段内存空间,然后写入将要执行的ShellCode1。
首先在VirtualAlloc下断点,bp VirtualAlloc:
在这里插入图片描述
然后F9执行,看断下来的参数,申请的大小,如果不大有可能是密钥:
在这里插入图片描述
还可以看申请的内存类型,大小比较大且是可执行的内存,基本就是ShellCode:
在这里插入图片描述
接着Ctrl+F9,执行到返回,EAX就是申请的内存地址:
在这里插入图片描述
在数据窗口中显示:
在这里插入图片描述
下内存写入断点:
在这里插入图片描述
由于基本上都是垃圾代码填充,没有必要看,直接F9执行到写入:
在这里插入图片描述
F8步过,待其写入数据后,删除内存写入断点,在ShellCode1的地址处,写int3执行断点:
在这里插入图片描述
接着按F9,另其执行进入ShellCode1:
在这里插入图片描述

ShellCode1

由于大部分的Beacon都是垃圾代码填充,慢慢跟太耗费精力,将其Dump出来后,可明显发现是导入函数过少,其中必然包括解密函数地址的代码,故在获取函数地址的“LoadLibrary”和“GetProcAddress”处下断:
在这里插入图片描述
而在“GetProcAddress”处,参数包含需要解密的函数名:
在这里插入图片描述
进入字符串的内存地址,可见大量函数名:
在这里插入图片描述
明显可以有调用WINHTTP外连的行为,可对关键函数下断。
然后接下来的代码是循环遍历函数的地址,跳出该循环就是在“GetProcAddress”后的向上跳转处,找到定位到“LoadLibrary”之前的那个关键跳转,在其下一行下断,就可以跳出解密函数的循环:
在这里插入图片描述
在解密后不远处的Call+寄存器,基本就是进入下一阶段载荷的代码:
(CALL EAX条件不成立,跳转到CALL ECX,ECX就是ShellCode2的地址)
在这里插入图片描述

ShellCode2

将其Dump出来,从ShellCode1中解密出的IAT中查看使用的函数,配合动态运行ShellCode2,不再赘述:
在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页