我尝试创建包含Option82的自定义DHCP请求,但我无法设置子选项的长度:
ethernet= Ether(dst='ff:ff:ff:ff:ff:ff',src=get_if_hwaddr("eth1"), type=0x800)
ip= IP(src='0.0.0.0', dst='255.255.255.255')
udp = UDP(sport=68, dport=67)
bootp = BOOTP(chaddr =hw, ciaddr ='0.0.0.0', xid =0x01020304, flags= 1)
dhcp = DHCP(options=[("message-type","discover")])/DHCP(options=[("relay_agent_Information", "TEST"), "end"])
packet = ethernet / ip / udp / bootp / dhcp
无论我做什么,option82总是有错误的长度。有没有人知道如何设置子选项的地址标题?
提前致谢!
答案 0 :(得分:1)
DHCP Option 82不是像"TEST"
这样的简单字符串。您可以在RFC3046中找到对该选项的非常好的解释.DHCP 82是特定代理提供的子选项的“容器”选项。中继代理信息选项的格式为:
Code Len Agent Information Field
+------+------+------+------+------+------+--...-+------+
| 82 | N | i1 | i2 | i3 | i4 | | iN |
+------+------+------+------+------+------+--...-+------+
长度N给出代理信息字段中的八位字节总数。 “代理信息”字段由每个子选项的一系列SubOpt / Length / Value元组组成,按以下方式编码:
SubOpt Len Sub-option Value
+------+------+------+------+------+------+--...-+------+
| 1 | N | s1 | s2 | s3 | s4 | | sN |
+------+------+------+------+------+------+--...-+------+
SubOpt Len Sub-option Value
+------+------+------+------+------+------+--...-+------+
| 2 | N | i1 | i2 | i3 | i4 | | iN |
+------+------+------+------+------+------+--...-+------+
Scapy
不适用于子选项,因此您需要以十六进制格式提供完整的Option 82字段,包括字段长度等。例如,请考虑对您的代码进行以下修改,以产生正确的长度选项82:
...
option82 = "\x01\x01\x05\x02\x06\x11\x22\x34\x44\x55\x66"
dhcp = DHCP(options=[("message-type","discover")])/DHCP(options=[("relay_agent_Information", option82), "end"])
...
在这种特殊情况下,DHCP Option 82为\x01\x01\x05\x02\x06\x11\x22\x34\x44\x55\x66
。这里是Circuit ID = 05
和Remote ID = 112233445566
。相应的Wireshark转储如下: