Module: Metasploit::Model::Module::Instance

Extended by:
ActiveModel::Naming, ActiveSupport::Autoload, ActiveSupport::Concern, ClassMethods
Includes:
Translation
Defined in:
lib/metasploit/model/module/instance.rb

Overview

Code shared between Mdm::Module::Instance and Metasploit::Framework::Module::Instance.

Defined Under Namespace

Modules: ClassMethods, Spec

Constant Summary collapse

DYNAMIC_LENGTH_VALIDATION_OPTIONS_BY_MODULE_TYPE_BY_ATTRIBUTE =
{
    actions: {
        Metasploit::Model::Module::Type::AUX => {
            minimum: 0
        },
        Metasploit::Model::Module::Type::ENCODER => {
            is: 0
        },
        Metasploit::Model::Module::Type::EXPLOIT => {
            is: 0
        },
        Metasploit::Model::Module::Type::NOP => {
            is: 0
        },
        Metasploit::Model::Module::Type::PAYLOAD => {
            is: 0
        },
        Metasploit::Model::Module::Type::POST => {
            minimum: 0
        }
    },
    module_architectures: {
        Metasploit::Model::Module::Type::AUX => {
            is: 0
        },
        Metasploit::Model::Module::Type::ENCODER => {
            minimum: 1
        },
        Metasploit::Model::Module::Type::EXPLOIT => {
            minimum: 1
        },
        Metasploit::Model::Module::Type::NOP => {
            minimum: 1
        },
        Metasploit::Model::Module::Type::PAYLOAD => {
            minimum: 1
        },
        Metasploit::Model::Module::Type::POST => {
            minimum: 1
        }
    },
    module_platforms: {
        Metasploit::Model::Module::Type::AUX => {
            is: 0
        },
        Metasploit::Model::Module::Type::ENCODER => {
            is: 0
        },
        Metasploit::Model::Module::Type::EXPLOIT => {
            minimum: 1
        },
        Metasploit::Model::Module::Type::NOP => {
            is: 0
        },
        Metasploit::Model::Module::Type::PAYLOAD => {
            minimum: 1
        },
        Metasploit::Model::Module::Type::POST => {
            minimum: 1
        }
    },
    module_references: {
        Metasploit::Model::Module::Type::AUX => {
            minimum: 0
        },
        Metasploit::Model::Module::Type::ENCODER => {
            is: 0
        },
        Metasploit::Model::Module::Type::EXPLOIT => {
            minimum: 1
        },
        Metasploit::Model::Module::Type::NOP => {
            is: 0
        },
        Metasploit::Model::Module::Type::PAYLOAD => {
            is: 0
        },
        Metasploit::Model::Module::Type::POST => {
            minimum: 0
        }
    },
    targets: {
        Metasploit::Model::Module::Type::AUX => {
            is: 0
        },
        Metasploit::Model::Module::Type::ENCODER => {
            is: 0
        },
        Metasploit::Model::Module::Type::EXPLOIT => {
            minimum: 1
        },
        Metasploit::Model::Module::Type::NOP => {
            is: 0
        },
        Metasploit::Model::Module::Type::PAYLOAD => {
            is: 0
        },
        Metasploit::Model::Module::Type::POST => {
            is: 0
        }
    }
}
MINIMUM_MODULE_AUTHORS_LENGTH =

Minimum length of #module_authors.

1
PRIVILEGES =

#privileged is Boolean so, valid values are just true and false, but since both the validation and factory need an array of valid values, this constant exists.

[
    false,
    true
]
STANCED_MODULE_TYPES =

Member of Type::ALL that require #stance to be non-nil.

[
    Metasploit::Model::Module::Type::AUX,
    Metasploit::Model::Module::Type::EXPLOIT
]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#actionsArray<Metasploit::Model::Module::Action>

Auxiliary actions to perform when this running this module.



# File 'lib/metasploit/model/module/instance.rb', line 259

#architecturesArray<Metasploit::Model::Architecture> (readonly)

The architectures supported by this module.



# File 'lib/metasploit/model/module/instance.rb', line 300

#authorsArray<Metasploit::Model::Author> (readonly)

The names of the authors of this module.

Returns:



# File 'lib/metasploit/model/module/instance.rb', line 305

#default_actionMetasploit::Model::Module::Action

The default action in #actions.



# File 'lib/metasploit/model/module/instance.rb', line 264

#default_targetMetasploit::Model::Module::Target

The default target in #targets.



# File 'lib/metasploit/model/module/instance.rb', line 269

#descriptionString

A long, paragraph description of what the module does.

Returns:

  • (String)


# File 'lib/metasploit/model/module/instance.rb', line 344

#disclosed_onDate?

The date the vulnerability exploited by this module was disclosed to the public.

Returns:

  • (Date, nil)


# File 'lib/metasploit/model/module/instance.rb', line 349

#email_addressesArray<Metasploit::Model::EmailAddress> (readonly)

The email addresses of the authors of this module.



# File 'lib/metasploit/model/module/instance.rb', line 310

#licenseString

The name of the software license for the module's code.

Returns:

  • (String)


# File 'lib/metasploit/model/module/instance.rb', line 354

#module_architecturesArray<Metasploit::Model::Module::Architecture>

Joins this with #architectures.



# File 'lib/metasploit/model/module/instance.rb', line 274

#module_authorsArray<Metasploit::Model::Module::Author>

Joins this with #authors and #email_addresses to model the name and email address used for an author entry in the module metadata.



# File 'lib/metasploit/model/module/instance.rb', line 279

#module_classMetasploit::Model::Module::Class

Class-derived metadata to go along with the instance-derived metadata in this model.



# File 'lib/metasploit/model/module/instance.rb', line 285

#module_platformsArray<Metasploit::Model::Module::Platform>

Joins this with #platforms.



# File 'lib/metasploit/model/module/instance.rb', line 290

#nameString

The human readable name of the module. It is unrelated to Class#full_name or Class#reference_name and is better thought of as a short summary of the #description.

Returns:

  • (String)


# File 'lib/metasploit/model/module/instance.rb', line 359

#platformsArray<Metasploit::Model::Module::Platform> (readonly)

Platforms supported by this module.



# File 'lib/metasploit/model/module/instance.rb', line 315

#privilegedBoolean

Whether this module requires privileged access to run.

Returns:

  • (Boolean)


# File 'lib/metasploit/model/module/instance.rb', line 366

#referencesArray<Metasploit::Model::Reference> (readonly)

External references to the exploit or proof-of-concept (PoC) code in this module.

Returns:



# File 'lib/metasploit/model/module/instance.rb', line 320

#stance'active', ...

Whether the module is active or passive. nil if the #module_type is not #stanced?.

Returns:

  • ('active', 'passive', nil)


# File 'lib/metasploit/model/module/instance.rb', line 371

#targetsArray<Metasploit::Model::Module::Target>

Names of targets with different configurations that can be exploited by this module.



# File 'lib/metasploit/model/module/instance.rb', line 295

#vulnerable_hostsArray<Metasploit::Model::Host> (readonly)

Hosts vulnerable to this module.

Returns:

  • (Array<Metasploit::Model::Host>)


# File 'lib/metasploit/model/module/instance.rb', line 330

#vulnerable_servicesArray<Metasploit::Model::Service> (readonly)

Services vulnerable to this module.

Returns:

  • (Array<Metasploit::Model::Service>)


# File 'lib/metasploit/model/module/instance.rb', line 335

#vulnsArray<Metasploit::Model::Vuln> (readonly)

Vulnerabilities with same reference as this module.

Returns:

  • (Array<Metasploit::Model::Vuln>)


# File 'lib/metasploit/model/module/instance.rb', line 325

Class Method Details

.module_types_that_allow(attribute) ⇒ Array<String>

Values of #module_type (members of Type::ALL), which have an exact length (:is) or maximum length (:maximum) greater than 0 for the given attribute.

Returns:

  • (Array<String>)

    Array with members of Type::ALL.

See Also:



453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
# File 'lib/metasploit/model/module/instance.rb', line 453

def self.module_types_that_allow(attribute)
  dynamic_length_validation_options_by_module_type = DYNAMIC_LENGTH_VALIDATION_OPTIONS_BY_MODULE_TYPE_BY_ATTRIBUTE.fetch(attribute)

  dynamic_length_validation_options_by_module_type.each_with_object([]) { |(module_type, dynamic_length_validation_options), module_types|
    is = dynamic_length_validation_options[:is]

    if is
      if is > 0
        module_types << module_type
      end
    else
      maximum = dynamic_length_validation_options[:maximum]

      if maximum
        if maximum > 0
          module_types << module_type
        end
      else
        module_types << module_type
      end
    end

  }
end

Instance Method Details

#allows?(attribute) ⇒ false, true

Whether the given attribute is allowed to have elements.

Parameters:

  • attribute (Symbol)

    name of attribute to check if #module_type allows it to have one or more elements.

Returns:

  • (false)

    if #module_type is not valid

  • (true)

    if maximum elements is greater than 0 or value can be non-nil



488
489
490
491
492
493
494
495
496
497
# File 'lib/metasploit/model/module/instance.rb', line 488

def allows?(attribute)
  if Metasploit::Model::Module::Type::ALL.include? module_type
    self.class.allows?(
        attribute: attribute,
        module_type: module_type
    )
  else
    false
  end
end

#architectures_from_targetsvoid (private)

This method returns an undefined value.

Validates that the #module_architectures architectures match the #targets target_architectures architectures.



540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
# File 'lib/metasploit/model/module/instance.rb', line 540

def architectures_from_targets
  actual_architecture_set = Set.new module_architectures.map(&:architecture)
  expected_architecture_set = Set.new

  targets.each do |module_target|
    module_target.target_architectures.each do |target_architecture|
      expected_architecture_set.add target_architecture.architecture
    end
  end

  extra_architecture_set = actual_architecture_set - expected_architecture_set

  unless extra_architecture_set.empty?
    human_extra_architectures = human_architecture_set(extra_architecture_set)

    errors.add(:architectures, :extra, extra: human_extra_architectures)
  end

  missing_architecture_set = expected_architecture_set - actual_architecture_set

  unless missing_architecture_set.empty?
    human_missing_architectures = human_architecture_set(missing_architecture_set)

    errors.add(:architectures, :missing, missing: human_missing_architectures)
  end
end

#dynamic_length_validation_options(attribute) ⇒ {}, Hash{Symbol => Integer}

The dynamic length valdiations, such as :is and :minimum for the given attribute for the current #module_type.

Parameters:

  • attribute (Symbol)

    name of attribute whose dynamic length validation options to be

Returns:

  • ({})

    an empty Hash if #module_type is not a member of Type::ALL

  • (Hash{Symbol => Integer})

    Hash containing either :is (meaning :maximum and :minimum are the same) or :minimum (no attribute has an explicit :maximum currently).



505
506
507
508
509
510
511
512
513
514
# File 'lib/metasploit/model/module/instance.rb', line 505

def dynamic_length_validation_options(attribute)
  if Metasploit::Model::Module::Type::ALL.include? module_type
    self.class.dynamic_length_validation_options(
        module_type: module_type,
        attribute: attribute
    )
  else
    {}
  end
end

#human_architecture_set(architecture_set) ⇒ String (private)

Converts a SetMetasploit::Model::Architecture to a human readable representation including the Architecture#abbreviation.

Returns:

  • (String)


571
572
573
574
575
# File 'lib/metasploit/model/module/instance.rb', line 571

def human_architecture_set(architecture_set)
  abbreviations = architecture_set.map(&:abbreviation)

  human_set(abbreviations)
end

#human_platform_set(platform_set) ⇒ String (private)

Converts a SetMetasploit::Model::Platform to a human-readable representation including the Platform#fully_qualified_name.

Returns:

  • (String)


581
582
583
584
585
# File 'lib/metasploit/model/module/instance.rb', line 581

def human_platform_set(platform_set)
  fully_qualified_names = platform_set.map(&:fully_qualified_name)

  human_set(fully_qualified_names)
end

#human_set(strings) ⇒ String (private)

Converts strings to a human-readable set notation.

Returns:

  • (String)


590
591
592
593
594
595
# File 'lib/metasploit/model/module/instance.rb', line 590

def human_set(strings)
  sorted = strings.sort
  comma_separated = sorted.join(', ')

  "{#{comma_separated}}"
end

#module_typeObject



520
521
522
# File 'lib/metasploit/model/module/instance.rb', line 520

delegate :module_type,
allow_nil: true,
to: :module_class

#platforms_from_targetsvoid (private)

This method returns an undefined value.

Validates that #module_platforms platforms match the #targets target_platforms platforms.



602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
# File 'lib/metasploit/model/module/instance.rb', line 602

def platforms_from_targets
  actual_platform_set = Set.new module_platforms.map(&:platform)
  expected_platform_set = Set.new

  targets.each do |module_target|
    module_target.target_platforms.each do |target_platform|
      expected_platform_set.add target_platform.platform
    end
  end

  extra_platform_set = actual_platform_set - expected_platform_set

  unless extra_platform_set.empty?
    human_extra_platforms = human_platform_set(extra_platform_set)

    errors.add(:platforms, :extra, extra: human_extra_platforms)
  end

  missing_platform_set = expected_platform_set - actual_platform_set

  unless missing_platform_set.empty?
    human_missing_platforms = human_platform_set(missing_platform_set)

    errors.add(:platforms, :missing, missing: human_missing_platforms)
  end
end

#stanced?false, true

Whether #module_type requires #stance to be set or to be nil.

Returns:



528
529
530
# File 'lib/metasploit/model/module/instance.rb', line 528

def stanced?
  self.class.stanced?(module_type)
end