写一个ARP欺骗的命令行工具

18-37-52.jpg

最近烦心事略多,趁这个假期好好静下心来学习学习 : )

前言

在大一刚接触到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映射关系的表是一种很简单的结构

17-35-27.jpg

ARP协议是基于内网信任的基础上建立的,就是说在协议设计的时代,并没有考虑到会有中间人攻击这种玩意(毕竟当时用得起电脑的都是国家科研机构)。到如今电脑普及的今天,ARP协议这种信任就产生了一个大问题——ARP欺骗

ARP欺骗

假设当局域网内AB正在通信的时候,我们发一个ARP的reply包给他们两,告诉A我是B,告诉B我是A,那么他们将会傻傻地听你的话,然后把发给对方的东西发给你,然后你将得到他们的所有数据包
MITM.png

当然,想要细水长流地窃取AB的数据,Hacker就可以开启IP转发,是基于ICMP的Redirect机制实现的。在Linux下root权限执行命令就好了

1
echo 1> /proc/sys/net/ipv4/ip_forward

ARP包结构

知道原理之后我们知道只要发出对应ARP包就够了
我们来看一下ARP包的结构

ARP.png

很明显ARP的内容被包裹在链路层的数据内容中,其中

字段 含义
帧类型 指数据包里面内容的类型,我们写成ARP对应的协议代号0x0806
硬件类型 指以太网类型
协议类型 指的是我们ARP想要哪个协议映射,这个字段我们设成IPv4的代号\x0800
硬件地址长度 即MAC地址长度
协议地址长度 即IP地址长度

值得注意的是,填充字段是填18个字符。这是因为链路层的最短帧长为64字节,而固定的目的MAC+源MAC+帧类型+CRC = 18 字节,仍然需要46字节才能达到最短帧长,而ARP报文内容只有28字节,所以需要填充18字节才行

万事俱备

花了一天多的时间写了一个ARP欺骗的命令行工具,用的是Pythonsocket类,借鉴了scapy库的源码进行类封装
目录结构如下

1
2
3
4
5
6
│ main.py
├──wsocket
│ arp.py
│ wsocket.py
│ __init__.py

可以拿我写的wsocketarp类很方便的进行发包收包(当然wsocket里面组合了python的socket),arp类提供快速打包ARP的功能,然后我们就可以用这两个类来做一些事情了,比如写个命令行工具
注:利用Python 的socket类建立端口收发ARP等较为底层的包需要root权限

小工具

21-16-40.jpg

流程比较简单,简单才最美

  1. 选择网卡
  2. 选择对应功能,如ARP扫描和ARP欺骗、自定义发ARP包等

ARP扫描是获取网卡信息后,计算出子网大小,然后逐一请求IP的MAC地址,即广播ARP request可实现,ARP欺骗的原理已经说过了
当我们双向欺骗成功之后,可以用wireshark或者driftnet等工具提取和分析数据

21-31-33.jpg

当然,程序中也加入了一些异常处理机制、默认选项、发包频率、发包时间等,让程序更加健壮

21-32-20.jpg 21-33-42.jpg

程序源码下载地址:
https://github.com/WananpIG/ARP-Spoof

最后说一句

教我们的一位老师说的挺对的——“我们现在很多同学过度依赖于工具,脱离了工具就不知道该怎么办。我们科班出身的人应该是工具的创造者,而不是依赖者 ”
希望这个小工具能够让读者和本人重新思考用轮子造轮子的涵义。



----- 感谢阅读 -----