渗透&&探测 (之ARP探测篇)

题记

  • 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地址,具体过程如下:

    1. 本地主机局域网广播ARP请求,ARP 请求数据帧 中包含 目的主机IP地址。
      翻译成 人话 就是:如果你是这个IP地址的拥有者,请回答你的硬件地址

    2. 目的主机ARP解析 这份广播报文,识别出是 询问其硬件地址。于是发送ARP 应答包,里面包含IP地址及其对应硬件地址
      翻译一下就是: 你问的IP地址的所有者是我,老子的MAC是xx:xx:xx...

    3. 本地主机 收到ARP应答后,知道了目的地址MAC地址,之后的数据报就可以传送了

  • 分组格式 ARP 请求于应答的分组格式都如下图:

    1. 目的以太网地址
      目的主机 的硬件地址,ARP请求广播包中,因为不知道目的MAC地址,所以 目的地址 全为 1,也就是16进制的FF:FF:FF:FF:FF:FF

    2. 以太网源地址
      源主机的硬件地址。

    3. 帧类型
      对于ARP协议,该字段为0x0806。

    4. 硬件类型
      表示硬件地址的类型。值为 1 时表示以太网地址。也就是说ARP协议不仅仅应用于 以太网协议,还可以支持别的链路层协议。

    5. 协议类型
      表示要映射的协议地址类型,值为0x0800时表示IP协议。

    6. 硬件地址长度
      与硬件类型对应的硬件地址的长度,以字节为单位。如果是 以太网,则是6字节MAC长度)。

    7. 协议地址长度
      与协议类型对应的协议地址长度,以字节为单位。如果是IP协议,则是 4字节IP地址长度)。

    8. 操作类型(op
      四种 操作类型:

    • ARP请求(1)
    • ARP应答(2)
    • RARP请求(3)
    • RARP应答(4)
    1. 发送端硬件地址
      如果是以太网,则是源主机以太网地址,此处和以太网头中的源地址对应。

    2. 发送端协议地址
      如果是IP协议,则表示 源主机IP地址。

    3. 目的端硬件地址
      如果是 以太网,则是目的以太网地址,和以太网头中目的地址对应。

    4. 目的端协议地址
      如果是IP协议,则表示源主机要请求硬件地址的IP地址。

抓包

  这么多字段都不是人记的,没事,我们用抓包神器 wireshark来抓一下ARP包,我们深入理解一下。
我们先看看请求包:

和上面的分组字段 一一 对应起来,可以读出 Apple_76:95:5d 的主机发了一个广播包,询问目的I P地址 192.168.3.17的MAC地址是多少。

  然后,我们收到一个ARP 回复包 ,如下图:

  这个包可以理解为:HuaweiTe的设备回复Apple_06:d2:a9的设备192.168.3.1MACXX:XX:XX...

  虽然这2个包不是一一对应的请求和回复,但我们可以从这个抓包理解了ARP协议的细节。

高速缓存

  明白了 原理 后,聪明的读者 肯定会 疑惑

  如果每次发之前都要广播去 发送ARP请求硬件地址 会不会 太慢,答案是肯定的。

  但是协议设计者早就洞察了一切,对于这种问题,我们可以用 万金油 方法解决呀---- 高速缓存

  我们可以在终端键入arp -a获取本机ARP 高速缓存 的所有内容:

  高速缓存中的每一项的生存时间一般为 20分钟,有了这些 缓存,我们经常直接使用 硬件地址加快速度了

ARP代理

  上面我们讨论都属于一个子网的主机间通信的情况,如果2个主机处于不同的子网,那么ARP又是如何工作的呢?

  这种情况下连接这两个主机的 路由器 就可以回答该请求,这个过程称为 委托ARP 或者 ARP代理

  我们知道 IP路由选择,如果主机不相连,我们就把数据报发送到一 默认路由 上,由 路由器转发 该数据报。

  在ARP协议中,我们发往网络的请求主机物理地址也会由路由器回答,得到的就是 路由器的物理地址

  发送方就根据这个物理地址把数据报 发送到路由器,由路由器转发,再下面的事情由路由器完成,那是属于IP协议的事了。
  当然在那个过程中,也不断使用ARP协议获取每一步的物理地址。

  理解了ARP的工作原理,那么我们就可以利用Python做出我们自己的ARP探测扫描工具

ARP探测扫描

  同样,同上期ICMP探测工具一样,我们选择Pythonscapy 神器 作为我们工具轮子。

  1. 构造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地址。
复制代码
  1. 发送并接收回应包,我们关心4个参数

    1. x
      发送的数据包
    2. timeout
      延迟,我们设置为1秒
    3. iface
      网口名称,当你的设备有多个网卡时候,一定要指定
    4. verbose
      打印参数,我们设置为False,过滤掉无用log
  2. 解析回应包并将MAC地址分解出来

    1. 返回的结果是一个 数组返回 的数据包是数据的第二元素
    2. 返回数据包 中二维数组中找到ARP协议帧的数据,并将源MAC地址字段取出

  1. 运行

工具改进

  1. 扫描整个网络
    引入ipaddress模块,扫描整个子网

  2. 多线程机制

from multiprocessing import Process,Queue
复制代码

多线程 协同扫描整个网络的主机,并将结果存储于 队列 中,另外的线程处理队列中的数据

  1. 引入Ping扫描工具 上一期我们制作了ping的扫描探测,我们可以先用ping扫描探测找出网络中的活动主机,然后用ARP探测出其的MAC地址

ARP漏洞

  • 广播
    ARP 请求包是已 广播 推送到 以太网,很容易 被抓包

  • 无校验机制
    以太网 上的 任何 一台主机,如果接收到一个ARP报文,即使该报文不是 该主机 所发送的ARP 请求应答 报文,该主机也会将ARP报文中的发送者的MAC地址和IP地址更新或加入到ARP高速缓存中。

ARP欺骗

  我们既然能够扫描,那当然也可以用来攻击,想要知道如何攻击欺骗,请持续关注笔者以及笔者的公众号哟~~~

  关注笔者公众账号[mindev],并回复arp,就能得到探测源码哟~~

愿意与大家分享交流各种技术,个人公众账号[mindev],以及 知识星球[ 极客世界 ]

            欢迎订阅公众账号,日更哟~~~

你可能感兴趣的:(渗透&&探测 (之ARP探测篇))