本文基于 Ubuntu 18.04 系统通过使用 Wireshark 软件对微信网页版进行抓包来总结 Wireshark 抓包软件的使用和计算机网络的基础知识.

Wireshark 介绍

Wireshark 是一款网络分包分析软件.主要功能是获取网络封包,并显示出详细资料.这里主要通过这个软件来学习网络协议.

安装

直接使用 apt 安装即可:

1
sudo apt-get install wireshark

如果不给授权,目前的 Wireshark 大概率是会:
permission denied

所以需要设置用户权限

1
sudo dpkg-reconfigure wireshark-common

在弹出的选项中选择 Yes

如果仍然不行,就手动把用户添加到 wireshark 的用户组中,然后赋予执行权限

1
2
3
sudo usermod -a -G wireshark $USER
sudo chgrp wireshark /usr/bin/dumpcap
sudo chmod 750 /usr/bin/dumpcap

加入用户组后注销用户重新登录,使用命令行或者应用启动器启动软件,就可以顺利实现抓包

选择网卡

机器上有两块网卡,一块有线网卡,一块无线网卡,所以需要选择其中一块网卡用于捕获数据包.菜单栏选择 捕获-选项-管理接口,选择需要捕获的网卡.

NetworkCard

过滤器

过滤器有两种,一种捕获过滤器一种是显示过滤器,捕获过滤器用来过滤需要什么数据包,用于控制捕获数据的数量,以避免产生过大的日志文件.显示过滤器用于在捕获的记录中过滤筛选出需要的数据包,相当于一个查找功能.其中捕获过滤器在 捕获-捕获过滤器 中编辑规则,然后在捕获开始时选择相应的规则.而显示过滤器则是在 分析-显示过滤器 中编辑.

打开网页抓包

首先打开软件,然后打开网页进行抓取如下:

openWebWeChat

查看 DNS 请求包,看到 https://web.wechat.com/ 对应的 ip183.232.103.154,所以在过滤规则中写 ip.addr == 183.232.103.154 进行分析:

ip.addr == 183.232.103.154

TCP 三次握手建立连接

TCP 完成的建立连接到释放过程如下:

TCP

从上图可知建立连接需要三次握手,从抓到的数据中可以看到三次握手的数据包:

tcp

TLS/SSL

OSI 模型中 TLS/SSL 位于表现层,从抓到的数据中可以分析出 微信使用的 TLS/SSL 的工作原理

  1. Client Hello

    客户端建立 HTTPS 连接时会发送一个 ClientHello 消息:

    Client Hello

  2. Server Hello

    服务器端收到 ClientHello 消息后,会回复客户端一个 ServerHello 消息,所带信息如下:

    Server Hello

  3. Change Cipher Spec(Client发送密钥改变通知)

    客户端生成 master secret 之后即可发送密钥改变通知通知服务器,之后就使用对称密钥 master secret 来加密数据:

    Client Cipher Spec

至此环境都OK,下面分析登录协议

扫码登录

在上面的过程中计算机已经和微信网页版的服务器建立了 TCP 连接,并且客户端每隔一段时间都向服务器发送数据保持链接不断开,而当用手机扫码登录后,服务器给客户端发送数据进行登录:

login

然后客户端发起了 DNS 查询请求,查询了 wx2.qq.com 的地址, DNS 服务器返回了两个地址,从之后的数据中可以看出客户端选择了第一个地址进行连接:

dns wx2.qq.com

DNS 查询完成后,自然就是 TCP 三次握手建立连接,然后 SSL 交换密钥,最后客户端页面跳转进入微信网页程序对话框页面(https://wx2.qq.com)

wechat

进入界面之后,需要加载用户头像,各类会话信息等等,这时候又抓到了大量 DNS 查询请求,有 js.aq.qq.com,res.wx.qq.com,js.aq.tcdn.qq.com等等,根据域名大概猜出是在查询 CDN 加速的静态 js 文件等,以及各种微信资源(其中应该包括用户头像,会话列表等等).由此也可见微信的不同功能是分给不同的服务处理的,这样看微信应该采用的是微服务的架构设计.

wechatlogin

然后就是跟刚刚查询到的各种地址各种握手建立 TCP 连接,并且由于连接都是 HTTPS 协议的,所以每次连接建立都要执行 SSL 那一套东西:

wechat

建立连接以后,就是各类请求获得数据

WeChat

至此登录也已经完成,网页已经显示出所有信息

分析好友聊天过程

为了方便,这里先把显示地址改为显示域名:

set

设置完成后,使用网页找好友给他发送四条消息,然后开始分析

首先是 DNS 查询,查询了 webpush.wx2.qq.com 的地址,然后根据客户端选择的地址 183.232.103.146 进行过滤,分析给好友发送消息的全过程:

send

第一步是进行 TCP 握手认证,建立连接,由客户端发送 SYN 请求,服务器收到后发送 SYNACK 进行确认,最后从客户端向服务器发送 ACK 完成认证.
第二步是 SSL 过程和之前打开网页的过程一样从 Client Hello 到最后发送 secret
第三步之后就是不断进行交互,不断进行连接.

其中客户端发送完消息后,还会发送 Fin 进行连接请求,如果这时候接着发送消息,由下图可见,客户端又发送了一个 ACK 恢复连接

sendfin

分析群聊协议

使用网页版发送一些消息,然后抓取数据.

首先可以看到的是,交互的地址仍旧是 183.232.103.146 也就是说网页版的微信群聊和私聊用的是同一个服务器,根据这个地址进行过滤分析:

groupsend

可以看到跟上面私聊的过程完全相同,并且由于上面已经建立了连接,群聊直接使用上面建立的连接发起 POST 请求发送数据.