Skip to content

Commit 66363f1

Browse files
author
Brent Cook
committed
Land rapid7#7625, add meterpreter 'cp' command and copy primitives
2 parents 7edb5e1 + 7346223 commit 66363f1

File tree

10 files changed

+77
-33
lines changed

10 files changed

+77
-33
lines changed

Gemfile.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ PATH
1414
metasploit-concern
1515
metasploit-credential
1616
metasploit-model
17-
metasploit-payloads (= 1.2.1)
17+
metasploit-payloads (= 1.2.3)
1818
metasploit_data_models
19-
metasploit_payloads-mettle (= 0.1.2)
19+
metasploit_payloads-mettle (= 0.1.3)
2020
msgpack
2121
nessus_rest
2222
net-ssh
@@ -169,7 +169,7 @@ GEM
169169
activemodel (~> 4.2.6)
170170
activesupport (~> 4.2.6)
171171
railties (~> 4.2.6)
172-
metasploit-payloads (1.2.1)
172+
metasploit-payloads (1.2.3)
173173
metasploit_data_models (2.0.10)
174174
activerecord (~> 4.2.6)
175175
activesupport (~> 4.2.6)
@@ -180,7 +180,7 @@ GEM
180180
postgres_ext
181181
railties (~> 4.2.6)
182182
recog (~> 2.0)
183-
metasploit_payloads-mettle (0.1.2)
183+
metasploit_payloads-mettle (0.1.3)
184184
method_source (0.8.2)
185185
mime-types (3.1)
186186
mime-types-data (~> 3.2015)

lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,24 @@ class << self
226226
alias rename mv
227227
end
228228

229+
#
230+
# Performs a copy from oldname to newname
231+
#
232+
def File.cp(oldname, newname)
233+
request = Packet.create_request('stdapi_fs_file_copy')
234+
235+
request.add_tlv(TLV_TYPE_FILE_NAME, client.unicode_filter_decode( oldname ))
236+
request.add_tlv(TLV_TYPE_FILE_PATH, client.unicode_filter_decode( newname ))
237+
238+
response = client.send_request(request)
239+
240+
return response
241+
end
242+
243+
class << self
244+
alias copy cp
245+
end
246+
229247
#
230248
# Upload one or more files to the remote remote directory supplied in
231249
# +destination+.

lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def commands
7171
'pwd' => 'Print working directory',
7272
'rm' => 'Delete the specified file',
7373
'mv' => 'Move source to destination',
74+
'cp' => 'Copy source to destination',
7475
'rmdir' => 'Remove directory',
7576
'search' => 'Search for files',
7677
'upload' => 'Upload a file or directory',
@@ -95,6 +96,7 @@ def commands
9596
'rmdir' => ['stdapi_fs_delete_dir'],
9697
'rm' => ['stdapi_fs_delete_file'],
9798
'mv' => ['stdapi_fs_file_move'],
99+
'cp' => ['stdapi_fs_file_copy'],
98100
'search' => ['stdapi_fs_search'],
99101
'upload' => [],
100102
'show_mount' => ['stdapi_fs_mount_show'],

metasploit-framework.gemspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ Gem::Specification.new do |spec|
6565
# are needed when there's no database
6666
spec.add_runtime_dependency 'metasploit-model'
6767
# Needed for Meterpreter
68-
spec.add_runtime_dependency 'metasploit-payloads', '1.2.1'
68+
spec.add_runtime_dependency 'metasploit-payloads', '1.2.3'
6969
# Needed for the next-generation POSIX Meterpreter
70-
spec.add_runtime_dependency 'metasploit_payloads-mettle', '0.1.2'
70+
spec.add_runtime_dependency 'metasploit_payloads-mettle', '0.1.3'
7171
# Needed by msfgui and other rpc components
7272
spec.add_runtime_dependency 'msgpack'
7373
# get list of network interfaces, like eth* from OS.

modules/payloads/singles/php/meterpreter_reverse_tcp.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
module MetasploitModule
1414

15-
CachedSize = 27144
15+
CachedSize = 27149
1616

1717
include Msf::Payload::Single
1818
include Msf::Payload::Php::ReverseTcp

modules/payloads/singles/python/meterpreter_bind_tcp.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
module MetasploitModule
1414

15-
CachedSize = 51742
15+
CachedSize = 51758
1616

1717
include Msf::Payload::Single
1818
include Msf::Payload::Python

modules/payloads/singles/python/meterpreter_reverse_http.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
module MetasploitModule
1414

15-
CachedSize = 51706
15+
CachedSize = 51718
1616

1717
include Msf::Payload::Single
1818
include Msf::Payload::Python

modules/payloads/singles/python/meterpreter_reverse_https.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
module MetasploitModule
1414

15-
CachedSize = 51706
15+
CachedSize = 51722
1616

1717
include Msf::Payload::Single
1818
include Msf::Payload::Python

modules/payloads/singles/python/meterpreter_reverse_tcp.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
module MetasploitModule
1414

15-
CachedSize = 51662
15+
CachedSize = 51674
1616

1717
include Msf::Payload::Single
1818
include Msf::Payload::Python

test/modules/post/test/meterpreter.rb

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -251,31 +251,55 @@ def test_fs
251251
session.fs.file.rm(remote)
252252
res
253253
end
254-
if session.commands.include?("stdapi_fs_file_move")
255-
it "should move files" do
256-
res = true
257-
src_name = datastore["BaseFileName"]
258-
dst_name = "#{datastore["BaseFileName"]}-moved"
259-
260-
# Make sure we don't have leftovers from a previous run
261-
session.fs.file.rm(src_name) rescue nil
262-
session.fs.file.rm(dst_name) rescue nil
263-
264-
# touch a new file
265-
fd = session.fs.file.open(src_name, "wb")
266-
fd.close
267254

268-
session.fs.file.mv(src_name, dst_name)
269-
entries = session.fs.dir.entries
270-
res &&= entries.include?(dst_name)
271-
res &&= !entries.include?(src_name)
255+
it "should move files" do
256+
res = true
257+
src_name = datastore["BaseFileName"]
258+
dst_name = "#{datastore["BaseFileName"]}-moved"
259+
260+
# Make sure we don't have leftovers from a previous run
261+
session.fs.file.rm(src_name) rescue nil
262+
session.fs.file.rm(dst_name) rescue nil
272263

273-
# clean up
274-
session.fs.file.rm(src_name) rescue nil
275-
session.fs.file.rm(dst_name) rescue nil
264+
# touch a new file
265+
fd = session.fs.file.open(src_name, "wb")
266+
fd.close
276267

277-
res
278-
end
268+
session.fs.file.mv(src_name, dst_name)
269+
entries = session.fs.dir.entries
270+
res &&= entries.include?(dst_name)
271+
res &&= !entries.include?(src_name)
272+
273+
# clean up
274+
session.fs.file.rm(src_name) rescue nil
275+
session.fs.file.rm(dst_name) rescue nil
276+
277+
res
278+
end
279+
280+
it "should copy files" do
281+
res = true
282+
src_name = datastore["BaseFileName"]
283+
dst_name = "#{datastore["BaseFileName"]}-copied"
284+
285+
# Make sure we don't have leftovers from a previous run
286+
session.fs.file.rm(src_name) rescue nil
287+
session.fs.file.rm(dst_name) rescue nil
288+
289+
# touch a new file
290+
fd = session.fs.file.open(src_name, "wb")
291+
fd.close
292+
293+
session.fs.file.cp(src_name, dst_name)
294+
entries = session.fs.dir.entries
295+
res &&= entries.include?(dst_name)
296+
res &&= entries.include?(src_name)
297+
298+
# clean up
299+
session.fs.file.rm(src_name) rescue nil
300+
session.fs.file.rm(dst_name) rescue nil
301+
302+
res
279303
end
280304

281305
it "should do md5 and sha1 of files" do

0 commit comments

Comments
 (0)