Class: Rex::Proto::SMB::SimpleClient

Inherits:
Object
  • Object
show all
Defined in:
lib/rex/proto/smb/simpleclient.rb

Defined Under Namespace

Classes: OpenFile, OpenPipe, UnitTest

Constant Summary collapse

CONST =

Some short-hand class aliases

Rex::Proto::SMB::Constants
CRYPT =
Rex::Proto::SMB::Crypt
UTILS =
Rex::Proto::SMB::Utils
XCEPT =
Rex::Proto::SMB::Exceptions
EVADE =
Rex::Proto::SMB::Evasions

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(socket, direct = false) ⇒ SimpleClient

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



176
177
178
179
180
181
# File 'lib/rex/proto/smb/simpleclient.rb', line 176

def initialize(socket, direct = false)
	self.socket = socket
	self.direct = direct
	self.client = Rex::Proto::SMB::Client.new(socket)
	self.shares = { }
end

Instance Attribute Details

#clientObject

Private accessors



173
174
175
# File 'lib/rex/proto/smb/simpleclient.rb', line 173

def client
  @client
end

#directObject

Private accessors



173
174
175
# File 'lib/rex/proto/smb/simpleclient.rb', line 173

def direct
  @direct
end

#last_errorObject

Public accessors



170
171
172
# File 'lib/rex/proto/smb/simpleclient.rb', line 170

def last_error
  @last_error
end

#last_shareObject

Private accessors



173
174
175
# File 'lib/rex/proto/smb/simpleclient.rb', line 173

def last_share
  @last_share
end

#sharesObject

Private accessors



173
174
175
# File 'lib/rex/proto/smb/simpleclient.rb', line 173

def shares
  @shares
end

#socketObject

Private accessors



173
174
175
# File 'lib/rex/proto/smb/simpleclient.rb', line 173

def socket
  @socket
end

Instance Method Details

#connect(share) ⇒ Object



274
275
276
277
278
279
# File 'lib/rex/proto/smb/simpleclient.rb', line 274

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') ⇒ Object



302
303
304
305
306
307
# File 'lib/rex/proto/smb/simpleclient.rb', line 302

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) ⇒ Object



298
299
300
# File 'lib/rex/proto/smb/simpleclient.rb', line 298

def delete(*args)
	self.client.delete(*args)
end

#disconnect(share) ⇒ Object



281
282
283
284
# File 'lib/rex/proto/smb/simpleclient.rb', line 281

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 = {}) ⇒ Object



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/rex/proto/smb/simpleclient.rb', line 183

def (	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

		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) ⇒ Object



256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
# File 'lib/rex/proto/smb/simpleclient.rb', line 256

def (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 = '') ⇒ Object



230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# File 'lib/rex/proto/smb/simpleclient.rb', line 230

def (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) ⇒ Object



287
288
289
290
291
292
293
294
295
296
# File 'lib/rex/proto/smb/simpleclient.rb', line 287

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) ⇒ Object



309
310
311
# File 'lib/rex/proto/smb/simpleclient.rb', line 309

def trans_pipe(fid, data, no_response = nil)
	client.trans_named_pipe(fid, data, no_response)
end