一、工具介绍
Merlin是一款支持多种协议的后渗透测试工具。与CS相比,由于该工具使用go语言进行开发(go语言支持跨平台编译),使得Merlin具备了跨平台的优势。该工具传输数据使用了JWE(JSON Web Encryption)格式进行加密数据传输,有效的保护了通信数据的隐蔽性。
二、工具原理分析
工作流程:
Merlin默认情况下,Server和CLI程序是放在同一台设备上,当部署在不同设备上时需要添加“-addr”参数指定地址端口。Merlin上线时,Agent上线后会给Server发送POST请求,请求中携带AgentID信息,Server端对请求包进行校验,检测是否符合请求特征,并使用生成的JWEKey尝试解析请求中的AgentID信息,如果使用JWEKey没有解析成功,则使用PSK(默认值为merlin)计算sha256后作为key进行校验,解密后取AgentID,之后的通信中Agent发送主机的相关信息。
验证过程与加解密分析
服务端会对Agent发送的请求包进行校验,验证步骤如下:
- 请求方式是否为“POST”
- 请求头中UA字段是否为默认的值
- “Content-Type”字段是否为默认配置
- 验证JWT加密模式,尝试解出AgentID(uuid)
这里调用第三方库"github.com/go-jose/go-jose/v3/jwt",对JWT数据进行解密。解密后为AgentID信息。
- 请求体与响应体使用JWE对数据进行加密
该工具使用第三方库“github.com/go-jose/go-jose/v3”对数据进行加密和解密,格式为JWE格式。这里定义了加密算法信息。
三、流量分析
HTTP流量分析:
对merlin agent回连控制端的HTTP流量进行分析,交互的流量中存在如下特征:
* 请求方式均为POST
* 请求的路径不变,默认均为“/”
* 请求头中均含有“Authorization: Bearer eyJhbGciOiJkaXIiLCJjdHkiOiJKV1QiLCJlbmMiOiJBMjU2R0NNIiwidHlwIjoiSldUIn0”
* 请求头中“Content-Type”默认值为“application/octet-stream; charset=utf-8
”
* 响应头中“Content-Type”默认值为“application/octet-stream”
对请求头中的内容进行解密。
"alg":"dir" —这个字段是使用的签名算法,dir表示直接使用对称密钥进行签名;
"cty":"JWT" —这里指定JWT的内容类型;
"enc":"A256GCM" —这里指定加密使用的算法为AES256 GCM模式,默认的key是“merlin”的sha256哈希值;
"typ":"JWT" —指的是格式类型,这里使用的是JWT格式。
请求体中的内容使用JWE格式进行加密解密。
JWE格式分为五部分,每个部分都是用base64url编码,解码第一部分可以看到算法内容:
"alg":"PBES2-HS512+A256KW" —指使用PBES2进行密钥加密,使用HMAC SHA-512和A256KW两种加密算法;
"enc":"A256GCM" —指定使用AES256 GCM模式对内容进行加密;
"p2c":3000 —表示迭代次数3000次;
"p2s":"veb2ksZs8TiXTA6U6xWpTw" —是盐值。
HTTPS流量分析
对HTTPS流量进行分析:
该工具为反连木马,连接远程控制服务器时,其HTTPS通信方式默认使用TLS 1.3版本,证书经过加密,无法看到。但其流量存在心跳特征,默认的心跳间隔为30s,且心跳包存在独特的载荷变化规律。通过心跳间隔和载荷变化规律能够对该工具的HTTPS模式进行有效检测。
四、工具检测
根据分析结果,我们可以对merlin通信的加密流量进行有效的检出。
五、总结
Merlin支持在多种平台上使用,在较为复杂的环境中都能很好的得到应用。该工具使用独特的JWE格式加密传输数据,可以更好的躲避明文流量设备的检测,但是通过TLS限定域指纹和多流行为可以对该工具进行有效的检出。如今,越来越多的攻击者采用加密通信的C2工具,以提升攻击的隐蔽性。观成科技安全研究团队持续追踪这些C2工具的最新动态,积极研究和更新针对加密流量的检测技术。