python使用scapy模块实现ARP扫描的过程
作者:怪味巧克力 发布时间:2023-07-16 11:55:26
标签:python,scapy,ARP,扫描
前言
上篇文章主要写了利用scapy实现ping扫描,这篇文章主要是利用scapy模块实现内网ARP扫描
实现过程
上篇文章中介绍了通过scapy来伪造包,那么ARP包的伪造过程这里不再详述,说一工具的简单整体流程
1.首先,实现单个IP的ARP包的发送和接收
2.其次,实现多进程同时多个ARP包的发送和接收
整体的实现流程与上个脚本的实现较为相似
单进程ARP包
包的构造:
def scapy_arp_one(ip_address, queue=None):
Packet = Ether(dst='FF:FF:FF:FF:FF:FF') / ARP(op=1, hwdst='00:00:00:00:00:00:', pdst=ip_address)
请求包的发送:
arp = srp(Packet, timeout=0.2, verbose=False)
返回包的接收
try:
reply_list = arp[0].res
if queue is None:
return reply_list[0][1].getlayer(ARP).fields['hwsrc']
else:
queue.out((ip_address, reply_list[0][1].getlayer(ARP).fields['hwsrc']))
except:
return
这里采用队列的模式,主要是为了后面多进程同时发送做准备,涉及到ARP包的接受。这里我简单描述一下ARP包接受的情况,当我们发送ARP广播包的之后,我们就会接受到一个返回包。所以正确的情况就是,一个发送包一个接收包,一个发送包一个接收包,所以这里采用队列的方式,一个一个IP地址的接收,并使用列表进行存储,然后过滤ARP把内容,接收ARP中的硬件MAC地址
完整代码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:Ameng, jlx-love.com
from scapy.all import *
import sys
def scapy_arp_one(ip_address, queue=None):
Packet = Ether(dst='FF:FF:FF:FF:FF:FF') / ARP(op=1, hwdst='00:00:00:00:00:00:', pdst=ip_address)
arp = srp(Packet, timeout=0.2, verbose=False)
try:
reply_list = arp[0].res
if queue is None:
return reply_list[0][1].getlayer(ARP).fields['hwsrc']
else:
queue.out((ip_address, reply_list[0][1].getlayer(ARP).fields['hwsrc']))
except:
return
if __name__ == '__main__':
scapy_arp_one(sys.argv[1])
进一步完善
那么既然我们已经了解了使用ARP进行基本的发包和收包,那么我们接下来就来编写一个能够扫描整个网段的ARP检测
理一下思路,首先,我们需要将ip地址编程一个网段中的所有ip,可以借助ipaddress模块实现,其次我们知道我们接收响应包是一对的,所以我们可以从一对一对的响应包中接收我们需要的目标IP和源MAC地址,其次就是优化代码,输出结果,这里我不再采用sys模块进行传参,而是采用一个新的模块optparse,具体使用方法可以百度百科
完整代码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:Ameng, jlx-love.com
import time
from scapy.all import *
import ipaddress
import optparse
def scapy_arp_scan(network, ifname):
net = ipaddress.ip_network(network)
ip_addr = []
for ip in net:
ip = str(ip)
ip_addr.append(ip)
time.sleep(1)
Packet = Ether(dst='FF:FF:FF:FF:FF:FF')/ARP(op=1, hwdst='00:00:00:00:00:00', pdst=ip_addr)
arp = srp(Packet, iface = ifname, timeout = 1, verbose = False)
arp_list = arp[0].res
IP_MAC_LIST = []
for n in range(len(arp_list)):
IP = arp_list[n][1][1].fields['psrc']
MAC = arp_list[n][1][1].fields['hwsrc']
IP_MAC = [IP, MAC]
IP_MAC_LIST.append(IP_MAC)
return IP_MAC_LIST
if __name__ == '__main__':
t1 = time.time()
parser = optparse.OptionParser('用法:\n python3 scapy_arp_scan.py --network 扫描网段 --ifname 网卡名称')
parser.add_option('--network', dest = 'network', type = 'string', help = '扫描网段')
parser.add_option('--ifname', dest = 'ifname', type = 'string', help = '网卡名称')
(options, args) = parser.parse_args()
network = options.network
ifname = options.ifname
if network == None or ifname == None:
print(parser.usage)
else:
active_ip_mac = scapy_arp_scan(network, ifname)
print('存活的IP地址及对应MAC:')
for ip, mac in active_ip_mac:
print(ip, mac)
t2 = time.time()
print('所用时间为:{}'.format(int(t2 - t1)))
运行结果
来源:https://www.cnblogs.com/Jleixin/p/14300063.html


猜你喜欢
- 前期准备 :注册,填材料,验证等等:https://mp.weixin.qq.com1.浏览一遍简易教程,下载相应的开发工具写一个小例子点击
- requests是一个python 轻量的http客户端库,相比python的标准库要优雅很多。接下来通过本文给大家介绍Python3使用r
- 安装完成后需要在系统环境变量中设置GOPATH为项目目录GOROOT为安装目录path中设置好安装目录到bin目录打开cmd,输入go en
- 学习前言在SSD的框架中,除去tfrecord处理是非常重要的一环之外,slim框架的使用也是非常重要的一环,于是我开始学习slim啦sli
- [mysql]replace的用法(替换某字段部分内容)[mysql]replace的用法1.replace into  
- IWinter 是一个路由转控制器的 node 库,只解决一个问题:为了让使用者以更优雅的姿势进行路由的编写。支持在 Express 和 K
- HTML在线编辑器相信大家见得多了,有些流行的在线编辑器具有很丰富的功能。但美中不足的是,现有的HTML在线编辑器设置字号大小通常只限于1-
- 一般情况下,URL 中的参数应使用 url 编码规则,即把参数字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位
- 前言前文讲述了ppi-cpi和m0-m1-m2的图形绘制,在本文中继续分享一个反映经济活动景气度的指标PMI,在本文中还是采用爬虫的方式获取
- 一、算术运算符运算符+-*/%**(幂)求次方//(取整除,向下取整)如:9//2 =4二、比较运算符运算符==!=<>(不等于
- 前言前段时间看到有人问如何使用Python实现多张图片组成文字的效果?觉得还挺有意思,于是尝试做了一下,刚好赶上端午节,所以打算从网上下载1
- 如图所示,要处理的数据是一个json数组,而且非常大下图为电脑配置,使用 json.load() 方法加载上述json文件电脑直接卡死解决思
- 使用mysql_udf与curl库完成http_post通信模块(mysql_udf,multi_curl,http,post)这个模块其目
- 朴素贝叶斯算法简单高效,在处理分类问题上,是应该首先考虑的方法之一。通过本教程,你将学到朴素贝叶斯算法的原理和Python版本的逐步实现。更
- 前言turtle库是Python语言中一个很流行的绘制图像的函数库,可以轻松地绘制出精美的形状和图案,很适合用来引导孩子学习编程。turtl
- 1、吃金币源码分享:import osimport cfgimport sysimport pygameimport randomfrom
- 什么是组播点对点连接可以处理很多通信需求,不过随着直接连接数的增加,在多对通信方之间传递相同的消息会变得越来越困难。单独地向各个接收方发送消
- 1.partial首先是partial函数,它可以重新绑定函数的可选参数,生成一个callable的partial对象:>>&g
- MyBatis-Plus实现数据库curd操作1.mp是什么MyBatis-Plus(简称MP)是一个MyBatis 的增强工具,在MyBa
- 一、new做了哪些事先看看new的使用场景:// 1、创建一个构造函数function Vehicle(name, price) { &nb