Class: RubySMB::Gss::Provider::NTLM

Inherits:
Base
  • Object
show all
Includes:
NTLM
Defined in:
lib/ruby_smb/gss/provider/ntlm.rb

Overview

A GSS provider that authenticates clients via the NT LAN Manager (NTLM) Security Support Provider (NTLMSSP) protocol.

Defined Under Namespace

Classes: Account, Authenticator

Constant Summary

Constants included from NTLM

NTLM::DEFAULT_CLIENT_FLAGS, NTLM::NEGOTIATE_FLAGS

Instance Attribute Summary collapse

Attributes inherited from Base

#allow_anonymous

Instance Method Summary collapse

Constructor Details

#initialize(allow_anonymous: false, default_domain: 'WORKGROUP') ⇒ NTLM

Returns a new instance of NTLM.

Parameters:

  • allow_anonymous (Boolean) (defaults to: false)

    whether or not to allow anonymous authentication attempts

  • default_domain (String) (defaults to: 'WORKGROUP')

    the default domain to use for authentication, unless specified 'WORKGROUP' will be used

Raises:

  • (ArgumentError)


251
252
253
254
255
256
257
258
259
260
261
# File 'lib/ruby_smb/gss/provider/ntlm.rb', line 251

def initialize(allow_anonymous: false, default_domain: 'WORKGROUP')
  raise ArgumentError, 'Must specify a default domain' unless default_domain

  @allow_anonymous = allow_anonymous
  @default_domain = default_domain
  @accounts = []
  @generate_server_challenge = -> { SecureRandom.bytes(8) }

  @dns_domain = @netbios_domain = 'LOCALDOMAIN'
  @dns_hostname = @netbios_hostname = 'LOCALHOST'
end

Instance Attribute Details

#default_domainObject (readonly)

The default domain value to use for accounts which do not have one specified or use the special '.' value.



311
312
313
# File 'lib/ruby_smb/gss/provider/ntlm.rb', line 311

def default_domain
  @default_domain
end

#dns_domainObject

Returns the value of attribute dns_domain.



313
314
315
# File 'lib/ruby_smb/gss/provider/ntlm.rb', line 313

def dns_domain
  @dns_domain
end

#dns_hostnameObject

Returns the value of attribute dns_hostname.



313
314
315
# File 'lib/ruby_smb/gss/provider/ntlm.rb', line 313

def dns_hostname
  @dns_hostname
end

#netbios_domainObject

Returns the value of attribute netbios_domain.



313
314
315
# File 'lib/ruby_smb/gss/provider/ntlm.rb', line 313

def netbios_domain
  @netbios_domain
end

#netbios_hostnameObject

Returns the value of attribute netbios_hostname.



313
314
315
# File 'lib/ruby_smb/gss/provider/ntlm.rb', line 313

def netbios_hostname
  @netbios_hostname
end

Instance Method Details

#generate_server_challenge(&block) ⇒ String

Generate the 8-byte server challenge. If a block is specified, it's used as the challenge generation routine and should return an 8-byte value.

Returns:

  • (String)

    an 8-byte challenge value



268
269
270
271
272
273
274
# File 'lib/ruby_smb/gss/provider/ntlm.rb', line 268

def generate_server_challenge(&block)
  if block.nil?
    @generate_server_challenge.call
  else
    @generate_server_challenge = block
  end
end

#get_account(username, domain: nil) ⇒ Account?

Lookup and return an account based on the username and optionally, the domain. If no domain is specified or or it is the special value '.', the default domain will be used. The username and domain values are case insensitive.

Parameters:

  • username (String)

    the username of the account to fetch.

  • domain (String, nil) (defaults to: nil)

    the domain in which the account to fetch exists.

Returns:

  • (Account, nil)

    the account if it was found



290
291
292
293
294
295
296
# File 'lib/ruby_smb/gss/provider/ntlm.rb', line 290

def (username, domain: nil)
  # the username and password values should use the native encoding for the comparison in the #find operation
  username = username.downcase
  domain = @default_domain if domain.nil? || domain == '.'.encode(domain.encoding)
  domain = domain.downcase
  @accounts.find { || .username.encode(username.encoding).downcase == username && .domain.encode(domain.encoding).downcase == domain }
end

#new_authenticator(server_client) ⇒ Object



276
277
278
279
280
# File 'lib/ruby_smb/gss/provider/ntlm.rb', line 276

def new_authenticator(server_client)
  # build and return an instance that can process and track stateful information for a particular connection but
  # that's backed by this particular provider
  Authenticator.new(self, server_client)
end

#put_account(username, password, domain: nil) ⇒ Object

Add an account to the database.

Parameters:

  • username (String)

    the username of the account to add

  • password (String)

    either the plaintext password or the NTLM hash of the account to add

  • domain (String) (defaults to: nil)

    the domain of the account to add, if not specified, the @default_domain will be used



304
305
306
307
# File 'lib/ruby_smb/gss/provider/ntlm.rb', line 304

def (username, password, domain: nil)
  domain = @default_domain if domain.nil? || domain == '.'.encode(domain.encoding)
  @accounts << Account.new(username, password, domain)
end