class Rex::Proto::SMB::SimpleClient

Constants

CONST

Some short-hand class aliases

CRYPT
EVADE
UTILS
XCEPT

Attributes

client[RW]

Private accessors

direct[RW]

Private accessors

last_error[RW]

Public accessors

last_share[RW]

Private accessors

shares[RW]

Private accessors

socket[RW]

Private accessors

Public Class Methods

new(socket, direct = false) click to toggle source

Pass the socket object and a boolean indicating whether the socket is netbios or cifs

# File lib/rex/proto/smb/simpleclient.rb, line 31
def initialize(socket, direct = false)
  self.socket = socket
  self.direct = direct
  self.client = Rex::Proto::SMB::Client.new(socket)
  self.shares = { }
end

Public Instance Methods

connect(share) click to toggle source
# File lib/rex/proto/smb/simpleclient.rb, line 133
def connect(share)
  ok = self.client.tree_connect(share)
  tree_id = ok['Payload']['SMB'].v['TreeID']
  self.shares[share] = tree_id
  self.last_share = share
end
create_pipe(path, perm = 'c') click to toggle source
# File lib/rex/proto/smb/simpleclient.rb, line 161
def create_pipe(path, perm = 'c')
  disposition = UTILS.create_mode_to_disposition(perm)
  ok = self.client.create_pipe(path, disposition)
  file_id = ok['Payload'].v['FileID']
  fh = OpenPipe.new(self.client, path, self.client.last_tree_id, file_id)
end
delete(*args) click to toggle source
# File lib/rex/proto/smb/simpleclient.rb, line 157
def delete(*args)
  self.client.delete(*args)
end
disconnect(share) click to toggle source
# File lib/rex/proto/smb/simpleclient.rb, line 140
def disconnect(share)
  ok = self.client.tree_disconnect(self.shares[share])
  self.shares.delete(share)
end
login(name = '', user = '', pass = '', domain = '', verify_signature = false, usentlmv2 = false, usentlm2_session = true, send_lm = true, use_lanman_key = false, send_ntlm = true, native_os = 'Windows 2000 2195', native_lm = 'Windows 2000 5.0', spnopt = {}) click to toggle source
# File lib/rex/proto/smb/simpleclient.rb, line 38
def login(name = '', user = '', pass = '', domain = '',
    verify_signature = false, usentlmv2 = false, usentlm2_session = true,
    send_lm = true, use_lanman_key = false, send_ntlm = true,
    native_os = 'Windows 2000 2195', native_lm = 'Windows 2000 5.0', spnopt = {})

  begin

    if (self.direct != true)
      self.client.session_request(name)
    end
    self.client.native_os = native_os
    self.client.native_lm = native_lm
    self.client.verify_signature = verify_signature
    self.client.use_ntlmv2 = usentlmv2
    self.client.usentlm2_session = usentlm2_session
    self.client.send_lm = send_lm
    self.client.use_lanman_key =  use_lanman_key
    self.client.send_ntlm = send_ntlm

    self.client.negotiate

    # Disable NTLMv2 Session for Windows 2000 (breaks authentication on some systems)
    # XXX: This in turn breaks SMB auth for Windows 2000 configured to enforce NTLMv2
    # XXX: Tracked by ticket #4785#4785
    if self.client.native_lm =~ /Windows 2000 5\.0/ and usentlm2_session
    # self.client.usentlm2_session = false
    end

    self.client.spnopt = spnopt

    # In case the user unsets the password option, we make sure this is
    # always a string
    pass ||= ''

    ok = self.client.session_setup(user, pass, domain)
  rescue ::Interrupt
    raise $!
  rescue ::Exception => e
    n = XCEPT::LoginError.new
    n.source = e
    if(e.respond_to?('error_code'))
      n.error_code   = e.error_code
      n.error_reason = e.get_error(e.error_code)
    end
    raise n
  end

  return true
end
login_split_next_ntlm1(user, domain, hash_lm, hash_nt) click to toggle source
# File lib/rex/proto/smb/simpleclient.rb, line 115
def login_split_next_ntlm1(user, domain, hash_lm, hash_nt)
  begin
    ok = self.client.session_setup_no_ntlmssp_prehash(user, domain, hash_lm, hash_nt)
  rescue ::Interrupt
    raise $!
  rescue ::Exception => e
    n = XCEPT::LoginError.new
    n.source = e
    if(e.respond_to?('error_code'))
      n.error_code   = e.error_code
      n.error_reason = e.get_error(e.error_code)
    end
    raise n
  end

  return true
end
login_split_start_ntlm1(name = '') click to toggle source
# File lib/rex/proto/smb/simpleclient.rb, line 89
def login_split_start_ntlm1(name = '')

  begin

    if (self.direct != true)
      self.client.session_request(name)
    end

    # Disable extended security
    self.client.negotiate(false)
  rescue ::Interrupt
    raise $!
  rescue ::Exception => e
    n = XCEPT::LoginError.new
    n.source = e
    if(e.respond_to?('error_code'))
      n.error_code   = e.error_code
      n.error_reason = e.get_error(e.error_code)
    end
    raise n
  end

  return true
end
open(path, perm, chunk_size = 48000) click to toggle source
# File lib/rex/proto/smb/simpleclient.rb, line 146
def open(path, perm, chunk_size = 48000)
  mode   = UTILS.open_mode_to_mode(perm)
  access = UTILS.open_mode_to_access(perm)

  ok = self.client.open(path, mode, access)
  file_id = ok['Payload'].v['FileID']
  fh = OpenFile.new(self.client, path, self.client.last_tree_id, file_id)
  fh.chunk_size = chunk_size
  fh
end
trans_pipe(fid, data, no_response = nil) click to toggle source
# File lib/rex/proto/smb/simpleclient.rb, line 168
def trans_pipe(fid, data, no_response = nil)
  client.trans_named_pipe(fid, data, no_response)
end