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

yizhihongxing

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中,可以使用实数和虚数运算来定义复数。复数中,虚数部分是由一个小写字母j或大写字母J来表示的。 例如: >>> x = 2 + 3j >>> print(x) (2+3j) >>> y = 4j >>…

    python 2023年6月5日
    00
  • 值得收藏的10道python 面试题

    作为网站的作者,我们推出了一篇名为“值得收藏的10道Python面试题”的文章,旨在帮助学习Python语言的人更好地准备面试。下面将对这篇文章的内容进行完整的讲解,包括题目解析、示例说明和答案解释。 1.判断字符串是否为回文 该题要求判断给定的字符串是否为回文字符串(即正着和倒着读都一样),其解法如下: def is_palindrome(s): &quo…

    python 2023年6月5日
    00
  • 如何通过python检查文件是否被占用

    以下是关于如何通过 Python 检查文件是否被占用的完整攻略: 问题描述 在 Python 中,有时候我们需要检查文件是否被占用。本文详细介绍如何通过 Python 检查文件是否被占用。 解决方法 以下步骤解决 Python 检查文件是否被占用问题: 使用 os 模块检查文件是否存在。 可以使用 os 模块的 path.exists() 方法检文件是否存在…

    python 2023年5月13日
    00
  • python编辑用户登入界面的实现代码

    下面我来为您详细讲解如何使用Python实现用户登录界面的实现代码。 1. 创建登录页面 首先,需要确定登录页面需要包含哪些信息,比如用户名和密码。可以使用HTML和CSS来创建具有美观效果的登录页面。以下是一个简单的示例代码: <!DOCTYPE html> <html> <head> <title>Logi…

    python 2023年6月13日
    00
  • python+webdriver自动化环境搭建步骤详解

    下面我将详细讲解“python+webdriver自动化环境搭建步骤详解”的完整攻略。 1. 安装 Python 首先,需要到 Python 的官方网站 Python官网 下载并安装 Python,选择与操作系统对应的版本下载即可。 2. 安装 pip 安装好 Python 后,需要安装 pip。pip 是 Python 的一个包管理工具,用于安装第三方库。…

    python 2023年5月19日
    00
  • Python数据结构详细

    Python数据结构详细攻略 什么是数据结构? 数据结构是计算机中存储、组织数据的方式。常见的数据结构有数组、链表、栈、队列、哈希表、树和图等。不同的数据结构适用于不同的场景,通过选择合适的数据结构能够提高程序的效率和性能。 数组(Array) 数组是一种线性数据结构,它是一组连续的内存空间,用来存储同类型的数据。数组中的元素可以被通过下标访问,下标通常从0…

    python 2023年5月13日
    00
  • Python numpy实现二维数组和一维数组拼接的方法

    下面是详细讲解 “Python numpy实现二维数组和一维数组拼接的方法” 的攻略。 一、numpy.concatenate()方法 使用numpy的方法concatenate()可以实现二维数组和一维数组拼接。例如,我们有一个2×3的二维数组和一个大小为3的一维数组: import numpy as np a = np.array([[1, 2, 3],…

    python 2023年6月6日
    00
  • python制作简单计算器功能

    下面是Python制作简单计算器的完整攻略: 步骤1:定义计算器函数 首先,我们需要定义一个计算器函数,该函数将接受两个数字和一个操作符,并执行适当的计算。以下是一个简单的示例函数: def calculator(num1, num2, operator): if operator == ‘+’: return num1 + num2 elif operat…

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