南京音乐推荐联合社

Python写ARP局域网主机存活扫描与ARP欺骗工具

Python中文社区 2019-10-19 14:35:36

專 欄

exploit,Python中文社区专栏作者,入坑Python一年。希望与作者交流或者对文章有任何疑问的可以与作者联系:
QQ:1585173691
Email:15735640998@163.com


起源

最近一直在研究网络协议,为了加深理解就自己构造了数据包发送并用抓包工具进行分析,在研究arp协议时顺便写了一个简单的类似网络剪刀手的小脚本用于测试,下面开始我们的arp研究吧。

简单协议分析

网络协议大致分为应用层•传输层•网路层•链路层,以http为例,传输层封装tcp头,网络层封装ip头,链路层封装以太头(如下图所示),而arp报文就是包含在链路层以太帧的数据包里面,下面我们来讲讲以太帧格式。


以太帧

以太帧工作在链路层,以太帧格式多达五种,但今天的tcp/ip应用都是用Ethernet V2格式,下面我们分析Ethernet V2格式(如图),各数据段的解释图上也标出来了,其中“类型”是指明上层协议,0x800代表网际协议,0x0806代表arp协议


下面我用wireshark抓一个arp回复包来分析一下是否能与上面数据格式对应上(如下面截图)此处wireshark把前导码与CRC包给丢弃了,截图中的“数据”里面就包含着我们要研究的arp报文


Arp报文数据结构的研究

Arp报文数据结构就是对上面截图中“数据”的具体研究,arp报文格式如下图,操作类型有四种,这里只讲arp的两种:1表示发送的包为请求包,2表示发送的包为回复包:


下面我用wireshark对上面截图“数据”展开进行研究:


好,说了这么多我们下面来讲讲arp欺骗的原理吧!

Arp欺骗

两台计算机通信需要ip地址与mac地址,此时把两台计算机当作快递的起始站和终点站,要传送的数据当作你要邮寄的物品,那么ip地址就相当于起始站的寄件地址和终点站的收件地址,而mac地址就相当于中间要经过的中转站地址。当一个数据发出后,要经过一个一个mac中转站才能到达终点站。 
(1)此时如果你把起始站要发往中转站的mac地址改为你的mac地址,那么起始站的数据包就直接发到你手中,如果你做一个路由转换,再转换到正确的mac地址,那么起始站能正常收发邮件,而你却能看其中的内容,如果不做路由转换便实现了断网功能 
(2)如果你把mac中转站(网关)要发往起始站的mac地址改为你的mac地址,那么回复的请求包就发到你手中,起始站就得不到回复包,实现断网功能。 
方法一是欺骗目标机,修改目标机的mac缓存表,如果目标机有arp防火墙便成功不了; 
方法二是欺骗路由器,修改路由器的mac缓存表,即使目标机有arp防火墙,也能实现断网功能,因为目标机的mac缓存表并没有修改 
Arp协议是一个不安全的协议,只要你发送数据包就能修改目标的mac缓存表,基于这种不安全性,便能实现arp欺骗。

Python写arp欺骗工具

思路(及数据包的构造):不断发送修改对方mac缓存表的arp

欺骗目标机:以太头:本机mac•目标机mac数据(Arp包):目标机mac•目标机ip•操作类型请求或回复都行•本机mac•网关ip

欺骗路由器:以太头:网关mac•本机mac数据(arp包):网关mac•网关ip•操作类型请求或回复都行•本机mac•目标机ip

Arp主机存活扫描

遍历你要扫描的ip段地址并发送一个广播mac地址的请求包,收到回复则代表这台主机存活,并打印其ip地址及mac地址,用于arp欺骗。

Python写扫描工具

思路: 
以太头:本机mac•ff:ff:ff:ff:ff:ff

数据:00:00:00:00:00:00(因为不知道目标mac于是用0填充)•目标机ip(一个一个遍历)•操作类型请求•本机mac•本机ip

具体代码如下:



代码效果(以欺骗目标机为例):

使用arp欺骗路由器时,不能用本机和虚拟机做路由欺骗实验,因为无论你怎么分配虚拟机mac地址,在路由器上的mac缓存表中本机和虚拟机mac地址都是用的本机mac地址,如下图


ARTICLES
近期热门文章


生成器

关于生成器的那些事儿

爬虫代理

如何构建爬虫代理服务

地理编码

怎样用Python实现地理编码

nginx日志

使用Python分析nginx日志


淘宝女郎

一个批量抓取淘女郎写真图片的爬虫

IP代理池

突破反爬虫的利器——开源IP代理池

布隆去重

基于Redis的Bloomfilter去重(附代码)

内建函数

Python中内建函数的用法

QQ空间爬虫

QQ空间爬虫最新分享,一天 400 万条数据

对象

Python教你找到最心仪对象

线性回归

Python机器学习算法入门之梯度下降法实现线性回归

匿名代理池

进击的爬虫:用Python搭建匿名代理池

在公众号底部回复上述关键词可直接打开相应文章




我 们 终 将 改 变 潮 水 的 方 向


§§
Python中文社区
www.python-cn.com

致力于成为

国内最好的Python社区


QQ群:152745094

专栏作者申请邮箱

sinoandywong@gmail.com

— Life is short,we use Python —



Copyright © 南京音乐推荐联合社@2017