前言
在大一刚接触到kali linux的时候,第一个做的渗透就是wifi以及内网渗透,其中中间人攻击打开了我新世界的大门
虽说也学习了其原理是怎样的,但是知道得再多不如自己动手写一个。
时至今日,也该是时候给它“正身”了
ARP毒化原理
ARP协议
我们都知道在TCP/IP模型中,分为四个层次。
- 应用层
- 传输层
- 网络层
- 数据链路层
其中每一层各司其职,完成自己的任务后传递给下一层进行处理
忘了在哪看到的一句话,很在理
分层结构由于各层相互独立,给计算机网络安全带来的很大的隐患。但是我并没有说分层结构一无是处,相反,正是因为它,才能高速而有效率地处理数据、逻辑、事务,才能构成了我们的大千世界。这才是它的伟大之处。
在《TCP/IP卷一:协议》中,ARP协议被归为网络一层,而网上对ARP协议工作的层面还是有很大的争议,很大一部分人认为ARP是工作在数据链路层的。
ARP协议的作用是将IP地址和MAC地址一一映射起来。网络分为几个类 ―― 个域网,局域网,城域网,广域网,互联网。MAC地址作用于局域网寻址而IP地址作用于互联网寻址。所以在局域网内要找到对应的机器就得利用到MAC地址
在一个数据包在局域网传输时,一开始发送者它只知道应该发给哪个IP地址而不知道是对应哪个MAC地址,所以会向局域网里面广播,这个IP在哪个MAC地址,由于ARP协议,当你收到这个包的时候你就会检查你是不是这个IP,如果是的话你就会发回去一个包告诉它,这个鱼塘被你承包了,不,是这个IP地址在我这个MAC这里,然后它就会更新它的ARP表,写上这个IP是你这个MAC的,然后后面的通讯就会基于这条记录来执行
而记录MAC和IP映射关系的表是一种很简单的结构
ARP协议是基于内网信任的基础上建立的,就是说在协议设计的时代,并没有考虑到会有中间人攻击这种玩意(毕竟当时用得起电脑的都是国家科研机构)。到如今电脑普及的今天,ARP协议这种信任就产生了一个大问题――ARP欺骗
ARP欺骗
假设当局域网内A
和B
正在通信的时候,我们发一个ARP的reply包给他们两,告诉A
我是B
,告诉B
我是A
,那么他们将会傻傻地听你的话,然后把发给对方的东西发给你,然后你将得到他们的所有数据包
当然,想要细水长流地窃取A
和B
的数据,Hacker
就可以开启IP转发,是基于ICMP的Redirect
机制实现的。在Linux下root
权限执行命令就好了
1
|
echo 1> /proc/sys/net/ipv4/ip_forward
|
ARP包结构
知道原理之后我们知道只要发出对应ARP包就够了
我们来看一下ARP包的结构
很明显ARP的内容被包裹在链路层的数据内容中,其中
字段 | 含义 |
---|---|
帧类型 | 指数据包里面内容的类型,我们写成ARP对应的协议代号0x0806 |
硬件类型 | 指以太网类型 |
协议类型 | 指的是我们ARP想要哪个协议映射,这个字段我们设成IPv4的代号\x0800 |
硬件地址长度 | 即MAC地址长度 |
协议地址长度 | 即IP地址长度 |
值得注意的是,填充字段是填18个字符。这是因为链路层的最短帧长为64字节,而固定的目的MAC
+源MAC
+帧类型
+CRC
= 18 字节,仍然需要46字节才能达到最短帧长,而ARP报文内容只有28字节,所以需要填充18字节才行
万事俱备
花了一天多的时间写了一个ARP欺骗的命令行工具,用的是Python
的socket
类,借鉴了scapy
库的源码进行类封装
目录结构如下
1
2
3
4
5
6
|
│ main.py
│
├──wsocket
│ arp.py
│ wsocket.py
│ __init__.py
|
可以拿我写的wsocket
和arp
类很方便的进行发包收包(当然wsocket里面组合了python的socket),arp
类提供快速打包ARP的功能,然后我们就可以用这两个类来做一些事情了,比如写个命令行工具
注:利用Python 的socket类建立端口收发ARP等较为底层的包需要root权限
小工具
流程比较简单,简单才最美
- 选择网卡
- 选择对应功能,如ARP扫描和ARP欺骗、自定义发ARP包等
ARP扫描是获取网卡信息后,计算出子网大小,然后逐一请求IP的MAC地址,即广播ARP request可实现,ARP欺骗的原理已经说过了
当我们双向欺骗成功之后,可以用wireshark
或者driftnet
等工具提取和分析数据
当然,程序中也加入了一些异常处理机制、默认选项、发包频率、发包时间等,让程序更加健壮
程序源码下载地址:
https://github.com/WananpIG/ARP-Spoof
最后说一句
教我们的一位老师说的挺对的――“我们现在很多同学过度依赖于工具,脱离了工具就不知道该怎么办。我们科班出身的人应该是工具的创造者,而不是依赖者 ”
希望这个小工具能够让读者和本人重新思考用轮子和造轮子的涵义。
来源:https://www.cnblogs.com/thespace/p/12510157.html