网络编程懒人入门(十六):手把手教你使用网络编程抓包神器Wireshark

141 阅读7分钟

1、引言

在网络通信相关的应用场景中(如Web系统、IM聊天应用、消息推送系统等),网络抓包工具是验证客户端和服务器之间数据包传输是否正确的关键工具。以IM聊天系统为例,TLS/SSL加密是否成功?加密效果如何?端到端加密的聊天内容是否足够安全?这些问题都需要通过网络抓包工具来分析和验证。

Wireshark 是一款开源且跨平台的抓包工具,通过调用操作系统底层的API,直接捕获网卡上的数据包,功能强大且数据包信息详细。然而,Wireshark的操作稍显复杂,对于初学者来说,可能需要一些时间来掌握。而 SniffMaster(抓包大师) 则是一款更加轻量级且易于使用的抓包工具,特别适合那些希望快速上手并专注于抓包分析的用户。本文将结合 Wireshark 和 SniffMaster 的使用,手把手带你掌握抓包技巧,并深入理解抓到的数据包的含义。

2、系列文章

本文是系列文章中的第 16 篇,本系列文章的大纲如下:

  • 网络编程懒人入门(一):快速理解网络通信协议(上篇)
  • 网络编程懒人入门(二):快速理解网络通信协议(下篇)
  • 网络编程懒人入门(三):快速理解TCP协议一篇就够
  • 网络编程懒人入门(四):快速理解TCP和UDP的差异
  • 网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势
  • 网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门
  • 网络编程懒人入门(七):深入浅出,全面理解HTTP协议
  • 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
  • 网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?
  • 网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议
  • 网络编程懒人入门(十一):一文读懂什么是IPv6
  • 网络编程懒人入门(十二):快速读懂Http/3协议,一篇就够!
  • 网络编程懒人入门(十三):一泡尿的时间,快速搞懂TCP和UDP的区别
  • 网络编程懒人入门(十四):到底什么是Socket?一文即懂!
  • 网络编程懒人入门(十五):外行也能读懂的网络硬件设备功能原理速成
  • 网络编程懒人入门(十六):手把手教你使用网络编程抓包神器Wireshark(本文)

3、Wireshark 和 SniffMaster 的安装与基本使用

Wireshark 安装: 直接通过官方下载对应的安装包即可。

SniffMaster 安装: SniffMaster 是一款轻量级的抓包工具,适合快速抓包和分析。你可以通过其官方网站下载并安装。

Wireshark 使用:

  • 左上角为几个最常用的按钮:开始捕获、停止捕获、重新捕获、捕获选项;
  • 中间为捕获过滤器,用于过滤需要捕获的数据包;
  • 捕获过滤器下面可以选择需要捕获的网络连接。

SniffMaster 使用:

SniffMaster 的界面更加简洁,适合快速抓包。它提供了类似的功能,但操作更加直观,适合初学者快速上手。

4、快速理解 Wireshark 和 SniffMaster 的过滤器

由于 Wireshark 和 SniffMaster 都直接捕获底层网络数据包,导致捕获的数据包数量通常较大。为了便于筛选数据包,两者都提供了过滤器功能。

4.1 捕获过滤器

用于设置什么样的数据包保存在捕获结果中,避免产生过大的日志文件。

需要在开始捕获之前设置,相对简单:

  • 显示目的TCP端口为8080的包:tcp dst port 8080
  • 显示来源IP地址为192.168.171.201的封包:ip src host 192.168.171.201

4.2 显示过滤器

用于在捕获日志中查找数据包,可以在捕获过程中或者捕获后随时更改。

功能更加强大和复杂:

  • 源地址是192.168.171.0网段的数据包:ip.src == 192.168.171.0/24
  • 所有的HTTP POST请求:http.request.method== "POST"
  • 显示包含TCP SYN标志的包:tcp.flags.syn == 0×02
  • URL中包含baidu的http请求:http.request.uri contains "baidu"

5、用什么例子来动手学习 Wireshark 和 SniffMaster?

本来想借用 IM 聊天中的 TLS/SSL 数据包来分析,但考虑到 IM 通常都是私有协议,不利于理解。因此,接下来的内容将以 HTTPS 为例,详细讲解如何借助 Wireshark 和 SniffMaster 抓取数据包,并深入理解 HTTPS 协议。

6、什么是 HTTPS

SSL/TLS: SSL (Secure Sockets Layer),最初由 Netscape 公司设计,后来逐渐演变为 TLS (Transport Layer Security Protocol),即“传输层安全协议”。该协议工作在 TCP 层之上,应用层之下。在 TCP 连接完成后,进行通信双方的身份认证,并协商一些跟加密相关的工作。完成协商之后,就可以对双方发送的信息进行加密/解密了。

HTTPS: 可以理解为 HTTP over SSL/TLS。即在 SSL/TLS 协议之上运行 HTTP 协议,以保证通信的安全性。

7、HTTPS 的 SSL/TLS 握手过程

SSL/TLS 的握手过程主要需要解决两个问题:

  • 证明通信双方身份的真实性;
  • 协商后续通信过程中使用的密钥;

如下图所示: 左侧是一个简单的握手流程,右侧为对应的抓包结果,我们可以对比分析一下 SSL/TLS 的握手过程。

  1. C:ClientHello
    客户端发送协议版本号、sessionid、随机数、加密算法列表、扩展字段等信息。

  2. S:ServerHello
    与客户端类似,不同之处在于确定了所使用的加密算法等。

  3. S:Certificate
    服务端向客户端发送自己的 CA 证书。客户端通过证书信任链查看该证书的真实性,以验证服务端的身份。

  4. S:ServerKey Exchange
    服务端根据之前选择的加密算法,传输密钥协商需要的参数。

  5. S:ServerHello Done
    该报文表示服务端发送完成。

  6. C:ClientKey Exchange
    客户端根据之前选择的加密算法,传输相应的参数。

  7. C:ChangeCipher Spec
    经过上述步骤,客户端和服务器双方已经完成了身份认证,并且交换了生成密钥的全部参数。双方会根据对应的算法,各自生成加密密钥,然后就可以进行加密通信了。这个报文表示切换到密文模式,后续消息都通过加密传输。

  8. C:Finished
    客户端表示握手完成。这里会发送一段 Verify Data,是使用新生成的密钥加密后的一段信息。双方通过该信息验证加密算法、密钥是否有效。

  9. S:Change Cipher Spec

  10. S:Finished
    服务端也会发送对应的两条消息作为回应。

8、解密 HTTPS 报文

握手完成之后,就可以查看客户端发出的 HTTP 请求了。但我们看到的只是一段加密后的字符串?那么如何对 HTTPS 报文进行解密呢?

要想解密 HTTPS 报文,就必须要获取到加密密钥。Chrome、Firefox 等浏览器支持将访问网站时使用的密钥输出到文件中。仅需要配置环境变量 SSLKEYLOGFILE 即可。

然后需要将该密钥文件导入到 Wireshark 或 SniffMaster 中。打开编辑-首选项,选择 Protocol-SSL,填写刚才设置的文件路径。

现在,就可以通过 Wireshark 或 SniffMaster 查看 HTTPS 请求中的具体信息了!

9、参考资料

  • TCP/IP详解
  • 理论经典:TCP协议的3次握手与4次挥手过程详解
  • 理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程
  • 网络通讯数据抓包和分析工具 Wireshark 使用教程(中文)
  • 如果这样来理解HTTPS原理,一篇就够了
  • 你知道,HTTPS用的是对称加密还是非对称加密?
  • 为什么要用HTTPS?深入浅出,探密短连接的安全性
  • 一分钟理解 HTTPS 到底解决了什么问题
  • 一篇读懂HTTPS:加密原理、安全逻辑、数字证书等
  • IM聊天系统安全手段之通信连接层加密技术
  • IM聊天系统安全手段之传输内容端到端加密技术
  • 传输层安全协议SSL/TLS的Java平台实现简介和Demo演示
  • 微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解
  • 手把手教你为基于Netty的IM生成自签名SSL/TLS证书