python获取局域网内的设备_通过python对本局域网进行ARP扫描获取MAC

通过python对本局域网进行ARP扫描获取MAC

#!/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)

©著作权归作者所有:来自51CTO博客作者hello_world007的原创作品,如需转载,请注明出处,否则将追究法律责任

hello_world007

163篇文章,47W+人气,4粉丝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值