前言
实战攻防中,原生的cs满足不了当前对抗场景,了解cs通信原理才能透彻的理解网上主流的域前置、云函数、自定义profile等概念。未知防,焉知攻。
理论研究
HTTP STAGING
becon请求下载完整的stager并注入内存中
HTTP GET
becon将受感染主机的信息加密通过get请求发送到C2,C2将需要执行的命令加密后通过返回包传递给becon,becon解密后执行,如果没有要执行的命令就为空。
上面两步对应的profile写法
becon定制发送主机信息
1 | http-get{ |
C2定制返回需要执行的命令信息
1 | http-get{ |
HTTP POST
becon在执行任务时会积累输出,在完成所有任务后,becon会检查是否有要发送的输出。如果没有输出,则信标进入睡眠状态。如果有输出,则becon会发起HTTP POST请求。
HTTP POST请求必须在URI参数或标头中包含会话ID。Cobalt Strike使用此信息将输出与正确的会话相关联。最初发布的内容是加密的二进制数据块。可以在http-post的客户端上下文下使用output关键字转换此信息。
1 | http-post{ |
下图为发送的关键字以及其发送的数据
流量实战
使用自定义的profile(不用也可以,只不过访问的url不一样)开启,首先新建一个11223端口的http becon监听器,然后创建一个该监听器的马抓包并运行木马然后执行ipconfig。
发现第一个发送的http包请求了/bLLc,对应着stager下载完整payload访问的地址。这一步的作用是下载完全体的payload并解密注入内存中。
第二个包,发送加密的元数据放到cookie中传输,不过这个cookie看起来一眼假,因为没有cookie的键只有值。再看包的返回值,为空。之前说过这一步包的返回值内藏着的是加密的命令,这里为空代表里面没有需要becon执行的命令。
而下面还有一个对activity访问的包,这个包的返回值是一串加密的二进制字符,里面放着的就是我们执行的ipconfig命令。
最后的包就是becon将ipconfig执行结束的命令加密并通过post包提交给我们的C2,id就是becon的在C2中的编号。
总结
默认的becon在发送的时候首先会请求一个4字随机的url获取完全体的payload,这是一个特征。然后提交数据会用submit.php,也是一个很明显的特征。这里可以自定义profile进行对抗,网上随便找个profile修改一下流量特征,流量安全设备就识别不出来了becon的http了。不过如果要用https的话,还需要配置一个证书,不然默认的证书流量设备会直接告警。