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
0
投稿
猜你喜欢
- 相对于 Ajax,服务端 XMLHTTP 就是在服务端使用 XMLHttpRequest 对象了。虽然说,在服务端使用异步请求是比较不方便的
- 画矩形函数调用:cv2.rectangle(img,pt1,pt2,color,thickness,line_type,shift)img:
- 如何使用表单发送电子邮件?邮件也可以用表单格式发送吗?我见一个朋友这样做的。当然可以,用OCXMail就行:formToEmail.htm&
- 前言想要使用摄像头实现一个多人姿态识别环境安装下载并安装 Anaconda官网连接 https://anaconda.cloud/insta
- 使用ASP实现网站的目录树数据库结构(共使用了两个表)1。tblCategory字段名 类型 Root&
- 首次安装、运行MySQL时,你可能会遇到一些错误,使MySQL服务器不能启动。本节的目的是帮助你诊断并纠正这些错误。解决服务器问题时你的第一
- asp无组件上传VBS编写的大家见的多了,这个是纯javascript实现的上传,原来unicode可以解决读取位置的问题,这次真的是纯JS
- 一、ts文件的由来ts文件,ts即"Transport Stream"的缩写,特点就是要求从视频流的任一片段开始都是可以
- 序言小学妹说要毕业了,学了一学期Python等于没学,现在要做毕设做不出来,让我帮帮她,晚上去她家吃夜宵。当时我心想,这不是分分钟的事情,还
- 前言当我们需要对列表(list)、元组(tuple)、字典(dictionary)和集合(set)的元素进行遍历时,其实Python内部都是
- 开发环境:win10-64 python2.7.16 chrome77from selenium import we
- 前言CUDA(Compute Unified Device Architecture)是NVIDIA推出的异构计算平台,PyTorch中有专
- Go本地测试的思路我习惯在开发过程中及时测试自己开发的功能模块,这样能及时发现问题,节省后期功能耦合之后,debug的时间。为了统一管理要测
- 2。date_default_timezone_set("PRC"); 3。PHP&
- newstudent.asp<script LANGUAGE=″vbscript″ RUNAT=″Server″&
- 前段时间我们部门的粉丝和布林同学都写过关于这个问题的文章。刚好阅读了关于这个问题的其他争论文章。所以顺便在这补充几点。首先说明这里讨论的是在
- 本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义,
- 代码如下:<% dim objconn,connstr Set objconn =&
- 创建一个名为templatetags的python module。新建一个名为verbose_name.py的文件。from django
- 问题现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在。解决方案加入你有如下两个