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进阶教程之模块(module)介绍
Aug 30 Python
python实现用于测试网站访问速率的方法
May 26 Python
Python 装饰器深入理解
Mar 16 Python
python清除函数占用的内存方法
Jun 25 Python
替换python字典中的key值方法
Jul 06 Python
修改python plot折线图的坐标轴刻度方法
Dec 13 Python
python读取图片任意范围区域
Jan 23 Python
python如何获取列表中每个元素的下标位置
Jul 01 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
python scrapy爬虫代码及填坑
Aug 12 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
Python常用编译器原理及特点解析
Mar 23 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
php 启动报错如何解决
2014/01/17 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python解析json实例方法
2013/11/19 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
网上蛋糕店创业计划书
2014/01/24 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
居住证明范文
2015/06/17 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
利用Python实现Picgo图床工具
2021/11/23 Python