Skip to main content
 首页 » 编程设计

python之使用 scapy 释放 DHCP

2025年05月04日18落叶无声

我想将 DHCP 释放数据包发送到我局域网上的 DHCP 服务器。

我有机器的 MAC 地址,我想为其伪造 RELEASE 数据包。

我谷歌了一下,没有找到任何有用的东西。有人可以指出我正确的方向吗?

我尝试发送一个带有选项消息类型的 DHCP 数据包:发布。基本上我是想发布我自己的 IP。但它没有用。

sendp(Ether(dst=server_mac)/IP(src=my_ip,dst=server_ip)/UDP(sport=68,dport=67)/BOOTP(chaddr=my_mac)/DHCP(options=[("message-type","release")])) 

请您参考如下方法:

感谢您的尝试。关于 DHCP 释放消息,需要牢记一件重要的事情。当您将消息发送到服务器时,它实际上不会导致 IP 地址在您的本地计算机上被释放。如果您正在考虑使用 RELEASE 创建 DOS 或其他一些攻击的演示,您将不会有太多运气。

释放消息只是告诉 DHCP 服务器客户端正在放弃网络地址并取消剩余的租约。在放弃该地址后,由客户端停止使用该地址。

就为什么它可能不适合您而言,有几件事浮现在脑海中。

  1. mac 地址可能不正确,您没有包括如何设置 my_mac...您不能在这里简单地使用字符串。您可以使用从 get_if_raw_hwaddr 函数获得的值。
  2. 您在消息的 bootp 部分缺少客户端地址和交易 ID。
  3. 您缺少服务器标识符,并以 DHCP 选项结尾。如果您使用客户端标识符来获取地址,则必须在发布中使用它。标准规定了这一点,但并非所有 DHCP 服务器都强制执行。

这是一个对我有用的例子。您可以通过阅读 RFC specification 了解更多关于 DHCP 的信息。和/或使用 Wireshark 捕获和观察真实数据包。

from scapy import * 
fam,hw = get_if_raw_hwaddr('wlan0')     
send(IP(src=my_ip,dst=server_ip) /  
     UDP(sport=68,dport=67) / 
     BOOTP(chaddr=hw, ciaddr='192.168.0.101', xid=random.randint(0, 0xFFFFFFFF)) / 
     DHCP(options=[("message-type","release"), ("server_id", "192.168.0.1"), 'end']))