1、什么是私有协议?
比较著名的网络协议有TCP/IP协议栈中的一些协议,比如IP、TCP、UDP、POP3、SMTP、HTTP等。已知协议都是有RFC规范的,按照规范解码就可以得到协议。
与之相对的,私有协议是指协议格式不公开的协议。比如我们所知道的QQ、Teamviewer、向日葵,还有一些商用产品的通信协议,工控类的工控协议,甚至恶意软件所使用的通讯协议,都可以理解为私有协议。
抽象点来举例,网络的公开协议就像是我们日常生活中交流所用的语法,只要我们都懂语法,就能通过语言准确传达我们想表达的信息。与之相反的,私有协议就相当于创造了一种只有特定目标之间才懂的语法。
现实中还的确发生过这样的事情,一部名为《波斯语课》的纪实电影就讲述了在二战期间,年轻的比利时犹太人吉尔斯为求活命,假冒波斯人为集中营的军官科赫教授波斯语,二人之间产生不同寻常的友谊的故事。而吉尔斯所教授的假波斯语其实是他在极度的求生欲中创造出来的。
《波斯语课》剧照
2、分析私有协议流量难点
第一个难点是引起协议变化的场景未知。运营商在复杂多变的环境下生存下来,流量传输的协议格式必须发生变化,至于如何改变,对于协议分析者是未知的。
第二个难点在于协议格式无明显规律,不能套用标准格式去分析私有协议。
3、私有协议分析
远控程序:Teamviewer15.20.6
抓包工具:Wireshark
操作系统:Win10 64位
网络环境:内部NAT网络
(1)分析DNS数据
先过滤出dns数据,发现刚开始使用时,会向域名请求几个含有teamviewer的域名,得到一些不同的IP地址响应。
初步判断请求的域名可能的作用:请求的服务器用于作为数据中转或者接收程序的心跳包。
DNS数据
(2)分析TCP数据
过滤出TCP数据,发现存在与上一步中域名响应的IP(106.14.200.133)进行了数据交互的情况。
进行多次反复连接抓包后,观察发现TeamViewer服务器的网络流量一直是固定在TCP端口5938上运行的自定义协议。同时注意到只要是存在有数据的传输的情况下,payload的开头均为1130,且在teamviewer连接成功前后都出现1130。但是数据内容被编码,完全无法识别。
服务器端口为5938
TCP的payload部分以1130开头
(3)分析UDP数据
连接上主机并在通信的过程中,会夹杂一些UDP的数据,而且从里面可以发现连接目标主机的数据包。并且在对比了多个UDP数据中还发现了UDP的数据部分必定会出现1724 。
UDP数据
4、意外发现
从上面的之后其实我的分析已经告一段落了,单独从流量层面分析到的有效信息实在非常有限。分析中发现固定出现的数据如TCP出现的“1130”和UDP出现的“1724”,只能猜想是版本号或者心跳指令之类固定格式的一些数据。
通过之前收集到的一些数据其实已经足以用来证明存在Teamviewer的使用行为,但还是感觉对数据内容知之甚少。直到一段时间后在查资料的时有了意外发现,有人做出了利用Wireshark来对Teamviewer私有协议进行解析的插件。(而且在他的文章中写明了1130和1724其实是表示两种不同的命令格式。)
插件来源文章
Wireshark载入该lua插件后,能对Teamviwer私有协议数据进行解析。从数据可以看出来,数据头部两个字节代表了命令格式(他用Magic字段表示),随后接的一个字节表示的是使用的命令名称,如下图表示的是路由命令(CMD_ROUTERCMD)。
通过这个插件,所有的操作一目了然了。
协议解析结果