librex 0.0.36 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +1 -1
- data/Rakefile +1 -1
- data/lib/rex/proto/smb/simpleclient.rb +54 -44
- metadata +3 -3
data/README.markdown
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
A non-official re-packaging of the Rex library as a gem for easy of usage of the Metasploit REX framework in a non Metasploit application. I received permission from HDM to create this package.
|
4
4
|
|
5
5
|
Currently based on:
|
6
|
-
SVN Revision:
|
6
|
+
SVN Revision: 12994
|
7
7
|
|
8
8
|
# Credits
|
9
9
|
The Metasploit development team <http://www.metasploit.com>
|
data/Rakefile
CHANGED
@@ -90,5 +90,5 @@ task :update do
|
|
90
90
|
system "git push &> /dev/null"
|
91
91
|
|
92
92
|
#Twitter tweet for the update, I am that lazy yes.
|
93
|
-
puts "Updated librex to v#{version} based on SVN Revision: #{rev[1]} of the
|
93
|
+
puts "Updated librex to v#{version} based on SVN Revision: #{rev[1]} of the #metasploit rex library. Available in rubygems."
|
94
94
|
end
|
@@ -22,7 +22,7 @@ EVADE = Rex::Proto::SMB::Evasions
|
|
22
22
|
|
23
23
|
class OpenFile
|
24
24
|
attr_accessor :name, :tree_id, :file_id, :mode, :client, :chunk_size
|
25
|
-
|
25
|
+
|
26
26
|
def initialize(client, name, tree_id, file_id)
|
27
27
|
self.client = client
|
28
28
|
self.name = name
|
@@ -30,7 +30,7 @@ EVADE = Rex::Proto::SMB::Evasions
|
|
30
30
|
self.file_id = file_id
|
31
31
|
self.chunk_size = 48000
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def delete
|
35
35
|
begin
|
36
36
|
self.close
|
@@ -38,14 +38,14 @@ EVADE = Rex::Proto::SMB::Evasions
|
|
38
38
|
end
|
39
39
|
self.client.delete(self.name, self.tree_id)
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
# Close this open file
|
43
43
|
def close
|
44
44
|
self.client.close(self.file_id, self.tree_id)
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
# Read data from the file
|
48
|
-
def read(length = nil, offset = 0)
|
48
|
+
def read(length = nil, offset = 0)
|
49
49
|
if (length == nil)
|
50
50
|
data = ''
|
51
51
|
fptr = offset
|
@@ -60,11 +60,11 @@ EVADE = Rex::Proto::SMB::Evasions
|
|
60
60
|
break
|
61
61
|
end
|
62
62
|
fptr += ok['Payload'].v['DataLenLow']
|
63
|
-
|
63
|
+
|
64
64
|
begin
|
65
65
|
ok = self.client.read(self.file_id, fptr, self.chunk_size)
|
66
66
|
rescue XCEPT::ErrorCode => e
|
67
|
-
case e.error_code
|
67
|
+
case e.error_code
|
68
68
|
when 0x00050001
|
69
69
|
# Novell fires off an access denied error on EOF
|
70
70
|
ok = nil
|
@@ -90,49 +90,49 @@ EVADE = Rex::Proto::SMB::Evasions
|
|
90
90
|
end
|
91
91
|
|
92
92
|
# Write data to the file
|
93
|
-
def write(data, offset = 0)
|
93
|
+
def write(data, offset = 0)
|
94
94
|
# Track our offset into the remote file
|
95
95
|
fptr = offset
|
96
|
-
|
96
|
+
|
97
97
|
# Duplicate the data so we can use slice!
|
98
98
|
data = data.dup
|
99
|
-
|
99
|
+
|
100
100
|
# Take our first chunk of bytes
|
101
101
|
chunk = data.slice!(0, self.chunk_size)
|
102
|
-
|
102
|
+
|
103
103
|
# Keep writing data until we run out
|
104
104
|
while (chunk.length > 0)
|
105
105
|
ok = self.client.write(self.file_id, fptr, chunk)
|
106
106
|
cl = ok['Payload'].v['CountLow']
|
107
|
-
|
107
|
+
|
108
108
|
# Partial write, push the failed data back into the queue
|
109
109
|
if (cl != chunk.length)
|
110
110
|
data = chunk.slice(cl - 1, chunk.length - cl) + data
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
# Increment our painter and grab the next chunk
|
114
114
|
fptr += cl
|
115
115
|
chunk = data.slice!(0, self.chunk_size)
|
116
116
|
end
|
117
117
|
end
|
118
118
|
end
|
119
|
-
|
119
|
+
|
120
120
|
class OpenPipe < OpenFile
|
121
|
-
|
121
|
+
|
122
122
|
# Valid modes are: 'trans' and 'rw'
|
123
123
|
attr_accessor :mode
|
124
|
-
|
124
|
+
|
125
125
|
def initialize(*args)
|
126
126
|
super(*args)
|
127
127
|
self.mode = 'rw'
|
128
128
|
@buff = ''
|
129
129
|
end
|
130
|
-
|
130
|
+
|
131
131
|
def read_buffer(length, offset=0)
|
132
132
|
length ||= @buff.length
|
133
133
|
@buff.slice!(0, length)
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
def read(length = nil, offset = 0)
|
137
137
|
case self.mode
|
138
138
|
when 'trans'
|
@@ -143,10 +143,10 @@ EVADE = Rex::Proto::SMB::Evasions
|
|
143
143
|
raise ArgumentError
|
144
144
|
end
|
145
145
|
end
|
146
|
-
|
146
|
+
|
147
147
|
def write(data, offset = 0)
|
148
148
|
case self.mode
|
149
|
-
|
149
|
+
|
150
150
|
when 'trans'
|
151
151
|
write_trans(data, offset)
|
152
152
|
when 'rw'
|
@@ -155,7 +155,7 @@ EVADE = Rex::Proto::SMB::Evasions
|
|
155
155
|
raise ArgumentError
|
156
156
|
end
|
157
157
|
end
|
158
|
-
|
158
|
+
|
159
159
|
def write_trans(data, offset=0)
|
160
160
|
ack = self.client.trans_named_pipe(self.file_id, data)
|
161
161
|
doff = ack['Payload'].v['DataOffset']
|
@@ -163,7 +163,7 @@ EVADE = Rex::Proto::SMB::Evasions
|
|
163
163
|
@buff << ack.to_s[4+doff, dlen]
|
164
164
|
end
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
167
|
|
168
168
|
# Public accessors
|
169
169
|
attr_accessor :last_error
|
@@ -178,26 +178,35 @@ attr_accessor :socket, :client, :direct, :shares, :last_share
|
|
178
178
|
self.client = Rex::Proto::SMB::Client.new(socket)
|
179
179
|
self.shares = { }
|
180
180
|
end
|
181
|
-
|
181
|
+
|
182
182
|
def login( name = '', user = '', pass = '', domain = '',
|
183
|
-
verify_signature = false, usentlmv2 = false, usentlm2_session = true,
|
183
|
+
verify_signature = false, usentlmv2 = false, usentlm2_session = true,
|
184
184
|
send_lm = true, use_lanman_key = false, send_ntlm = true,
|
185
185
|
native_os = 'Windows 2000 2195', native_lm = 'Windows 2000 5.0', spnopt = {})
|
186
186
|
|
187
187
|
begin
|
188
|
-
|
188
|
+
|
189
189
|
if (self.direct != true)
|
190
190
|
self.client.session_request(name)
|
191
191
|
end
|
192
|
-
self.client.native_os = native_os
|
192
|
+
self.client.native_os = native_os
|
193
193
|
self.client.native_lm = native_lm
|
194
194
|
self.client.verify_signature = verify_signature
|
195
195
|
self.client.use_ntlmv2 = usentlmv2
|
196
196
|
self.client.usentlm2_session = usentlm2_session
|
197
197
|
self.client.send_lm = send_lm
|
198
198
|
self.client.use_lanman_key = use_lanman_key
|
199
|
-
self.client.send_ntlm = send_ntlm
|
199
|
+
self.client.send_ntlm = send_ntlm
|
200
|
+
|
200
201
|
self.client.negotiate
|
202
|
+
|
203
|
+
# Disable NTLMv2 Session for Windows 2000 (breaks authentication on some systems)
|
204
|
+
# XXX: This in turn breaks SMB auth for Windows 2000 configured to enforce NTLMv2
|
205
|
+
# XXX: Tracked by ticket #4785#4785
|
206
|
+
if self.client.native_lm =~ /Windows 2000 5\.0/ and usentlm2_session
|
207
|
+
# self.client.usentlm2_session = false
|
208
|
+
end
|
209
|
+
|
201
210
|
self.client.spnopt = spnopt
|
202
211
|
|
203
212
|
ok = self.client.session_setup(user, pass, domain)
|
@@ -212,7 +221,7 @@ attr_accessor :socket, :client, :direct, :shares, :last_share
|
|
212
221
|
end
|
213
222
|
raise n
|
214
223
|
end
|
215
|
-
|
224
|
+
|
216
225
|
return true
|
217
226
|
end
|
218
227
|
|
@@ -220,11 +229,11 @@ attr_accessor :socket, :client, :direct, :shares, :last_share
|
|
220
229
|
def login_split_start_ntlm1(name = '')
|
221
230
|
|
222
231
|
begin
|
223
|
-
|
232
|
+
|
224
233
|
if (self.direct != true)
|
225
234
|
self.client.session_request(name)
|
226
235
|
end
|
227
|
-
|
236
|
+
|
228
237
|
# Disable extended security
|
229
238
|
self.client.negotiate(false)
|
230
239
|
rescue ::Interrupt
|
@@ -238,11 +247,11 @@ attr_accessor :socket, :client, :direct, :shares, :last_share
|
|
238
247
|
end
|
239
248
|
raise n
|
240
249
|
end
|
241
|
-
|
250
|
+
|
242
251
|
return true
|
243
252
|
end
|
244
|
-
|
245
|
-
|
253
|
+
|
254
|
+
|
246
255
|
def login_split_next_ntlm1(user, domain, hash_lm, hash_nt)
|
247
256
|
begin
|
248
257
|
ok = self.client.session_setup_no_ntlmssp_prehash(user, domain, hash_lm, hash_nt)
|
@@ -257,34 +266,34 @@ attr_accessor :socket, :client, :direct, :shares, :last_share
|
|
257
266
|
end
|
258
267
|
raise n
|
259
268
|
end
|
260
|
-
|
261
|
-
return true
|
269
|
+
|
270
|
+
return true
|
262
271
|
end
|
263
|
-
|
272
|
+
|
264
273
|
def connect(share)
|
265
274
|
ok = self.client.tree_connect(share)
|
266
275
|
tree_id = ok['Payload']['SMB'].v['TreeID']
|
267
276
|
self.shares[share] = tree_id
|
268
277
|
self.last_share = share
|
269
278
|
end
|
270
|
-
|
279
|
+
|
271
280
|
def disconnect(share)
|
272
281
|
ok = self.client.tree_disconnect(self.shares[share])
|
273
282
|
self.shares.delete(share)
|
274
|
-
end
|
275
|
-
|
283
|
+
end
|
284
|
+
|
276
285
|
|
277
|
-
def open(path, perm, chunk_size = 48000)
|
286
|
+
def open(path, perm, chunk_size = 48000)
|
278
287
|
mode = UTILS.open_mode_to_mode(perm)
|
279
288
|
access = UTILS.open_mode_to_access(perm)
|
280
|
-
|
289
|
+
|
281
290
|
ok = self.client.open(path, mode, access)
|
282
291
|
file_id = ok['Payload'].v['FileID']
|
283
292
|
fh = OpenFile.new(self.client, path, self.client.last_tree_id, file_id)
|
284
293
|
fh.chunk_size = chunk_size
|
285
294
|
fh
|
286
295
|
end
|
287
|
-
|
296
|
+
|
288
297
|
def delete(*args)
|
289
298
|
self.client.delete(*args)
|
290
299
|
end
|
@@ -292,15 +301,16 @@ attr_accessor :socket, :client, :direct, :shares, :last_share
|
|
292
301
|
def create_pipe(path, perm = 'c')
|
293
302
|
disposition = UTILS.create_mode_to_disposition(perm)
|
294
303
|
ok = self.client.create_pipe(path, disposition)
|
295
|
-
file_id = ok['Payload'].v['FileID']
|
304
|
+
file_id = ok['Payload'].v['FileID']
|
296
305
|
fh = OpenPipe.new(self.client, path, self.client.last_tree_id, file_id)
|
297
306
|
end
|
298
307
|
|
299
308
|
def trans_pipe(fid, data, no_response = nil)
|
300
309
|
client.trans_named_pipe(fid, data, no_response)
|
301
310
|
end
|
302
|
-
|
311
|
+
|
303
312
|
end
|
304
313
|
end
|
305
314
|
end
|
306
315
|
end
|
316
|
+
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: librex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.37
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Metasploit Development Team
|
@@ -11,11 +11,11 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2011-06-
|
14
|
+
date: 2011-06-20 00:00:00 -05:00
|
15
15
|
default_executable:
|
16
16
|
dependencies: []
|
17
17
|
|
18
|
-
description: Rex provides a variety of classes useful for security testing and exploit development. Based on SVN Revision
|
18
|
+
description: Rex provides a variety of classes useful for security testing and exploit development. Based on SVN Revision 12994
|
19
19
|
email:
|
20
20
|
- hdm@metasploit.com
|
21
21
|
- jacob.hammack@hammackj.com
|