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中使用urllib2伪造HTTP报头的2个方法
Jul 07 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
python三引号输出方法
Feb 27 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
Apr 10 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
如何在scrapy中捕获并处理各种异常
Sep 28 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 Python
如何用Django处理gzip数据流
Jan 29 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编程之xpath的应用实例
2015/01/24 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
Javascript typeof 用法
2008/12/28 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
浅谈scrapy 的基本命令介绍
2017/06/13 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
python用列表生成式写嵌套循环的方法
2018/11/08 Python
Django中create和save方法的不同
2019/08/13 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
python中如何写类
2020/06/29 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
应届生财务会计求职信
2013/11/05 职场文书
公积金单位接收函
2014/01/11 职场文书
元宵节寄语大全
2015/02/27 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
户外拓展训练感想
2015/08/07 职场文书
React Fragment介绍与使用详解
2021/11/11 Javascript
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB