Class: Msf::Plugin::Alias::AliasCommandDispatcher
- Inherits:
-
Object
- Object
- Msf::Plugin::Alias::AliasCommandDispatcher
- Includes:
- Ui::Console::CommandDispatcher
- Defined in:
- plugins/alias.rb
Constant Summary collapse
- @@alias_opts =
Rex::Parser::Arguments.new( '-h' => [ false, 'Help banner.' ], '-c' => [ true, 'Clear an alias (* to clear all).'], '-f' => [ true, 'Force an alias assignment.' ] )
Instance Attribute Summary collapse
-
#aliases ⇒ Object
readonly
Returns the value of attribute aliases.
Attributes included from Ui::Console::CommandDispatcher
Attributes included from Rex::Ui::Text::DispatcherShell::CommandDispatcher
Instance Method Summary collapse
-
#cmd_alias(*args) ⇒ Object
the main alias command handler.
- #cmd_alias_help ⇒ Object
-
#cmd_alias_tabs(_str, words) ⇒ Object
Tab completion for the alias command.
-
#commands ⇒ Object
Returns the hash of commands supported by this dispatcher.
-
#initialize(driver) ⇒ AliasCommandDispatcher
constructor
A new instance of AliasCommandDispatcher.
- #name ⇒ Object
Methods included from Ui::Console::CommandDispatcher
#active_module, #active_module=, #active_session, #active_session=, #build_range_array, #docs_dir, #framework, #load_config, #log_error, #remove_lines
Methods included from Rex::Ui::Text::DispatcherShell::CommandDispatcher
#cmd_help, #cmd_help_help, #cmd_help_tabs, #deprecated_cmd, #deprecated_commands, #deprecated_help, #docs_dir, #help_to_s, included, #print, #print_error, #print_good, #print_line, #print_status, #print_warning, #tab_complete_directory, #tab_complete_filenames, #tab_complete_generic, #tab_complete_source_address, #unknown_command, #update_prompt
Constructor Details
#initialize(driver) ⇒ AliasCommandDispatcher
Returns a new instance of AliasCommandDispatcher.
10 11 12 13 |
# File 'plugins/alias.rb', line 10 def initialize(driver) super(driver) @aliases = {} end |
Instance Attribute Details
#aliases ⇒ Object (readonly)
Returns the value of attribute aliases.
8 9 10 |
# File 'plugins/alias.rb', line 8 def aliases @aliases end |
Instance Method Details
#cmd_alias(*args) ⇒ Object
the main alias command handler
usage: alias [options] [name [value]]
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'plugins/alias.rb', line 40 def cmd_alias(*args) # we parse args manually instead of using @@alias.opts.parse to handle special cases case args.length when 0 # print the list of current aliases if @aliases.empty? return print_status('No aliases currently defined') else tbl = Rex::Text::Table.new( 'Header' => 'Current Aliases', 'Prefix' => "\n", 'Postfix' => "\n", 'Columns' => [ '', 'Alias Name', 'Alias Value' ] ) # add 'alias' in front of each row so that the output can be copy pasted into an rc file if desired @aliases.each_pair do |key, val| tbl << ['alias', key, val] end return print(tbl.to_s) end when 1 # display the alias if one matches this name (or help) return cmd_alias_help if (args[0] == '-h') || (args[0] == '--help') if @aliases.keys.include?(args[0]) print_status("\'#{args[0]}\' is aliased to \'#{@aliases[args[0]]}\'") else print_status("\'#{args[0]}\' is not currently aliased") end else # let's see if we can assign or clear the alias force = false clear = false # if using -f or -c, they must be the first arg, because -f/-c may also show up in the alias # value so we can't do something like if args.include("-f") or delete_if etc # we should never have to force and clear simultaneously. if args[0] == '-f' force = true args.shift elsif args[0] == '-c' clear = true args.shift end name = args.shift # alias name can NEVER be certain reserved words like 'alias', add any other reserved words here # We prevent the user from naming the alias "alias" cuz they could end up unable to clear the aliases, # for example you 'alias -f set unset and then 'alias -f alias sessions', now you're screwed. The byproduct # of this is that it prevents you from aliasing 'alias' to 'alias -f' etc, but that's acceptable reserved_words = [/^alias$/i] reserved_words.each do |regex| if name =~ regex print_error "You cannot use #{name} as the name for an alias, sorry" return false end end if clear # clear all aliases if "*" if name == '*' @aliases.each_key do |a| deregister_alias(a) end print_status 'Cleared all aliases' elsif @aliases.keys.include?(name) # clear the named alias if it exists deregister_alias(name) print_status "Cleared alias #{name}" else print_error("#{name} is not a currently active alias") end return end # smash everything that's left together value = args.join(' ') value.strip! # value can NEVER be certain bad words like 'rm -rf /', add any other reserved words here # this is basic idiot protection, not meant to be impervious to subversive intentions reserved_words = [%r{^rm +(-rf|-r +-f|-f +-r) +/.*$}] reserved_words.each do |regex| if value =~ regex print_error "You cannot use #{value} as the value for an alias, sorry" return false end end is_valid_alias = valid_alias?(name, value) # print_good "Alias validity = #{is_valid_alias}" is_sys_cmd = Rex::FileUtils.find_full_path(name) is_already_alias = @aliases.keys.include?(name) if is_valid_alias && !is_sys_cmd && !is_already_alias register_alias(name, value) elsif force if !is_valid_alias print_status 'The alias failed validation, but force is set so we allow this. This is often the case' print_status "when for instance 'exploit' is being overridden but msfconsole is not currently in the" print_status 'exploit context (an exploit is not loaded), or you are overriding a system command' end register_alias(name, value) else print_error("#{name} already exists as a system command, use -f to force override") if is_sys_cmd print_error("#{name} is already an alias, use -f to force override") if is_already_alias if !is_valid_alias && !force print_error("'#{name}' is not a permitted name or '#{value}' is not valid/permitted") print_error("It's possible the responding dispatcher isn't loaded yet, try changing to the proper context or using -f to force") end end end end |
#cmd_alias_help ⇒ Object
145 146 147 148 149 |
# File 'plugins/alias.rb', line 145 def cmd_alias_help print_line 'Usage: alias [options] [name [value]]' print_line print(@@alias_opts.usage) end |
#cmd_alias_tabs(_str, words) ⇒ Object
Tab completion for the alias command
154 155 156 157 158 159 160 161 162 |
# File 'plugins/alias.rb', line 154 def cmd_alias_tabs(_str, words) if words.length <= 1 # puts "1 word or less" return @@alias_opts.option_keys + tab_complete_aliases_and_commands else # puts "more than 1 word" return tab_complete_aliases_and_commands end end |
#commands ⇒ Object
Returns the hash of commands supported by this dispatcher.
driver.dispatcher_stack.commands
28 29 30 31 32 33 34 |
# File 'plugins/alias.rb', line 28 def commands { 'alias' => 'create or view an alias.' # "alias_clear" => "clear an alias (or all aliases).", # "alias_force" => "Force an alias (such as to override)" }.merge(aliases) # make aliased commands available as commands of their own end |
#name ⇒ Object
15 16 17 |
# File 'plugins/alias.rb', line 15 def name 'Alias' end |