社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 639阅读
  • 2回复

[分享]魔改CobaltStrike:二开及后门生成分析

楼层直达
z3960 
级别: 茶馆馆主
发帖
770867
飞翔币
207694
威望
215657
飞扬币
2511641
信誉值
8

[font=-apple-system, BlinkMacSystemFont, &quot]一、概述:[font=-apple-system, BlinkMacSystemFont, &quot]这次文章主要介绍下Cobalt Strike 4.1相关功能的二开和后门(artifact.exebeacon.exe)的生成方式,Cobalt Strike的jar包我已反编译,并改了下反编译后的bug,teamserver与agressor均能正常调试使用,附反编译后项目地址: https://github.com/mai1zhi2/CobaltstrikeSource[font=-apple-system, BlinkMacSystemFont, &quot]。若有不对的地方希望大伙指出,谢谢。后续将会再分享通讯协议与自定义客户端(后门)。PS:感谢Moriarty的分享课。[font=-apple-system, BlinkMacSystemFont, &quot]二、常用二开的方式:[font=-apple-system, BlinkMacSystemFont, &quot]2.1RDI,反射型DLL注入[font=-apple-system, BlinkMacSystemFont, &quot]添加反射型Dll:[font=-apple-system, BlinkMacSystemFont, &quot]在default.can文件中添加自定义的菜单项,其中传入参数$1为beaconID:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]在AggressorBridge.java的scriptLoaded()方法中增加自定义的dialog:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]在evaluate()方法添加相应的事件处理,来打开自定义的对话框:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]自定义的对话框的构造方法传入client和beaconID的数组,以便后续构造TaskBeacon实例,再调用TaskBeacon实例中新增的RDITest()方法,:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]下图为在TaskBeacon.java中的TaskBeacon类中新增的RDITest(),在该方法中生成RDITestJob类对象并调用其spawn()方法:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]所增加的RDITestJob类,该类继承Job类,并实现所需的虚函数,其中getDLLName()函数要返回所需dll的路径:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]另外在该类中重写了父类的spawn()方法,因为父类的spawn()方法会调用decrypt()函数解密后相应的资源后再去读取,而我们的dll没有进行加密,所以直接读取即可:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]测试运行:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]2.2 BOF,Beacon Object File,加载运行obj File[font=-apple-system, BlinkMacSystemFont, &quot]先生成 bof文件,这里以netstat功能为例子[font=-apple-system, BlinkMacSystemFont, &quot]新建自定义的BOF类,并继承PostExInlineObject类,重写类中的getObjectFile()方法,该方法的作用是返回要加载的BOF文件路径:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]其中在父类PostExInlineObject中的getFunction()方法可以修改BOF文件的入口方法名,不一定为go:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]然后在TaskBeacon增加其BOF类的调用:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]最后在自定义dialog中调用:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]测试运行:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]三、简介相关后门的生成:[font=-apple-system, BlinkMacSystemFont, &quot]3.1、stager(artifact.exe)[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟进show(),首先设置windowsexecute对话框里面的相应信息,其中DialogManager var1为窗口管理对象,再调用addDialogListener(this)将当前的窗口加入链表,然后调用它的action()方法:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入action()方法,里面再调用action_noclose()方法:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入action_noclose(),首先找到Generate的按钮,然后为其添加事件监听:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]选择listener,点击Generate:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]点击按钮后就新建线程,通过listeners2属性获得一个窗口迭代器,然后迭代窗口对象,调用该窗口对象所实现DialogListener接口中的dialogAction()方法:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]因为WindowsExecutableDialog实现了DialogListener的接口:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]即调用该类中的dialogAction()方法:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入getPayloadStager(),该方法主要负责生成相关的shellcode:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入 shellcode (),该方法三个参数分别为listener、payload名称、payload的位数:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]继续跟入resolve(),判断传入的payload名称var2是否在系统自带的payload链表var4里:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]返回相应payload 的GenericStager对象,并genericStager.generate()方法,该方法为主要shellcode的生成方法:首先传入"resources/httpstager.bin"路径通过CommUtils.resource()获得相关的shellcode: [font=-apple-system, BlinkMacSystemFont, &quot]先拼接了teamserver地址和端口号:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]再回填EXIT_FUNK_PROCESS:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]回填SkipOffset和isSSL[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]回填User-agent:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]回填URI:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]这里注意这个getURI()生成URI的函数,现在有网络空间测绘进行网络上的扫描,该生成的URI就是其主要特征,跟入这个函数:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]因为GenericHTTPStagerX86是父类,看ForeignHTTPStagerX86子类里面的函数实现,里面调用了MSFURI(32),继续跟入: [font=-apple-system, BlinkMacSystemFont, &quot]这个函数是URI有大写字母+小写字母+数字组合而成,然后经过checksum()函数计算与92相等则成功生成,跟入checksum(): [font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]在webserver端认证URI来下载beacon时也是通过checksum8()函数来认证:[font=-apple-system, BlinkMacSystemFont, &quot] [font=-apple-system, BlinkMacSystemFont, &quot]最后函数执行完后返回shellcode,回到dialogAction()方法,后续判断需要生成的是exe还是dll,调用savefile()来保存,再在该函数中调用post(),里面新开线程,调用窗口对象的dialogResult()方法: [font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入dialogResult()方法,先获取了相关的信息:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]根据信息调用patchArtifact()方法:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟进patchArtifact():[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]再跟进patchArtifact(),函数中主要调用_patchArtifact(),传入shellcode内容和相应文件名,先读取出在resources/中artfict32的内容:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]再生成四个随机数放在数组var6中,然后将shellcode跟该数组进行异或处理后存放在var7:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]在artfact.exe找到1024个‘A’的位置:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]然后把相应的位置、异或所需的数组、异或后的shellcode内容及长度等信息填入var10:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]然后把artfact32.exe的1024个’A’进行替换,并返回artfact32.exe内容:[font=-apple-system, BlinkMacSystemFont, &quot][size=; font-size: 10.5pt,10.5pt]接着把artfact32.exe内容传入fixChecksum()做校验和:[font=-apple-system, BlinkMacSystemFont, &quot]最后调用writetofile()把数据写入文件:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]对比文件,1024个‘A’被替换成异或后的shellcode:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]生成Stage(Beacon.exe)分析:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]前面流程都一样,主要分析WindowsExecuteStageDialog.java[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入getListener(),里面主要做配置信息:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]再跟入new ScListener():[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]先看DataUtils.getProfile(var1),主要获取c2profile通信设置:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]再看DataUtils.getPublicKey(var1),获取pubkey的值:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]返回listener var4后,调用var4的export()方法,跟入,函数里判断payload的类型:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]获得相关host和port后调用exportBeaconStageHTTP():[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]再跟入exportBeaconStage(),先获得当前的系统时间,然后读取resource/beacon.dll:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入readResource(String s),先把resource/替换成sleeve/,然后调用decrypt()解密读取到的相应资源:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入decrypt(),里面做相应的解密处理,先分别获取内容0到length-16的字节存入var2和length-16到length的字节存入var3:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]计算var2的消息摘要:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]取消息摘要的前16位与var3对比,相等则执行do_decrypt()解密操作:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]然后读出数组的长度,跟进长度申请空间,再存入空间并返回:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]接着后面读取c2配置文件的规则信息user-agent、sleep间隔、dns配置等:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]注意:这里传入RSA的pubKey,用后续AES密钥传递通信:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]把信息传入beacon_obfuscate()进行异或处理后,回填到解密后内容的"AAAABBBBCCCCDDDDEEEEFFFF"的位置,并返回:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]返回后的内容传入process(),里面有前后两个处理pe文件的方法:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]先跟进pre_process(),首先调用string()方法,传入pe内容即var1:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入string(),函数主要是读取默认配置文件default.profile里面的stage内容:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]再获取配置文件stage标签里的image_size、entrypoint等基本信息,再进行设置:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入post_process(),主要判断生成的Beacon位数,然后修改其里面的DOS头,作为RDI调用:[font=-apple-system, BlinkMacSystemFont, &quot][size=; font-size: 10.5pt,10.5pt]硬编码修改DOS头,其中var1为需要跳转执行方法的位置:[size=; font-size: 10.5pt,10.5pt][size=; font-size: 10.5pt,10.5pt][font=-apple-system, BlinkMacSystemFont, &quot]返回修改好的内容,至此export()方法执行完毕,后续根据是否生成x64位程序和是否为.exe.dll去修改。[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]跟入patchArtifact():[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]再跟入_patchArtifact():[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]可见后面所调用的方法作用均与上面stager一致,不再赘述。[font=-apple-system, BlinkMacSystemFont, &quot]谢谢大家观看。祝大家新春快乐。
关键词: 系统 下载 申请
我不喜欢说话却每天说最多的话,我不喜欢笑却总笑个不停,身边的每个人都说我的生活好快乐,于是我也就认为自己真的快乐。可是为什么我会在一大群朋友中突然地就沉默,为什么在人群中看到个相似的背影就难过,看见秋天树木疯狂地掉叶子我就忘记了说话,看见天色渐晚路上暖黄色的灯火就忘记了自己原来的方向。
级别: 超级版主
发帖
834390
飞翔币
226658
威望
224648
飞扬币
2446620
信誉值
0

只看该作者 1 发表于: 2021-02-27
来看一下
级别: 超级版主
发帖
834390
飞翔币
226658
威望
224648
飞扬币
2446620
信誉值
0

只看该作者 2 发表于: 2021-02-27
不错,了解了