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程序
Apr 04 Python
python回调函数用法实例分析
May 09 Python
python2.7的编码问题与解决方法
Oct 04 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
对pandas replace函数的使用方法小结
May 18 Python
对pandas处理json数据的方法详解
Feb 08 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
python日期与时间戳的各种转换示例
Feb 12 Python
用Python开发app后端有优势吗
Jun 29 Python
Python实现异步IO的示例
Nov 05 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 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使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
Node.js文件操作详解
2014/08/16 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
信息滚动效果的实例讲解
2017/09/18 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
JavaScript async/await原理及实例解析
2020/12/02 Javascript
python的类变量和成员变量用法实例教程
2014/08/25 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
python如何导入依赖包
2020/07/13 Python
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
行政助理岗位职责范文
2013/12/03 职场文书
考察现实表现材料
2014/05/19 职场文书
学校四群教育实施方案
2014/06/12 职场文书
环境日宣传活动总结
2014/07/09 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
租车协议书范本2014
2014/11/17 职场文书
承诺函范文
2015/01/21 职场文书
工厂仓库管理员岗位职责
2015/04/09 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
Python测试框架pytest高阶用法全面详解
2022/06/01 Python