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 类对象和实例对象动态添加方法(分享)
Dec 31 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
详解Python 数据库的Connection、Cursor两大对象
Jun 25 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
Python实现Event回调机制的方法
Feb 13 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
python如何导出微信公众号文章方法详解
Aug 31 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
Jan 12 Python
python 实现图片裁剪小工具
Feb 02 Python
python实现简单的学生管理系统
Feb 22 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 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变量引用的面试题
2010/08/08 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
2017/07/18 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
pytorch模型存储的2种实现方法
2020/02/14 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
Python使用Matlab命令过程解析
2020/06/04 Python
python如何求圆的面积
2020/07/01 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
中专生毕业自我鉴定
2013/11/01 职场文书
开朗女孩的自我评价
2014/02/10 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
老员工辞职信范文
2015/05/12 职场文书
2016入党心得体会范文
2016/01/06 职场文书