diff --git a/lib/loader.rb b/lib/loader.rb index ee5f585a1..54cda048f 100644 --- a/lib/loader.rb +++ b/lib/loader.rb @@ -40,6 +40,7 @@ require 'lib/model/distributedenginerules' require 'lib/model/dynamiccommandinfo' require 'lib/model/dynamicpayloadinfo.rb' require 'lib/model/dynamicpayloads.rb' +require 'lib/model/optioncache.rb' require 'lib/crypto' diff --git a/lib/modules/command.rb b/lib/modules/command.rb index af0c997c6..54aabec9a 100644 --- a/lib/modules/command.rb +++ b/lib/modules/command.rb @@ -284,7 +284,19 @@ module BeEF def map_file_to_url(file, path=nil, extension=nil, count=1) return BeEF::AssetHandler.instance.bind(file, path, extension, count) end - + + def oc_value(name) + option = BeEF::Models::OptionCache.first(:name => name) + return nil if not option + return option.value + end + + def apply_defaults() + @datastore.each { |opt| + opt["value"] = oc_value(opt["name"]) || opt["value"] + } + end + private @use_template diff --git a/lib/modules/msfcommand.rb b/lib/modules/msfcommand.rb index 8c6a5bb04..80f99a2f5 100644 --- a/lib/modules/msfcommand.rb +++ b/lib/modules/msfcommand.rb @@ -87,7 +87,7 @@ class Msf < BeEF::Command case msfoptions[k]['type'] when "string","address","port" msfoptions[k]['default'] = rand(32**20).to_s(32) if k == "URIPATH" - @info['Data'] << {'name' => k , 'ui_label' => k, 'value' => msfoptions[k]['default']} + @info['Data'] << {'name' => k , 'ui_label' => k, 'value' => (oc_value(k) || msfoptions[k]['default'])} when "bool" @info['Data'] << {'name' => k, 'type' => 'checkbox', 'ui_label' => k } when "enum" @@ -95,7 +95,7 @@ class Msf < BeEF::Command msfoptions[k]['enums'].each { |e| enumdata << [e] } - @info['Data'] << { 'name' => k, 'type' => 'combobox', 'ui_label' => k, 'store_type' => 'arraystore', 'store_fields' => ['enum'], 'store_data' => enumdata, 'valueField' => 'enum', 'displayField' => 'enum' , 'autoWidth' => true, 'mode' => 'local', 'value' => msfoptions[k]['default']} + @info['Data'] << { 'name' => k, 'type' => 'combobox', 'ui_label' => k, 'store_type' => 'arraystore', 'store_fields' => ['enum'], 'store_data' => enumdata, 'valueField' => 'enum', 'displayField' => 'enum' , 'autoWidth' => true, 'mode' => 'local', 'value' => (oc_value(k) || msfoptions[k]['default'])} else print "K => #{k}\n" print "Status => #{msfoptions[k]['advanced']}\n" @@ -107,6 +107,7 @@ class Msf < BeEF::Command payloads = msfpayloads['payloads'] pl = [] + pl << [(oc_value('PAYLOAD') || 'generic/shell_bind_tcp')] payloads.each { |p| pl << [p] } @@ -145,11 +146,11 @@ class Msf < BeEF::Command case payload_options[k]['type'] when "string","address","port","raw","path", "integer" payload_options[k]['default'] = "127.0.0.1" if k == "RHOST" - info['Data'] << {'name' => k , 'ui_label' => k, 'value' => payload_options[k]['default']} + info['Data'] << {'name' => k , 'ui_label' => k, 'value' => (oc_value(k) || payload_options[k]['default'])} when "bool" info['Data'] << {'name' => k, 'type' => 'checkbox', 'ui_label' => k } when "enum" - info['Data'] << { 'name' => k, 'type' => 'combobox', 'ui_label' => k, 'store_type' => 'arraystore', 'store_fields' => ['enum'], 'store_data' => payload_options[k]['enums'], 'valueField' => 'enum', 'displayField' => 'enum' , 'autoWidth' => true, 'mode' => 'local', 'value' => payload_options[k]['default']} + info['Data'] << { 'name' => k, 'type' => 'combobox', 'ui_label' => k, 'store_type' => 'arraystore', 'store_fields' => ['enum'], 'store_data' => payload_options[k]['enums'], 'valueField' => 'enum', 'displayField' => 'enum' , 'autoWidth' => true, 'mode' => 'local', 'value' => (oc_value(k) || payload_options[k]['default'])} else # Debug output if the payload option type isn't found puts "K => #{k}\n" diff --git a/lib/ui/modules/modules.rb b/lib/ui/modules/modules.rb index 4b842a558..24c5eef78 100644 --- a/lib/ui/modules/modules.rb +++ b/lib/ui/modules/modules.rb @@ -363,6 +363,9 @@ class Modules < BeEF::HttpController raise WEBrick::HTTPStatus::BadRequest, "invalid key param string" if not Filter.has_valid_param_chars?(param) raise WEBrick::HTTPStatus::BadRequest, "first char is num" if Filter.first_char_is_num?(param) definition[param[4..-1]] = params[param] + oc = BeEF::Models::OptionCache.first_or_create(:name => param[4..-1]) + oc.value = params[param] + oc.save } zombie = Z.first(:session => zombie_session) @@ -416,6 +419,9 @@ class Modules < BeEF::HttpController raise WEBrick::HTTPStatus::BadRequest, "invalid key param string" if not Filter.has_valid_param_chars?(param) raise WEBrick::HTTPStatus::BadRequest, "first char is num" if Filter.first_char_is_num?(param) definition[param[4..-1]] = params[param] + oc = BeEF::Models::OptionCache.first_or_create(:name => param[4..-1]) + oc.value = params[param] + oc.save } zombie = Z.first(:session => zombie_session) @@ -518,7 +524,7 @@ class Modules < BeEF::HttpController command_modules_json[i] = JSON.parse(e.to_json) i += 1 end - + if not command_modules_json.empty? return {'success' => 'true', 'command_modules' => command_modules_json}.to_json else