利用CobaltStrike捆绑后门的艺术
作者:admin | 时间:2019-8-20 14:17:12 | 分类:黑客技术 隐藏侧边栏展开侧边栏
*本工具仅供技术分享、交流讨论,严禁用于非法用途
CobaltStrike(以下全部简称为CS)是渗透测试中常用的一个后渗透工具,它可以快速地生成后门并通过其控制目标主机。其中,捆绑型后门是攻击者较为喜欢的一种后门,因为其具有较好的隐蔽性及免杀效果。下面,就来剖析一下该类后门的捆绑及免杀原理。
一、后门制作
制作捆绑型后门前,先得创建一个监听器用于与后门通信,点击 Cobalt Strike->Listener创建一个监听器,填上IP和端口号,点击save,就可完成创建。选择端口时,可以使用一些较少为使用的协议端口,好伪装,如下选择的2333端口,是snapp协议的端口。
接下来,就可以制作捆绑型的后门,点击 攻击->package->Windows Dropper,填上待捆绑的文件(这里使用flash下载器),完成!
生成的捆绑后门有个缺陷,就是图标不是原文件的图标,官网提示得自己使用图标编辑器进行更换。
点击运行捆绑后门fake_flash.exe,表面上看跟原始的文件没啥区别,都是运行Flash下载器,然而,后面的CS已经通过捆绑后门连接上了该主机。
二、捆绑原理分析
按照常规操作,捆绑后门应该是将恶意代码插入到原文件中并修改入口点地址进行劫持,然而当比对捆绑后门和原文件的结构时,发现这两个文件的PE结构完全不一样,看来应该不是上述的方法。
生成一个CS非捆绑型后门进行比对,可以观察到,捆绑后门和非捆绑后门的PE结构几乎是一样的,前者只比后者多了一个.rsrc节段,这也说明,捆绑的方式应该是将整个原文件以.rsrc节段的方式附加到后门的末尾。
知道原文件存放的位置,那它是怎么样调用运行原文件的呢?使用bindiff对比捆绑型后门和非捆绑型后门,可以得知前者多了个4018BC函数,猜测该函数就是用来调用原文件的函数。
通过逆向分析,发现其调用逻辑很简单,运行后读取事先硬编码好的原文件大小,然后在相应的位置读取原文件数据,并释放到Documents目录下运行。这样,后门就可以实现运行恶意代码的同时,执行原文件,达到避开用户怀疑的效果。
根据代码中硬编码的原文件地址,我们可以在0x621D处定位到原文件,而在它前面0x1D的地方,存放着原文件的名字。
在“我的文档”下,可以找到原文件flashplayerpp_install_cn.exe。这种捆绑方法的好处就是兼容性好,无论捆绑什么软件,只要将原文件数据追加到后门末尾就行了,但缺点也易见,PE代码结构与非捆绑型后门几乎一样,很容易被检测出来。
三、后门核心功能分析
看完4018BC函数后,程序还有两个函数4029D0和401800,这两个函数的功能分别是反沙箱以及释放运行shellcode,4029D0主要原理是通过循环执行垃圾代码来耗时绕过沙箱,接下来将主要分析核心函数401800。
该函数也使用了一个有趣的过沙箱的方法,它并没有将shellcode硬编码在程序中,而是硬编码了两段payload(其中一个payload使用命名管道的方式进行创建),将两段payload进行异或运算,得到最终的shellcode并运行,绕过了沙箱的虚拟执行检测。
上图是payload1的生成方法,先创建一个命名管道XXX-MSSE-S-server,将payload1写入管道后,后续再从管道中读取payload1。这里可能大家有个疑惑,把payload1写入管道又读出来,这岂不是多此一举吗?其实并不是,它这样做是为了绕过沙箱的虚拟执行,沙箱有时候为了效率只会模拟一些敏感的函数,但像CreateNamePipeA这种函数比较少用的一般不会模拟,这就导致了沙箱无法获取payload1。
官方解释如下:
得到payload1和payload2后,通过异或运算得到shellcode,并调用CreateThread执行。
shellcode运行之后,会访问URL:192.168.0.101:2333/PIUn并执行该网页上的数据,从数据包中的加密数据可以看出,这应该是第二段恶意代码,主要功能就是接收并执行CS控制者所发来的恶意命令。
四、写在最后
捆绑型软件被广泛用于传播木马及广告软件,而捆绑的目标一般都为安装包文件,因为安装包一般会提示用户使用管理员权限运行,这样捆绑的恶意代码就可以获得较高的权限。所以,提醒大家尽量不要下载来路不明的安装包,避免运行不明恶意代码的风险。
*本文作者:深信服千里目安全实验室,转自FreeBuf