""" """ # Created on 2015.04.02 # # Author: Giovanni Cannata # # Copyright 2015 - 2020 Giovanni Cannata # # This file is part of ldap3. # # ldap3 is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # ldap3 is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with ldap3 in the COPYING and COPYING.LESSER files. # If not, see . # NTLMv2 authentication as per [MS-NLMP] (https://msdn.microsoft.com/en-us/library/cc236621.aspx) from struct import pack, unpack from platform import system, version from socket import gethostname from time import time import hmac import hashlib import binascii from os import urandom try: from locale import getpreferredencoding oem_encoding = getpreferredencoding() except Exception: oem_encoding = 'utf-8' from ..protocol.formatters.formatters import format_ad_timestamp NTLM_SIGNATURE = b'NTLMSSP\x00' NTLM_MESSAGE_TYPE_NTLM_NEGOTIATE = 1 NTLM_MESSAGE_TYPE_NTLM_CHALLENGE = 2 NTLM_MESSAGE_TYPE_NTLM_AUTHENTICATE = 3 FLAG_NEGOTIATE_56 = 31 # W FLAG_NEGOTIATE_KEY_EXCH = 30 # V FLAG_NEGOTIATE_128 = 29 # U FLAG_NEGOTIATE_VERSION = 25 # T FLAG_NEGOTIATE_TARGET_INFO = 23 # S FLAG_REQUEST_NOT_NT_SESSION_KEY = 22 # R FLAG_NEGOTIATE_IDENTIFY = 20 # Q FLAG_NEGOTIATE_EXTENDED_SESSIONSECURITY = 19 # P FLAG_TARGET_TYPE_SERVER = 17 # O FLAG_TARGET_TYPE_DOMAIN = 16 # N FLAG_NEGOTIATE_ALWAYS_SIGN = 15 # M FLAG_NEGOTIATE_OEM_WORKSTATION_SUPPLIED = 13 # L FLAG_NEGOTIATE_OEM_DOMAIN_SUPPLIED = 12 # K FLAG_NEGOTIATE_ANONYMOUS = 11 # J FLAG_NEGOTIATE_NTLM = 9 # H FLAG_NEGOTIATE_LM_KEY = 7 # G FLAG_NEGOTIATE_DATAGRAM = 6 # F FLAG_NEGOTIATE_SEAL = 5 # E FLAG_NEGOTIATE_SIGN = 4 # D FLAG_REQUEST_TARGET = 2 # C FLAG_NEGOTIATE_OEM = 1 # B FLAG_NEGOTIATE_UNICODE = 0 # A FLAG_TYPES = [FLAG_NEGOTIATE_56, FLAG_NEGOTIATE_KEY_EXCH, FLAG_NEGOTIATE_128, FLAG_NEGOTIATE_VERSION, FLAG_NEGOTIATE_TARGET_INFO, FLAG_REQUEST_NOT_NT_SESSION_KEY, FLAG_NEGOTIATE_IDENTIFY, FLAG_NEGOTIATE_EXTENDED_SESSIONSECURITY, FLAG_TARGET_TYPE_SERVER, FLAG_TARGET_TYPE_DOMAIN, FLAG_NEGOTIATE_ALWAYS_SIGN, FLAG_NEGOTIATE_OEM_WORKSTATION_SUPPLIED, FLAG_NEGOTIATE_OEM_DOMAIN_SUPPLIED, FLAG_NEGOTIATE_ANONYMOUS, FLAG_NEGOTIATE_NTLM, FLAG_NEGOTIATE_LM_KEY, FLAG_NEGOTIATE_DATAGRAM, FLAG_NEGOTIATE_SEAL, FLAG_NEGOTIATE_SIGN, FLAG_REQUEST_TARGET, FLAG_NEGOTIATE_OEM, FLAG_NEGOTIATE_UNICODE] AV_END_OF_LIST = 0 AV_NETBIOS_COMPUTER_NAME = 1 AV_NETBIOS_DOMAIN_NAME = 2 AV_DNS_COMPUTER_NAME = 3 AV_DNS_DOMAIN_NAME = 4 AV_DNS_TREE_NAME = 5 AV_FLAGS = 6 AV_TIMESTAMP = 7 AV_SINGLE_HOST_DATA = 8 AV_TARGET_NAME = 9 AV_CHANNEL_BINDINGS = 10 AV_TYPES = [AV_END_OF_LIST, AV_NETBIOS_COMPUTER_NAME, AV_NETBIOS_DOMAIN_NAME, AV_DNS_COMPUTER_NAME, AV_DNS_DOMAIN_NAME, AV_DNS_TREE_NAME, AV_FLAGS, AV_TIMESTAMP, AV_SINGLE_HOST_DATA, AV_TARGET_NAME, AV_CHANNEL_BINDINGS] AV_FLAG_CONSTRAINED = 0 AV_FLAG_INTEGRITY = 1 AV_FLAG_TARGET_SPN_UNTRUSTED = 2 AV_FLAG_TYPES = [AV_FLAG_CONSTRAINED, AV_FLAG_INTEGRITY, AV_FLAG_TARGET_SPN_UNTRUSTED] def pack_windows_version(debug=False): if debug: if system().lower() == 'windows': try: major_release, minor_release, build = version().split('.') major_release = int(major_release) minor_release = int(minor_release) build = int(build) except Exception: major_release = 5 minor_release = 1 build = 2600 else: major_release = 5 minor_release = 1 build = 2600 else: major_release = 0 minor_release = 0 build = 0 return pack('