def __init__(self, key_str): k = str_to_key56(key_str) k = key56_to_key64(k) key_str = b'' for i in k: key_str += six.int2byte(i & 0xFF) self.des_c_obj = des_c.DES(key_str)
def decrypt(self, str): # block - UChar[] block = [] for i in six.iterbytes(str): block.append(i) # print block block = des_ecb_encrypt(block, self.KeySched, 0) res = b'' for i in block: res = res + six.int2byte(i) return res
def encrypt(self, plaintext): # block - UChar[] block = [] for i in plaintext: block.append(i) block = des_ecb_encrypt(block, self.KeySched, 1) res = b'' for i in block: res += six.int2byte(i) return res
def create_NTLM_AUTHENTICATE_MESSAGE(nonce, user, domain, password, NegotiateFlags): is_unicode = NegotiateFlags & NTLM_NegotiateUnicode is_NegotiateExtendedSecurity = NegotiateFlags & NTLM_NegotiateExtendedSecurity flags = struct.pack('<I', NTLM_TYPE2_FLAGS) BODY_LENGTH = 72 Payload_start = BODY_LENGTH # in bytes Workstation = gethostname().upper().encode('ascii') DomainName = domain.upper().encode('ascii') UserName = user.encode('ascii') EncryptedRandomSessionKey = b"" if is_unicode: Workstation = gethostname().upper().encode('utf-16-le') DomainName = domain.upper().encode('utf-16-le') UserName = user.encode('utf-16-le') EncryptedRandomSessionKey = "".encode('utf-16-le') LmChallengeResponse = calc_resp(create_LM_hashed_password_v1(password), nonce) NtChallengeResponse = calc_resp(create_NT_hashed_password_v1(password), nonce) if is_NegotiateExtendedSecurity: pwhash = create_NT_hashed_password_v1(password, UserName, DomainName) ClientChallenge = b"" for i in range(8): ClientChallenge += six.int2byte(random.getrandbits(8)) (NtChallengeResponse, LmChallengeResponse) = ntlm2sr_calc_resp(pwhash, nonce, ClientChallenge) # ='\x39 e3 f4 cd 59 c5 d8 60') Signature = b'NTLMSSP\0' MessageType = struct.pack('<I', 3) # type 3 DomainNameLen = struct.pack('<H', len(DomainName)) DomainNameMaxLen = struct.pack('<H', len(DomainName)) DomainNameOffset = struct.pack('<I', Payload_start) Payload_start += len(DomainName) UserNameLen = struct.pack('<H', len(UserName)) UserNameMaxLen = struct.pack('<H', len(UserName)) UserNameOffset = struct.pack('<I', Payload_start) Payload_start += len(UserName) WorkstationLen = struct.pack('<H', len(Workstation)) WorkstationMaxLen = struct.pack('<H', len(Workstation)) WorkstationOffset = struct.pack('<I', Payload_start) Payload_start += len(Workstation) LmChallengeResponseLen = struct.pack('<H', len(LmChallengeResponse)) LmChallengeResponseMaxLen = struct.pack('<H', len(LmChallengeResponse)) LmChallengeResponseOffset = struct.pack('<I', Payload_start) Payload_start += len(LmChallengeResponse) NtChallengeResponseLen = struct.pack('<H', len(NtChallengeResponse)) NtChallengeResponseMaxLen = struct.pack('<H', len(NtChallengeResponse)) NtChallengeResponseOffset = struct.pack('<I', Payload_start) Payload_start += len(NtChallengeResponse) EncryptedRandomSessionKeyLen = struct.pack('<H', len(EncryptedRandomSessionKey)) EncryptedRandomSessionKeyMaxLen = struct.pack('<H', len(EncryptedRandomSessionKey)) EncryptedRandomSessionKeyOffset = struct.pack('<I', Payload_start) Payload_start += len(EncryptedRandomSessionKey) NegotiateFlags = flags ProductMajorVersion = struct.pack('<B', 5) ProductMinorVersion = struct.pack('<B', 1) ProductBuild = struct.pack('<H', 2600) VersionReserved1 = struct.pack('<B', 0) VersionReserved2 = struct.pack('<B', 0) VersionReserved3 = struct.pack('<B', 0) NTLMRevisionCurrent = struct.pack('<B', 15) # TODO - This variable isn't used MIC = struct.pack('<IIII', 0, 0, 0, 0) # noqa msg3 = Signature + MessageType + \ LmChallengeResponseLen + LmChallengeResponseMaxLen + LmChallengeResponseOffset + \ NtChallengeResponseLen + NtChallengeResponseMaxLen + NtChallengeResponseOffset + \ DomainNameLen + DomainNameMaxLen + DomainNameOffset + \ UserNameLen + UserNameMaxLen + UserNameOffset + \ WorkstationLen + WorkstationMaxLen + WorkstationOffset + \ EncryptedRandomSessionKeyLen + EncryptedRandomSessionKeyMaxLen + EncryptedRandomSessionKeyOffset + \ NegotiateFlags + \ ProductMajorVersion + ProductMinorVersion + ProductBuild + \ VersionReserved1 + VersionReserved2 + VersionReserved3 + NTLMRevisionCurrent assert BODY_LENGTH == len(msg3), "BODY_LENGTH: %d != msg3: %d" % (BODY_LENGTH, len(msg3)) Payload = DomainName + UserName + Workstation + LmChallengeResponse + NtChallengeResponse + EncryptedRandomSessionKey msg3 += Payload msg3 = base64.b64encode(msg3) return msg3