观成科技:轻量级内网穿透工具natpass加密流量分析
一、概述
natpass是新一代开源的主机管理工具,支持shell管理、VNC远程桌面等功能,支持使用TCP、TLS等多种协议进行通信,同时可以自定义预共享密钥确保两端通信安全,并且还支持多种操作系统,可以进行跨平台操作。
图 1控制端Web页面
二、部署方式
根据部署的位置不同,分为服务端、控制端和受控端。其中服务端用于提供服务,通常部署于公网环境,控制端用于发出控制请求,受控端用于出网,控制端和受控端使用同一个可执行程序,只是使用的配置文件不一样,前者主要是多了Web端功能,会在控制端本地监听一个本地端口用于启动Web端。部署时,首先启动服务端,再启动控制端和受控端进行上线。
三、流量分析
Natpass默认使用TCP协议进行通信,在配置文件中进行简单配置后可以支持TLS协议加密通信,在TLS流量分析部分会对TLS相关配置做进一步说明。
TCP上线包分析
服务端启动并默认监听6154端口,运行受控端可执行程序进行上线,上线过程首先会发送一个“握手包”到服务端(需要注意的是该“握手包”是工具自定义的,跟TCP建立连接时产生的握手包不是同一个概念),握手包发送的载荷如下图所示:
图 3 TCP上线握手包载荷
图 4 Protobuf编码文件
上图中的载荷经过了Protobuf编码,解析如下:
- 0056:message的总长度,从0x0801处开始的握手信息长度86个字节;
- f2d5023f:随机字节;
- 0801: 0x08表示_type字段,数据类型为VARINT,0x01表示握手请求;
- 120672656d6f7465: 0x12表示from字段,数据类型为string(高5位比特标识字段意义,低3位比特标识数据类型),0x06是长度指示,指示后续受控端id的长度,72656d6f7465为字符串”remote”,是受控端的自定义id,表示请求来自受控端;
- 2206736572766572: 0x22表示to字段,数据类型为string,0x06是长度指示,736572766572为字符串”server”,硬编码在源码中,表示此请求发往服务端;
- 5242: 0x52为payload字段,数据类型为string,0x42为长度指示;
- 0a40至载荷末尾: payload字段的值,根据上面的长度指示确定是66个字节, 其中后64字节是通过自定义Hash函数计算得到的哈希值。
自定义Hash函数会生成一段长度为64字节的哈希值赋值给payload,具体算法是获取当前时间戳并转为分钟数,这个分钟数会和预共享密钥一起参与HMAC哈希函数的计算,算法为sha512,通过计算得出一个长度为64字节的哈希值,最后再赋值给payload。
也就是说在payload生成的过程中,预共享密钥和当前时间的分钟数时间戳都会对最终的哈希值产生影响,如果请求的时间不在同一个时间段内或者预共享密钥是错误的都无法产生正确的payload,服务端在接收到请求后,也会进行相同的操作,与受控端发来的payload进行比对,如果不一致,则不会建立握手,通过这样的方式完成验证过程。
服务端默认使用端口6154进行监听,默认情况下监听的端口是固定的,不会随机产生,在配置文件中可以对服务端默认端口号进行更改,支持自定义监听的端口号。
图 5 配置文件中可以自定义服务端监听端口号
TCP心跳包分析
受控端完成上线之后,每10秒会产生1次心跳,由服务端向受控端先发起,受控端收到心跳请求后会进行响应,最后服务端发送ACK进行最后的确认。
图 6 服务端发起心跳包
分析心跳包相关的代码实现,可以看到心跳包的核心逻辑,心跳包发送间隔10秒是硬编码到代码中的,工具本身也并未提供在配置文件中修改心跳间隔时间的选项。
图 7 服务端心跳包实现代码
分析心跳包发送的载荷,序列化后的载荷如下图所示:
图 8 服务端发起的心跳包
根据上面的Protobuf编码文件进行解析:
- 0012:message总长度,长度从0x0802处开始计算,总长度是18个字节;
- 6653ece6:服务端发起心跳包时为6653ece6,如果是受控端发起的心跳包为507dea79,通过跨平台的不同环境抓包,这4个字节始终是固定的;
- 0802: 0x08表示_type字段,数据类型为VARINT,0x02表示请求类型为keepalive;
- 1206736572766572:0x12表示From字段,数据类型为string,0x06是长度指示,736572766572是服务端的id,硬编码为字符串”server” ;
- 220672656d6f7465:0x22表示To字段,类型为string,0x06是长度指示,72656d6f7465是字符串”remote”,为受控端默认自定义ID,可以在受控端配置文件remote.yaml中进行修改。
受控端在接收到服务端发来的请求后会返回心跳包进行响应,载荷跟服务端发出的心跳包大同小异,不再赘述,
图 9受控端发出的心跳包载荷
TCP终端连接包分析
通常在上线之后,攻击者会在第一时间进入终端执行命令以确认目标是否可以顺利进行通信。
图 10 受控端终端连接成功
上线完成后通过控制端的Web页面进入终端,进入终端时控制端首先会向服务端发起请求,服务接收到请求后,会生成一个请求发往受控端,请求载荷如下所示
图 11 服务端发往受控端的终端连接载荷
对序列化数据进行解析:
- 003c:从0x0803开始的message总长度;
- 20766014:随机字节码;
- 0803:0x08表示_type字段,数据类型为VARINT,0x03表示请求类型为connect_req;
- 12056c6f63616c:0x12表示 from字段,数据类型为string,0x05是长度指示,6c6f63616c是字符串”local”,表示控制端的id;
- 220672656d6f7465:0x22表示to字段, string类型,0x06是长度指示,72656d6f7465是字符串”remote”,表示受控端的id;
- 3210613933…13132313933: 0x32表示link_id字段, string类型,0x10是长度指示,613933343…13132313933转为ASCII为“a9341a4b40a12193”,每一个终端都有这样一个单独的link_id,终端通信的请求和响应都会带上这个link_id,用于标记同一终端;
- 5a170a0573…d3d787465726d: 0x5a表示connect_request字段,string类型,0x17是长度指示,之后的字节为固定字符串,表示创建网页终端时声明的环境变量
受控端在接收到服务端发来的建立终端连接的请求之后,会返回2个响应包,第1个响应包仅带上link_id,用于标记唯一会话,第2个响应包会返回一些终端明文信息,这是终端连接时较为明显的特征,如下图所示:
图 12 受控端的2次响应
图 13 响应包中包含了终端信息
TLS上线包分析
natpass未提供默认证书,如果要通过TLS协议进行通信,需要自行生成证书和私钥,并在服务端和受控端分别部署证书和相关设置,即可通过TLS协议进行通信。
图 14 服务端TLS配置
图 15 受控端TLS配置
natpass支持自签名证书,只需要在配置文件中将insecure字段修改为true就可以在通信时忽略证书校验。
TLS协议的通信过程构建于TCP协议之上,通过在数据传输的最外层增添了一层加密机制,从而确保通信的保密性、完整性以及身份验证的可靠性。虽然外层包裹了一层加密,不过基于TLS协议的上线包仍然具有TCP通信时的相同行为特点。
受控端在上线时首先会发送一条“握手包”,逻辑跟TCP通信时一致,流量行为上看,受控端会发起一个请求,产生一个上行加密载荷,长度为109字节,通过前面对TCP上线包的分析可以得知,它的长度变化仅取决于有没有自定义ID。序列化后的payload部分虽然也受到自定义ID的影响,但是由于哈希算法的特点,始终会产生固定长度的哈希值,不会对加密载荷长度产生影响。 如果受控端采用默认ID上线,在同一环境下总是会产生相同长度、相同个数的上线包,即使更换了默认ID,包长度会有变化,由于一般不会设置超长的ID,以致需要分包传输,上行包数通常也不会产生变化。
图 16 TLS上线包
TLS心跳包分析
上线握手完成之后,开始发送心跳包,心跳包长度固定为41,心跳包每隔10秒进行1次,并且每次心跳只会产生一次交互,每次交互只有1个上行和下行包,值得注意的是该工具不支持通过配置文件修改默认的心跳包间隔,只能通过修改源码进行工具定制开发才能使该特征产生变化。
图 17 TLS心跳间隔
虽然TLS心跳包完全被加密,不过根据之前对TCP心跳包传输的载荷内容的分析,该心跳包长度取决于服务端和受控端自定义id的长度,但是一旦定义好了id,通信过程中id不会改变,则同一次通信过程中心跳包长度始终不变。
图 18 TLS心跳包长度
四、产品检测
观成瞰云(ENS)-加密威胁智能检测系统能够对natpass工具产生的通信流量进行检测。
图 19 natpass告警详情
五、总结
通过对natpass工具的研究发现,该工具不仅支持shell远控,还支持VNC远程桌面等功能,可以方便的作为黑客工具进行远控管理,虽然该类工具设计的初衷可能只是作为个人研究和学习,从作者的声明也可以看出这一点,不过还是存在可能性会被黑客所利用当作远控工具。通过利用这类非主流的远控工具,一方面可以绕过各类流量检测设备的检测,另一方面也可以使用工具本身提供的丰富强大的功能进行网络攻击。观成科技安全研究团队将持续跟踪这类工具的动态,并积极研究更新检测手段,防范此类网络攻击。