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中super的用法实例
May 28 Python
Python Socket实现简单TCP Server/client功能示例
Aug 05 Python
python基于物品协同过滤算法实现代码
May 31 Python
利用pandas进行大文件计数处理的方法
Jul 25 Python
python 运用Django 开发后台接口的实例
Dec 11 Python
面向对象学习之pygame坦克大战
Sep 11 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
Feb 20 Python
Python运行提示缺少模块问题解决方案
Apr 02 Python
Keras模型转成tensorflow的.pb操作
Jul 06 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
Python 如何将integer转化为罗马数(3999以内)
Jun 05 Python
Python3中最常用的5种线程锁实例总结
Jul 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制作静态网站的模板框架(四)
2006/10/09 PHP
php实现水仙花数示例分享
2014/04/03 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
Firefox div高度自适应
2009/04/28 Javascript
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
js实现滑动触屏事件监听的方法
2015/05/05 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
如何根据业务封装自己的功能组件
2019/04/19 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
理解python中生成器用法
2017/12/20 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
Python import与from import使用及区别介绍
2018/09/06 Python
python实现简单名片管理系统
2018/11/30 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
Mac中PyCharm配置Anaconda环境的方法
2020/03/04 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
Reformation官网:美国女装品牌
2018/09/14 全球购物
优质的学校老师推荐信
2013/10/28 职场文书
小学教师国培感言
2014/02/08 职场文书
《草原》教学反思
2014/02/15 职场文书
新党章心得体会
2014/09/04 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
统计员岗位职责范本
2015/04/14 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python