# SECUREAUTH LABS. Copyright 2018 SecureAuth Corporation. All rights reserved.
#
# This software is provided under under a slightly modified version
# of the Apache Software License. See the accompanying LICENSE file
# for more information.
#
# Description:
# Convenience packet unpackers for various network protocols
# implemented in the ImpactPacket module.
#
# Author:
# Javier Burroni (javier)
# Bruce Leidl (brl)
# Aureliano Calvo
import array
from impacket import ICMP6
from impacket import IP6
from impacket import IP6_Extension_Headers
from impacket import ImpactPacket
from impacket import LOG
from impacket import dot11
from impacket import wps, eap, dhcp
from impacket.cdp import CDP
"""Classes to convert from raw packets into a hierarchy of
ImpactPacket derived objects.
The protocol of the outermost layer must be known in advance, and the
packet must be fed to the corresponding decoder. From there it will
try to decode the raw data into a hierarchy of ImpactPacket derived
objects; if a layer's protocol is unknown, all the remaining data will
be wrapped into a ImpactPacket.Data object.
"""
class Decoder:
__decoded_protocol = None
def decode(self, aBuffer):
pass
def set_decoded_protocol(self, protocol):
self.__decoded_protocol = protocol
def get_protocol(self, aprotocol):
protocol = self.__decoded_protocol
while protocol:
if protocol.__class__ == aprotocol:
break
protocol=protocol.child()
return protocol
def __str__(self):
protocol = self.__decoded_protocol
i=0
out=''
while protocol:
tabline=' '*i+'+-'+str(protocol.__class__)
out+="%s"%tabline+'\n'
protocol=protocol.child()
i+=1
return out
class EthDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
e = ImpactPacket.Ethernet(aBuffer)
self.set_decoded_protocol( e )
off = e.get_header_size()
if e.get_ether_type() == ImpactPacket.IP.ethertype:
self.ip_decoder = IPDecoder()
packet = self.ip_decoder.decode(aBuffer[off:])
elif e.get_ether_type() == IP6.IP6.ethertype:
self.ip6_decoder = IP6Decoder()
packet = self.ip6_decoder.decode(aBuffer[off:])
elif e.get_ether_type() == ImpactPacket.ARP.ethertype:
self.arp_decoder = ARPDecoder()
packet = self.arp_decoder.decode(aBuffer[off:])
elif e.get_ether_type() == eap.DOT1X_AUTHENTICATION:
self.eapol_decoder = EAPOLDecoder()
packet = self.eapol_decoder.decode(aBuffer[off:])
# LLC ?
elif e.get_ether_type() < 1500:
self.llc_decoder = LLCDecoder()
packet = self.llc_decoder.decode(aBuffer[off:])
else:
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(aBuffer[off:])
e.contains(packet)
return e
# Linux "cooked" capture encapsulation.
# Used, for instance, for packets returned by the "any" interface.
class LinuxSLLDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
e = ImpactPacket.LinuxSLL(aBuffer)
self.set_decoded_protocol( e )
off = 16
if e.get_ether_type() == ImpactPacket.IP.ethertype:
self.ip_decoder = IPDecoder()
packet = self.ip_decoder.decode(aBuffer[off:])
elif e.get_ether_type() == ImpactPacket.ARP.ethertype:
self.arp_decoder = ARPDecoder()
packet = self.arp_decoder.decode(aBuffer[off:])
elif e.get_ether_type() == eap.DOT1X_AUTHENTICATION:
self.eapol_decoder = EAPOLDecoder()
packet = self.eapol_decoder.decode(aBuffer[off:])
else:
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(aBuffer[off:])
e.contains(packet)
return e
class IPDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
i = ImpactPacket.IP(aBuffer)
self.set_decoded_protocol ( i )
off = i.get_header_size()
end = i.get_ip_len()
# If ip_len == 0 we might be facing TCP segmentation offload, let's calculate the right len
131 ↛ 132line 131 didn't jump to line 132, because the condition on line 131 was never true if end == 0:
LOG.warning('IP len reported as 0, most probably because of TCP segmentation offload. Attempting to fix its size')
i.set_ip_len(len(aBuffer))
end = i.get_ip_len()
136 ↛ 137line 136 didn't jump to line 137, because the condition on line 136 was never true if i.get_ip_p() == ImpactPacket.UDP.protocol:
self.udp_decoder = UDPDecoder()
packet = self.udp_decoder.decode(aBuffer[off:end])
139 ↛ 140line 139 didn't jump to line 140, because the condition on line 139 was never true elif i.get_ip_p() == ImpactPacket.TCP.protocol:
self.tcp_decoder = TCPDecoder()
packet = self.tcp_decoder.decode(aBuffer[off:end])
142 ↛ 145line 142 didn't jump to line 145, because the condition on line 142 was never false elif i.get_ip_p() == ImpactPacket.ICMP.protocol:
self.icmp_decoder = ICMPDecoder()
packet = self.icmp_decoder.decode(aBuffer[off:end])
elif i.get_ip_p() == ImpactPacket.IGMP.protocol:
self.igmp_decoder = IGMPDecoder()
packet = self.igmp_decoder.decode(aBuffer[off:end])
else:
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(aBuffer[off:end])
i.contains(packet)
return i
class IP6MultiProtocolDecoder(Decoder):
def __init__(self, a_protocol_id):
self.protocol_id = a_protocol_id
def decode(self, buffer):
if self.protocol_id == ImpactPacket.UDP.protocol:
self.udp_decoder = UDPDecoder()
packet = self.udp_decoder.decode(buffer)
162 ↛ 163line 162 didn't jump to line 163, because the condition on line 162 was never true elif self.protocol_id == ImpactPacket.TCP.protocol:
self.tcp_decoder = TCPDecoder()
packet = self.tcp_decoder.decode(buffer)
elif self.protocol_id == ICMP6.ICMP6.protocol:
self.icmp6_decoder = ICMP6Decoder()
packet = self.icmp6_decoder.decode(buffer)
else:
# IPv6 Extension Headers lookup
extension_headers = IP6_Extension_Headers.IP6_Extension_Header.get_extension_headers()
if buffer and self.protocol_id in extension_headers:
extension_header_decoder_class = extension_headers[self.protocol_id].get_decoder()
self.extension_header_decoder = extension_header_decoder_class()
packet = self.extension_header_decoder.decode(buffer)
else:
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(buffer)
return packet
class IP6Decoder(Decoder):
def __init__(self):
pass
def decode(self, buffer):
ip6_packet = IP6.IP6(buffer)
self.set_decoded_protocol(ip6_packet)
start_pos = ip6_packet.get_header_size()
end_pos = ip6_packet.get_payload_length() + start_pos
contained_protocol = ip6_packet.get_next_header()
multi_protocol_decoder = IP6MultiProtocolDecoder(contained_protocol)
child_packet = multi_protocol_decoder.decode(buffer[start_pos:end_pos])
ip6_packet.contains(child_packet)
return ip6_packet
class HopByHopDecoder(Decoder):
def __init__(self):
pass
def decode(self, buffer):
hop_by_hop = IP6_Extension_Headers.Hop_By_Hop(buffer)
self.set_decoded_protocol(hop_by_hop)
start_pos = hop_by_hop.get_header_size()
contained_protocol = hop_by_hop.get_next_header()
multi_protocol_decoder = IP6MultiProtocolDecoder(contained_protocol)
child_packet = multi_protocol_decoder.decode(buffer[start_pos:])
hop_by_hop.contains(child_packet)
return hop_by_hop
class DestinationOptionsDecoder(Decoder):
def __init__(self):
pass
def decode(self, buffer):
destination_options = IP6_Extension_Headers.Destination_Options(buffer)
self.set_decoded_protocol(destination_options)
start_pos = destination_options.get_header_size()
contained_protocol = destination_options.get_next_header()
multi_protocol_decoder = IP6MultiProtocolDecoder(contained_protocol)
child_packet = multi_protocol_decoder.decode(buffer[start_pos:])
destination_options.contains(child_packet)
return destination_options
class RoutingOptionsDecoder(Decoder):
def __init__(self):
pass
def decode(self, buffer):
routing_options = IP6_Extension_Headers.Routing_Options(buffer)
self.set_decoded_protocol(routing_options)
start_pos = routing_options.get_header_size()
contained_protocol = routing_options.get_next_header()
multi_protocol_decoder = IP6MultiProtocolDecoder(contained_protocol)
child_packet = multi_protocol_decoder.decode(buffer[start_pos:])
routing_options.contains(child_packet)
return routing_options
class ICMP6Decoder(Decoder):
def __init__(self):
pass
def decode(self, buffer):
icmp6_packet = ICMP6.ICMP6(buffer)
self.set_decoded_protocol(icmp6_packet)
start_pos = icmp6_packet.get_header_size()
self.data_decoder = DataDecoder()
child_packet = self.data_decoder.decode(buffer[start_pos:])
icmp6_packet.contains(child_packet)
return icmp6_packet
class ARPDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
arp = ImpactPacket.ARP(aBuffer)
self.set_decoded_protocol( arp )
off = arp.get_header_size()
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(aBuffer[off:])
arp.contains(packet)
return arp
class UDPDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
u = ImpactPacket.UDP(aBuffer)
self.set_decoded_protocol( u )
off = u.get_header_size()
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(aBuffer[off:])
u.contains(packet)
return u
class TCPDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
t = ImpactPacket.TCP(aBuffer)
self.set_decoded_protocol( t )
off = t.get_header_size()
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(aBuffer[off:])
t.contains(packet)
return t
class IGMPDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
ig = ImpactPacket.IGMP(aBuffer)
off = ig.get_header_size()
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(aBuffer[off:])
ig.contains(packet)
return ig
class IPDecoderForICMP(Decoder):
"""This class was added to parse the IP header of ICMP unreachables packets
If you use the "standard" IPDecoder, it might crash (see bug #4870) ImpactPacket.py
because the TCP header inside the IP header is incomplete"""
def __init__(self):
pass
def decode(self, aBuffer):
i = ImpactPacket.IP(aBuffer)
self.set_decoded_protocol( i )
off = i.get_header_size()
if i.get_ip_p() == ImpactPacket.UDP.protocol:
self.udp_decoder = UDPDecoder()
packet = self.udp_decoder.decode(aBuffer[off:])
else:
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(aBuffer[off:])
i.contains(packet)
return i
class ICMPDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
ic = ImpactPacket.ICMP(aBuffer)
self.set_decoded_protocol( ic )
off = ic.get_header_size()
340 ↛ 341line 340 didn't jump to line 341, because the condition on line 340 was never true if ic.get_icmp_type() == ImpactPacket.ICMP.ICMP_UNREACH:
self.ip_decoder = IPDecoderForICMP()
packet = self.ip_decoder.decode(aBuffer[off:])
else:
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(aBuffer[off:])
ic.contains(packet)
return ic
class DataDecoder(Decoder):
def decode(self, aBuffer):
d = ImpactPacket.Data(aBuffer)
self.set_decoded_protocol( d )
return d
class BaseDot11Decoder(Decoder):
def __init__(self, key_manager=None):
self.set_key_manager(key_manager)
def set_key_manager(self, key_manager):
self.key_manager = key_manager
def find_key(self, bssid):
try:
key = self.key_manager.get_key(bssid)
except:
return False
return key
class RadioTapDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
rt = dot11.RadioTap(aBuffer)
self.set_decoded_protocol( rt )
self.do11_decoder = Dot11Decoder()
self.do11_decoder.set_key_manager(self.key_manager)
flags=rt.get_flags()
380 ↛ 384line 380 didn't jump to line 384, because the condition on line 380 was never false if flags is not None:
fcs=flags&dot11.RadioTap.RTF_FLAGS.PROPERTY_FCS_AT_END
self.do11_decoder.FCS_at_end(fcs)
packet = self.do11_decoder.decode(rt.get_body_as_string())
rt.contains(packet)
return rt
class Dot11Decoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
self.__FCS_at_end = True
def FCS_at_end(self, fcs_at_end=True):
self.__FCS_at_end=not not fcs_at_end
def decode(self, aBuffer):
d = dot11.Dot11(aBuffer, self.__FCS_at_end)
self.set_decoded_protocol( d )
type = d.get_type()
402 ↛ 403line 402 didn't jump to line 403, because the condition on line 402 was never true if type == dot11.Dot11Types.DOT11_TYPE_CONTROL:
dot11_control_decoder = Dot11ControlDecoder()
packet = dot11_control_decoder.decode(d.body_string)
elif type == dot11.Dot11Types.DOT11_TYPE_DATA:
dot11_data_decoder = Dot11DataDecoder(self.key_manager)
dot11_data_decoder.set_dot11_hdr(d)
packet = dot11_data_decoder.decode(d.body_string)
411 ↛ 416line 411 didn't jump to line 416, because the condition on line 411 was never false elif type == dot11.Dot11Types.DOT11_TYPE_MANAGEMENT:
dot11_management_decoder = Dot11ManagementDecoder()
dot11_management_decoder.set_subtype(d.get_subtype())
packet = dot11_management_decoder.decode(d.body_string)
else:
data_decoder = DataDecoder()
packet = data_decoder.decode(d.body_string)
d.contains(packet)
return d
class Dot11ControlDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
self.__FCS_at_end = True
def FCS_at_end(self, fcs_at_end=True):
self.__FCS_at_end=not not fcs_at_end
def decode(self, aBuffer):
d = dot11.Dot11(aBuffer, self.__FCS_at_end)
self.set_decoded_protocol(d)
self.subtype = d.get_subtype()
if self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_CONTROL_CLEAR_TO_SEND:
self.ctrl_cts_decoder = Dot11ControlFrameCTSDecoder()
packet = self.ctrl_cts_decoder.decode(d.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_CONTROL_ACKNOWLEDGMENT:
self.ctrl_ack_decoder = Dot11ControlFrameACKDecoder()
packet = self.ctrl_ack_decoder.decode(d.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_CONTROL_REQUEST_TO_SEND:
self.ctrl_rts_decoder = Dot11ControlFrameRTSDecoder()
packet = self.ctrl_rts_decoder.decode(d.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_CONTROL_POWERSAVE_POLL:
self.ctrl_pspoll_decoder = Dot11ControlFramePSPollDecoder()
packet = self.ctrl_pspoll_decoder.decode(d.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_CONTROL_CF_END:
self.ctrl_cfend_decoder = Dot11ControlFrameCFEndDecoder()
packet = self.ctrl_cfend_decoder.decode(d.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_CONTROL_CF_END_CF_ACK:
self.ctrl_cfendcfack_decoder = Dot11ControlFrameCFEndCFACKDecoder()
packet = self.ctrl_cfendcfack_decoder.decode(d.body_string)
else:
data_decoder = DataDecoder()
packet = data_decoder.decode(d.body_string)
d.contains(packet)
return d
class Dot11ControlFrameCTSDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ControlFrameCTS(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11ControlFrameACKDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ControlFrameACK(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11ControlFrameRTSDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ControlFrameRTS(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11ControlFramePSPollDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ControlFramePSPoll(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11ControlFrameCFEndDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ControlFrameCFEnd(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11ControlFrameCFEndCFACKDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ControlFrameCFEndCFACK(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11DataDecoder(BaseDot11Decoder):
def __init__(self, key_manager):
BaseDot11Decoder.__init__(self, key_manager)
def set_dot11_hdr(self, dot11_obj):
self.dot11 = dot11_obj
def decode(self, aBuffer):
521 ↛ 522line 521 didn't jump to line 522, because the condition on line 521 was never true if self.dot11.get_fromDS() and self.dot11.get_toDS():
if self.dot11.is_QoS_frame():
p = dot11.Dot11DataAddr4QoSFrame(aBuffer)
else:
p = dot11.Dot11DataAddr4Frame(aBuffer)
526 ↛ 527line 526 didn't jump to line 527, because the condition on line 526 was never true elif self.dot11.is_QoS_frame():
p = dot11.Dot11DataQoSFrame(aBuffer)
else:
p = dot11.Dot11DataFrame(aBuffer)
self.set_decoded_protocol( p )
if not self.dot11.get_protectedFrame():
self.llc_decoder = LLCDecoder()
packet = self.llc_decoder.decode(p.body_string)
else:
536 ↛ 538line 536 didn't jump to line 538, because the condition on line 536 was never false if not self.dot11.get_fromDS() and self.dot11.get_toDS():
bssid = p.get_address1()
elif self.dot11.get_fromDS() and not self.dot11.get_toDS():
bssid = p.get_address2()
elif not self.dot11.get_fromDS() and not self.dot11.get_toDS():
bssid = p.get_address3()
else:
# WDS, this is the RA
bssid = p.get_address1()
wep_decoder = Dot11WEPDecoder(self.key_manager)
wep_decoder.set_bssid(bssid)
packet = wep_decoder.decode(p.body_string)
549 ↛ 550line 549 didn't jump to line 550, because the condition on line 549 was never true if packet is None:
wpa_decoder = Dot11WPADecoder()
packet = wpa_decoder.decode(p.body_string)
if packet is None:
wpa2_decoder = Dot11WPA2Decoder()
packet = wpa2_decoder.decode(p.body_string)
if packet is None:
data_decoder = DataDecoder()
packet = data_decoder.decode(p.body_string)
p.contains(packet)
return p
class Dot11WEPDecoder(BaseDot11Decoder):
def __init__(self, key_manager):
BaseDot11Decoder.__init__(self, key_manager)
self.bssid = None
def set_bssid(self, bssid):
self.bssid = bssid
def decode(self, aBuffer):
wep = dot11.Dot11WEP(aBuffer)
self.set_decoded_protocol( wep )
574 ↛ 575line 574 didn't jump to line 575, because the condition on line 574 was never true if wep.is_WEP() is False:
return None
key = self.find_key(self.bssid)
if key:
decoded_string=wep.get_decrypted_data(key)
wep_data = Dot11WEPDataDecoder()
packet = wep_data.decode(decoded_string)
else:
data_decoder = DataDecoder()
packet = data_decoder.decode(wep.body_string)
wep.contains(packet)
return wep
class Dot11WEPDataDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
wep_data = dot11.Dot11WEPData(aBuffer)
if not wep_data.check_icv():
# TODO: Do something when the icv is not correct
pass
self.set_decoded_protocol( wep_data )
llc_decoder = LLCDecoder()
packet = llc_decoder.decode(wep_data.body_string)
wep_data.contains(packet)
return wep_data
class Dot11WPADecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer, key=None):
wpa = dot11.Dot11WPA(aBuffer)
self.set_decoded_protocol( wpa )
if wpa.is_WPA() is False:
return None
if key:
decoded_string=wpa.get_decrypted_data()
wpa_data = Dot11WPADataDecoder()
packet = wpa_data.decode(decoded_string)
else:
data_decoder = DataDecoder()
packet = data_decoder.decode(wpa.body_string)
wpa.contains(packet)
return wpa
class Dot11WPADataDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
wpa_data = dot11.Dot11WPAData(aBuffer)
self.set_decoded_protocol( wpa_data )
llc_decoder = LLCDecoder()
packet = self.llc_decoder.decode(wpa_data.body_string)
wpa_data.contains(packet)
return wpa_data
class Dot11WPA2Decoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer, key=None):
wpa2 = dot11.Dot11WPA2(aBuffer)
self.set_decoded_protocol( wpa2 )
if wpa2.is_WPA2() is False:
return None
if key:
decoded_string=wpa2.get_decrypted_data()
wpa2_data = Dot11WPA2DataDecoder()
packet = wpa2_data.decode(decoded_string)
else:
data_decoder = DataDecoder()
packet = data_decoder.decode(wpa2.body_string)
wpa2.contains(packet)
return wpa2
class Dot11WPA2DataDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
wpa2_data = dot11.Dot11WPA2Data(aBuffer)
self.set_decoded_protocol( wpa2_data )
llc_decoder = LLCDecoder()
packet = self.llc_decoder.decode(wpa2_data.body_string)
wpa2_data.contains(packet)
return wpa2_data
class LLCDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
d = dot11.LLC(aBuffer)
self.set_decoded_protocol( d )
698 ↛ 707line 698 didn't jump to line 707, because the condition on line 698 was never false if d.get_DSAP()==dot11.SAPTypes.SNAP:
699 ↛ 707line 699 didn't jump to line 707, because the condition on line 699 was never false if d.get_SSAP()==dot11.SAPTypes.SNAP:
700 ↛ 707line 700 didn't jump to line 707, because the condition on line 700 was never false if d.get_control()==dot11.LLC.DLC_UNNUMBERED_FRAMES:
snap_decoder = SNAPDecoder()
packet = snap_decoder.decode(d.body_string)
d.contains(packet)
return d
# Only SNAP is implemented
data_decoder = DataDecoder()
packet = data_decoder.decode(d.body_string)
d.contains(packet)
return d
class SNAPDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
s = dot11.SNAP(aBuffer)
self.set_decoded_protocol( s )
719 ↛ 720line 719 didn't jump to line 720, because the condition on line 719 was never true if s.get_OUI()==CDP.OUI and s.get_protoID()==CDP.Type:
dec = CDPDecoder()
packet = dec.decode(s.body_string)
722 ↛ 724line 722 didn't jump to line 724, because the condition on line 722 was never true elif s.get_OUI()!=0x000000:
# We don't know how to handle other than OUI=0x000000 (EtherType)
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(s.body_string)
elif s.get_protoID() == ImpactPacket.IP.ethertype:
self.ip_decoder = IPDecoder()
packet = self.ip_decoder.decode(s.body_string)
729 ↛ 732line 729 didn't jump to line 732, because the condition on line 729 was never false elif s.get_protoID() == ImpactPacket.ARP.ethertype:
self.arp_decoder = ARPDecoder()
packet = self.arp_decoder.decode(s.body_string)
elif s.get_protoID() == eap.DOT1X_AUTHENTICATION:
self.eapol_decoder = EAPOLDecoder()
packet = self.eapol_decoder.decode(s.body_string)
else:
self.data_decoder = DataDecoder()
packet = self.data_decoder.decode(s.body_string)
s.contains(packet)
return s
class CDPDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
s = CDP(aBuffer)
self.set_decoded_protocol( s )
return s
class Dot11ManagementDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
self.subtype = None
def set_subtype(self, subtype):
self.subtype=subtype
def decode(self, aBuffer):
p = dot11.Dot11ManagementFrame(aBuffer)
self.set_decoded_protocol( p )
if self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_BEACON:
self.mgt_beacon_decoder = Dot11ManagementBeaconDecoder()
packet = self.mgt_beacon_decoder.decode(p.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_PROBE_REQUEST:
self.mgt_probe_request_decoder = Dot11ManagementProbeRequestDecoder()
packet = self.mgt_probe_request_decoder.decode(p.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_PROBE_RESPONSE:
self.mgt_probe_response_decoder = Dot11ManagementProbeResponseDecoder()
packet = self.mgt_probe_response_decoder.decode(p.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_DEAUTHENTICATION:
self.mgt_deauthentication_decoder = Dot11ManagementDeauthenticationDecoder()
packet = self.mgt_deauthentication_decoder.decode(p.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_AUTHENTICATION:
self.mgt_Authentication_decoder = Dot11ManagementAuthenticationDecoder()
packet = self.mgt_Authentication_decoder.decode(p.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_DISASSOCIATION:
self.mgt_disassociation_decoder = Dot11ManagementDisassociationDecoder()
packet = self.mgt_disassociation_decoder.decode(p.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_ASSOCIATION_REQUEST:
self.mgt_association_request_decoder = Dot11ManagementAssociationRequestDecoder()
packet = self.mgt_association_request_decoder.decode(p.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_ASSOCIATION_RESPONSE:
self.mgt_association_response_decoder = Dot11ManagementAssociationResponseDecoder()
packet = self.mgt_association_response_decoder.decode(p.body_string)
elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_REASSOCIATION_REQUEST:
self.mgt_reassociation_request_decoder = Dot11ManagementReassociationRequestDecoder()
packet = self.mgt_reassociation_request_decoder.decode(p.body_string)
791 ↛ 795line 791 didn't jump to line 795, because the condition on line 791 was never false elif self.subtype is dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_REASSOCIATION_RESPONSE:
self.mgt_reassociation_response_decoder = Dot11ManagementReassociationResponseDecoder()
packet = self.mgt_reassociation_response_decoder.decode(p.body_string)
else:
data_decoder = DataDecoder()
packet = data_decoder.decode(p.body_string)
p.contains(packet)
return p
class Dot11ManagementBeaconDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ManagementBeacon(aBuffer)
self.set_decoded_protocol( p )
return p
class Dot11ManagementProbeRequestDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ManagementProbeRequest(aBuffer)
self.set_decoded_protocol( p )
return p
class Dot11ManagementProbeResponseDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ManagementProbeResponse(aBuffer)
self.set_decoded_protocol( p )
return p
class Dot11ManagementDeauthenticationDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ManagementDeauthentication(aBuffer)
self.set_decoded_protocol( p )
return p
class Dot11ManagementAuthenticationDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ManagementAuthentication(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11ManagementDisassociationDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ManagementDisassociation(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11ManagementAssociationRequestDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ManagementAssociationRequest(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11ManagementAssociationResponseDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ManagementAssociationResponse(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11ManagementReassociationRequestDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ManagementReassociationRequest(aBuffer)
self.set_decoded_protocol(p)
return p
class Dot11ManagementReassociationResponseDecoder(BaseDot11Decoder):
def __init__(self):
BaseDot11Decoder.__init__(self)
def decode(self, aBuffer):
p = dot11.Dot11ManagementReassociationResponse(aBuffer)
self.set_decoded_protocol(p)
return p
class BaseDecoder(Decoder):
def decode(self, buff):
packet = self.klass(buff)
self.set_decoded_protocol(packet)
cd = self.child_decoders.get(self.child_key(packet), DataDecoder())
packet.contains(cd.decode(packet.get_body_as_string()))
return packet
class SimpleConfigDecoder(BaseDecoder):
child_decoders = {}
klass = wps.SimpleConfig
915 ↛ exitline 915 didn't run the lambda on line 915 child_key = lambda s,p: None
def decode(self, buff):
sc = BaseDecoder.decode(self, buff)
ary = array.array('B', sc.child().get_packet())
sc.unlink_child()
tlv = wps.SimpleConfig.build_tlv_container()
tlv.from_ary(ary)
sc.contains(tlv)
return sc
class EAPExpandedDecoder(BaseDecoder):
child_decoders = {
(eap.EAPExpanded.WFA_SMI, eap.EAPExpanded.SIMPLE_CONFIG): SimpleConfigDecoder(),
}
klass = eap.EAPExpanded
932 ↛ exitline 932 didn't run the lambda on line 932 child_key = lambda s,p: (p.get_vendor_id(), p.get_vendor_type())
class EAPRDecoder(BaseDecoder):
child_decoders = {
eap.EAPR.EXPANDED:EAPExpandedDecoder()
}
klass = eap.EAPR
939 ↛ exitline 939 didn't run the lambda on line 939 child_key = lambda s, p: p.get_type()
class EAPDecoder(BaseDecoder):
child_decoders = {
eap.EAP.REQUEST: EAPRDecoder(),
eap.EAP.RESPONSE: EAPRDecoder(),
}
klass = eap.EAP
947 ↛ exitline 947 didn't run the lambda on line 947 child_key = lambda s, p: p.get_code()
class EAPOLDecoder(BaseDecoder):
child_decoders = {
eap.EAPOL.EAP_PACKET: EAPDecoder()
}
klass = eap.EAPOL
954 ↛ exitline 954 didn't run the lambda on line 954 child_key = lambda s, p: p.get_packet_type()
class BootpDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
d = dhcp.BootpPacket(aBuffer)
self.set_decoded_protocol( d )
off = len(d.getData())
if dhcp.DhcpPacket(aBuffer[off:])['cookie'] == dhcp.DhcpPacket.MAGIC_NUMBER:
self.data_decoder = DHCPDecoder()
packet = self.data_decoder.decode(aBuffer[off:])
d.contains(packet)
return d
class DHCPDecoder(Decoder):
def __init__(self):
pass
def decode(self, aBuffer):
d = dhcp.DhcpPacket(aBuffer)
self.set_decoded_protocol( d )
return d
|