1、工具简介
suo5是一个高性能的http隧道代理工具,支持全双工半双工模式,具有很高的传输性能,现在越来越多的webshell管理工具与内存马生成工具都支持了生成suo5木马的功能。从v1.1.0版本开始,其TLS协议传输功能中,增加了新的变化,每次握手使用随机的加密套件和扩展列表项,使得客户端指纹和特征不固定,增大了其TLS加密流量的检测难度。
2、不同版本对比
v1.1.0之后的新版本相较于我们之前分析过的v0.5.0版本存在以下差异:
3、新旧版本差异详解
(1)HTTP协议通信分析
1)建立连接的验证阶段
图1:v0.5.0验证请求
图2:v1.1.0验证请求
- 在请求体的长度方面
0.5.0版本在ctrl.go文件中定义的checkMemshell函数限定了请求体长度以及验证连接成功的方式
图3:v0.5.0 checkMemshell函数限定了长度64字节
函数前半段的data使用randstring函数生成了长度为64的随机字符串作为请求体,并在之后用于验证连接情况。
图4:v0.5.0 响应体校验方式
之后使用len(body) != 32 || !strings.HasPrefix(data, string(body))校验响应体,如果响应体的长度不等于 32 或者响应体的前缀不是 data 的一部分,则认为检测失败。在失败的情况下,会将响应头和响应体内容记录下来,并返回错误。
而1.1.0版本改用checkConnectMode函数,在校验连接的同时判断适用的连接模式,见下图:
图5:v1.1.0 checkConnectMode函数源码
这里随机生成的data长度不再是固定的64字节,而是在32 到 1024 字节之间随机取值,因此每次验证数据长度不固定。
2)首次传输数据
图6:v0.5.0首次传输数据
图7:v1.1.0首次传输数据
- 请求头中在Content-Type分别是application/octet-stream和application/x-binary这里在新老版本是相同的,作为全双工半双工模式标记。
- 新版本同样沿用了之前的异或加密方式,数据格式为【四个字节密文长度指示+密钥+密文】。
3)请求体解密:
图8:解密请求体
解密后请求体存在字符ac、h、p,这些参数在handler.go文件中定义:
图9:请求体构建函数
newActionCreate函数接收四个参数后,返回字节映射并在handleConnect函数中构建请求体。其中ac代表操作类型(创建、数据传输、删除、心跳);id代表当前操作的唯一标识,用于确保操作的正确性和一致性;h为目标的IP或域名;p代表端口,默认为0。除此之外,在chunked.go代码中,还记录着在后续传输数据时才存在的标志位”dt”,表示有数据传输。
4)响应体解密:
图10:解密响应体
响应体内容解密后除了不可读字符外仅有 “s”。
图11:响应体验证
分析代码可以看出响应体中的键 "s" 对应的值作为状态码。如果状态码不是 0x00 或者状态值的长度不为1,说明服务器拒绝了连接请求。
(2)TLS协议通信
图12:v1.1.0版本的TLS指纹不固定
图13:v0.5.0 版本的TLS指纹不变
v1.1.0版本在进行HTTPS通信时使用了utls库中的UClient函数,用于创建TLS客户端连接。该函数的第三个参数 utls.HelloRandomizedNoALPN 表示客户端消息中的ClientHello类型。这个参数表示在TLS握手中不使用ALPN并且随机化扩展列表和加密套件以增强隐私性。因为新版本使用的不是oldConn.ClientHelloID参数,所以由ClientHello消息计算得到的TLS指纹也不再是固定的。
图14:v1.1.0版本中处理TLS通信的相关代码
而v0.5.0版本并未发现这个函数,HTTPS通信上使用的是crypto/tls库中的tls.Config来构建请求,除了设置了忽略证书校验外都使用go的默认配置进行连接。
4、产品检测
观成瞰云(ENS)-加密威胁智能检测系统能够对suo5隧道代理工具产生的HTTP和HTTPS流量进行检测。
图15:suo5-http告警详情
图16:suo5-https告警详情
5、总结
在利用suo5隧道代理工具的过程中,攻击者不仅可以将工具自带的木马上传到目标中,也可以由其他内存马以suo5的通信方式和加密形式来利用,还可以通过webshell管理工具来注入suo5的内存马进行利用,但是基于人工智能、流行为特征和TLS限定域指纹检测的加密威胁智能检测系统能够高效、准确的检测出该代理工具。目前越来越多的攻击者利用隐蔽隧道工具来封装攻击行为,观成科技安全研究团队一直在持续追踪这些工具的最新动态,并积极进行研究和更新,以提高对加密流量的检测技术。