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中bisect的用法
Sep 23 Python
python打开网页和暂停实例
Sep 30 Python
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
浅谈Python中的数据类型
May 05 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
Django中cookie的基本使用方法示例
Feb 03 Python
python networkx 根据图的权重画图实现
Jul 10 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
keras 读取多标签图像数据方式
Jun 12 Python
基于Python实现粒子滤波效果
Dec 01 Python
python中添加模块导入路径的方法
Feb 03 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 str_pad 函数使用详解
2009/01/13 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
php去除html标记的原生函数详解
2015/01/27 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
便捷提取python导入包的属性方法
2018/10/15 Python
Python定义函数实现累计求和操作
2020/05/03 Python
python如何修改文件时间属性
2021/02/05 Python
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
大学生军训自我评价分享
2013/11/09 职场文书
另类冲刺标语
2014/06/24 职场文书
政协调研汇报材料
2014/08/15 职场文书
整改通知书格式
2015/04/22 职场文书
抢劫罪辩护词
2015/05/21 职场文书
运动会致辞稿
2015/07/29 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
sql注入教程之类型以及提交注入
2021/08/02 MySQL