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

发布时间:2019-09-07 08:09:49编辑:auto阅读(2182)

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

关键字