201 lines
6.4 KiB
Ruby
201 lines
6.4 KiB
Ruby
#
|
|
# Copyright (c) 2006-2022 Wade Alcorn - wade@bindshell.net
|
|
# Browser Exploitation Framework (BeEF) - http://beefproject.com
|
|
# See the file 'doc/COPYING' for copying permission
|
|
#
|
|
module BeEF
|
|
module Extension
|
|
module Console
|
|
module CommandDispatcher
|
|
class Command
|
|
include BeEF::Extension::Console::CommandDispatcher
|
|
|
|
@@params = []
|
|
|
|
def initialize(driver)
|
|
super
|
|
begin
|
|
driver.interface.cmd['Data'].each do |data|
|
|
@@params << data['name']
|
|
end
|
|
rescue StandardError
|
|
nil
|
|
end
|
|
end
|
|
|
|
def commands
|
|
{
|
|
'execute' => 'Go! Execute the command module',
|
|
'param' => 'Set parameters for this module',
|
|
'response' => 'Get previous responses to this command module',
|
|
'cmdinfo' => 'See information about this particular command module'
|
|
}
|
|
end
|
|
|
|
def name
|
|
'Command'
|
|
end
|
|
|
|
@@bare_opts = Rex::Parser::Arguments.new(
|
|
'-h' => [false, 'Help.']
|
|
)
|
|
|
|
def cmd_cmdinfo(*args)
|
|
@@bare_opts.parse(args) do |opt, _idx, _val|
|
|
case opt
|
|
when '-h'
|
|
cmd_cmdinfo_help
|
|
return false
|
|
end
|
|
end
|
|
|
|
print_line('Module name: ' + driver.interface.cmd['Name'])
|
|
print_line('Module category: ' + driver.interface.cmd['Category'].to_s)
|
|
print_line('Module description: ' + driver.interface.cmd['Description'])
|
|
print_line('Module parameters:') unless driver.interface.cmd['Data'].length == 0
|
|
|
|
unless driver.interface.cmd['Data'].nil?
|
|
driver.interface.cmd['Data'].each do |data|
|
|
if data['type'].eql?('combobox')
|
|
print_line(data['name'] + ' => "' + data['value'].to_s + '" # ' + data['ui_label'] + ' (Options include: ' + data['store_data'].to_s + ')')
|
|
else
|
|
print_line(data['name'] + ' => "' + data['value'].to_s + '" # ' + data['ui_label'])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def cmd_cmdinfo_help(*_args)
|
|
print_status('Displays information about the current command module')
|
|
end
|
|
|
|
def cmd_param(*args)
|
|
@@bare_opts.parse(args) do |opt, _idx, _val|
|
|
case opt
|
|
when '-h'
|
|
cmd_param_help
|
|
return false
|
|
end
|
|
end
|
|
|
|
if args[0].nil? || args[1].nil?
|
|
cmd_param_help
|
|
nil
|
|
else
|
|
p = ''
|
|
(1..args.length - 1).each do |x|
|
|
p << args[x] << ' '
|
|
end
|
|
p.chop!
|
|
driver.interface.setparam(args[0], p)
|
|
end
|
|
end
|
|
|
|
def cmd_param_help(*_args)
|
|
print_status('Sets parameters for the current modules. Run "cmdinfo" to see the parameter values')
|
|
print_status(' Usage: param <paramname> <paramvalue>')
|
|
end
|
|
|
|
def cmd_param_tabs(_str, words)
|
|
return if words.length > 1
|
|
|
|
if @@params == ''
|
|
# nothing prepopulated?
|
|
else
|
|
@@params
|
|
end
|
|
end
|
|
|
|
def cmd_execute(*args)
|
|
@@bare_opts.parse(args) do |opt, _idx, _val|
|
|
case opt
|
|
when '-h'
|
|
cmd_execute_help
|
|
return false
|
|
end
|
|
end
|
|
|
|
if driver.interface.executecommand == true
|
|
print_status('Command successfully queued')
|
|
else
|
|
print_status('Something went wrong')
|
|
end
|
|
end
|
|
|
|
def cmd_execute_help(*_args)
|
|
print_status('Execute this module... go on!')
|
|
end
|
|
|
|
def cmd_response(*args)
|
|
@@bare_opts.parse(args) do |opt, _idx, _val|
|
|
case opt
|
|
when '-h'
|
|
cmd_response_help
|
|
return false
|
|
end
|
|
end
|
|
|
|
tbl = Rex::Ui::Text::Table.new(
|
|
'Columns' =>
|
|
[
|
|
'Id',
|
|
'Executed Time',
|
|
'Response Time'
|
|
]
|
|
)
|
|
|
|
if args[0].nil?
|
|
lastcmdid = nil
|
|
driver.interface.getcommandresponses.each do |resp|
|
|
indiresp = driver.interface.getindividualresponse(resp['object_id'])
|
|
respout = ''
|
|
if indiresp.nil? or indiresp[0].nil?
|
|
respout = 'No response yet'
|
|
else
|
|
respout = Time.at(indiresp[0]['date'].to_i).to_s
|
|
lastcmdid = resp['object_id']
|
|
end
|
|
tbl << [resp['object_id'].to_s, resp['creationdate'], respout]
|
|
end
|
|
|
|
puts "\n"
|
|
puts "List of responses for this command module:\n"
|
|
puts tbl.to_s + "\n"
|
|
|
|
unless lastcmdid.nil?
|
|
resp = driver.interface.getindividualresponse(lastcmdid)
|
|
puts "\n"
|
|
print_line('The last response [' + lastcmdid.to_s + '] was retrieved: ' + Time.at(resp[0]['date'].to_i).to_s)
|
|
print_line('Response:')
|
|
resp.each do |op|
|
|
print_line(op['data']['data'].to_s)
|
|
end
|
|
end
|
|
else
|
|
output = driver.interface.getindividualresponse(args[0])
|
|
if output.nil?
|
|
print_line('Invalid response ID')
|
|
elsif output[0].nil?
|
|
print_line('No response yet from the hooked browser or perhaps an invalid response ID')
|
|
else
|
|
print_line('Results retrieved: ' + Time.at(output[0]['date'].to_i).to_s)
|
|
print_line('')
|
|
print_line('Response:')
|
|
output.each do |op|
|
|
print_line(op['data']['data'].to_s)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def cmd_response_help(*_args)
|
|
print_status('List and review particular responses to this command')
|
|
print_status(' Usage: response (id)')
|
|
print_status(" If you omit id you'll see a list of all responses for the currently active command module")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|