我是python的新手并学习一些网络编程,我希望通过我的tap接口向我的DHCP服务器发送一个DHCP数据包并期待它的响应 . 我尝试了几种数据包构建技术,例如结构和ctypes,最后使用了scapy . 在这里,我能够发送DHCP数据包,但无法从DHCP服务器获得任何响应(使用wireshark和tcpdump进行分析) . 我的数据包看起来与原始DHCP数据包相同但无法获得响应 . 这是我的代码
import socket
from scapy.all import *
def main():
if len(sys.argv)<3:
print " fewer arguments."
sys.exit(1)
else:
tap_interface = sys.argv[1]
src_mac_address = sys.argv[2]
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
fd = open('/dev/net/tun','r+')
TUNSETIFF = 0x400454ca
IFF_TAP = 0x0002
IFF_NO_PI = 0x1000
mode = IFF_TAP | IFF_NO_PI
ifr = struct.pack('16sH', tap_interface, IFF_TAP | IFF_NO_PI)
fcntl.ioctl(fd,TUNSETIFF,ifr)
while True:
sendp(packet, iface = tap_interface)
time.sleep(10)
if __name__ == '__main__':
main()
有没有其他方法来实现这一目标?如果是这样,请同时提及它们 . 提前致谢 .
3 回答
解决了 !我有同样的问题,
The problem I think was on the srp() function, it can't receive packets on port 68, but I've created a new function with a new thread that sniffs BOOTP messages and displays the packet fields. 你可以模拟它:
然后使用srp()或sendp()func发送数据包:)
注意:我使用多线程机制导致我的程序在网络上出现恶意DHCP服务器时发送消息和嗅探
我不确定这是否有资格作为答案,但我们使用scapy来模拟DHCP服务器/客户端交换,以下是我们的工作:
我的代码和你的代码之间的主要区别似乎是如何定义BOOTP头 . 也许你可以尝试我的数据包定义,看看它是否有效?
这是我做的一个示例,它获取dhcp地址并将其分配给ip接口:
我粗略的POC,同时为我的项目创建代码: