Path: blob/master/lib/msf/base/sessions/mettle_config.rb
32904 views
# -*- coding: binary -*-12require 'base64'3require 'securerandom'45module Msf6module Sessions7module MettleConfig8include Msf::Payload::TransportConfig910def initialize(info = {})11super1213register_advanced_options(14[15OptBool.new(16'MeterpreterTryToFork',17'Fork a new process if the functionality is available',18default: false19),20]21)22unless staged?23register_advanced_options(24[25OptEnum.new(26'PayloadLinuxMinKernel',27[true, 'Linux minimum kernel version for compatibility', '2.6', ['2.6', '3.17']]28)29]30)31end32end3334def generate_uri(opts = {})35ds = opts[:datastore] || datastore36uri_req_len = ds['StagerURILength'].to_i3738# Choose a random URI length between 30 and 128 bytes39if uri_req_len == 040uri_req_len = 30 + luri.length + rand(127 - (30 + luri.length))41end4243if uri_req_len < 544raise ArgumentError, 'Minimum StagerURILength is 5'45end4647generate_uri_uuid_mode(:init_connect, uri_req_len, uuid: opts[:uuid])48end4950def generate_uri_option(opts, opt)51opts[opt] ? "--#{opt} '#{opts[opt].gsub('\'', "\\'")}' " : ''52end5354def generate_http_uri(opts)55if Rex::Socket.is_ipv6?(opts[:lhost])56target_uri = "#{opts[:scheme]}://[#{opts[:lhost]}]"57else58target_uri = "#{opts[:scheme]}://#{opts[:lhost]}"59end6061target_uri << ':'62target_uri << opts[:lport].to_s63target_uri << luri64target_uri << generate_uri(opts)65target_uri << '|'66target_uri << generate_uri_option(opts, :ua)67target_uri << generate_uri_option(opts, :host)68target_uri << generate_uri_option(opts, :referer)69if opts[:cookie]70opts[:header] = "Cookie: #{opts[:cookie]}"71target_uri << generate_uri_option(opts, :header)72end73target_uri.strip74end7576def generate_tcp_uri(opts)77if Rex::Socket.is_ipv6?(opts[:lhost])78target_uri = "#{opts[:scheme]}://[#{opts[:lhost]}]"79else80target_uri = "#{opts[:scheme]}://#{opts[:lhost]}"81end82target_uri << ':'83target_uri << opts[:lport].to_s84target_uri85end8687def generate_config(opts = {})88ds = opts[:datastore] || datastore8990opts[:background] = ds['MeterpreterTryToFork'] ? 1 : 09192if ds['PayloadProcessCommandLine'] != ''93opts[:name] ||= ds['PayloadProcessCommandLine']94end9596opts[:uuid] ||= generate_payload_uuid9798case opts[:scheme]99when 'http'100opts[:uri] = generate_http_uri(transport_config_reverse_http(opts))101when 'https'102opts[:uri] = generate_http_uri(transport_config_reverse_https(opts))103when 'tcp'104opts[:uri] = generate_tcp_uri(transport_config_reverse_tcp(opts))105else106raise ArgumentError, "Unknown scheme: #{opts[:scheme]}"107end108109opts[:uuid] = Base64.encode64(opts[:uuid].to_raw).strip110guid = "\x00" * 16111unless opts[:stageless] == true112guid = [SecureRandom.uuid.gsub('-', '')].pack('H*')113end114opts[:session_guid] = Base64.encode64(guid).strip115116opts.slice(:uuid, :session_guid, :uri, :debug, :log_file, :name, :background)117end118119# Stage encoding is not safe for Mettle (doesn't apply to stageless)120def encode_stage?121if datastore['EnableStageEncoding'] && !@warned122print_warning("Stage encoding is not supported for #{refname}")123@warned = true124end125126false127end128end129end130end131132133