class Rex::Post::Meterpreter::Extensions::Python::Python

Python extension - gives remote python scripting capabilities on the target.

Constants

PY_CODE_FILE_TYPES
PY_CODE_FILE_TYPE_MAP
PY_CODE_TYPE_PY
PY_CODE_TYPE_PYC
PY_CODE_TYPE_STRING

Public Class Methods

new(client) click to toggle source

Typical extension initialization routine.

@param client (see Extension#initialize)

Calls superclass method Rex::Post::Meterpreter::Extension::new
# File lib/rex/post/meterpreter/extensions/python/python.rb, line 34
def initialize(client)
  super(client, 'python')

  client.register_extension_aliases(
    [
      {
        'name' => 'python',
        'ext'  => self
      }
    ])
end

Public Instance Methods

execute_string(code, result_var) click to toggle source

Dump the LSA secrets from the target machine.

@return [Hash<Symbol,Object>]

# File lib/rex/post/meterpreter/extensions/python/python.rb, line 79
def execute_string(code, result_var)
  request = Packet.create_request('python_execute')
  request.add_tlv(TLV_TYPE_PYTHON_CODE, code)
  request.add_tlv(TLV_TYPE_PYTHON_CODE_TYPE, PY_CODE_TYPE_STRING)
  request.add_tlv(TLV_TYPE_PYTHON_RESULT_VAR, result_var) if result_var

  run_exec_request(request)
end
import(file, mod_name, result_var) click to toggle source
# File lib/rex/post/meterpreter/extensions/python/python.rb, line 53
def import(file, mod_name, result_var)
  unless ::File.file?(file)
    raise ArgumentError, "File not found: #{file}"
  end

  ext = ::File.extname(file).downcase
  unless PY_CODE_FILE_TYPES.include?(ext)
    raise ArgumentError, "File not a valid type: #{file}"
  end

  code = ::File.read(file)

  request = Packet.create_request('python_execute')
  request.add_tlv(TLV_TYPE_PYTHON_CODE, code)
  request.add_tlv(TLV_TYPE_PYTHON_CODE_LEN, code.length)
  request.add_tlv(TLV_TYPE_PYTHON_CODE_TYPE, PY_CODE_FILE_TYPE_MAP[ext])
  request.add_tlv(TLV_TYPE_PYTHON_NAME, mod_name) if mod_name
  request.add_tlv(TLV_TYPE_PYTHON_RESULT_VAR, result_var) if result_var

  run_exec_request(request)
end
reset() click to toggle source
# File lib/rex/post/meterpreter/extensions/python/python.rb, line 46
def reset
  request = Packet.create_request('python_reset')
  client.send_request(request)

  return true
end

Private Instance Methods

run_exec_request(request) click to toggle source
# File lib/rex/post/meterpreter/extensions/python/python.rb, line 90
def run_exec_request(request)
  response = client.send_request(request)

  result = {
    result: response.get_tlv_value(TLV_TYPE_PYTHON_RESULT),
    stdout: "",
    stderr: ""
  }

  response.each(TLV_TYPE_PYTHON_STDOUT) do |o|
    result[:stdout] << o.value
  end

  response.each(TLV_TYPE_PYTHON_STDERR) do |e|
    result[:stderr] << e.value
  end

  result
end