题记
- hacker
A hacker is any highly skilled computer expert. - script kiddie
A script kiddie is an unskilled individual who uses scripts or programs developed by others to attach computer systems and networks and deface websites
ARP协议
-
简介
ARP 是 地址转换协议(Address Resolution Protocol
)的英文缩写。
它是一个 数据链路层 协议,处于TCP/IP
五层 协议中的 第二层。还不熟悉 五层网络协议 的小伙伴可以参考我之前分享的网络相关的文章。 -
工作原理
在 以太网(ARP
协议只适用于 局域网)中,本地主机想要向某一个IP
地址的主机(路由表中的下一跳路由器或者直连的主机)发送数据,但是并不知道其MAC
地址,此时利用ARP
协议提供的机制来获取MAC
地址,具体过程如下:-
本地主机 在 局域网 中 广播
ARP
请求,ARP
请求数据帧 中包含 目的主机 的IP
地址。
翻译成 人话 就是:如果你是这个IP地址的拥有者,请回答你的硬件地址。 -
目的主机 的
ARP
层 解析 这份广播报文,识别出是 询问其硬件地址。于是发送ARP
应答包,里面包含IP
地址及其对应的 硬件地址。
翻译一下就是: 你问的IP地址的所有者是我,老子的MAC是xx:xx:xx... -
本地主机 收到
ARP
应答后,知道了目的地址的MAC
地址,之后的数据报就可以传送了。
-
-
分组格式 ARP 请求于应答的分组格式都如下图:
-
目的以太网地址
目的主机 的硬件地址,ARP
请求广播包中,因为不知道目的MAC
地址,所以 目的地址 全为 1,也就是16进制的FF:FF:FF:FF:FF:FF
-
以太网源地址
源主机的硬件地址。 -
帧类型
对于ARP协议,该字段为0x0806。 -
硬件类型
表示硬件地址的类型。值为 1 时表示以太网地址。也就是说ARP
协议不仅仅应用于 以太网协议,还可以支持别的链路层协议。 -
协议类型
表示要映射的协议地址类型,值为0x0800
时表示IP
协议。 -
硬件地址长度
与硬件类型对应的硬件地址的长度,以字节为单位。如果是 以太网,则是6字节(MAC
长度)。 -
协议地址长度
与协议类型对应的协议地址长度,以字节为单位。如果是IP
协议,则是 4字节(IP
地址长度)。 -
操作类型(
op
)
四种 操作类型:
- ARP请求(1)
- ARP应答(2)
- RARP请求(3)
- RARP应答(4)
-
发送端硬件地址
如果是以太网,则是源主机以太网地址,此处和以太网头中的源地址对应。 -
发送端协议地址
如果是IP
协议,则表示 源主机 的IP
地址。 -
目的端硬件地址
如果是 以太网,则是目的以太网地址,和以太网头中的目的地址对应。 -
目的端协议地址
如果是IP
协议,则表示源主机要请求硬件地址的IP
地址。
-
抓包
这么多字段都不是人记的,没事,我们用抓包神器 wireshark
来抓一下ARP
包,我们深入理解一下。
我们先看看请求包:
P
地址
192.168.3.17
的MAC地址是多少。
然后,我们收到一个ARP
回复包 ,如下图:
这个包可以理解为:HuaweiTe
的设备回复Apple_06:d2:a9
的设备192.168.3.1
的MAC
是XX:XX:XX...
虽然这2个包不是一一对应的请求和回复,但我们可以从这个抓包理解了ARP
协议的细节。
高速缓存
明白了 原理 后,聪明的读者 肯定会 疑惑:
如果每次发之前都要广播去 发送ARP请求硬件地址 会不会 太慢,答案是肯定的。
但是协议设计者早就洞察了一切,对于这种问题,我们可以用 万金油 方法解决呀---- 高速缓存。
我们可以在终端键入arp -a
获取本机ARP
高速缓存 的所有内容:
高速缓存中的每一项的生存时间一般为 20分钟,有了这些 缓存,我们经常直接使用 硬件地址,加快速度了。
ARP
代理
上面我们讨论都属于一个子网的主机间通信的情况,如果2个主机处于不同的子网,那么ARP
又是如何工作的呢?
这种情况下连接这两个主机的 路由器 就可以回答该请求,这个过程称为 委托ARP 或者 ARP代理。
我们知道 IP路由选择,如果主机不相连,我们就把数据报发送到一 默认路由 上,由 路由器 来 转发 该数据报。
在ARP
协议中,我们发往网络的请求主机物理地址也会由路由器回答,得到的就是 路由器的物理地址。
发送方就根据这个物理地址把数据报 发送到路由器,由路由器转发,再下面的事情由路由器完成,那是属于IP
协议的事了。
当然在那个过程中,也不断使用ARP
协议获取每一步的物理地址。
理解了ARP
的工作原理,那么我们就可以利用Python
做出我们自己的ARP
探测扫描工具
ARP
探测扫描
同样,同上期ICMP
探测工具一样,我们选择Python
的scapy
神器 作为我们工具轮子。
- 构造
ARP
请求广播数据包
在程序的顶部,我们先导入scapy
。
ARP 是构建ARP
数据包的类,Ether
用来构建以太网数据包,srp
方法在第二层 发送并接收 回应数据包。
我们先解下Ether的参数:
构造一个以太网数据包通常需要 指定目标和源MAC地址,如果不指定,默认发出的就是广播包,例如:
再来了解下ARP类构造函数的参数列表:构造ARP需要我们注意的有5个参数:【和上面讲的ARP
报文字段对应起来】
1. op
取值为1或者2,代表ARP请求或者响应包。
2. hwsrc
发送方Mac地址。
3. psrc
发送方IP地址。
4. hwdst
目标Mac地址。
5. pdst
目标IP地址。
复制代码
-
发送并接收回应包,我们关心4个参数
- x
发送的数据包 - timeout
延迟,我们设置为1秒 - iface
网口名称,当你的设备有多个网卡时候,一定要指定 - verbose
打印参数,我们设置为False
,过滤掉无用log
- x
-
解析回应包并将
MAC
地址分解出来- 返回的结果是一个 数组 ,返回 的数据包是数据的第二元素
- 在 返回数据包 中二维数组中找到
ARP
协议帧的数据,并将源MAC
地址字段取出
- 运行
工具改进
-
扫描整个网络
引入ipaddress
模块,扫描整个子网 -
多线程机制
from multiprocessing import Process,Queue
复制代码
多线程 协同扫描整个网络的主机,并将结果存储于 队列 中,另外的线程处理队列中的数据
- 引入
Ping
扫描工具 上一期我们制作了ping
的扫描探测,我们可以先用ping
扫描探测找出网络中的活动主机,然后用ARP
探测出其的MAC
地址
ARP
漏洞
-
广播
ARP 请求包是已 广播 推送到 以太网,很容易 被抓包 -
无校验机制
以太网 上的 任何 一台主机,如果接收到一个ARP
报文,即使该报文不是 该主机 所发送的ARP 请求 的 应答 报文,该主机也会将ARP
报文中的发送者的MAC
地址和IP
地址更新或加入到ARP
高速缓存中。
ARP
欺骗
我们既然能够扫描,那当然也可以用来攻击,想要知道如何攻击欺骗,请持续关注笔者以及笔者的公众号哟~~~
关注笔者公众账号[mindev],并回复arp,就能得到探测源码哟~~
愿意与大家分享交流各种技术,个人公众账号[mindev],以及 知识星球[ 极客世界 ]
欢迎订阅公众账号,日更哟~~~