一、ARP详解
- 地址解析协议(Address Resolution Protocol),其基本功能为透过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代。
1、ARP工作流程
假设主机A和B在同一个网段,主机A要向主机B发送信息,具体的地址解析过程如下:
- 主机A首先查看自己的ARP表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。
- 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。
- 主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
- 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。
2、ARP报文格式
一般说以太网地址就是指MAC地址。
- 字段1是ARP请求的目的以太网地址,全1时代表广播地址。
- 字段2是发送ARP请求的以太网地址。
- 字段3以太网帧类型表示的是后面的数据类型,ARP请求和ARP应答这个值为0x0806。
- 字段4表示硬件地址的类型,硬件地址不只以太网一种,是以太网类型时此值为1。
- 字段5表示要映射的协议地址的类型,要对IPv4地址进行映射,此值为0x0800。
- 字段6和7表示硬件地址长度和协议地址长度,MAC地址占6字节,IP地址占4字节。
- 字段8是操作类型字段,值为1,表示进行ARP请求;值为2,表示进行ARP应答;值为3,表示进行RARP请求;值为4,表示进行RARP应答。
- 字段9是发送端ARP请求或应答的硬件地址,这里是以太网地址,和字段2相同。
- 字段10是发送ARP请求或应答的IP地址。
- 字段11和12是目的端的硬件地址和协议地址。
3、抓包分析
下面是抓取的ARP数据包,可以对照上面的说明进行理解。 图中红框圈起来的是一对ARP请求和ARP应答。
4、ARP请求报文
5、ARP应答报文
二、Netdiscover详解
1、Netdiscover安装
- Kali Linux提供的网络扫描工具
- github地址:https://github.com/alexxy/netdiscover
- ubuntu:
$ sudo apt install netdiscover
2、Netdiscover选项
选项 | 说明 |
---|---|
-i device | 网络接口 |
-r range | 扫描范围,例如192.168.0.0/24,仅支持/8, /16和/24 |
-l file | 扫描范围列表文件,每行一个范围 |
-p | 被动模式:不发生任何报文,仅嗅探 |
-m file | 扫描已知Mac地址和主机名的列表文件 |
-F filter | 自定义pcap filter表达式(默认“arp”) |
-s time | 每个ARP请求间的休眠时间(毫秒,默认1ms) |
-c count | 发送每个ARP请求的次数,用于丢失数据包的网络,默认1次 |
-n node | 扫描最后的源IP,默认为67(x.x.x.67),允许范围为2-253 |
-d | 忽略自动扫描和快速模式的主配置文件,扫描默认的范围和IP |
-f | 启用快速模式扫描,扫描每个网段的.1、.100 和 .254 |
-P | 产生输出到文件或者其他解析程序,扫描完成后退出,例如:netdiscover -P -r 192.168.20.0/16 | grep 192.168.20.100 |
-L | 与-P类似,但在主动扫描后继续捕获ARP包 |
-N | 不打印表头,仅在-P 或者-L启用时有效 |
3、使用实例
扫描指定接口:
$ netdiscover -i ens38
扫描指定范围:
$ netdiscover -i ens38 -r 192.168.0.0/16
快速扫描:
$ netdiscover -i ens38 -f
被动扫描,仅嗅探:
$ netdiscover -i ens38 -r 192.168.0.0/16 -p