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列表推导式的使用方法
Nov 21 Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 Python
python生成随机图形验证码详解
Nov 08 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
windows10下python3.5 pip3安装图文教程
Apr 02 Python
Python实现字符串的逆序 C++字符串逆序算法
May 28 Python
python安装numpy和pandas的方法步骤
May 27 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
python获取Pandas列名的几种方法
Aug 07 Python
django创建最简单HTML页面跳转方法
Aug 16 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
Python基本知识点总结
Apr 07 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中对数据库操作的封装
2006/10/09 PHP
php实现数据库的增删改查
2017/02/26 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
AngularJs bootstrap详解及示例代码
2016/09/01 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
python实现kMeans算法
2017/12/21 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
基于Python函数和变量名解析
2019/07/19 Python
python 操作hive pyhs2方式
2019/12/21 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
《雷雨》教学反思
2014/02/20 职场文书
小学班主任评语大全
2014/04/23 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
学校党员干部承诺书
2015/05/04 职场文书
实用求职信模板范文
2019/05/13 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
vue实现在data里引入相对路径
2022/06/05 Vue.js
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android