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中dictionary items()系列函数的用法实例
Aug 21 Python
Python中使用SAX解析xml实例
Nov 21 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
python2.7读取文件夹下所有文件名称及内容的方法
Feb 24 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
Numpy数组转置的两种实现方法
Apr 17 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
对python 读取线的shp文件实例详解
Dec 22 Python
python中类的输出或类的实例输出为这种形式的原因
Aug 12 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
Dec 04 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 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删除xml文档内容的方法
2015/01/23 PHP
JavaScript 给汉字排序实例代码
2008/06/28 Javascript
JavaScript Sort 表格排序
2009/10/31 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
JS实现密码框效果
2020/09/10 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
Windows下安装Scrapy
2018/10/17 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
销售职业生涯规划范文
2014/03/14 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
学校推普周活动总结
2015/05/07 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS