diff --git a/lib/msf/core/exploit/cmdstager.rb b/lib/msf/core/exploit/cmdstager.rb index c190aac778..a388affa35 100644 --- a/lib/msf/core/exploit/cmdstager.rb +++ b/lib/msf/core/exploit/cmdstager.rb @@ -44,21 +44,10 @@ module Exploit::CmdStager def initialize(info = {}) super - flavors = [] - if module_info['CmdStagerFlavor'] - flavors = Array(module_info['CmdStagerFlavor']) - else - targets.each do |target| - flavors += Array(target.opts['CmdStagerFlavor']) if target.opts['CmdStagerFlavor'] - end - flavors.uniq! - end - - if flavors.empty? - flavors = STAGERS.keys - end - flavors = flavors.map { |flavor| flavor.to_s } + flavors = module_flavors + flavors = STAGERS.keys if flavors.empty? flavors.unshift('auto') + register_advanced_options( [ OptEnum.new('CMDSTAGER::FLAVOR', [false, 'The CMD Stager to use.', 'auto', flavors]), @@ -261,6 +250,20 @@ module Exploit::CmdStager end end + # Returns all the compatible stager flavors specified by the module and each + # of it's targets. + # + # @return [Array] the list of all compatible cmd stager flavors. + def module_flavors + flavors = [] + flavors += Array(module_info['CmdStagerFlavor']) if module_info['CmdStagerFlavor'] + targets.each do |target| + flavors += Array(target.opts['CmdStagerFlavor']) if target.opts['CmdStagerFlavor'] + end + flavors.uniq! + flavors.map { |flavor| flavor.to_s } + end + # Returns the compatible stager flavors for the current target or module. # # @return [Array] the list of compatible cmd stager flavors.