Class: Metasploit::Framework::DataService::DataProxy
- Inherits:
-
Object
- Object
- Metasploit::Framework::DataService::DataProxy
- Includes:
- DataProxyAutoLoader
- Defined in:
- lib/metasploit/framework/data_service/proxy/core.rb
Instance Attribute Summary collapse
-
#usable ⇒ Object
readonly
Returns the value of attribute usable.
Instance Method Summary collapse
-
#active ⇒ Object
Determines if the data service is active.
-
#add_opts_workspace(opts, wspace = nil) ⇒ Hash
Adds a valid workspace value to the opts hash before sending on to the data layer.
-
#data_service_operation(&block) ⇒ Object
Performs a set of data service operations declared within the block.
- #delete_current_data_service ⇒ Object
-
#delete_data_service(data_service_id) ⇒ Object
Delete the specified data service.
-
#error ⇒ Object
Returns current error state.
- #get_data_service ⇒ Object
-
#get_services_metadata ⇒ Object
Retrieves metadata about the data services.
-
#initialize(opts = {}) ⇒ DataProxy
constructor
A new instance of DataProxy.
- #is_local? ⇒ Boolean
- #log_error(exception, ui_message) ⇒ Object
-
#method_missing(method, *args, &block) ⇒ Object
Used to bridge the local db.
-
#register_data_service(data_service) ⇒ Object
Registers the specified data service with the proxy and immediately sets it as the primary if active.
- #respond_to?(method_name, include_private = false) ⇒ Boolean
-
#set_data_service(data_service_id) ⇒ Object
Set the data service to be used.
Methods included from PayloadDataProxy
#create_payload, #delete_payload, #payloads, #update_payload
Methods included from MsfDataProxy
Methods included from VulnAttemptDataProxy
#report_vuln_attempt, #vuln_attempts
Methods included from DbImportDataProxy
Methods included from DbExportDataProxy
Methods included from NmapDataProxy
Methods included from LoginDataProxy
#create_credential_login, #invalidate_login, #logins, #update_login
Methods included from CredentialDataProxy
#create_cracked_credential, #create_credential, #create_credential_and_login, #creds, #delete_credentials, #update_credential
Methods included from SessionEventDataProxy
#report_session_event, #session_events
Methods included from LootDataProxy
#find_or_create_loot, #loots, #report_loot, #update_loot
Methods included from ExploitDataProxy
#report_exploit_attempt, #report_exploit_failure, #report_exploit_success
Methods included from SessionDataProxy
convert_msf_session_to_hash, #report_session, #sessions, #update_session
Methods included from WebDataProxy
#report_web_form, #report_web_page, #report_web_site, #report_web_vuln
Methods included from NoteDataProxy
#delete_note, #find_or_create_note, #notes, #report_note, #update_note
Methods included from WorkspaceDataProxy
#add_workspace, #default_workspace, #delete_workspaces, #find_workspace, #update_workspace, #workspace, #workspace=, #workspaces
Methods included from EventDataProxy
Methods included from VulnDataProxy
#delete_vuln, #find_or_create_vuln, #report_vuln, #update_vuln, #vulns
Methods included from HostDataProxy
#add_host_tag, #delete_host, #delete_host_tag, #find_or_create_host, #get_host, #get_host_tags, #hosts, #report_host, #update_host
Methods included from ServiceDataProxy
#delete_service, #find_or_create_service, #report_service, #services, #update_service
Constructor Details
#initialize(opts = {}) ⇒ DataProxy
Returns a new instance of DataProxy.
16 17 18 19 20 21 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 16 def initialize(opts = {}) @data_services = {} @data_service_id = 0 @usable = false setup(opts) end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, &block) ⇒ Object
Used to bridge the local db
132 133 134 135 136 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 132 def method_missing(method, *args, &block) unless @current_data_service.nil? @current_data_service.send(method, *args, &block) end end |
Instance Attribute Details
#usable ⇒ Object (readonly)
Returns the value of attribute usable.
14 15 16 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 14 def usable @usable end |
Instance Method Details
#active ⇒ Object
Determines if the data service is active
43 44 45 46 47 48 49 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 43 def active if @current_data_service return @current_data_service.active end return false end |
#add_opts_workspace(opts, wspace = nil) ⇒ Hash
Adds a valid workspace value to the opts hash before sending on to the data layer.
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 179 def add_opts_workspace(opts, wspace = nil) # If :id is present the user only wants a specific record, so workspace isn't needed return if opts.key?(:id) # If the user passed in a specific workspace then use that in opts opts[:workspace] = wspace if wspace # We only want to pass the workspace name, so grab it if it is currently an object. if opts[:workspace] && opts[:workspace].is_a?(::Mdm::Workspace) opts[:workspace] = opts[:workspace].name end # If we still don't have a :workspace value, just set it to the current workspace. opts[:workspace] = workspace.name if opts[:workspace].nil? opts end |
#data_service_operation(&block) ⇒ Object
Performs a set of data service operations declared within the block. This passes the @current_data_service as a parameter to the block. If there is no current data service registered or the data service is not active, the block is not executed and the method simply returns.
155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 155 def data_service_operation(&block) return unless block_given? begin data_service = self.get_data_service rescue return end block.call(data_service) if !data_service.nil? && self.active end |
#delete_current_data_service ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 79 def delete_current_data_service @data_services.each do |id, ds| if ds == @current_data_service if id == 1 raise "Unable to delete the local data service. Please use db_disconnect." else @data_services.delete(id) @current_data_service = @data_services[1] end end end end |
#delete_data_service(data_service_id) ⇒ Object
Delete the specified data service
65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 65 def delete_data_service(data_service_id) raise ArgumentError.new('Cannot delete data service id: 1') if data_service_id.to_i == 1 data_service = @data_services.delete(data_service_id.to_i) if data_service.nil? raise "Data service with id: #{data_service_id} does not exist" end if @current_data_service == data_service # set the current data service to the first data service created @current_data_service = @data_services[1] end end |
#error ⇒ Object
Returns current error state
26 27 28 29 30 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 26 def error return @error if (@error) return @current_data_service.error if @current_data_service && !@current_data_service.error.nil? return 'unknown' end |
#get_data_service ⇒ Object
146 147 148 149 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 146 def get_data_service raise 'No registered data_service' unless @current_data_service return @current_data_service end |
#get_services_metadata ⇒ Object
Retrieves metadata about the data services
117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 117 def () = [] @data_services.each_key {|key| name = @data_services[key].name active = !@current_data_service.nil? && name == @current_data_service.name is_local = @data_services[key].is_local? << Metasploit::Framework::DataService::Metadata.new(key, name, active, is_local) } end |
#is_local? ⇒ Boolean
32 33 34 35 36 37 38 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 32 def is_local? if @current_data_service return @current_data_service.is_local? end return false end |
#log_error(exception, ui_message) ⇒ Object
167 168 169 170 171 172 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 167 def log_error(exception, ) elog(, error: exception) # TODO: We should try to surface the original exception, instead of just a generic one. # This should not display the full backtrace, only the message. raise exception end |
#register_data_service(data_service) ⇒ Object
Registers the specified data service with the proxy and immediately sets it as the primary if active
55 56 57 58 59 60 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 55 def register_data_service(data_service) validate(data_service) data_service_id = @data_service_id += 1 @data_services[data_service_id] = data_service set_data_service(data_service_id) end |
#respond_to?(method_name, include_private = false) ⇒ Boolean
138 139 140 141 142 143 144 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 138 def respond_to?(method_name, include_private=false) unless @current_data_service.nil? return @current_data_service.respond_to?(method_name, include_private) end false end |
#set_data_service(data_service_id) ⇒ Object
Set the data service to be used
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/metasploit/framework/data_service/proxy/core.rb', line 95 def set_data_service(data_service_id) data_service = @data_services[data_service_id.to_i] if data_service.nil? raise "Data service with id: #{data_service_id} does not exist" end if !data_service.is_local? && !data_service.active raise "Data service #{data_service.name} is not online, and won't be set as active" end prev_data_service = @current_data_service @current_data_service = data_service # reset the previous data service's active flag if it is remote # to ensure checks are performed the next time it is set if !prev_data_service.nil? && !prev_data_service.is_local? prev_data_service.active = false end end |