- #!/usr/local/bin/python3
- """
- 对本局域网进行 ARP 扫描 ARP (Address Resolution Protocol,ARP);
- 以太网 MAC 地址识别 (如下):
- 主机在整个局域网广播 ARP 请求消息, 该 ARP 请求中包含目标设备的 IP 地址;
- 局域网上的每一台设备都会检查该 ARP 请求, 看该 ARP 请求中的 IP 地址是不是自己;
- 只有符合该 IP 地址的设备才会发送 ARP 响应;
- ARP 响应该中包涵了 ARP 请求中的 IP 地址及对应的 MAC 地址;
- """"""
- 这里需要 Scapy 这个模块
- https://pypi.org/project/ 去这里下载 scapy
- 或者去它官网 https://scapy.net/ 下载
- Scapy 是一个功能强大的交互式包操作程序. 它能够伪造或解码大量的协议包,
- 还有能发送, 捕获, 匹配及回复各种大量的协议包. 它还能轻松的处理大量的经典任务,
- 如扫描, 跟踪, 探测, 单元测试,××× 或网断扫描;
- 并且它还能处理其它其它工具所无法处理的任务, 如发送无效帧及注入自己的 802.11 帧,
- 还有一些结合技术 (如 VLAN 跳转 + ARP 缓存中毒, WEP 加密信道上的 VoIP 解码等), 总之就是很强大
- 执行本脚本时 , 如果需要用 sudo 来执行
- """"""
- ls() 列出所有的协议及协议选项
- lsc() 列出所有 scapy 的命令函数
- """"""
- / 操作符在两层之间起到一个组合的作用. 当使用该操作符时, 下层可以根据其上层, 使它的一个或多个默认字段被重载.
- 本例中需要用的下面几个函数
- >>>ls(Ether)
- dst : DestMACField = (None)
- src : SourceMACField = (None)
- type : XShortEnumField = (36864)
- #dst 目标 mac 地址 6 字节 48 位 dst 设置为 ff:ff:ff:ff:ff:ff 为广播设置
- #src 源 mac 地址 6 字节 48 位
- #type 以太网类型, 用于标识上一层使用的是什么协议; 比如 0800 是 IP 协议, 0806 是 ARP 协议, 8035 是 RARP 协议
- >>>ls(ARP)
- hwtype : XShortField = (1)
- ptype : XShortEnumField = (2048)
- hwlen : FieldLenField = (None)
- plen : FieldLenField = (None)
- op : ShortEnumField = (1)
- hwsrc : MultipleTypeField = (None)
- psrc : MultipleTypeField = (None)
- hwdst : MultipleTypeField = (None)
- pdst : MultipleTypeField = (None)
- #hwtype 硬件地址的类型, 硬件地址不只以太网一种, 是以太网类型时此值为 1
- #ptype 标识上一层使用的是什么协议
- #op 是操作类型字段, 值为 1, 表示进行 ARP 请求; 值为 2, 表示进行 ARP 应答; 值为 3, 表示进行 RARP 请求; 值为 4, 表示进行 RARP 应答.
- #hwsrc 源 mac 地址
- #psrc 源 ip 地址
- #hwdst 目标 mac 地址
- #pdst 目标 ip 地址
- >>> srp1(pkt,timeout=1,verbose=0 )
- #srp1 在第二层协议上发送及接收包并返回第一次的应答
- #pkt 构建包的变量
- #timeout=1 超时 1 秒就丢弃, 实际时间看程序处理能力而定
- #verbose=0 不显示详细信息
- """
- from scapy.all import *
- import sys,getopt,socket
- def get_local_net():
- #获取主机名
- hostname = socket.gethostname()
- #获取主机的局域网 ip
- localip = socket.gethostbyname(hostname)
- localipnums = localip.split('.')
- localipnums.pop()
- localipnet = '.'.join(localipnums)
- return localipnet
- def get_vlan_ip_and_mac():
- localnet = get_local_net()
- result = []
- for ipFix in range(1,254):
- ip =localnet+"."+str(ipFix)
- #组合协议包
- arpPkt=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip)
- res = srp1(arpPkt,timeout=1,verbose=0)
- if res:
- result.append({"localIP":res.psrc,"mac":res.hwsrc})
- return result
- result = get_vlan_ip_and_mac()
- print(result)
来源: http://www.bubuko.com/infodetail-2737794.html