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中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
对Python中9种生成新对象的方法总结
May 23 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
详解Python:面向对象编程
Apr 10 Python
在cmd中查看python的安装路径方法
Jul 03 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
Python集合操作方法详解
Feb 09 Python
python实现Oracle查询分组的方法示例
Apr 30 Python
如何理解python对象
Jun 21 Python
详解python爬取弹幕与数据分析
Nov 14 Python
Django程序的优化技巧
Apr 29 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实例分享之html转为rtf格式
2014/06/02 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
Python制作刷网页流量工具
2017/04/23 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
python interpolate插值实例
2020/07/06 Python
python中Django文件上传方法详解
2020/08/05 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
德国购买门票网站:ADticket.de
2019/10/31 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
TCP/IP的分层模型
2013/10/27 面试题
秋季运动会通讯稿
2014/01/24 职场文书
关于热爱祖国的演讲稿
2014/05/04 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
学习党章的体会
2014/11/07 职场文书
锦旗赠语
2015/06/23 职场文书
Golang map映射的用法
2022/04/22 Golang
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android