Scapy自定义DHCP Option82

时间:2015-02-03 14:55:54

标签: scapy dhcp

我尝试创建包含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总是有错误的长度。有没有人知道如何设置子选项的地址标题?

提前致谢!

1 个答案:

答案 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 = 05Remote ID = 112233445566。相应的Wireshark转储如下:

Wireshark dump of the packet