【免杀】使用CobaltStrike的外置监听器绕过检测
可能是最简单一种免杀方式了
公众号:https://mp.weixin.qq.com/s/9ReEchLx1dTbWR9plRWbpg
或许我们的公众号会有更多你感兴趣的内容

【免杀】使用CobaltStrike的外置监听器绕过检测
背景
起源于一次免杀马的制作,当我制作好了过后,在windows defender(后文简称为wd)中测试时
- [x] 本地扫描能够通过
- [x] CobaltStrike TeamServer能显示木马的正常上线
- [ ] 上线后本地木马立即被查杀
结论
这里直接上结论,想要知道原因可以看下文
首先给出猜测:是windows defender有类似的waf,并且由于cobaltstrike的stager payload的加载方式被wd识别出
给出解决办法:想办法加密/混淆Teamserver和Tojan的流量,类似于下图

在CS上有一种监听器叫做:External C2

只需要绑定本地的端口即可
同时我们需要编写一个 转发器、收发的torjan
转发器编写
为了方便,这里就使用Tcp socket进行编写
首先需要一个转发的类
import socket |
这里需要说明的是,转发器和teamserver之间的通讯tcp报文是

也就是说先从tcp流中读取4字节,然后这4字节作为长度,再从流中读取这一长度的剩余报文。这一点也可以从recvFromBeacon看出
首先创建和 teamserver的 externalC2监听器的socket连接,然后监听本地的12222端口的tcp流量,一旦有请求流向监听的12222端口,就开始向teamserver传输上线信息,其中
- arch:torjan的位数
- pipename:需要使用到的管道名称,在程序中就为
\\,\pipe\${pipename} - go:表示传输初始化信息完毕,torjan已经上线
当 teamserver收到torjan上线消息后,会返回一段data,这段data就是stager(有阶段)的第二段payload,通过之前讲过的反射式dll注入运行,由于使用的dll被各种标记,所以这里很有可能被检测出,如果对teamserver的这段dll进行加密后再发送给torjan,那么在torjan内,至少这段dll解密进入内存之前是安全的
第三方客户端编写
也就是我们的马子,torjan
根据上面的简单分析,主要过程如下:
- 创建到转发器的socket
- 接收并
解密转发器返回的shellcode,想办法运行这段shellcode
DWORD payloadLen = 0; |
如果你逆向分析过cs生成的artifact.exe,你会发现它使用管道通讯
为什么要使用管道通讯呢?
之前在讲转发器的最后一个部分,因为第二段payload是一个dll,如何保持该dll和主程序之间的通讯?解决的方法就是使用命名管道,这也是为什么要在初始上线的时候传输管道的名称,这样才能生成torjan生成的torjan_dll。

通过管道将:teamserver->转发器->torjan 的数据,通过管道传输到 torjan_dll,反之亦然
// Loop until the pipe is up and ready to use |
关于管道数据的解析,和转发器到teamserver的一致

测试一下windows defender
这里就简单测试下没有加密过的


完整代码如下,建议使用 Visual Studio,位数x86 编译
|







