抓包工具
大约 6 分钟
抓包工具
tcpdump
命令格式:
常用参数:
-i
:指定网卡接口,-i any
可以使用所有接口-c
: 指定抓包数量-nn
: 不解析主机地址和端口号为名字-S
: 打印绝对TCP序列号,而不是相对序列号-X
: 以以hex和ASCII形式打印数据包内容-w
: 将结果写入文件,通常后缀为.pcap
-D
: 查看拥有的网络接口
表达式语法:
抓包结果格式:
TCP标志位介绍:
[S]
: SYN(开始连接)[P]
: PSH(推送数据)[F]
: FIN (结束连接)[R]
: RST(重置连接)[.]
: 没有 Flag,由于除了 SYN 包外所有的数据包都有ACK,所以一般这个标志也可表示 ACK
使用举例:
- 根据主机IP过滤
tcpdump host 192.168.10.100
tcpdump src host 192.168.10.100
tcpdump dst host 192.168.10.200
- 根据网段过滤
tcpdump net 192.168.10.0/24
tcpdump src net 192.168.10.0/24
tcpdump dst net 192.168.10.0/24
- 根据端口过滤
# 单一端口
tcpdump port 8088
tcpdump src port 8088
tcpdump dst port 8088
# 端口范围
tcpdump portrange 8000-8080
tcpdump src portrange 8000-8080
tcpdump dst portrange 8000-8080
- 根据协议过滤
tcpdump icmp
tcpdump 'ip proto tcp'
tcpdump 'ip6 proto tcp'
- 组合过滤
:::info
逻辑语句:
and
,or
,not
或&&
,||
,!
判断语句:
=
,==
,!=
内置变量:
if
: 网卡接口名proc
: 进程名pid
: 进程iddir
: 方向
# 过滤来自进程名为 nc 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包
tcpdump "( if=en0 and proc=nc ) || (if != en0 and dir=in)"
:::
# find all traffic from 10.5.2.3 going to any host on port 3389
tcpdump -nnvvS src 10.5.2.3 and dst port 3389
# look for all traffic coming from 192.168.x.x and going to the 10.x or 172.16.x.x networks
tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16
# look for all traffic going to 192.168.0.2 that is not ICMP
tcpdump dst 192.168.0.2 and src net and not icmp
# look for all traffic from a host that isn’t SSH traffic
tcpdump -vv src mars and not dst port 22
tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'
- 根据标志位过滤
# 指定标志位
tcpdump 'tcp[13] & 2!=0'
tcpdump 'tcp[tcpflags] == tcp-syn'
Wireshark
1. 捕获过滤表达式:
语法与tcpdump
类似。先设定条件再进行抓包。
2. 显示过滤表达式:
在抓完包后根据设定条件筛选感兴趣的包。
- 根据ip过滤
ip.src == 192.168.0.1
ip.dst == 192.168.0.1
ip.addr == 192.168.0.1
!(ip.addr == 192.168.0.1)
- 根据网段过滤
- 根据端口过滤
tcp.port == 80
udp.port >= 2048
- 根据协议过滤
http
http or telnet
not arp # 或!arp
# 根据标志位过滤
tcp.flags.syn==1
tcp/flags.rst==1
- 根据长度过滤
udp.length < 20
http.content_length <=30
- 根据内容过滤
http.request.uri matches "user"
http.request.uri contains "User"
http.host==baidu.com
http.host contains "baidu"
http.content_type =="text/html"
http.request.method=="POST"
http.response.code==302
http.cookie contains "userid"
- 组合过滤
ip.addr==192.168.2.121 && tcp.port==10080
:::tip
编辑>首选项>Protocols>TCP
:::
:::tip{title="抓https网络包"} 参考:https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/
- 设置系统环境变量
SSLKEYLOGFILE
- 设置Wireshark的pre master secret。
使用浏览器访问https网站
注意:目前火狐浏览器和Chrome浏览器支持,其他浏览器不一定支持。抓包
:::
TCP协议格式
字段说明:
源端口
:2字节。目的端口
: 2字节。序号
: 本报文段所发送的数据的第一个字节的序号。下一个报文段的序号=当前报文段序号+当前报文段数据长度
。确认号
: 期望收到对方下一个报文段的第一个数据节的序号。确认号=接收报文段序号+接收报文段数据长度
。数据偏移
:反映了TCP报文段的首部长度,含义为数据起始位置相对于TCP报文起始位置的距离。单位为4字节,说明报文首部长度最大为15*4=60字节。保留
: 6位,暂时不用,置为零。控制位
:URG
: 紧急位,告诉系统此报文段含有紧急数据需尽快传送,而不要按原来排队顺序传送。配合后面紧急指针
一起使用。ACK
:确认位,在连接建立后所有传送的报文段都必须把 ACK 置 1。PSH
: 推送位,当该位置1时,发送方立即发送,接收方立即向上交付,而不再等缓存填满再交付。RST
: 重置位,表明TCP连接出现严重差错,需要释放连接重新建立。SYN
: 同步位,在建立连接时用来同步序号。FIN
: 终止位,在关闭连接时用到。
窗口
: 接收窗口大小,告诉发送方自己目前允许对方发送的数据量,单位为字节,经常动态变化。检验和
: 检验范围包括首部和数据两部分。紧急指针
: 指出本报文段紧急数据的字节数,紧急数据后为普通数据。选项
: 长度可变,最大为40字节。
IP协议格式
字段说明:
版本
:IP协议版本。首部长度
: 占4位,可表示数据范围为0~15,单位为4字节,表明首部长度最大为15*4=60字节。区分服务
: 暂时不用。总长度
: 首部和数据之和的长度。最大为65535字节。实际上不能超过MTU(以太网规定MTU为1500字节),否则会进行分片。标识
: 数据报的编号,当产生分片时,利用该字段便于将属于同一数据包的各个分片重新组装。标志
: 标志位,占3位,只用到2位:MF
:MF=1
表示后面还有分片。DF
:DF=1
表示不能分片,只有为0时才允许分片。
片偏移
: 指出该分片在原始分组数据字段的起点的相对偏移位置,单位为8字节。生存时间
:TTL
(Time To Live),至多允许的跳数。协议
: 数据字段部分使用的协议。
首部检验和
: 只检验首部,不包括数据部分。源地址
: 4字节目标地址
:4字节
实战分析
- 在机器B上搭建一个http服务
python -m http.server 9099
- 在机器A上使用tcpdump准备抓包
sudo tcpdump -nnS -i wlx90de8095c21f host 192.168.2.121 and port 9099 -w test.pcap
- 在机器A上访问机器B上的http服务
curl http://192.168.2.121:9099
- 将抓到的包文件
test.cap
导入wireshark分析
流量图分析:
可以看到,前三个包是建立tcp连接的过程,最后两个包是关闭tcp连接的过程。