github.com/n00py/Slackor@v0.0.0-20200610224921-d007fcea1740/impacket/tests/SMB_RPC/test_ntlm.py (about) 1 from __future__ import print_function 2 import unittest 3 import struct 4 5 from six import b 6 from impacket import ntlm 7 from impacket.structure import hexdump 8 9 # Common values 10 11 class NTLMTests(unittest.TestCase): 12 def setUp(self): 13 # Turn test case mode on 14 ntlm.TEST_CASE = True 15 self.user = "User" 16 self.domain = "Domain" 17 self.password = "Password" 18 self.serverName = "Server" 19 self.workstationName = "COMPUTER" 20 self.randomSessionKey = b("U"*16) 21 self.time = b('\x00'*8) 22 self.clientChallenge = b("\xaa"*8) 23 self.serverChallenge = b("\x01\x23\x45\x67\x89\xab\xcd\xef") 24 self.flags = ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH | ntlm.NTLMSSP_NEGOTIATE_56 | ntlm.NTLMSSP_NEGOTIATE_128 | ntlm.NTLMSSP_NEGOTIATE_VERSION | ntlm.NTLMSSP_TARGET_TYPE_SERVER | ntlm.NTLMSSP_NEGOTIATE_ALWAYS_SIGN | ntlm.NTLMSSP_NEGOTIATE_NTLM | ntlm.NTLMSSP_NEGOTIATE_SEAL | ntlm.NTLMSSP_NEGOTIATE_SIGN | ntlm.NTLM_NEGOTIATE_OEM | ntlm.NTLMSSP_NEGOTIATE_UNICODE 25 self.seqNum = 0 26 self.nonce = b('\x00'*16) 27 self.plaintext = 'Plaintext'.encode('utf-16le') 28 29 print("## BEFORE RUNNING THESE TESTS") 30 print("Don't forget to set up aTime = '\\x00'*8 in computeResponseNTLMv2 otherwise the results won't be right. ") 31 print("Look for that in ntlm.py and uncomment the lines, comment the other ones and don't forget to revert everything back whenever finished testing") 32 print("Flags") 33 hexdump(struct.pack('<L',self.flags)) 34 35 def test_ntlmv1(self): 36 print("####### 4.2.2 NTLMv1 Authentication") 37 ntlm.USE_NTLMv2 = False 38 print("4.2.2.1 LMOWFv1()") 39 res = ntlm.LMOWFv1(self.password) 40 hexdump(res) 41 self.assertTrue(res==bytearray(b'\xe5,\xacgA\x9a\x9a"J;\x10\x8f?\xa6\xcbm')) 42 print("\n") 43 print("4.2.2.1.2 NTOWFv1()") 44 res = ntlm.NTOWFv1(self.password) 45 hexdump(res) 46 self.assertTrue(res==bytearray(b'\xa4\xf4\x9c\x40\x65\x10\xbd\xca\xb6\x82\x4e\xe7\xc3\x0f\xd8\x52')) 47 print("\n") 48 print("4.2.2.1.3 Session Base Key and Key Exchange Key") 49 ntResponse, lmResponse, sessionBaseKey = ntlm.computeResponseNTLMv1(int(self.flags), self.serverChallenge, 50 self.clientChallenge, self.serverName, 51 self.domain, self.user, self.password, '', '') 52 hexdump(sessionBaseKey) 53 self.assertTrue(sessionBaseKey==bytearray(b'\xD8\x72\x62\xB0\xCD\xE4\xB1\xCB\x74\x99\xBE\xCC\xCD\xF1\x07\x84')) 54 print("\n") 55 print("4.2.2.2.1 NTLMv1 Response") 56 hexdump(ntResponse) 57 self.assertTrue(ntResponse==bytearray(b'\x67\xC4\x30\x11\xF3\x02\x98\xA2\xAD\x35\xEC\xE6\x4F\x16\x33\x1C\x44\xBD\xBE\xD9\x27\x84\x1F\x94')) 58 print("\n") 59 print("4.2.2.2.2 LMv1 Response") 60 hexdump(lmResponse) 61 self.assertTrue(lmResponse==bytearray(b'\x98\xDE\xF7\xB8\x7F\x88\xAA\x5D\xAF\xE2\xDF\x77\x96\x88\xA1\x72\xde\xf1\x1c\x7d\x5c\xcd\xef\x13')) 62 print("\n") 63 print("4.2.2.2.2 LMv1 Response with NTLMSSP_NEGOTIATE_LM_KEY set") 64 flags2 = self.flags 65 #flags2 = flags | ntlm.NTLMSSP_LM_KEY 66 #hexdump(struct.pack('<L',flags2)) 67 ntResponse, lmResponse, sessionBaseKey = ntlm.computeResponseNTLMv1(int(flags2), self.serverChallenge, 68 self.clientChallenge, self.serverName, self.domain, self.user, 69 self.password, '', '') 70 hexdump(lmResponse) 71 print("\n") 72 print("4.2.2.2.3 Encrypted Session Key ") 73 ntResponse, lmResponse, sessionBaseKey = ntlm.computeResponseNTLMv1(int(self.flags), self.serverChallenge, 74 self.clientChallenge, self.serverName, self.domain, self.user, self.password, '', '') 75 keyExchangeKey = ntlm.KXKEY(self.flags, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','') 76 encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey) 77 hexdump(encryptedSessionKey) 78 self.assertTrue(encryptedSessionKey==bytearray(b'\x51\x88\x22\xB1\xB3\xF3\x50\xC8\x95\x86\x82\xEC\xBB\x3E\x3C\xB7')) 79 print("\n") 80 print("4.2.2.2.3 Encrypted Session Key (NTLMSSP_NON_NT_KEY)") 81 flags2 = self.flags | ntlm.NTLMSSP_REQUEST_NON_NT_SESSION_KEY 82 keyExchangeKey = ntlm.KXKEY(flags2, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','') 83 encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey) 84 hexdump(encryptedSessionKey) 85 #ToDo Fix this 86 #self.assertTrue(encryptedSessionKey==bytearray(b'\x74\x52\xca\x55\xc2\x25\xa1\xca\x04\xb4\x8f\xae\x32\xcf\x56\xfc')) 87 print("\n") 88 print("4.2.2.2.3 Encrypted Session Key (NTLMSSP_LM_KEY)") 89 flags2 = self.flags | ntlm.NTLMSSP_NEGOTIATE_LM_KEY 90 #hexdump(struct.pack('<L',flags2)) 91 keyExchangeKey = ntlm.KXKEY(flags2, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','') 92 encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey) 93 hexdump(encryptedSessionKey) 94 #ToDo Fix this 95 #self.assertTrue(encryptedSessionKey==bytearray(b'\x4c\xd7\xbb\x57\xd6\x97\xef\x9b\x54\x9f\x02\xb8\xf9\xb3\x78\x64') 96 print("\n") 97 print("4.2.2.3 AUTHENTICATE MESSAGE") 98 ntResponse, lmResponse, sessionBaseKey = ntlm.computeResponseNTLMv1(int(self.flags), self.serverChallenge, 99 self.clientChallenge, self.serverName, self.domain, self.user, self.password, '', '') 100 keyExchangeKey = ntlm.KXKEY(self.flags, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','') 101 encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey) 102 ntlmChallengeResponse = ntlm.NTLMAuthChallengeResponse(self.user, self.password, self.serverChallenge) 103 ntlmChallengeResponse['flags'] = flags2 104 ntlmChallengeResponse['host_name'] = self.workstationName.encode('utf-16le') 105 ntlmChallengeResponse['domain_name'] = self.domain.encode('utf-16le') 106 ntlmChallengeResponse['lanman'] = lmResponse 107 ntlmChallengeResponse['ntlm'] = ntResponse 108 ntlmChallengeResponse['session_key'] = encryptedSessionKey 109 hexdump(ntlmChallengeResponse.getData()) 110 self.assertTrue(ntlmChallengeResponse.getData()==bytearray(b'NTLMSSP\x00\x03\x00\x00\x00\x18\x00\x18\x00|\x00\x00\x00\x18\x00\x18\x00\x94\x00\x00\x00\x0c\x00\x0c\x00X\x00\x00\x00\x08\x00\x08\x00d\x00\x00\x00\x10\x00\x10\x00l\x00\x00\x00\x10\x00\x10\x00\xac\x00\x00\x00\xb3\x82\x02\xe2D\x00o\x00m\x00a\x00i\x00n\x00U\x00s\x00e\x00r\x00C\x00O\x00M\x00P\x00U\x00T\x00E\x00R\x00\x98\xde\xf7\xb8\x7f\x88\xaa]\xaf\xe2\xdfw\x96\x88\xa1r\xde\xf1\x1c}\\\xcd\xef\x13g\xc40\x11\xf3\x02\x98\xa2\xad5\xec\xe6O\x163\x1cD\xbd\xbe\xd9\'\x84\x1f\x94Q\x88"\xb1\xb3\xf3P\xc8\x95\x86\x82\xec\xbb><\xb7')) 111 print("\n") 112 113 print("4.2.2.4 GSS_WrapEx") 114 print("Output of SEAL()") 115 from Cryptodome.Cipher import ARC4 116 cipher = ARC4.new(self.randomSessionKey) 117 handle = cipher.encrypt 118 print("Plaintext") 119 hexdump(self.plaintext) 120 print("\n") 121 sealedMsg, signature = ntlm.SEAL(self.flags, self.nonce, self.nonce, self.plaintext, self.plaintext, self.seqNum, handle) 122 #signature = ntlm.SIGN(flags, nonce, plaintext, seqNum, handle) 123 hexdump(sealedMsg) 124 self.assertTrue(sealedMsg==bytearray(b'V\xfe\x04\xd8a\xf91\x9a\xf0\xd7#\x8a.;ME\x7f\xb8')) 125 print("\n") 126 hexdump(signature.getData()) 127 self.assertTrue(signature.getData()==bytearray(b'\x01\x00\x00\x00\x00\x00\x00\x00\t\xdc\xd1\xdf.E\x9d6')) 128 print("\n") 129 130 print("####### 4.2.3 NTLMv1 with Client Challenge") 131 flags = ntlm.NTLMSSP_NEGOTIATE_56 | ntlm.NTLMSSP_NEGOTIATE_VERSION | ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY \ 132 | ntlm.NTLMSSP_TARGET_TYPE_SERVER | ntlm.NTLMSSP_NEGOTIATE_ALWAYS_SIGN | ntlm.NTLMSSP_NEGOTIATE_NTLM |\ 133 ntlm.NTLMSSP_NEGOTIATE_SEAL | ntlm.NTLMSSP_NEGOTIATE_SIGN | ntlm.NTLM_NEGOTIATE_OEM | ntlm.NTLMSSP_NEGOTIATE_UNICODE 134 print("Flags") 135 hexdump(struct.pack('<L',flags)) 136 print("\n") 137 print("4.2.3.1.1 NTOWFv1(password)") 138 hexdump(ntlm.NTOWFv1(self.password)) 139 print("\n") 140 print("4.2.3.1.2 Session Base Key") 141 ntResponse, lmResponse, sessionBaseKey = ntlm.computeResponseNTLMv1(int(flags), self.serverChallenge, self.clientChallenge, 142 self.serverName, self.domain, self.user, self.password, '', '') 143 hexdump(sessionBaseKey) 144 self.assertTrue(sessionBaseKey==bytearray(b'\xd8rb\xb0\xcd\xe4\xb1\xcbt\x99\xbe\xcc\xcd\xf1\x07\x84')) 145 print("\n") 146 print("4.2.3.1.3 Key Exchange Key") 147 keyExchangeKey = ntlm.KXKEY(flags, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','') 148 hexdump(keyExchangeKey) 149 # ToDo: Fix this 150 #self.assertTrue(keyExchangeKey==bytearray(b'\xeb\x93\x42\x9a\x8b\xd9\x52\xf8\xb8\x9c\x55\xb8\x7f\x47\x5e\xdc')) 151 print("\n") 152 153 print("4.2.3.2.1 LMv1 Response") 154 hexdump(lmResponse) 155 #self.assertTrue(lmResponse==bytearray(b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')) 156 print("\n") 157 158 print("4.2.3.2.2 NTLMv1 Response") 159 hexdump(ntResponse) 160 # ToDo: Fix this 161 #self.assertTrue(ntResponse==bytearray(b'\x75\x37\xf8\x03\xae\x36\x71\x28\xca\x45\x82\x04\xbd\xe7\xca\xf8\x1e\x97\xed\x26\x83\x26\x72\x32')) 162 print("\n") 163 print("AUTHENTICATE MESSAGE") 164 ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey) 165 ntlmChallengeResponse = ntlm.NTLMAuthChallengeResponse(self.user, self.password, self.serverChallenge) 166 ntlmChallengeResponse['flags'] = flags2 167 ntlmChallengeResponse['host_name'] = self.workstationName.encode('utf-16le') 168 ntlmChallengeResponse['domain_name'] = self.domain.encode('utf-16le') 169 ntlmChallengeResponse['lanman'] = lmResponse 170 ntlmChallengeResponse['ntlm'] = ntResponse 171 hexdump(ntlmChallengeResponse.getData()) 172 self.assertTrue(ntlmChallengeResponse.getData()==bytearray(b'NTLMSSP\x00\x03\x00\x00\x00\x18\x00\x18\x00|\x00\x00\x00\x18\x00\x18\x00\x94\x00\x00\x00\x0c\x00\x0c\x00X\x00\x00\x00\x08\x00\x08\x00d\x00\x00\x00\x10\x00\x10\x00l\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\xb3\x82\x02\xe2D\x00o\x00m\x00a\x00i\x00n\x00U\x00s\x00e\x00r\x00C\x00O\x00M\x00P\x00U\x00T\x00E\x00R\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u7\xf8\x03\xae6q(\xcaE\x82\x04\xbd\xe7\xca\xf8\x1e\x97\xed&\x83&r2')) 173 174 print("\n") 175 print("4.2.3.4 GSS_WrapEx") 176 print("Plaintext") 177 hexdump(self.plaintext) 178 print("\n") 179 print("Output of SEAL()") 180 181 exportedSessionKey = keyExchangeKey 182 clientSigningKey = ntlm.SIGNKEY(flags, exportedSessionKey) 183 clientSealingKey = ntlm.SEALKEY(flags, exportedSessionKey) 184 185 from Cryptodome.Cipher import ARC4 186 cipher = ARC4.new(clientSigningKey) 187 188 cipher2 = ARC4.new(clientSealingKey) 189 client_sealing_h = cipher2.encrypt 190 print("SEALKEY()") 191 hexdump(clientSealingKey) 192 print("\n") 193 print("SIGNKEY()") 194 hexdump(clientSigningKey) 195 print("\n") 196 print("Sealed Data") 197 sealedMsg, signature = ntlm.SEAL(flags, clientSealingKey, clientSigningKey, 198 self.plaintext, self.plaintext, self.seqNum, client_sealing_h) 199 #signature = ntlm.SIGN(flags, clientSigningKey, plaintext, seqNum, client_sealing_h) 200 hexdump(sealedMsg) 201 # ToDo: Fix this 202 #self.assertTrue(ntResponse==bytearray(b'\xa0\x23\x72\xf6\x53\x02\x73\xf3\xaa\x1e\xb9\x01\x90\xce\x52\x00\xc9\x9d')) 203 print("\n") 204 print("Signature") 205 hexdump(signature.getData()) 206 # ToDo: Fix this 207 #self.assertTrue(ntResponse==bytearray(b'\x01\x00\x00\x00\xff\x2a\xeb\x52\xf6\x81\x79\x3a\x00\x00\x00\x00') 208 print("\n") 209 210 def test_ntlmv2(self): 211 print("####### 4.2.4 NTLMv2 Authentication") 212 ntlm.USE_NTLMv2 = True 213 serverName = b('\x02\x00\x0c\x00\x44\x00\x6f\x00\x6d\x00\x61\x00\x69\x00\x6e\x00\x01\x00\x0c\x00\x53\x00\x65\x00\x72\x00\x76\x00\x65\x00\x72\x00\x00\x00\x00\x00') 214 # Still the aTime won't be set to zero. that must be changed in ntlm.computeResponseNTLM2. Gotta make this more automated 215 216 flags = ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH | ntlm.NTLMSSP_NEGOTIATE_56 | ntlm.NTLMSSP_NEGOTIATE_128 | \ 217 ntlm.NTLMSSP_NEGOTIATE_VERSION | ntlm.NTLMSSP_NEGOTIATE_TARGET_INFO | \ 218 ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY | ntlm.NTLMSSP_TARGET_TYPE_SERVER | \ 219 ntlm.NTLMSSP_NEGOTIATE_ALWAYS_SIGN | ntlm.NTLMSSP_NEGOTIATE_NTLM | ntlm.NTLMSSP_NEGOTIATE_SEAL | \ 220 ntlm.NTLMSSP_NEGOTIATE_SIGN | ntlm.NTLM_NEGOTIATE_OEM | ntlm.NTLMSSP_NEGOTIATE_UNICODE 221 print("Flags") 222 hexdump(struct.pack('<L',flags)) 223 print("\n") 224 print("4.2.4.1.1 NTOWFv2 and LMOWFv2") 225 res = ntlm.NTOWFv2(self.user,self.password,self.domain) 226 hexdump(res) 227 self.assertTrue(res==bytearray(b'\x0c\x86\x8a@;\xfdz\x93\xa3\x00\x1e\xf2.\xf0.?')) 228 print("\n") 229 print("\n") 230 print("4.2.4.1.2 Session Base Key") 231 ntResponse, lmResponse, sessionBaseKey = ntlm.computeResponseNTLMv2(flags, self.serverChallenge, 232 self.clientChallenge, serverName, self.domain, self.user, self.password, '', '' ) 233 hexdump(sessionBaseKey) 234 self.assertTrue(sessionBaseKey==bytearray(b'\x8d\xe4\x0c\xca\xdb\xc1\x4a\x82\xf1\x5c\xb0\xad\x0d\xe9\x5c\xa3')) 235 print("\n") 236 237 print("4.2.4.2.1 LMv2 Response") 238 hexdump(lmResponse) 239 self.assertTrue(lmResponse==bytearray(b'\x86\xc3P\x97\xac\x9c\xec\x10%TvJW\xcc\xcc\x19\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa')) 240 print("\n") 241 print("4.2.4.2.2 NTLMv2 Response") 242 hexdump(ntResponse[:16]) 243 self.assertTrue(ntResponse[:16]==bytearray(b'\x68\xcd\x0a\xb8\x51\xe5\x1c\x96\xaa\xbc\x92\x7b\xeb\xef\x6a\x1c')) 244 print("\n") 245 print("4.2.4.2.3 Encrypted Session Key") 246 keyExchangeKey = ntlm.KXKEY(flags, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','') 247 encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey) 248 hexdump(encryptedSessionKey) 249 self.assertTrue(encryptedSessionKey==bytearray(b'\xC5\xDA\xD2\x54\x4F\xC9\x79\x90\x94\xCE\x1C\xE9\x0B\xC9\xD0\x3E')) 250 print("\n") 251 252 print("AUTHENTICATE MESSAGE") 253 encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey) 254 ntlmChallengeResponse = ntlm.NTLMAuthChallengeResponse(self.user, self.password, self.serverChallenge) 255 ntlmChallengeResponse['flags'] = flags 256 ntlmChallengeResponse['host_name'] = self.workstationName.encode('utf-16le') 257 ntlmChallengeResponse['domain_name'] = self.domain.encode('utf-16le') 258 ntlmChallengeResponse['lanman'] = lmResponse 259 ntlmChallengeResponse['ntlm'] = ntResponse 260 ntlmChallengeResponse['session_key'] = encryptedSessionKey 261 hexdump(ntlmChallengeResponse.getData()) 262 self.assertTrue(ntlmChallengeResponse.getData()==bytearray(b'NTLMSSP\x00\x03\x00\x00\x00\x18\x00\x18\x00|\x00\x00\x00T\x00T\x00\x94\x00\x00\x00\x0c\x00\x0c\x00X\x00\x00\x00\x08\x00\x08\x00d\x00\x00\x00\x10\x00\x10\x00l\x00\x00\x00\x10\x00\x10\x00\xe8\x00\x00\x003\x82\x8a\xe2D\x00o\x00m\x00a\x00i\x00n\x00U\x00s\x00e\x00r\x00C\x00O\x00M\x00P\x00U\x00T\x00E\x00R\x00\x86\xc3P\x97\xac\x9c\xec\x10%TvJW\xcc\xcc\x19\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaah\xcd\n\xb8Q\xe5\x1c\x96\xaa\xbc\x92{\xeb\xefj\x1c\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x02\x00\x0c\x00D\x00o\x00m\x00a\x00i\x00n\x00\x01\x00\x0c\x00S\x00e\x00r\x00v\x00e\x00r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xda\xd2TO\xc9y\x90\x94\xce\x1c\xe9\x0b\xc9\xd0>')) 263 print("\n") 264 print("4.2.4.4 GSS_WrapEx") 265 print("Plaintext") 266 hexdump(self.plaintext) 267 print("\n") 268 print("Output of SEAL()") 269 270 exportedSessionKey = self.randomSessionKey 271 clientSigningKey = ntlm.SIGNKEY(flags, exportedSessionKey) 272 clientSealingKey = ntlm.SEALKEY(flags, exportedSessionKey) 273 274 from Cryptodome.Cipher import ARC4 275 276 cipher2 = ARC4.new(clientSealingKey) 277 client_sealing_h = cipher2.encrypt 278 print("SEALKEY()") 279 hexdump(clientSealingKey) 280 self.assertTrue(clientSealingKey==bytearray(b'Y\xf6\x00\x97<\xc4\x96\n%H\n|\x19nLX')) 281 print("\n") 282 print("SIGNKEY()") 283 hexdump(clientSigningKey) 284 self.assertTrue(clientSigningKey==bytearray(b'G\x88\xdc\x86\x1bG\x82\xf3]C\xfd\x98\xfe\x1a-9')) 285 print("\n") 286 print("Sealed Data") 287 sealedMsg, signature = ntlm.SEAL(flags, clientSealingKey, clientSigningKey, 288 self.plaintext, self.plaintext, self.seqNum, client_sealing_h) 289 #signature = ntlm.SIGN(flags, clientSigningKey, plaintext, seqNum, client_sealing_h) 290 hexdump(sealedMsg) 291 self.assertTrue(sealedMsg==bytearray(b'T\xe5\x01e\xbf\x196\xdc\x99` \xc1\x81\x1b\x0f\x06\xfb_')) 292 print("\n") 293 print("Signature") 294 hexdump(signature.getData()) 295 self.assertTrue(signature.getData()==bytearray(b'\x01\x00\x00\x00\x00\xc1a\xa1\x1e@\x03\x9f\x00\x00\x00\x00')) 296 #print (repr(bytearray(str(signature)))) 297 #raise 298 print("\n") 299 300 if __name__ == '__main__': 301 import sys 302 if len(sys.argv) > 1: 303 testcase = sys.argv[1] 304 suite = unittest.TestLoader().loadTestsFromTestCase(globals()[testcase]) 305 else: 306 suite = unittest.TestLoader().loadTestsFromTestCase(NTLMTests) 307 unittest.TextTestRunner(verbosity=1).run(suite)