Class: Msf::MCP::Tools::VulnerabilityInfo

Inherits:
MCP::Tool
  • Object
show all
Extended by:
ToolHelper
Defined in:
lib/msf/core/mcp/tools/vulnerability_info.rb

Overview

MCP Tool: Query Metasploit Database Vulnerabilities

Retrieves vulnerability information from the Metasploit database including CVE IDs, affected hosts, and vulnerability details.

Constant Summary

Constants included from ToolHelper

ToolHelper::DANGEROUS_MODE_DISABLED_MESSAGE

Class Method Summary collapse

Methods included from ToolHelper

dangerous_mode_required!, tool_error_response, with_tool_context

Class Method Details

.call(workspace: 'default', host: nil, names: nil, ports: nil, protocol: nil, limit: Msf::MCP::Security::InputValidator::LIMIT_DEFAULT, offset: 0, server_context:) ⇒ MCP::Tool::Response

Execute vulnerability query

Parameters:

  • workspace (String) (defaults to: 'default')

    Workspace name (default: ‘default’)

  • host (String, nil) (defaults to: nil)

    Host IP address to filter

  • names (Array<String>, nil) (defaults to: nil)

    Exploit names to filter

  • ports (String, nil) (defaults to: nil)

    Port or port range to filter

  • protocol (String, nil) (defaults to: nil)

    Protocol to filter (tcp or udp)

  • limit (Integer) (defaults to: Msf::MCP::Security::InputValidator::LIMIT_DEFAULT)

    Maximum results (default: 100)

  • offset (Integer) (defaults to: 0)

    Results offset (default: 0)

  • server_context (Hash)

    Server context with msf_client, rate_limiter, config

Returns:

  • (MCP::Tool::Response)

    Structured response with vulnerability information



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/msf/core/mcp/tools/vulnerability_info.rb', line 116

def call(workspace: 'default', host: nil, names: nil, ports: nil, protocol: nil, limit: Msf::MCP::Security::InputValidator::LIMIT_DEFAULT, offset: 0, server_context:)
  with_tool_context(server_context, 'vulnerability_info') do |msf_client|
    # Validate inputs
    Msf::MCP::Security::InputValidator.validate_pagination!(limit, offset)
    Msf::MCP::Security::InputValidator.validate_protocol!(protocol) if protocol
    Msf::MCP::Security::InputValidator.validate_ip_address!(host) if host
    Msf::MCP::Security::InputValidator.validate_port_range!(ports) if ports

    # Call Metasploit API
    # Note that `workspace` is optional in the MSF API, the default workspace is used if not provided.
    # The default value is sent anyway for clarity.
    options = { workspace: workspace }
    options[:address] = host if host
    options[:names] = names.join(',') if names && names.is_a?(Array) && names.any?
    options[:ports] = ports if ports
    options[:proto] = protocol if protocol
    raw_vulns, elapsed = Rex::Stopwatch.elapsed_time do
      msf_client.db_vulns(options)
    end

    # Transform response
    transformed = Metasploit::ResponseTransformer.transform_vulns(raw_vulns)

    # Apply pagination
    #
    # Note that to get the total number of entries, we gather the entire data set and apply pagination here
    # instead of sending the limit and offset to the API call to be processed by MSF.
    # This is needed to provide accurate total_items count in the metadata.
    total_items = transformed.size
    paginated_data = transformed[offset, limit] || []

    # Build metadata
     = {
      workspace: workspace,
      query_time: elapsed.round(3),
      total_items: total_items,
      returned_items: paginated_data.size,
      limit: limit,
      offset: offset
    }

    # Return MCP response
    ::MCP::Tool::Response.new(
      [
        {
          type: 'text',
          text: JSON.generate(
            metadata: ,
            data: paginated_data
          )
        }
      ],
      structured_content: {
        metadata: ,
        data: paginated_data
      }
    )
  end
end