python arp扫描_基于python的局域网arp扫描
ARP协议
ARP 协议也叫做地址解析协议,就是IP地址转换成MAC地址的协议
原理:在局域网内广播,向所有的主机发送包含目标IP地址的请求报文,如果该IP地址的主机接到了报文,那么就会将自己的MAC地址返回给发送端。同样根据这个原理就可以实现扫描局域网的所有主机。
ARP请求报文
一个完整的ARP数据报包括:14字节的以太网首部 + 28字节的ARP数据报
前者包括:6字节的目的MAC地址 + 6字节的发送端MAC地址 + 2字节的类型(0x0806:ARP协议)
后者包括:2B 硬件类型+2B 协议类型+1B 硬件地址长度+1B协议地址长度+2B 操作类型+6B 发送端 MAC 地址+4B 发送端 IP 地址+6B 目的端 MAC 地址+4B 目的端 IP 地址
ARP发送
# 将16进制的MAC地址转换成,需要的字符格式
def mac2a(m):
return binascii.a2b_hex(m)
# 将ip地址列表转换成,需要的字符格式
def ip2a(i):
ipi = i[0]*256*256*256+i[1]*256*256+i[2]*256+i[3]
iph = hex(ipi)
return binascii.a2b_hex(iph[2:])
# 向指定IP发送ARP报
def send(ip):
# 设置协议族类型和上层协议
rawS = socket.socket(socket.PF_PACKET,socket.SOCK_RAW,
socket.htons(0x0806))
# 绑定网卡和端口号
rawS.bind(("wlo1",socket.htons(0x0800)))
# 以太网头封包,6s:6B的目的端MAC,6s:6B 发送端MAC,2s:2B的协议类型
tha = mac2a('ffffffffffff')#target hardware address 目的端硬件地址
sha = mac2a('34238769543e')#sender hardware address 发送端硬件地址
ethHdr = tha+sha+'\x08\x06'
# ARP数据封包
hrd = '\x00\x01'#硬件地址类型,默认1:以太网
pro = '\x08\x00'#网络地址类型,0800:IP地址
hln = '\x06'#硬件地址长度,单位B
pln = '\x04'#网络地址长度,单位B
op = '\x00\x01'#操作类型,1:arp请求,2:arp响应
#sha = sha#发送端硬件地址
spa = ip2a([192,168,199,112])#发送端网络地址
#tha = tha#目的端硬件地址
tpa = ip2a(ip)#目的端网络地址
arpPkt = hrd+pro+hln+pln+op+sha+spa+tha+tpa
# 发送
rawS.send(ethHdr+arpPkt)
ARP监听
def a2ip(a):
return '%d.%d.%d.%d'%tuple(map(ord,list(a)))
def a2mac(a):
h = binascii.b2a_hex(a)
return ':'.join([h[i:i+2] for i in xrange(0,len(h),2)])
#监听ARP响应
def listen():
pc=pcap.pcap("wlo1") #注,参数可为网卡名,如eth0
for pt,pd in pc: #pt为收到时间,pd为收到数据
eth = dpkt.ethernet.Ethernet(pd)
if eth.type==2054:
arp = eth.data
if arp.op==2: #ARP响应
print "在线",a2ip(arp.spa)," ",a2mac(arp.sha)
测试执行
~/python/pcap/arp$ sudo python lanScan.py
扫描开始
在线 192.168.199.1 d4:ee:07:1b:71:9c
在线 192.168.199.135 fc:64:ba:04:e0:2f
在线 192.168.199.148 90:00:4e:1e:19:ba
在线 192.168.199.153 a0:88:69:9d:ef:3b
在线 192.168.199.154 84:9f:b5:41:aa:f1
在线 192.168.199.154 84:9f:b5:41:aa:f1
在线 192.168.199.164 24:fd:52:92:14:86
扫描结束
~/python/pcap/arp$
这样就可已知道所有的局域网的主机了,也可以使用 ping 命令,查看对方的操作系统,例如:
~/python/pcap/arp$ ping 192.168.199.1
PING 192.168.199.1 (192.168.199.1) 56(84) bytes of data.
64 bytes from 192.168.199.1: icmp_seq=1 ttl=64 time=1.69 ms
64 bytes from 192.168.199.1: icmp_seq=2 ttl=64 time=1.20 ms
# 主要看ttl字段,一般情况下
# Linux系统的TTL值为64或255
# Windows NT/2000/XP系统的TTL值为128
# Windows 98系统的TTL值为32
# UNIX主机的TTL值为255
完整的代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# sendARP.py
# 探测局域网 IP
import socket
import struct
import binascii
import dpkt
import pcap
import thread
# 将16进制的MAC地址转换成,需要的字符格式
def mac2a(m):
return binascii.a2b_hex(m)
# 将ip地址列表转换成,需要的字符格式
def ip2a(i):
ipi = i[0]*256*256*256+i[1]*256*256+i[2]*256+i[3]
iph = hex(ipi)
return binascii.a2b_hex(iph[2:])
# 向指定IP发送ARP报
def send(ip):
# 设置协议族类型和上层协议
rawS = socket.socket(socket.PF_PACKET,socket.SOCK_RAW,
socket.htons(0x0806))
# 绑定网卡和端口号
rawS.bind(("wlo1",socket.htons(0x0800)))
# 以太网头封包,6s:6B的目的端MAC,6s:6B 发送端MAC,2s:2B的协议类型
tha = mac2a('ffffffffffff')#target hardware address 目的端硬件地址
sha = mac2a('34238769543e')#sender hardware address 发送端硬件地址
ethHdr = tha+sha+'\x08\x06'
# ARP数据封包
hrd = '\x00\x01'#硬件地址类型,默认1:以太网
pro = '\x08\x00'#网络地址类型,0800:IP地址
hln = '\x06'#硬件地址长度,单位B
pln = '\x04'#网络地址长度,单位B
op = '\x00\x01'#操作类型,1:arp请求,2:arp响应
#sha = sha#发送端硬件地址
spa = ip2a([192,168,199,112])#发送端网络地址
#tha = tha#目的端硬件地址
tpa = ip2a(ip)#目的端网络地址
arpPkt = hrd+pro+hln+pln+op+sha+spa+tha+tpa
# 发送
rawS.send(ethHdr+arpPkt)
def a2ip(a):
return '%d.%d.%d.%d'%tuple(map(ord,list(a)))
def a2mac(a):
h = binascii.b2a_hex(a)
return ':'.join([h[i:i+2] for i in xrange(0,len(h),2)])
#监听ARP响应
def listen():
pc=pcap.pcap("wlo1") #注,参数可为网卡名,如eth0
for pt,pd in pc: #pt为收到时间,pd为收到数据
eth = dpkt.ethernet.Ethernet(pd)
if eth.type==2054:
arp = eth.data
if arp.op==2: #ARP响应
print "在线",a2ip(arp.spa)," ",a2mac(arp.sha)
#listen()
thread.start_new_thread(listen,())
print "扫描开始"
for i in xrange(1,255):
send([192,168,199,i])
print "扫描结束"
python arp扫描_基于python的局域网arp扫描相关推荐
- python病毒扫描器_基于Python的病毒扫描机制
构建集中式病毒扫描机制(ClamAV) Clam AntiVirus(ClamAV)是一款免费而且开源的防毒软件,软件与病毒库的更新皆有社区免费发布,官网地址:http://www.clamav.ne ...
- python 英语分词_基于Python NLTK库进行英文文本预处理
文本预处理是要文本处理成计算机能识别的格式,是文本分类.文本可视化.文本分析等研究的重要步骤.具体流程包括文本分词.去除停用词.词干抽取(词形还原).文本向量表征.特征选择等步骤,以消除脏数据对挖掘分 ...
- python回归算法_基于Python的函数回归算法验证
看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归 回归方法就是寻找方差的最小值 y = kx + b xi, ...
- python数据采集系统_基于python的聚焦网络爬虫数据采集系统设计与实现
基于 python 的聚焦网络爬虫数据采集系统设计与实现 杨国志 ; 江业峰 [期刊名称] < <科学技术创新> > [年 ( 卷 ), 期] 2018(000)027 [摘要 ...
- python编码尺寸_基于Python批量生成指定尺寸缩略图代码实例
这篇文章主要介绍了基于Python批量生成指定尺寸缩略图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近我们商城上架的应用越来越丰富了. ...
- cv2 python 获取斑马线_基于python的opencv图像处理实现对斑马线的检测示例
基本思路 斑马线检测通过opencv图像处理来进行灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人 ...
- python词频作图_基于Python的词频分析与云图生成
近期,学校对呼和浩特市第二中学学生特质进行了调查,具体题目为"用关键词描述一下二中学生的特质(尽量在20字以内)". 为了更好的展示调查结果,我们基于Python的jieba库和w ...
- 基于python爬虫数据处理_基于Python爬虫的校园数据获取
苏艺航 徐海蛟 何佳蕾 杨振宇 王佳鹏 摘要:随着移动时代的到来,只适配了电脑网页.性能羸弱的校园教务系统,已经不能满足学生们的移动查询需求.为此,设计了一种基于网络爬虫的高实用性查询系統.它首先通过 ...
- 基于python的网站_基于Python的网站爬虫应用研究
基于 Python 的网站爬虫应用研究 陈清 [期刊名称] <通讯世界> [年 ( 卷 ), 期] 2020(027)001 [摘要] 如何于海量的互联网网站中获取有用资源信息 , 对网站 ...
最新文章
- pandas数据框,统计某列或者某行数据元素的个数
- gif 图片制作和拆解
- mod_jk是Apache服务器的一个可插入模块
- 物联网的发展之—Vecloud微云
- linux dd命令制作软盘,制作Linux启动软盘的四种方法
- Tomcat 初始化端点错误--Error initializing endpoint
- 一条更新SQL 是如何执行的?
- Eclipse生成get,set方法,无参构造方法和有参构造方法
- RCP:给GEF编辑器添加网格和标尺。
- 【C】——C深入探讨——switch语句的default位置【转】
- lambda表达式python_python lambda表达式用法
- 计算机显微视觉相关概念,计算机视觉热门科研!基于深度神经网络的蛋白质智能显微分类系统,已开启!...
- HashSet、TreeSet、LinkedHashSet的区别
- 用户故事讲解(看最后的例子,你应该就知道怎么样写用户故事了)
- spyder python下载_【spyder编程软件下载】spyder官方下载 v2.1.0 最新版-七喜软件园...
- i510300h和i78750h参数对比哪个好
- GStreamer应用开发文档的ogg播放器
- Android RGB颜色对照表
- 有趣且重要的Git知识合集(5)Merge branch ‘master‘ of
- 知己知彼 看CIO如何成功领导80后