工具介绍
项目地址:
https://github.com/esrrhs/pingtunnel
说明
通过伪造ping,把tcp/udp/sock5流量通过远程服务器转发到目的服务器上。用于突破某些运营商封锁TCP/UDP流量。
特点
流量&逻辑分析
环境&测试准备
环境配置
服务端 Ubantu192.168.2.129
客户端 Kali 192.168.2.139
测试方式
- Ubantu运行命令
./pingtunnel -type server
- Kali运行命令
./pingtunnel -type client -l :4455 -s 192.168.2.129 -sock5 1
检测特征
Client逻辑分析
DATA用于数据传输,PING用于联通新测试,KICK用于退出,MAGIC用于校验
client入口主要在cmd#main.go#244#pingtunnel.NewClient,前边的逻辑基本都是参数判断,初始化赋值等
继续跟踪client.go#23#NewClient方法,此方法为初始化和赋值Client对象:
继续跟踪发现主要入口函数cmd#main.go#244#c.Run,继续跟踪client.go#185#Run方法:
其中最主要的几个方法为recvICMP、ping、processPacket、AcceptTcpConn、AcceptSock5Conn等等,之前通过方法调用或者chan信道来进行
先看client.go#673#ping方法(最开始的调用在client.go#228)
继续跟踪pingtunnel.go#15#sendICMP方法:
其中主要调用了proto.Marshal来对m进行序列化操作,m的值如下,其中非定值为Data,关于具体的序列化结构数据可参考链接,个人感觉例子讲解的和通透
这里直接给结论,前面的Id、Type、Target、Data(部分)组成定值,
\x10-01(Type) 220f-010000000e(Data)
后边Magic组成定值(MyMsg_MAGIC=57005)
\x30dafa06
总体满足以下格式:
\x10\x01(Type) + \x22\x0f\x01\x00\x00\x00\x0e.{10}(Data) + \x30\xda\xfa\x06(Magic)
另外一个重要方法为client.go#564#processPacket,重点部分跟踪分析一下(其调用在recvICMP–> recv <- &Packet --> p.processPacket®):
解析以Frame形式发送的数据
client.go#312#AcceptTcpConn方法用于处理TCP连接,并发送数据,由AcceptTcp进行循环调用:
Server逻辑分析
Server端和Client逻辑类似,server,go#89#recvICMP持续监听是否有ICMP入保,如果有并且解析无误后,通过信道将Packet传输给processPacket进行处理
server.go#132#processPacket方法针对不同类型的数据做不同的处理,这里我们只关注PING类型
这里主要分析一下数据特征:
这里直接给结论,前面的Id、Type、Target、Data(部分)组成定值:
\x10-01(Type) 220f-010000000e(Data)
后面Rprote组成定值:
\x28-01(ZigZag优化负数存储逻辑,存储其绝对值的2倍减1)
后边Magic组成定值(MyMsg_MAGIC=57005)
\x30-dafa06
总体满足以下格式:
\x10\x01(Type) + \x22\x0f\x01\x00\x00\x00\x0e.{10}(Data) + \x28\x01(Rprote) + \x30\xda\xfa\x06(Magic)