github.com/n00py/Slackor@v0.0.0-20200610224921-d007fcea1740/impacket/tests/dot11/test_WEPDecoder.py (about)

     1  #!/usr/bin/env python
     2  # sorry, this is very ugly, but I'm in python 2.5
     3  import sys
     4  sys.path.insert(0,"../..")
     5  
     6  from impacket.dot11 import Dot11,Dot11Types,Dot11DataFrame,Dot11WEP,Dot11WEPData
     7  from impacket.ImpactPacket import IP,ICMP
     8  from impacket.Dot11KeyManager import KeyManager
     9  from impacket.ImpactDecoder import Dot11Decoder
    10  from binascii import unhexlify
    11  import unittest
    12  from six import PY2
    13  
    14  class TestDot11WEPData(unittest.TestCase):
    15  
    16      def setUp(self):
    17          # 802.11 Data Frame
    18          #
    19          self.dot11frame = b'\x08\x41\x2c\x00\x00\x21\x29\x68\x33\x5d\x00\x18\xde\x7c\x37\x9f\x00\x21\x29\x68\x33\x5b\xf0\xd6\x0c\x31\x65\x00\x8d\x23\x81\xe9\x25\x1c\xb5\xaa\x83\xd2\xc7\x16\xba\x6e\xe1\x8e\x7d\x3a\x2c\x71\xc0\x0f\x6a\xb8\x2f\xbc\x54\xc4\xb0\x14\xab\x03\x11\x5e\xde\xcc\xab\x2b\x18\xeb\xeb\x25\x0f\x75\xeb\x6b\xf5\x7f\xd6\x5c\xb9\xe1\xb2\x6e\x50\xba\x4b\xb4\x8b\x9f\x34\x71\xda\x9e\xcf\x12\xcb\x8f\x36\x1b\x02\x53'
    20          
    21          d = Dot11(self.dot11frame, FCS_at_end = False)
    22          
    23          self.assertEqual(d.get_type(),Dot11Types.DOT11_TYPE_DATA)
    24          self.assertEqual(d.get_subtype(),Dot11Types.DOT11_SUBTYPE_DATA)
    25          self.assertEqual(d.get_type_n_subtype(),Dot11Types.DOT11_TYPE_DATA_SUBTYPE_DATA)
    26          
    27          data = Dot11DataFrame(d.get_body_as_string())
    28          d.contains(data)
    29          
    30          self.wep_header = Dot11WEP(data.body_string)
    31          data.contains(self.wep_header)
    32          
    33          self.wep_data = Dot11WEPData(self.wep_header.body_string)
    34          self.wep_header.contains(self.wep_data)
    35          
    36          self.km=KeyManager()
    37          self.km.add_key([0x00,0x21,0x29,0x68,0x33,0x5d],unhexlify(b'999cbb701ca2ef030e302dcc35'))
    38          
    39      def test_01(self):
    40          'Test WEPHeader is_WEP method'
    41          self.assertEqual(self.wep_header.is_WEP(), True)
    42      
    43      def test_02(self):
    44          'Test Packet Hierarchy'
    45          dot11_decoder = Dot11Decoder()
    46          dot11_decoder.FCS_at_end(False)
    47          dot11_decoder.set_key_manager(self.km)
    48          in0=dot11_decoder.decode(self.dot11frame)
    49          if PY2:
    50              self.assertEqual(str(in0.__class__), "impacket.dot11.Dot11")
    51          else:
    52              self.assertEqual(str(in0.__class__), "<class 'impacket.dot11.Dot11'>")
    53          in1=in0.child()
    54          if PY2:
    55              self.assertEqual(str(in1.__class__), "impacket.dot11.Dot11DataFrame")
    56          else:
    57              self.assertEqual(str(in1.__class__), "<class 'impacket.dot11.Dot11DataFrame'>")
    58          in2=in1.child()
    59          if PY2:
    60              self.assertEqual(str(in2.__class__), "impacket.dot11.Dot11WEP")
    61          else:
    62              self.assertEqual(str(in2.__class__), "<class 'impacket.dot11.Dot11WEP'>")
    63          in3=in2.child()
    64          if PY2:
    65              self.assertEqual(str(in3.__class__), "impacket.dot11.Dot11WEPData")
    66          else:
    67              self.assertEqual(str(in3.__class__), "<class 'impacket.dot11.Dot11WEPData'>")
    68          in4=in3.child()
    69          if PY2:
    70              self.assertEqual(str(in4.__class__), "impacket.dot11.LLC")
    71          else:
    72              self.assertEqual(str(in4.__class__), "<class 'impacket.dot11.LLC'>")
    73          in5=in4.child()
    74          if PY2:
    75              self.assertEqual(str(in5.__class__), "impacket.dot11.SNAP")
    76          else:
    77              self.assertEqual(str(in5.__class__), "<class 'impacket.dot11.SNAP'>")
    78          in6=in5.child()
    79          #self.assertEqual(str(in6.__class__), "ImpactPacket.IP")
    80          in7=in6.child()
    81          #self.assertEqual(str(in7.__class__), "ImpactPacket.ICMP")
    82          in8=in7.child()
    83          #self.assertEqual(str(in8.__class__), "ImpactPacket.Data")
    84          self.assertEqual(in8.get_packet(),b'abcdefghijklmnopqrstuvwabcdefghi')
    85          
    86      def test_03(self):
    87          'Test WEPHeader IV getter and setter methods'
    88          self.assertEqual(self.wep_header.get_iv(), 0x0c3165)
    89          
    90          self.wep_header.set_iv(0x1e0501) # Es de 24 bit
    91          self.assertEqual(self.wep_header.get_iv(), 0x1e0501)
    92  
    93      def test_04(self):
    94          'Test WEPHeader keyID getter and setter methods'
    95          self.assertEqual(self.wep_header.get_keyid(), 0x00)
    96          
    97          self.wep_header.set_iv(0x03) # Es de 2 bits
    98          self.assertEqual(self.wep_header.get_iv(), 0x03)
    99      
   100      def test_05(self):
   101          'Test WEPData ICV getter and setter methods'
   102          
   103          dot11_decoder = Dot11Decoder()
   104          dot11_decoder.FCS_at_end(False)
   105          dot11_decoder.set_key_manager(self.km)
   106          dot11_decoder.decode(self.dot11frame)
   107          wepdata = dot11_decoder.get_protocol(Dot11WEPData)
   108  
   109          # The encrypted ICV is 0x361b0253, but it not the real,
   110          # we need decrypt it. The decrypted and real ICV is 0xA1F93985
   111          
   112          self.assertEqual(wepdata.get_icv(),0xA1F93985)
   113          
   114          self.assertEqual(wepdata.get_computed_icv(),0xA1F93985)
   115          
   116          self.assertEqual(wepdata.get_icv(), wepdata.get_computed_icv())
   117          
   118          wepdata.set_icv(0x11223344)
   119          self.assertEqual(wepdata.get_icv(), 0x11223344)
   120          
   121      def test_06(self):
   122          'Test WEPData body decryption'
   123          dot11_decoder = Dot11Decoder()
   124          dot11_decoder.FCS_at_end(False)
   125          dot11_decoder.set_key_manager(self.km)
   126          dot11_decoder.decode(self.dot11frame)
   127          wep = dot11_decoder.get_protocol(Dot11WEP)
   128          wepdata = dot11_decoder.get_protocol(Dot11WEPData)
   129          decrypted = b'\xaa\xaa\x03\x00\x00\x00\x08\x00\x45\x00\x00\x3c\xa6\x07\x00\x00\x80\x01\xee\x5a\xc0\xa8\x01\x66\x40\xe9\xa3\x67\x08\x00\xc5\x56\x04\x00\x84\x05\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x61\x62\x63\x64\x65\x66\x67\x68\x69\xa1\xf9\x39\x85'
   130          self.assertEqual(wepdata.get_packet(), decrypted)
   131          self.assertEqual(wepdata.check_icv(), True)
   132          
   133          ip = dot11_decoder.get_protocol(IP)
   134          self.assertEqual(ip.get_ip_src(),'192.168.1.102')
   135          self.assertEqual(ip.get_ip_dst(),'64.233.163.103')
   136          
   137          icmp = dot11_decoder.get_protocol(ICMP)
   138          self.assertEqual(icmp.get_icmp_type(),icmp.ICMP_ECHO)
   139          self.assertEqual(icmp.get_icmp_id(),0x0400)
   140  
   141  suite = unittest.TestLoader().loadTestsFromTestCase(TestDot11WEPData)
   142  unittest.TextTestRunner(verbosity=1).run(suite)