0x00 ARP概述
中文名: 地址解析协议(英语:Address Resolution Protocol,缩写:ARP)是通过解析网络层地址(IPv4,IPv6)来寻找数据链路层地址的一个在网络中非常重要的传输协议。用简单明了的话就是实现从IP地址到MAC地址的映射,即询问目标IP对应的MAC地址。
0x01 基本功能
在以太网协议中规定,同一局域网中的一台主机A要和另一台主机B进行直接通信,那么主机A必须要知道主机B的MAC地址。而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。所谓地址解析(address resolution)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
0x02 ARP报文格式
正式开讲之前先让我们了解一些相关内容。
●ARP缓存
ARP高速缓存(即ARP缓存表)是ARP地址解析协议能高效运行的关键(如果有多次ARP响应时,以最后一次响应为准)。ARP给IP地址和MAC地址中间做了动态映射,也就是说缓存了一个ARP表,将得 到的IP地址和MAC地址对应起来,如果表中没有查到IP地址对应的MAC地址,才会发广播去找。
ARP缓存表采用老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可减少缓存表的长度,加快查询速度,各设备的老化时间不一想了解的小伙伴可自行上网查询。
0x03 ARP原理之请求应答
如果在一个局域网中主机A要想和主机B进行通信那么主机A是怎么做的呢?
首先发送方(主机A)将会按照OSI数据封装顺序,自顶向下从应用层->物理层,按该层协议进行协议头和协议尾的封装,然后将封装好的数据传递给下层最终发送出去。
以ping命令举例 主机A, B通信时需要知道对方的通信信息比如姓名(IP),地址(MAC)等 由于ping 主机B 时告诉了我们主机B的IP地址,那么主机A是如何获取主机B 的MAC地址的呢?
如图:首先主机A会查找自己的ARP缓存表 ,查看主机B的IP地址是否有匹配的MAC地址。
如果在ARP缓存表中没有查到IP对应的MAC地址时。那么将如下图所示, 主机A 首先会向当前网络发出一个携带自己IP和MAC地址的ARP广播请求包,询问谁是 192.168.0.2 收到请回答over。
当主机B收到广播后便会检查数据包中携带的IP地址是否为自己的IP地址,如果不是就忽略掉,是的话就将数据包中携带主机A的IP地址和MAC地址写入自己的ARP缓存表中,然后返回一个应答包 我是 192.168.0.2, 我的MAC 地址是 aa:bb:cc:dd:ee:ff。
主机A通过接收主机B返回的应答包将主机B的IP以及询问到MAC地址写入ARP缓存表中之后便按照正常流程进行通信。
0x04 ARP 数据包解读
为了能更直观的体现出ARP交互过程,这里我用wireshark抓取存在真实网络中的ARP流量,通过解读数据包的形式进行分析。
●ARP请求包
以太网链路层
目标以太网地址目标MAC地址FF:FF:FF:FF:FF:FF (二进制1)为广播地址。
源以太网地址:发送方MAC地址。
帧类型:以太网类型,0x0806为ARP。
● ARP请求报文
硬件类型:如以太网(0x0001)、分组无线网等等。
协议类型:如网际协议(IP)(0x0800)、IPv6(0x86DD)。
硬件地址长度:每种硬件地址的字节长度,一般为6(以太网)。
协议地址长度:每种协议地址的字节长度,一般为4(IPv4)。
操作码:1为ARP请求,2为ARP应答,3为RARP请求,4为RARP应答。
源硬件地址:n个字节,n由硬件地址长度得到,一般为发送方MAC地址。源协议地址:m个字节,m由协议地址长度得到,一般为发送方IP地址。
目标硬件地址:n个字节,n由硬件地址长度得到,一般为目标MAC地址,此处全0表示是请求报文。
目标协议地址:m个字节,m由协议地址长度得到,一般为目标IP地址。
●ARP应答包
从主机B返回的应答包中可以看出目标地址不在是ff:ff:ff:ff:ff:ff而是主机A的mac地址。
操作码也为表示响应的应答操作码2。
图中出现的Padding字段作用是填充数据,为了保证数据帧最少有64个字节既然了解了ARP协议的交互过程,那么就让我们使用Python的Scapy包来实现对网络主机的扫描和ARP中间人攻击的脚本吧。
0x05 Scapy 介绍
Scapy是一个Python程序,使用户能够发送,嗅探和剖析并伪造网络数据包。
此功能允许构建可以探测,扫描或攻击网络的工具。
换句话说,Scapy是一个功能强大的交互式数据包操作程序。
它能够伪造或解码大量协议的数据包,通过线路发送,捕获它们,匹配请求和回复等等。
Scapy可以轻松处理大多数经典任务,如扫描,跟踪路由,探测,单元测试,攻击或网络发现。
它可以取代hping,arpspoof,arp-sk,arping,p0f甚至是Nmap,tcpdump和tshark的某些部分。
x06 网络主机扫描
● 环境说明:
攻击机( Kail) 软件环境 python 2.7 scapy 2.3.3
目标靶机(Ubuntu 16.04)
通过上文ARP原理讲解我们知道如果通过ARP请求的IP地址存在的话,将会得到一个ARP应答包。那么我们就可以通过发送一个伪造的ARP请求包来请求一个自定义的IP地址并处理返回的应答包来确定一个IP(主机)是否存在当前网络中
● 脚本代码:
执行脚本:如果网络中存在存活主机那么我们就可以在输出的内容中看到存在的主机的IP地址及mac地址。
0x07 ARP中间人攻击
通过持续不断的发送arp应答包来覆盖目标主机arp缓存表中对应的转换关系(如果有多次ARP响应时,以最后一次响应为准),从而导致目标计算机与网关通信失败,以及信道重定向,所有的数据都会通过攻击者的机器。攻击者再对目标和网关之间的数据进行转发则可以作为一个“中间人”,实现监听目标却又不影响目标正常上网。
● 网络环境
软件环境 python 2.7 scapy 2.3.3
攻击机(kail) 192.168.0.1 VMnet3
主机A(Ubuntu 16.04) 192.168.0.2 VMnet3
网关(centos 6.5) 双网卡 eth0: 192.168.231.129 NAT
eth1: 192.168.0.4 VMnet3
为了实现192.168.0.0/24网段能访问外网,网关需要设置iptables nat以及启用路由转发。
脚本代码:
-
以192.168.0.4的身份发送应答包给192.168.0.2告诉它 我的mac地址是”00:0c:29:2b:4f:6b”(伪造攻击机是主机A的网关,所有发给网关的流量都会发给攻击机)。
攻击开始后主机A的arp 缓存表。
2. 以192.168.0.2的身份发送应答包给192.168.0.4告诉它 我的mac地址是”00:0c:29:2b:4f:6b”(伪造攻击机是主机A,所有发给主机A的流量都会发给攻击机)。
攻击开始后网关的arp缓存表:
其中攻击机也需要开启路由转发。
echo “1” > /proc/sys/net/ipv4/ip_forward
sysctl -p
为了方便展示这里使用wireshark抓包
主机A在浏览器发起登录请求。
攻击机通监听施行欺诈后的网卡抓到的了本该由主机A发往网关的流量,并且在数据包中找到了使用明文传输的账号密码。
本文始发于微信公众号(疯猫网络):网络协议arp学习和网络扫描
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论