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写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
python中文编码问题小结
Sep 28 Python
使用Python脚本操作MongoDB的教程
Apr 16 Python
Python中利用sorted()函数排序的简单教程
Apr 27 Python
Python中列表list以及list与数组array的相互转换实现方法
Sep 22 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
tensorflow模型转ncnn的操作方式
May 25 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 Python
python爬虫---requests库的用法详解
Sep 28 Python
Python如何配置环境变量详解
May 18 Python
Python循环之while无限迭代
Apr 30 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 伪造IP来源的实例代码
2012/11/01 PHP
Zend的MVC机制使用分析(一)
2013/05/02 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
PHP基于phpqrcode类生成二维码的方法详解
2018/03/14 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
2019/04/12 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
jQuery动态添加
2016/04/07 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
Textarea输入字数限制实例(兼容iOS&安卓)
2017/07/06 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
详解python的webrtc库实现语音端点检测
2017/05/31 Python
python中while和for的区别总结
2019/06/28 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
django的autoreload机制实现
2020/06/03 Python
Flask中jinja2的继承实现方法及实例
2021/03/03 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
学校三节实施方案
2014/06/09 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs
DSP接收机前端设想
2022/04/05 无线电
基于PyQt5制作一个群发邮件工具
2022/04/08 Python
关于的python五子棋的算法
2022/05/02 Python