Python3利用scapy局域网实现自动多线程arp扫描功能

Python3利用scapy局域网实现自动多线程arp扫描功能

简介

在网络安全领域,arp扫描是一种基础的扫描技术,它通过发送arp请求,获取设备的MAC地址,以及搜集局域网IP和MAC地址的对应关系,从而进行各种实际利用和攻击。在本文中,我们将讲述如何使用Python3和scapy库,实现自动多线程arp扫描功能。

环境

  • Python 3.x
  • Scapy 2.x

实现思路

自动arp扫描主要实现可以分为以下几个步骤:

  1. 获取本机IP和对应的子网掩码,在局域网内获取所有本网段IP
  2. 启动多线程,以每个IP地址发送arp请求
  3. 解析响应数据包,收集在线设备信息

代码实现

我们将会利用Python的多线程,并使用Scapy编写arp请求和解析响应包。

先从获取本机IP和子网掩码开始:

import socket
import struct

def get_local_ip():
    ip = socket.gethostbyname(socket.gethostname())
    subnet = socket.inet_ntoa(struct.pack("!I", socket.htonl(0xFFFFFF00 & struct.unpack("!I", socket.inet_aton(ip))[0])))
    return (ip, subnet)

上述函数中,通过socket.gethostbyname和socket.gethostname函数在本机获取IP地址,接着将其传入socket.inet_aton函数中使用struct.unpack函数从容器中获取整形inet地址,对其与0xFFFFFF00相与,然后使用socket.inet_ntoa再次将整形inet地址转换为点分十进制表示的IP地址,并加上子网掩码,最后返回。

获取本机IP和子网掩码之后,就可以获取本网段的IP地址列表了:

def get_ip_list(subnet):
    ip_list = []
    for i in range(1,255):
        try:
            ip = subnet.split(".")
            ip = ip[0] + "." + ip[1] + "." + ip[2] + "." + str(i)
            ip_list.append(ip)
        except:
            pass
    return ip_list

在该函数中,我们将传入的子网掩码分割出IP前三段,并将i加入到第四段末尾,之后生成符合网络规范的IP地址,加入到列表ip_list中。

接着是发送arp请求和解析响应的函数:

def send_arp_request(ip):
    arp_packet = Ether(dst='ff:ff:ff:ff:ff:ff', type=2054)/ARP(hwtype=1, ptype=2048, hwlen=6, plen=4, op=1, hwsrc=get_mac(), psrc=get_local_ip()[0], hwdst='00:00:00:00:00:00', pdst=ip)
    ans, unans = srp(arp_packet, timeout=1, verbose=False)
    if ans:
        return (ip, ans[0][1].hwsrc)
    else:
        return None

在该函数中,我们使用Scapy的srp函数来发送和接收arp请求和响应。构造arp请求包,设置请求类型和源IP地址、源MAC地址等信息,并使用多线程执行函数并返回结果,如果收到arp响应数据包,则返回IP地址和MAC地址对应,并将对应关系存到字典中,否则返回None。

最后,我们将各个方法放到主函数中,完成对局域网的arp扫描,如下所示:

import threading

ip_mac_dict = {}
lock = threading.Lock()

def main():
    subnet = get_local_ip()[1]
    ip_list = get_ip_list(subnet)
    for ip in ip_list:
        t = threading.Thread(target=scan_thread, args=(ip,))
        t.start()
    for thread in threading.enumerate():
        if thread != threading.current_thread():
            thread.join()
    for ip,mac in ip_mac_dict.items():
        print(ip + " : " + mac)

def scan_thread(ip):
    res = send_arp_request(ip)
    if res:
        with lock:
            ip_mac_dict[res[0]] = res[1]
            print(res[0] + " >>>>>>>>> " + res[1])

在本文中,我们介绍了如何利用Python和Scapy实现自动多线程arp扫描,其中主要使用了Python的多线程和Scapy的srp函数来实现数据包发送和接收,通过将各个方法结合实现了对局域网IP地址和MAC地址的快速扫描,有利于网络管理和安全管理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python3利用scapy局域网实现自动多线程arp扫描功能 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python函数中的全局变量详解

    Python函数中的全局变量详解 在Python函数中,全局变量是在函数外部定义的变量。它们可以用于整个程序,包括函数内和函数外都可以使用。但是,在函数内对全局变量进行修改会导致一些问题,本文将详细讲解。 全局变量的定义 在Python中,如果你想定义全局变量,你需要在最上层的代码中定义它。定义全局变量时,你无需像局部变量那样指定数据类型。 示例代码: # …

    python 2023年6月5日
    00
  • python Pandas库read_excel()参数实例详解

    我来为你详细讲解“Python Pandas库read_excel()参数实例详解”的完整实例教程。 Python Pandas库read_excel()参数实例详解 在使用Python Pandas库进行数据处理时,我们经常需要读取Excel文件中的数据。而Pandas库中的read_excel()函数可以帮助我们实现这个功能。下面我将详细讲解read_e…

    python 2023年5月13日
    00
  • Python检查图片是否损坏及图片类型是否正确过程详解

    Python检查图片是否损坏及图片类型是否正确过程详解 在Python中,我们可以使用Pillow库来检查图片是否损坏及图片类型是否正确。Pillow是Python中强大的图像处理库,它可以用于打开、操作和保存许多不同类型的图像文件。在本文中,我们将详细解Python检查图片是否损坏及图片类型是否正确的过程,包括如何使用Pillow库打开图片、如何检查图片是…

    python 2023年5月13日
    00
  • Pycharm下载pyinstaller报错:You should consider upgrading via the ‘python -m pip install –upgrade pip’ command的解决方法

    解决PyCharm下载PyInstaller报错You should consider upgrading via the ‘python -m pip install –upgrade pip’ command可以按照如下步骤进行: Step 1:在 PyCharm 中打开终端 首先,我们需要在 PyCharm 中打开终端,方法是依次点击菜单栏中的“Vi…

    python 2023年5月13日
    00
  • python列表与列表算法详解(2)

    下面我将详细讲解文章“python列表与列表算法详解(2)”的完整攻略。 1、概述 本篇文章主要介绍了Python中列表的相关内容,包括列表的定义、列表操作、列表算法等。此外,我们还详细介绍了Python中的一些内置函数,以及如何使用列表进行数据分析和处理。 2、列表的定义 列表是Python中最常用的数据结构之一,它可以用来存储一组数据,数据可以是任何类型…

    python 2023年5月13日
    00
  • python安装本地whl的实例步骤

    介绍如下: 安装 python 本地 whl 的实例步骤 1. 下载 whl 文件 首先,需要下载 whl 文件。可以从 PyPI(Python 包索引)上下载,也可以通过其他途径获取。 2. 确定本地 Python 版本以及位数 在下载 whl 文件之前,需要确定本地使用的 Python 版本以及位数(32 位/64 位)。可以通过终端输入以下命令获取: …

    python 2023年5月14日
    00
  • Python requests用法和django后台处理详解

    以下是关于Python requests用法和Django后台处理的详细攻略: Python requests用法 Python requests是一个流行的HTTP库,用于向Web服务器发送HTTP请求和接收响应。以下是Python requests的基本用法: 安装requests库 在使用requests库之前,需要先安装它。可以使用以下命令在终端中安…

    python 2023年5月14日
    00
  • Python async模块使用方法杂谈

    Python async模块使用方法杂谈 Python async(协程)是近年来非常流行的一种异步编程模式。async通过事件循环机制和协程技术实现其非阻塞的异步效果,让我们能够更方便、高效地编写异步代码。在本文中,我们将详细讲解Python async模块的使用方法,并带有两个示例说明。 1.异步编程概述 在传统的编程模式中,当程序执行到一个耗时的I/O…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部