从零开始开发CS beacon

VSole2021-12-21 16:01:20

 

0x01 netbios加解密

因为我也才学golang,基本面向github编程,在网上只找到python版加解密的方式,所以需要翻译成go语言。通过正则匹配加密传输的内容,解密执行获取cmdtype对应的操作,然后加密发送。

编写加密代码:

func NetbiosEncode(data []byte) string{   q := ""   for _,value := range data{        q += string((int(value)>>4) + int('a'))+string((int(value)&0xf + int('a')))   }    return q}

最终成功上线如下,能够看见心跳包与执行命令都是正常的,说明加解密是没问题的:

0x02 项目优化

因为上线后,显示如下,开始我以为是CS显示问题,后来发现是代码实现问题:

computer 与 prcoess 都不能正确获取,我们定位到sysinfo文件夹下meta.go文件,其中实现了收集beacon所在机器基本信息。

BUG-1:获取进程名

func GetProcessName() string {    processName := os.Args[0]    //fmt.Printf("processName: %v", processName)    // C:\Users\admin\Desktop\cmd.exe    // ./cmd    slashPos := strings.LastIndex(processName, "\\")    if slashPos > 0 {        return processName[slashPos+1:]    }    backslashPos := strings.LastIndex(processName, "/")    if backslashPos > 0 {        return processName[backslashPos+1:]    }    return "unknown"}

这里原作者想到的是,带路径的执行参数,但是经过我测试,os.Args[0]获取到的就是当前exe名称,并不是一个绝对路径,如果是绝对路径可以通过下面判断截取EXE名。这里修改也简单,直接return processName就正常了。

BUG-2:获取机器名

func GetComputerName() string {    sHostName, _ := os.Hostname()    fmt.Printf("sHostName: %v", sHostName)    // message too long for RSA public key size    if len(sHostName) > 10 {        sHostName = sHostName[1 : 10-1]    }    if runtime.GOOS == "linux" {        sHostName = sHostName + " (Linux)"    } else if runtime.GOOS == "darwin" {        sHostName = sHostName + " (Darwin)"    }    return sHostName}

这里机器名不能全部显示,确实跟他注释的原因一样,但是经过我测试发现,最长可以使用sHostName[0 : 14]切片。

BUG-3: 不能下载大的文件

当使用download 下载命令时,小文件可以下载,但是略微大的文件会出现如下报错:

经过多次调试实验发现,以下语句有问题(我这里通过BP抓包发现的):


fileBuf := make([]byte, 512*1024)

他默认一次传输512kb数据,可是在header中如果数据过长会提示:BAD REQUEST: header length is too large

所以这里很简单,我们就一次传小点,比如2kb。重新编译就上线:

0x03 总结

到这里,整个CS beacon适用自定义profile的开发流程就介绍完毕了,优化了原程序BUG,当然还有其他很多可以优化的地方。这个项目Geacon只实现了最基本功能,不像原生beacon那么多样,你就可以使用golang实现某些CS功能,比如execute-assembly,判断cmdtype就行。因为我的需求是CS跨平台的beacon,容易免杀(golang也有一些免杀的trick),后面还可以添加反调试的功能。项目地址:https://github.com/Nan3r/geacon_apt

beaconstring
本作品采用《CC 协议》,转载必须注明作者和本文链接
Beacon 通常是反射加载到内存中,还可以配置各种内存中混淆选项以隐藏其有效负载。 Beacon 可以配置各种内存中混淆选项以隐藏其有效负载。例如,obfuscate-and-sleep 选项会试图在回调之间屏蔽部分 Beacon 有效负载,以专门避开基于特征的内存扫描。
Beacon 通常是反射加载到内存中,还可以配置各种内存中混淆选项以隐藏其有效负载。Beacon 可以配置各
从零开始开发CS beacon
2021-12-21 16:01:20
因为我也才学golang,基本面向github编程,在网上只找到python版加解密的方式,所以需要翻译成go语言。
CobaltStrike ShellCode详解
2022-08-04 16:51:50
接下来就是重点了,加载起来的这段shellcode开头先将DF标志位置0,这里为什么这样做后面会提到。
shad0w原理分析 part 1
2021-10-18 16:17:10
shad0w原理分析!
cobaltstrike4.5特征消除2修改了内置stage的配置,实现硬性特征消除修改部分payload,实现基本免杀修改checksum8 判等参数public static long checksum8 {. 修改随机生成算法写入方法,传值 public static void main {. 修改传值修改common/CommonUtils的public static String MSFURI {. string = "/" + pick + pick + pick + pick;
CobaltStrike Charset Improvement
NO.1 前言之前介绍了CobaltStrike4.3的License认证分析,今天介绍一下CobaltStrike4.3去除CheckSum8特征的方法,CheckSum8的特征和具体算法不在此细说,
分享每周看到的有意思的威胁狩猎相关的文章,本人仅做翻译
域渗透实战之 vsmoon
2023-11-14 10:40:10
域渗透实战之 vsmoon
VSole
网络安全专家