Class: Msf::Plugin::MSGRPC

Inherits:
Msf::Plugin show all
Defined in:
plugins/msgrpc.rb

Overview

This class implements the msfd plugin interface.

Constant Summary collapse

DefaultHost =

The default local hostname that the server listens on.

'127.0.0.1'.freeze
DefaultPort =

The default local port that the server listens on.

55552

Instance Attribute Summary collapse

Attributes inherited from Msf::Plugin

#opts

Attributes included from Framework::Offspring

#framework

Instance Method Summary collapse

Methods inherited from Msf::Plugin

#add_console_dispatcher, create, #flush, #input, #output, #print, #print_error, #print_good, #print_line, #print_status, #print_warning, #remove_console_dispatcher

Constructor Details

#initialize(framework, opts) ⇒ MSGRPC

ServerPort

The local port to listen on for connections. The default is 55552

[View source] [View on GitHub]

35
36
37
38
39
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
# File 'plugins/msgrpc.rb', line 35

def initialize(framework, opts)
  super

  host = opts['ServerHost'] || DefaultHost
  port = opts['ServerPort'] || DefaultPort
  ssl = (opts['SSL'] && opts['SSL'].to_s =~ /^[ty]/i) ? true : false
  cert = opts['SSLCert']

  user = opts['User'] || 'msf'
  pass = opts['Pass'] || ::Rex::Text.rand_text_alphanumeric(8)
  uri = opts['URI'] || '/api'
  timeout = opts['TokenTimeout'] || 300

  print_status("MSGRPC Service:  #{host}:#{port} #{ssl ? ' (SSL)' : ''}")
  print_status("MSGRPC Username: #{user}")
  print_status("MSGRPC Password: #{pass}")

  self.server	= ::Msf::RPC::Service.new(framework, {
    host: host,
    port: port,
    ssl: ssl,
    cert: cert,
    uri: uri,
    tokens: {},
    token_timeout: timeout
  })

  server.add_user(user, pass)

  # If the run in foreground flag is not specified, then go ahead and fire
  # it off in a worker thread.
  unless opts['RunInForeground'] == true
    # Store a handle to the thread so we can kill it during
    # cleanup when we get unloaded.
    self.thread = Thread.new { run }
    framework.threads.register(thread, 'MetasploitRPCServer', true)
  end
end

Instance Attribute Details

#serverObject

The MSGRPC instance.

[View on GitHub]

115
116
117
# File 'plugins/msgrpc.rb', line 115

def server
  @server
end

#threadObject

Returns the value of attribute thread.

[View on GitHub]

116
117
118
# File 'plugins/msgrpc.rb', line 116

def thread
  @thread
end

#tokensObject

Returns the value of attribute tokens.

[View on GitHub]

116
117
118
# File 'plugins/msgrpc.rb', line 116

def tokens
  @tokens
end

#usersObject

Returns the value of attribute users.

[View on GitHub]

116
117
118
# File 'plugins/msgrpc.rb', line 116

def users
  @users
end

Instance Method Details

#cleanupObject

Closes the listener service.

[View source] [View on GitHub]

105
106
107
108
109
110
# File 'plugins/msgrpc.rb', line 105

def cleanup
  server.stop if server
  thread.kill if thread
  self.server = nil
  super
end

#descObject

Returns the plugin description.

[View source] [View on GitHub]

84
85
86
# File 'plugins/msgrpc.rb', line 84

def desc
  'Provides a MessagePack interface over HTTP'
end

#nameObject

Returns ‘msgrpc’

[View source] [View on GitHub]

77
78
79
# File 'plugins/msgrpc.rb', line 77

def name
  'msgrpc'
end

#runObject

The meat of the plugin, sets up handlers for requests

[View source] [View on GitHub]

91
92
93
94
95
96
97
98
99
100
# File 'plugins/msgrpc.rb', line 91

def run
  # Start the actual service
  server.start

  # Register
  framework.threads.register(Thread.current, 'MetasploitRPCServer', true)

  # Wait for the service to complete
  server.wait
end