python使用scapy模块实现ARP扫描的过程


Posted in Python onJanuary 21, 2021

前言

上篇文章主要写了利用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)))

运行结果

python使用scapy模块实现ARP扫描的过程

到此这篇关于python使用scapy模块实现ARP扫描的过程的文章就介绍到这了,更多相关python实现ARP扫描内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python守护线程用法实例
Jun 23 Python
对python的文件内注释 help注释方法
May 23 Python
python的中异常处理机制
Aug 30 Python
python实现维吉尼亚算法
Mar 20 Python
python assert的用处示例详解
Apr 01 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
Aug 31 Python
Python序列化与反序列化pickle用法实例
Nov 11 Python
Python:slice与indices的用法
Nov 25 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
Django实现列表页商品数据返回教程
Apr 03 Python
Python Selenium实现无可视化界面过程解析
Aug 25 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
May 11 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 #Python
Pandas直接读取sql脚本的方法
Jan 21 #Python
python asyncio 协程库的使用
Jan 21 #Python
python palywright库基本使用
Jan 21 #Python
python Scrapy爬虫框架的使用
Jan 21 #Python
python 可视化库PyG2Plot的使用
Jan 21 #Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 #Python
You might like
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
python对数组进行反转的方法
2015/05/20 Python
Python数组定义方法
2016/04/13 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
python 实现识别图片上的数字
2019/07/30 Python
python 实现屏幕录制示例
2019/12/23 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
恶意软件的定义
2014/11/12 面试题
介绍一下linux文件系统分配策略
2013/02/25 面试题
尽职尽责村干部自我鉴定
2014/01/23 职场文书
乡镇纠风工作实施方案
2014/03/22 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
车间核算员岗位职责
2014/07/01 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
2014年路政工作总结
2014/12/10 职场文书
会议简报格式范文
2015/07/20 职场文书