From b8ccb3f36b64e7949a0760b882e3030567b7bcc3 Mon Sep 17 00:00:00 2001 From: Guillaume Valadon Date: Fri, 16 Feb 2018 14:06:24 +0100 Subject: [PATCH 1/3] Typo fixed --- scapy/layers/inet6.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py index 6a697b49d..7d20dfea7 100644 --- a/scapy/layers/inet6.py +++ b/scapy/layers/inet6.py @@ -733,7 +733,7 @@ def in6_chksum(nh, u, p): # Inherited by all extension header classes class _IPv6ExtHdr(_IPv6GuessPayload, Packet): - name = 'Abstract IPV6 Option Header' + name = 'Abstract IPv6 Option Header' aliastypes = [IPv6, IPerror6] # TODO ... From d1bc4baa2d6e23ee4c39c2b755d95123688fa64c Mon Sep 17 00:00:00 2001 From: Guillaume Valadon Date: Fri, 16 Feb 2018 14:17:10 +0100 Subject: [PATCH 2/3] The relayed message can be any kind of DHCP6 packet --- scapy/layers/dhcp6.py | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/scapy/layers/dhcp6.py b/scapy/layers/dhcp6.py index fa58ccc89..88e653413 100644 --- a/scapy/layers/dhcp6.py +++ b/scapy/layers/dhcp6.py @@ -41,6 +41,25 @@ from scapy.utils6 import in6_addrtovendor, in6_islladdr def get_cls(name, fallback_cls): return globals().get(name, fallback_cls) +dhcp6_cls_by_type = { 1: "DHCP6_Solicit", + 2: "DHCP6_Advertise", + 3: "DHCP6_Request", + 4: "DHCP6_Confirm", + 5: "DHCP6_Renew", + 6: "DHCP6_Rebind", + 7: "DHCP6_Reply", + 8: "DHCP6_Release", + 9: "DHCP6_Decline", + 10: "DHCP6_Reconf", + 11: "DHCP6_InfoRequest", + 12: "DHCP6_RelayForward", + 13: "DHCP6_RelayReply" } + +def _dhcp6_dispatcher(x, *args, **kargs): + cls = conf.raw_layer + if len(x) >= 2: + cls = get_cls(dhcp6_cls_by_type.get(orb(x[0]), "Raw"), conf.raw_layer) + return cls(x, *args, **kargs) ############################################################################# ############################################################################# @@ -906,7 +925,7 @@ class DHCP6OptRelayMsg(_DHCP6OptGuessPayload): # RFC sect 22.10 fields_desc = [ ShortEnumField("optcode", 9, dhcp6opts), FieldLenField("optlen", None, fmt="!H", length_of="message"), - PacketLenField("message", DHCP6(), DHCP6, + PacketLenField("message", DHCP6(), _dhcp6_dispatcher, length_from=lambda p: p.optlen) ] ##################################################################### @@ -1170,26 +1189,6 @@ class DHCP6_RelayReply(DHCP6_RelayForward): self.peeraddr == other.peeraddr ) -dhcp6_cls_by_type = { 1: "DHCP6_Solicit", - 2: "DHCP6_Advertise", - 3: "DHCP6_Request", - 4: "DHCP6_Confirm", - 5: "DHCP6_Renew", - 6: "DHCP6_Rebind", - 7: "DHCP6_Reply", - 8: "DHCP6_Release", - 9: "DHCP6_Decline", - 10: "DHCP6_Reconf", - 11: "DHCP6_InfoRequest", - 12: "DHCP6_RelayForward", - 13: "DHCP6_RelayReply" } - -def _dhcp6_dispatcher(x, *args, **kargs): - cls = conf.raw_layer - if len(x) >= 2: - cls = get_cls(dhcp6_cls_by_type.get(orb(x[0]), "Raw"), conf.raw_layer) - return cls(x, *args, **kargs) - bind_bottom_up(UDP, _dhcp6_dispatcher, { "dport": 547 } ) bind_bottom_up(UDP, _dhcp6_dispatcher, { "dport": 546 } ) From 317b0ef93badb3ed66c2f76a36b31cdfe1f03b3d Mon Sep 17 00:00:00 2001 From: Guillaume Valadon Date: Fri, 16 Feb 2018 14:42:39 +0100 Subject: [PATCH 3/3] DHCP6OptRelayMsg unit tests --- test/regression.uts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/test/regression.uts b/test/regression.uts index 968ae5a17..fc6ef0eb2 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -4716,8 +4716,13 @@ a=DHCP6_RelayForward(b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ a.msgtype == 12 and a.hopcount == 0 and a.linkaddr == "::" and a.peeraddr == "::" = DHCP6_RelayForward - Dissection with options -a = DHCP6_RelayForward(b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x04\x00\x01\x00\x00') -a.msgtype == 12 and DHCP6OptRelayMsg in a and isinstance(a.message, DHCP6) +a = DHCP6_RelayForward(b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x04\x03\x01\x00\x00') +a.msgtype == 12 and DHCP6OptRelayMsg in a and isinstance(a.message, DHCP6_Request) + += DHCP6_RelayForward - Advanced dissection +s = b'`\x00\x00\x00\x002\x11@\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x02#\x02#\x002\xf0\xaf\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x04\x01\x00\x00\x00' +p = IPv6(s) +assert DHCP6OptRelayMsg in p and isinstance(p.message, DHCP6_Solicit) ############ @@ -4732,8 +4737,8 @@ a=DHCP6OptRelayMsg(b'\x00\r\x00\x00') assert a.optcode == 13 = DHCP6OptRelayMsg - Embedded DHCP6 packet -p = DHCP6OptRelayMsg(b'\x00\t\x00\x04\x00\x00\x00\x00') -isinstance(p.message, DHCP6) +p = DHCP6OptRelayMsg(b'\x00\t\x00\x04\x01\x00\x00\x00') +isinstance(p.message, DHCP6_Solicit) ############ ############