抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,常用来检查网络安全,被用来进行数据截取等。常用抓包工具有好多,如Charles、Wireshark、Fiddler等。
一、基础
TCP,即传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。用户数据报协议(UDP)是同一层内另一个重要的传输协议。
TCP的首部格式
- 来源连接端口(16位长)-识别发送连接端口
- 目的连接端口(16位长)-识别接收连接端口
- 序列号(seq,32位长)
- 如果含有同步化旗标(SYN),则此为最初的序列号;第一个数据比特的序列码为本序列号加一。
- 如果没有同步化旗标(SYN),则此为第一个数据比特的序列码。
- 确认号(ack,32位长)—期望收到的数据的开始序列号。也即已经收到的数据的字节长度加1。
- 数据偏移(4位长)—以4字节为单位计算出的数据段开始地址的偏移值。
- 保留(3比特长)—须置0
- 标志符(9比特长)
- NS—ECN-nonce。ECN显式拥塞通知(Explicit Congestion Notification)是对TCP的扩展,定义于RFC 3540(2003)。ECN允许拥塞控制的端对端通知而避免丢包。ECN为一项可选功能,如果底层网络设施支持,则可能被启用ECN的两个端点使用。在ECN成功协商的情况下,ECN感知路由器可以在IP头中设置一个标记来代替丢弃数据包,以标明阻塞即将发生。数据包的接收端回应发送端的表示,降低其传输速率,就如同在往常中检测到包丢失那样。
- CWR—Congestion Window Reduced,定义于RFC 3168(2001)。
- ECE—ECN-Echo有两种意思,取决于SYN标志的值,定义于RFC 3168(2001)。
- URG—为1表示高优先级数据包,紧急指针字段有效。
- ACK—为1表示确认号字段有效
- PSH—为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
- RST—为1表示出现严重差错。可能需要重新创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
- SYN—为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
- FIN—为1表示发送方没有数据要传输了,要求释放连接。
- 窗口(WIN,16位长)—表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制。
- 校验和(Checksum,16位长)—对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。
- 紧急指针(16位长)—本报文段中的紧急数据的最后一个字节的序号。
- 选项和填充字段—最多40字节。每个选项的开始是1字节的kind字段,说明选项的类型。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
- 0:选项表结束(1字节)
- 1:无操作(1字节)用于选项字段之间的字边界对齐。
- 2:最大报文段长度(4字节,Maximum Segment Size,MSS)通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能接收的最大长度的报文段。通常将MSS设置为(MTU-40)字节,携带TCP报文段的IP数据报的长度就不会超过MTU(MTU最大长度为1518字节,最短为64字节),从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。
- 3:窗口扩大因子(3字节,wscale),取值0-14。用来把TCP的窗口的值左移的位数,使窗口值乘倍。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。
- 4:sackOK—发送端支持并同意使用SACK选项。
- 5:SACK实际工作的选项。
- 8:时间戳(10字节,TCP Timestamps Option,TSopt)
- 发送端的时间戳(Timestamp Value field,TSval,4字节)
- 时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)
- 数据部分:TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
二、常用工具
Charles(试用,Windows、Mac、Linux均支持)
- Charles是一款代理服务器,通过过将自己设置成系统的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的(安装的时候要先装好Java环境),能够在Windows,Mac,Linux上使用。
- 主要功能:
- 截取Http和Https网络封包。
- 支持重发网络请求,方便后端调试。
- 支持修改网络请求参数。
- 支持网络请求的截获并动态修改。
- 支持模拟慢速网络。
- 安装使用
- 安装,直接下载安装就行了
- Charles是收费软件,可以免费试用30天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过30分钟,并且启动时将会有10秒种的延时。
- 使用
- 安装,直接下载安装就行了
Fiddler(试用,Windows、Mac、Linux均支持)
- Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie、html、js、css等文件)。Fiddler要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式。它是用C#写出来的,包含一个简单却功能强大的基于JScript .NET 事件脚本子系统,灵活性非常棒,可以支持众多的http调试任务,并且能够使用.net框架语言进行扩展。
- Fiddler是通过改写HTTP代理,让数据从它那通过,来监控并且截取到数据。
- 安装使用
- Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie、html、js、css等文件)。Fiddler要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式。它是用C#写出来的,包含一个简单却功能强大的基于JScript .NET 事件脚本子系统,灵活性非常棒,可以支持众多的http调试任务,并且能够使用.net框架语言进行扩展。
Wireshark(免费,Windows、Mac、Linux均支持)
- Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。在过去,网络封包分析软件是非常昂贵的,或是专门属于盈利用的软件,Ethereal的出现改变了这一切。在GNUGPL通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Ethereal是目前全世界最广泛的网络封包分析软件之一。
- 下载安装
- tshark、capinfos、tshark、dumpcap、editcap、mergecap命令
- tshark -r lesson17-in-shorten.pcap -T fields -e http.response.code | grep -v ^$ | sort | uniq -c | sort -r
- tshark -r 文件名 -T fields -e http.time | grep -v ^$
- tshark -r 文件名 -T fields -e frame.number -e http.time -e tcp.stream | sort -k2 -r | head -1 | awk ‘{print $3}’ | xargs -n 1 -I {} tshark -r captured.pcap -Y “tcp.stream eq {}”
tcpdump(免费,Mac、Linux)
tcpdump是Unix/Linux下的抓包工具,它可以针对指定网卡、端口、协议等进行抓包。
tcpdummp可实时抓取过滤,可写入文件,可读取前一步的文件进行过滤
安装
brew install tcpdump
使用
sudo tcpdump host www.baidu.com
打开浏览器访问百度首页
回到抓包页面可看到
以
21:33:08.338975 IP 10.2.182.71.61413 > 220.181.38.149.https: Flags [S], seq 1290980111, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 859313791 ecr 0,sackOK,eol], length 0
为例21:33:08.338975
代表数据传输的时间IP 10.2.182.71.61414
代表发送端的主机和端口>
代表数据传输方向220.181.38.149.https
代表接收端的主机和端口号Flags代表TCP包中的标志信息,主要有以下几种:
[S]
代表SYN,表示这是一个SYN请求[.]
代表ACK,表示这是一个ACK确认包[S.]
表示这是一个SYN+ACK确认包[P.]
代表PUSH+ACK,可以是从服务器端向客户端推送,也可以从客户端向服务器端推[F]
代表FIN,关闭连接操作,client/server都可发起[F.]
表示FIN+ACK[R]
表示这是一个RST包,与F包作用相同,但RST表示连接关闭时,仍然有数据未被处理,可以理解为是强制切断连接[R.]
表示RST+ACK
seq代表序列号
ack代表确认序号,因为这是一个SYN包故没有ack
win代表滑动窗口大小
options:tcp包的option区域,具体如下:
- mss:
- nop:
- wscale:
- TS val:
- sackOK:
- sack:
length代表数据包的大小
1 | tcpdump: data link type PKTAP |