# -*- coding: binary -*- module Rex module Proto module NTLM class Constants SSP_SIGN = "NTLMSSP\0" BLOB_SIGN = 0x00000101 LM_MAGIC = "KGS!@\#$%" TIME_OFFSET = 11644473600 MAX64 = 0xffffffffffffffff FLAGS = { :UNICODE => 0x00000001, :OEM => 0x00000002, :REQUEST_TARGET => 0x00000004, #:UNKNOWN => 0x00000008, :SIGN => 0x00000010, :SEAL => 0x00000020, #:UNKNOWN => 0x00000040, :NETWARE => 0x00000100, :NTLM => 0x00000200, #:UNKNOWN => 0x00000400, #:UNKNOWN => 0x00000800, :DOMAIN_SUPPLIED => 0x00001000, :WORKSTATION_SUPPLIED => 0x00002000, :LOCAL_CALL => 0x00004000, :ALWAYS_SIGN => 0x00008000, :TARGET_TYPE_DOMAIN => 0x00010000, :TARGET_INFO => 0x00800000, :NTLM2_KEY => 0x00080000, :KEY128 => 0x20000000, :KEY56 => 0x80000000 } FLAG_KEYS = FLAGS.keys.sort{|a, b| FLAGS[a] <=> FLAGS[b] } DEFAULT_FLAGS = { :TYPE1 => FLAGS[:UNICODE] | FLAGS[:OEM] | FLAGS[:REQUEST_TARGET] | FLAGS[:NTLM] | FLAGS[:ALWAYS_SIGN] | FLAGS[:NTLM2_KEY], :TYPE2 => FLAGS[:UNICODE], :TYPE3 => FLAGS[:UNICODE] | FLAGS[:REQUEST_TARGET] | FLAGS[:NTLM] | FLAGS[:ALWAYS_SIGN] | FLAGS[:NTLM2_KEY] } # NTLM Response Type NTLM_V1_RESPONSE = 1 NTLM_V2_RESPONSE = 2 NTLM_2_SESSION_RESPONSE = 3 #the same flags but merged from lib/rex/proto/smb/constants and keeped for compatibility # NTLMSSP Message Flags NEGOTIATE_UNICODE = 0x00000001 # Only set if Type 1 contains it - this or oem, not both NEGOTIATE_OEM = 0x00000002 # Only set if Type 1 contains it - this or unicode, not both REQUEST_TARGET = 0x00000004 # If set in Type 1, must return domain or server NEGOTIATE_SIGN = 0x00000010 # Session signature required NEGOTIATE_SEAL = 0x00000020 # Session seal required NEGOTIATE_LMKEY = 0x00000080 # LM Session Key should be used for signing and sealing NEGOTIATE_NTLM = 0x00000200 # NTLM auth is supported NEGOTIATE_ANONYMOUS = 0x00000800 # Anonymous context used NEGOTIATE_DOMAIN = 0x00001000 # Sent in Type1, client gives domain info NEGOTIATE_WORKSTATION = 0x00002000 # Sent in Type1, client gives workstation info NEGOTIATE_LOCAL_CALL = 0x00004000 # Server and client are on same machine NEGOTIATE_ALWAYS_SIGN = 0x00008000 # Add signatures to packets TARGET_TYPE_DOMAIN = 0x00010000 # If REQUEST_TARGET, we're adding the domain name TARGET_TYPE_SERVER = 0x00020000 # If REQUEST_TARGET, we're adding the server name TARGET_TYPE_SHARE = 0x00040000 # Supposed to denote "a share" but for a webserver? NEGOTIATE_NTLM2_KEY = 0x00080000 # NTLMv2 Signature and Key exchanges NEGOTIATE_TARGET_INFO = 0x00800000 # Server set when sending Target Information Block NEGOTIATE_128 = 0x20000000 # 128-bit encryption supported NEGOTIATE_KEY_EXCH = 0x40000000 # Client will supply encrypted master key in Session Key field of Type3 msg NEGOTIATE_56 = 0x80000000 # 56-bit encryption supported end end end end