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获取android设备的GPS信息脚本分享
Mar 06 Python
Python 实现数据库更新脚本的生成方法
Jul 09 Python
神经网络python源码分享
Dec 15 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
将python图片转为二进制文本的实例
Jan 24 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
Aug 01 Python
python实现简单颜色识别程序
Feb 19 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 Python
如何使用flask将模型部署为服务
May 13 Python
Python Matplotlib绘制条形图的全过程
Oct 24 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 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使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
为开发者准备的10款最好的jQuery日历插件
2014/02/04 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
跟老齐学Python之Import 模块
2014/10/13 Python
Python常用的日期时间处理方法示例
2015/02/08 Python
python中的代码编码格式转换问题
2015/06/10 Python
python实现的简单RPG游戏流程实例
2015/06/28 Python
Python变量作用范围实例分析
2015/07/07 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
Python中运算符"=="和"is"的详解
2016/10/08 Python
python实现汉诺塔算法
2021/03/01 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
tensorflow 环境变量设置方式
2020/02/06 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
linux面试题参考答案(8)
2016/04/19 面试题
资产评估专业大学生求职信
2013/09/29 职场文书
车间班组长的职责
2013/12/13 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
消防安全宣传口号
2014/06/10 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
公民授权委托书
2014/10/15 职场文书
《称赞》教学反思
2016/02/17 职场文书