抓取 arp 包分析
- 主机1:192.168.152.128
主机2:192.168.152.129
使用 arp -n 查看本机 arp 缓存。在执行抓包分析前,需要清除相应 arp 缓存,使用命令 arp -d IP地址。 - 在主机1上执行如下命令,在敲下命令回车后,主机1 监听两主机间数据包的传输。此时我们采用在主机2上ping 主机1,使用 ping 包
分析 arp 包。因为在发出 ping 包之前,需要对端 MAC 地址。
[root@yangzhen ~]# tcpdump -i ens33 -X -ent '(dst 192.168.152.128 and src 192.168.152.129) or (dst 192.168.152.129 and src 192.168.152.128)'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
00:0c:29:bb:ac:d3 > Broadcast, ethertype ARP (0x0806), length 60: Request who-has 192.168.152.128 tell 192.168.152.129, length 46
0x0000: 0001 0800 0604 0001 000c 29bb acd3 c0a8 ..........).....
0x0010: 9881 0000 0000 0000 c0a8 9880 0000 0000 ................
0x0020: 0000 0000 0000 0000 0000 0000 0000 ..............
00:0c:29:85:6e:73 > 00:0c:29:bb:ac:d3, ethertype ARP (0x0806), length 42: Reply 192.168.152.128 is-at 00:0c:29:85:6e:73, length 28
0x0000: 0001 0800 0604 0002 000c 2985 6e73 c0a8 ..........).ns..
0x0010: 9880 000c 29bb acd3 c0a8 9881 ....).......
00:0c:29:bb:ac:d3 > 00:0c:29:85:6e:73, ethertype IPv4 (0x0800), length 98: 192.168.152.129 > 192.168.152.128: ICMP echo request, id 7124, seq 1, length 64
0x0000: 4500 0054 c604 4000 4001 c251 c0a8 9881 E..T..@.@..Q....
0x0010: c0a8 9880 0800 0ea4 1bd4 0001 e31d a85c ...............\
0x0020: 0000 0000 7639 0d00 0000 0000 1011 1213 ....v9..........
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 3637 4567
00:0c:29:85:6e:73 > 00:0c:29:bb:ac:d3, ethertype IPv4 (0x0800), length 98: 192.168.152.128 > 192.168.152.129: ICMP echo reply, id 7124, seq 1, length 64
0x0000: 4500 0054 2f5e 0000 4001 98f8 c0a8 9880 E..T/^..@.......
0x0010: c0a8 9881 0000 16a4 1bd4 0001 e31d a85c ...............\
0x0020: 0000 0000 7639 0d00 0000 0000 1011 1213 ....v9..........
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 3637 4567
为便于包分析,查看两主机ip地址
主机1
[root@yangzhen ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:85:6e:73 brd ff:ff:ff:ff:ff:ff
inet 192.168.152.128/24 brd 192.168.152.255 scope global dynamic ens33
valid_lft 1017sec preferred_lft 1017sec
inet6 fe80::20c:29ff:fe85:6e73/64 scope link
valid_lft forever preferred_lft forever
主机2
[root@yz ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:bb:ac:d3 brd ff:ff:ff:ff:ff:ff
inet 192.168.152.129/24 brd 192.168.152.255 scope global dynamic ens33
valid_lft 1699sec preferred_lft 1699sec
inet6 fe80::20c:29ff:febb:acd3/64 scope link
valid_lft forever preferred_lft forever
- arp 包分析
在进行任何抓包分析之前,首先需要了解下 arp 包格式。arp 包如下:
字段说明:
帧类型:对 arp 协议来讲,值为 0x0806。对于 RARP,值为0x8035。
硬件类型:表示硬件地址的类型。值为1 时表示以太网地址,即 arp 不仅仅应用于以太网协议,还支持别的链路层协议。
协议类型:表示协议地址类型,对于 IPv4,值为 0x0800。
硬件地址长度:与硬件类型对应的硬件地址长度,以字节为单位,如果是以太网协议,是 6 字节。
协议地址长度:与协议地址对应的协议地址长度,以字节为单位,如果是 IPv4,则是 4 字节。
操作类型:arp请求为1,arp应答为2,rarp请求为3,rarp应答为4。
发送端硬件地址:如果是以太网,则是源主机以太网地址。
发送端协议地址:表示源主机 IP 地址。
目标硬件地址:如果是 arp 请求,则为0即可。arp应答的话,需要填充该字段。
目标协议地址:表示目的 IP 地址。
ping 包分析
还根据上述抓包来分析 ping 数据包。ping 数据包封装在 ip 数据包中。ip数据包头部字节大小为 20。ping 数据包格式如下
字段分析
类型:ping 请求报文类型是8,应答是0。
代码:字段为 0。
8为类型和8位代码一起决定了ICMP报文类型。
类型8, 代码0,表示 ping 请求。类型 0,代码 0,表示 ping 应答。类型 11, 代码 0, 表示超时。
校验和:表示数据在内的整个 ICMP 数据包的校验和。和 IP 头部计算校验和一样。
标识符:占 2 字节,用于标识本 ICMP 进程。但仅用于回显请求和回显应答报文。对于目标不可达和超时 ICMP 报文,该字段为 0。
表示发起方 ping 进程。
IP 报文分析
IP 数据包是一种可变长分组,它由首部和数据负载两部分组成。首部长度一般 20 至 60 字节,其中后 40 字节是可选的,长度不固定,前
20 字节是固定的。数据负载部分长度可变,整个 IP 数据包最大长度 65536 字节。
报文格式
字段分析
版本号:长度 4 比特位,IPv4 的值为 0100,IPv6 的值为 0110。
首部长度:如果首部长度是 20 字节,则为 5。
服务类型:实际应用中很少用,路由器通常忽略该值。
总长度:指 IP报文总长度,在以太网中允许的最大的包长为 1500 字节,超过允许的最大长度时需要将数据分片。
标识符:在ip分片以后,用来标识同一片分片的。方便ip分片的重组。
标志:长度为 3 位,三位从左到右分别为MF、DF、未用。MF=1表示后面还有分段的数据包,MF=0表示没有更多分片(即最后一个分片)
DF=1表示路由器不能对该数据包分段,DF=0表示数据包可以被分段。
生存时间:初始值由操作系统设置,每经过一个路由器转发后其值就减 1,减至0后丢弃该包。这种机制可以避免数据包找不到目地时不断
被转发,堵塞网络。linux 默认是64,windows默认是128。
协议:标识上层所使用的的协议。
首部校验和:只对IP数据包首部进行校验,不包含数据部分。数据包每经过一个中间节点都要重新计算首部校验和,对首都进行检验。