观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
- 1.工具介绍
Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网络环境并且借助TLS协议实现加密通信。
2.工作原理介绍
图 1工具运行流程图
服务端作为攻击方运行工具,使用命令自动生成签名证书指纹并监听本机的11601端口,等待受害机(客户端)的连接。
客户端在受害主机上启动运行,验证服务端生成的证书指纹,校验通过后双方建立TLS加密通道进行通信。客户端执行连接命令时指定参数-accept-fingerprint,参数后紧跟证书指纹,该证书指纹与服务端运行命令自动生成的证书指纹进行比对,如果两个证书指纹一样则校验通过。
3.通信过程流量分析
工具使用了go语言的yamux库进行通信,客户端和服务端之间的通信为TLS长连接,由于yamux库有可以使用双向流的特性,所以在完成TLS握手以后通信的两端会各自维护一组心跳行为,以此达到高实时性与高性能的效果。
默认配置下服务端主动发起的心跳间隔固定为27s,客户端主动发起的心跳固定为30s,可以通过修改源码各自设置不同心跳频率。
图 2 红黄两部分分别为两组不同间隔的心跳
常见的心跳包是由客户端发送请求(上行包)后,再接服务端响应(下行包),本工具具有服务端心跳,与客户端心跳相反,先由服务端主动发请求,之后客户端再发响应,在TLS加密载荷中体现为先有下行包后有上行包。
此行为为对yamux库特性的应用,从工具源码的NewAgent函数中可见:服务端在建立新连接后会立即发送InfoRequestPacket。之后在HandleConn函数中,agent会处理这个初始请求。
图 3服务端发送请求代码图
图 4客户端响应请求代码图
从TLS加密载荷可以看到,两组心跳的长度相同,且固定为29字节。
图 5交互稳定后心跳包大小图
分析代码可知,心跳的内容主要为通信自定义的ping命令,29字节长度组成为12字节明文数据(yamux库自定义的12字节ping帧结构),1字节记录类型,16字节认证标签。这16字节认证标签来源为服务端选择的加密套件TLS_AES_128_GCM_SHA256 (0x1301):
- TLS_AES_128_GCM_SHA256 加密套件:
- 使用 AES-128-GCM作为加密算法,GCM 模式是一种认证加密模式(AEAD)。
- 加密后会增加以下开销:
- Nonce(初始化向量):GCM 模式通常使用 12 字节的显式 Nonce(在 TLS 1.3 中,Nonce 由记录层隐式管理,显式部分通常不直接计入数据长度)。
- 认证标签(Authentication Tag):GCM 模式会为每个加密记录添加 16 字节的认证标签,用于完整性验证。
- TLS 1.3 的记录层会将明文加密为密文,并附带额外的元数据。
- TLS 1.3 记录结构:
- TLS 1.3 的 Application Data记录对以下明文内容进行加密:
- 明文数据:12 字节(在这里也就是yamux库自定义的12字节ping帧结构)。
- 记录类型:TLS 1.3 在加密数据后会附加 1 字节的记录类型
- 认证标签:16 字节(GCM 模式的完整性标签)。
- 加密后的数据总长度 = 明文数据 + 记录类型 + 认证标签 = 12 + 1 + 16 = 29 字节。
图 6 29字节加密载荷内容数据结构图
图 7 yamux库构造ping内容代码图
4.工具检测
观成瞰云-加密威胁智能检测系统通过对该工具TLS通信中的行为特征进行识别,支持对Ligolo-ng隐蔽通信工具进行有效检出,检测告警见下图。
图 8检测告警图
5.总结
通过对Ligolo-ng工具的研究发现,虽然该工具能利用反向TCP/TLS连接,使用自动生成的证书建立一条隐蔽的加密通信信道,但是通过对其通信过程的分析发现,数据包具有心跳时间、心跳方向以及心跳包长度等特征,可以通过检测这些行为特征对该工具加密流量进行识别。观成科技安全研究团队将持续跟踪各种隐蔽隧道工具并研究加密通信特征,及时更新检测方案。