本文的所有工具都采用未加密模式,以此来进行流量分析

Protocol

tcp

image-20230913151725296

udp

image-20230913151806877

区别

image-20230913151837036

形象的说

image-20230913151915604

Tool 1 EarthWorm

image-20230913151958846

最大的特征就是 没有特征 ,灯下黑,下面加密的流量是我访问百度的流量。

Tool 2 Frp

tcp 模式

由于是tcp模式,所以所有的包都在同一个tcp流当中

image-20230913152032123

通过分析该流,发现存在一些特征

特征 握手包

在程序刚运行的时候,客户端会向服务器端发送一个json格式的握手包,用来验证双方的版本、架构的信息

image-20230913152101708

发现这些信息了,就说明frp已经上线了。

kcp 模式

Frp作者在描述中这么写道

1
kcp协议可以在恶劣的网络环境中提供更优的隧道连接

开始分析

image-20230913152136720

首先,kcp协议基于udp协议,在百科上有这样的描述

1
KCP是一个快速可靠协议,能以比TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传输效果。

由于使用的是udp协议进行传输,那么作者所说的kcp可以在恶劣环境中提供更优的隧道服务也不难理解,毕竟服务态度决定了服务速度。

特征 握手包

跟tcp协议一样,udp协议在第一步的时候也会发出一个验证握手包

image-20230913152200982

根据这个特点可以狙击frp的流量。

websocket 模式

首先看一下websocket的握手过程

image-20230913152228695

websocket在建立连接之前,是必须用一个HTTP的请求来握手的,这个HTTP请求作为一个申请,在服务端响应了101以后,切换到websocket进行通信,由于协议自身的限制,这个HTTP明文握手的阶段是无法消除的。

报文呈上

image-20230913152259560

由于websocket是基于tcp的应用层协议,大体结构跟tcp相似,可以轻易找到http握手的那个包,在握手之后,协议集体变成了websocket

特征1 HTTP握手包

image-20230913152328864

由于开启了ws通讯,http明文的握手包当中会请求 /~frp 来转换协议,这个特点是websocket的第一个特征

特征 2 验证版本的响应包

image-20230913152400407

继续追踪这个流,发现在切换成websocket之后,还是会有一个和tcp、udp模式都一样的点,那就是验证版本的包,但是和tcp、udp协议不同的是,这个包不是请求包,而是服务器端发回来的响应包。

Tool 3 nps

tcp模式

包是这样的

image-20230913152424744

找特征咯

image-20230913152447127

特征 1 验证版本

在第一个数据包当中,会存在

1
TST.....0.26.0...0.26.10

这么一段数据,这个数据会进行版本校验,这个特征是nps连接的特征之一

特征 2 连接成功的返回

在服务端给客户端返回的第二个包会有 sucs字样,这个字样也是nps的特征之一

udp模式

不好意思 ,它通讯协议好像没有 udp,客户端可以向外发udp的包,但是服务端没有配置写udp的端口,这个功能需要对源码进行一下分析

Tool 4 pingtunnel

pingtunnel据说是鹅厂的一位大牛写的icmp隧道工具,实际生活中,不妨会有网管会犯迷糊,禁用了tcp协议以后开始沾沾自喜,殊不知这icmp也是可以穿透,话不多说,上报文结构。

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
| Identifier | Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
| Optional Data … |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

可以看到,Icmp包当中是有数据字段的,真不错

我们再看下windows环境下ping所产生的包

request

image-20230913152511926

在请求包当中,数据字段是abcdefg…

response

image-20230913152535598)

响应包字段当中也是abcdefg

我们再看下tracert所产生的包

image-20230913152634262

可以发现,tracert包当中数据字段都是0。

最后看下pingtunnel所产生的包

image-20230913152703847

数据字段当中会有ip存在的,如图,这个47.97.218.141:8000就是我通过icmp隧道进行转发的目的地址,而在ping与tracert功能当中是不会存在这种包的,通过这点可以在流量上来判断是icmp隧道。