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 命令行非阻塞输入的小例子
Sep 27 Python
linux系统使用python获取cpu信息脚本分享
Jan 15 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
Python中的Numpy矩阵操作
Aug 12 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
Pandas之Fillna填充缺失数据的方法
Jun 25 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Python垃圾回收机制三种实现方法
Apr 27 Python
Python单元测试及unittest框架用法实例解析
Jul 09 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
Feb 06 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中static和const关键字用法分析
2016/12/07 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
详解Python pygame安装过程笔记
2017/06/05 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
PyTorch预训练的实现
2019/09/18 Python
详解python算法常用技巧与内置库
2020/10/17 Python
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
社区健康教育实施方案
2014/03/18 职场文书
幼儿园八一建军节活动方案
2014/08/27 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
个人优缺点总结
2015/02/28 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python