本次实验用到的CobaltStrike为4.5版本

前情提要

上期我们介绍到,将免杀的ps1直接替换掉CobaltStrike中自带的ps1模板,但这仅适用于一种情况(因为替换内容中的ip和端口号已经被固定,核心上线代码是一样的),也就是说如果我们想通过监听器生成其他正向、反向、甚至其他协议后门时,可能会出现错误、上不了线、被查杀等多种情况。本期内容围绕不改变上线核心源码(被base64加密的shellcode部分),修改模板实现分离免杀

修改内容

对原模版x86.ps1内容修改

后门主要由-函数-shellcode-调用函数-三部分组成,使用分离思路将其拆分成三个片段,每段皆有变量代替。范围由@‘ ’@涵盖

为防止代码被识别,再将每部分进行base64加密,先解密后拼凑在一起,最后执行

或者可以像前期内容一样添加特殊字符在里面,解密后替换完再执行。要么就用http请求获得加密的shellcode,思路有很多,我这里就选最简单的

ps:写到执行那步才发现我的这个x3变量少写了个x,得添加上才能执行,懒得改了

将修改的内容替换掉源jar包中的文件

还有一处需要修改,打开cs项目,找到源文件的shellcodebase64加密处。既然咱们对他进行了两次加密,那么我们也要在源码进行两次加密,才能达到刚好匹配

搜索关键字找到加密处

根据对应文件路径在src下创建相同的文件,文件名。修改完后再重新编译成class文件,此处不懂的请见前期内容

在out目录找到生成的class文件

替换掉原来的ResourceUtils.class

将修改完的CobaltStrike.jar上传到服务器,换掉原来的,重新启动cs

生成一个x32的ps1木马测试

可以看到输出格式直接变成了我们编写的模板

上线没有问题但是不免杀,windows对于ps1文件很严格,shellcode没改动还是不行

对其他payload修改

cs的payload模块可以生成很多语言的后门代码,以c语言为例,生成的是一串二进制。我们可以运用上面学到的知识,对该shellcode在生成的时候就进行base64编码

搜索关键字定位文件出处

根据源文件路径在src下生成一样的

修改代码重新编译打包进jar包内,再上传服务器

重新生成c的payload试试,包成功的老弟