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作为一种脚本语言,特别适合快速开发,但开发中难免会遇到一些bug,本篇文章将介绍几种Python代码调试的方法。 方法一:print语句调试法 这可能是一种最传统的调试方法了,通过在代码中添加print语句,输出变量的值或执行…

    python 2023年5月13日
    00
  • Python实现8种常用抽样方法

    下面是Python实现8种常用抽样方法的详细攻略: 1. 简单随机抽样(Simple Random Sampling) 简单随机抽样是指从总体中随机抽取一定数量的样本,保证每个数据有相同的概率被选中。通常使用random库的sample()方法实现。示例代码如下: import random population = [1, 2, 3, 4, 5, 6, 7…

    python 2023年5月19日
    00
  • 约瑟夫问题的Python和C++求解方法

    约瑟夫问题的Python和C++求解方法 什么是约瑟夫问题? 约瑟夫问题是一个经典的问题,设编号为1,2,…,n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 Python解法 下面是Python的一…

    python 2023年6月5日
    00
  • python中list循环语句用法实例

    Python中列表(List)的循环语句用法 Python中的列表(List)是一种常用的数据类型,可以存储多个元素。在实际开发中,我们需要对列表进行遍历操作。本文将详细讲解中列表的循环语句用法,包括for循环遍历、while循环遍历和列表推导式,并提供两个实例说明。 for循环遍历 使用for循环遍历列表常见的方法。可以使用关键字来遍历列表中的每个元素。例…

    python 2023年5月13日
    00
  • 如何在Python中插入MongoDB数据库中的数据?

    以下是在Python中插入MongoDB数据库中的数据的完整使用攻略。 使用MongoDB数据库的前提条件 在使用Python连接MongoDB数据库之前,确保已经安装了MongoDB数据库,并已经创建使用数据库和集合,同时需要安装Python的驱动,例如pymongo。 步骤1:导入模块 在Python中使用pymongo模块连接MongoDB数据库。以下…

    python 2023年5月12日
    00
  • Python中三元表达式的几种写法介绍

    当我们需要在Python中进行简单的条件判断时,可以使用三元表达式。三元表达式是一种简洁的写法,可以用于替代if-else语句。 什么是Python中的三元表达式 Python中的三元表达式是由一个条件表达式和两个表达式组成的。如果条件为True,则返回值为表达式1,否则返回表达式2的值。 三元表达式的语法如下: expression1 if conditi…

    python 2023年6月3日
    00
  • 详解Python with/as使用说明

    我来详细讲解一下“详解Python with/as使用说明”。 标题 首先,在markdown中,我们使用#号表示标题,一级标题需要一个#号,二级标题需要两个#号,以此类推。 with和as with和as是Python中的两个关键字,用于管理资源。with语句可以自动管理资源,即无论任何情况下,代码块执行完毕后,所处的上下文环境都会自动清理资源,例如关闭文…

    python 2023年5月13日
    00
  • 详解linux正则表达式(基础正则表达式+扩展正则表达式)

    详解Linux正则表达式 正则表达式是一种用来匹配、查找、替换字符串中特定模式的工具。在Linux系统中,正则表达式被广泛应用于文本处理、文件搜索等方面。本文将详细讲解Linux中的正则表达式,包括基础正则表达式和扩展正则表达式。 基础正则表达式 基础正则表达式是Linux中最常用的正则表达式,它包括以下几个部分: 字符匹配 .:匹配任意一个字符。 [……

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