1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
#!/usr/bin/env python
# Impacket - Collection of Python classes for working with network protocols.
#
# Copyright Fortra, LLC and its affiliated companies
#
# All rights reserved.
#
# This software is provided under a slightly modified version
# of the Apache Software License. See the accompanying LICENSE file
# for more information.
#
import unittest
from binascii import unhexlify
import impacket.dot11
import impacket.ImpactPacket
from impacket.Dot11KeyManager import KeyManager
class TestDot11WEPData(unittest.TestCase):
def setUp(self):
self.dot11 = impacket.dot11.Dot11(FCS_at_end = False)
# dot11.fc
self.dot11.set_version(0)
self.dot11.set_type_n_subtype(impacket.dot11.Dot11Types.DOT11_TYPE_DATA_SUBTYPE_DATA)
# dot11.fc.flags
self.dot11.set_fromDS(0)
self.dot11.set_toDS(1)
self.dot11.set_moreFrag(0)
self.dot11.set_retry(0)
self.dot11.set_powerManagement(0)
self.dot11.set_moreData(0)
self.dot11.set_protectedFrame(1)
self.dot11.set_order(0)
# dot11.Data
self.dot11data = impacket.dot11.Dot11DataFrame()
self.dot11data.set_duration(44)
self.dot11data.set_address1([0x00,0x21,0x29,0x68,0x33,0x5d]) # Bssid
self.dot11data.set_address2([0x00,0x18,0xde,0x7c,0x37,0x9f]) # Source
self.dot11data.set_address3([0x00,0x21,0x29,0x68,0x33,0x5d]) # Destination
self.dot11data.set_fragment_number(0)
self.dot11data.set_sequence_number(3439)
# WEP
self.wep = impacket.dot11.Dot11WEP()
self.wep.set_iv(0x0c3165)
self.wep.set_keyid(0)
# WEPData
self.wepdata = impacket.dot11.Dot11WEPData()
# LLC
self.llc = impacket.dot11.LLC()
self.llc.set_DSAP(0xaa)
self.llc.set_SSAP(0xaa)
self.llc.set_control(0x03)
# SNAP
self.snap = impacket.dot11.SNAP()
self.snap.set_OUI(0x000000)
self.snap.set_protoID(0x0800)
# IP
self.ip = impacket.ImpactPacket.IP()
self.ip.set_ip_v(0x04)
self.ip.set_ip_tos(0x00)
self.ip.set_ip_id(0xa607)
# IP.flags
self.ip.set_ip_rf(0)
self.ip.set_ip_df(0)
self.ip.set_ip_mf(0)
#
self.ip.set_ip_off(0)
self.ip.set_ip_ttl(128)
self.ip.set_ip_p(0x01) # ICMP
self.ip.set_ip_src('192.168.1.102')
self.ip.set_ip_dst('64.233.163.103')
# ICMP
self.icmp = impacket.ImpactPacket.ICMP()
self.icmp.set_icmp_type(self.icmp.ICMP_ECHO)
self.icmp.set_icmp_code(0x00)
self.icmp.set_icmp_id(0x0400)
self.icmp.set_icmp_seq(0x8405)
# Data
datastring = b'abcdefghijklmnopqrstuvwabcdefghi'
self.data = impacket.ImpactPacket.Data( datastring )
# Build the protocol stack
self.dot11.contains(self.dot11data)
self.dot11data.contains(self.wep)
self.wep.contains(self.wepdata)
self.wepdata.contains(self.llc)
self.llc.contains(self.snap)
self.snap.contains(self.ip)
self.ip.contains(self.icmp)
self.icmp.contains(self.data)
# Instantiated the Key Manager
self.km=KeyManager()
self.km.add_key([0x00,0x21,0x29,0x68,0x33,0x5b],unhexlify('999cbb701ca2ef030e302dcc35'))
def test_02(self):
'Test ICV methods'
self.assertEqual(self.wepdata.get_icv(),0x00000000)
self.assertEqual(self.wepdata.get_computed_icv(),0xA1F93985)
self.wepdata.set_icv(0xA1F93985)
self.assertEqual(self.wepdata.get_icv(), self.wepdata.get_computed_icv())
self.wepdata.set_icv(0x01020304)
self.assertEqual(self.wepdata.get_icv(),0x01020304)
def test_03(self):
'Test WEPData creation from scratch with encryption'
#print "\nWEP Data Decrypted [%s]"%hexlify(self.wepdata.get_packet())
self.wepdata.set_icv(0xA1F93985)
wep_enc=self.wep.get_encrypted_data(unhexlify('999cbb701ca2ef030e302dcc35'))
#print "\nWEP Data Encrypted [%s]"%hexlify(wep_enc)
self.assertEqual(wep_enc,unhexlify('8d2381e9251cb5aa83d2c716ba6ee18e7d3a2c71c00f6ab82fbc54c4b014ab03115edeccab2b18ebeb250f75eb6bf57fd65cb9e1b26e50ba4bb48b9f3471da9ecf12cb8f361b0253'))
#print "\nDot11 decrypted [%s]"%hexlify(self.dot11.get_packet())
self.wep.encrypt_frame(unhexlify('999cbb701ca2ef030e302dcc35'))
#print "\nDot11 encrypted [%s]"%hexlify(self.dot11.get_packet())
if __name__ == '__main__':
unittest.main(verbosity=1)
|