metasploit_data_models 0.24.4 → 0.24.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +3 -3
  3. data/.travis.yml +3 -6
  4. data/CONTRIBUTING.md +52 -10
  5. data/Gemfile +8 -1
  6. data/Rakefile +0 -23
  7. data/app/models/mdm/api_key.rb +1 -41
  8. data/app/models/mdm/client.rb +1 -41
  9. data/app/models/mdm/cred.rb +19 -107
  10. data/app/models/mdm/event.rb +1 -48
  11. data/app/models/mdm/exploit_attempt.rb +16 -65
  12. data/app/models/mdm/exploited_host.rb +1 -28
  13. data/app/models/mdm/host_detail.rb +1 -45
  14. data/app/models/mdm/host_tag.rb +8 -6
  15. data/app/models/mdm/listener.rb +1 -53
  16. data/app/models/mdm/macro.rb +0 -42
  17. data/app/models/mdm/mod_ref.rb +0 -21
  18. data/app/models/mdm/module/action.rb +0 -15
  19. data/app/models/mdm/module/arch.rb +0 -10
  20. data/app/models/mdm/module/author.rb +0 -16
  21. data/app/models/mdm/module/mixin.rb +0 -13
  22. data/app/models/mdm/module/platform.rb +0 -11
  23. data/app/models/mdm/module/target.rb +0 -18
  24. data/app/models/mdm/nexpose_console.rb +4 -82
  25. data/app/models/mdm/profile.rb +0 -36
  26. data/app/models/mdm/route.rb +5 -17
  27. data/app/models/mdm/session_event.rb +1 -33
  28. data/app/models/mdm/tag.rb +10 -49
  29. data/app/models/mdm/task.rb +45 -94
  30. data/app/models/mdm/task_cred.rb +0 -29
  31. data/app/models/mdm/task_host.rb +0 -25
  32. data/app/models/mdm/task_service.rb +0 -25
  33. data/app/models/mdm/task_session.rb +0 -25
  34. data/app/models/mdm/user.rb +6 -188
  35. data/app/models/mdm/vuln_attempt.rb +12 -37
  36. data/app/models/mdm/vuln_detail.rb +5 -139
  37. data/app/models/mdm/vuln_ref.rb +1 -4
  38. data/app/models/mdm/web_form.rb +1 -35
  39. data/app/models/mdm/web_page.rb +1 -70
  40. data/app/models/mdm/web_site.rb +1 -51
  41. data/app/models/mdm/wmap_request.rb +0 -85
  42. data/app/models/mdm/wmap_target.rb +0 -40
  43. data/app/models/mdm/workspace.rb +14 -152
  44. data/app/models/metasploit_data_models/automatic_exploitation.rb +16 -0
  45. data/app/models/metasploit_data_models/automatic_exploitation/match.rb +24 -19
  46. data/app/models/metasploit_data_models/automatic_exploitation/match_result.rb +5 -33
  47. data/app/models/metasploit_data_models/automatic_exploitation/match_set.rb +4 -22
  48. data/app/models/metasploit_data_models/automatic_exploitation/run.rb +3 -13
  49. data/app/models/metasploit_data_models/ip_address/v4/segmented.rb +1 -1
  50. data/app/models/metasploit_data_models/module_run.rb +1 -1
  51. data/app/models/metasploit_data_models/search/visitor/where.rb +1 -1
  52. data/app/validators/ip_format_validator.rb +0 -4
  53. data/app/validators/parameters_validator.rb +0 -12
  54. data/app/validators/password_is_strong_validator.rb +1 -10
  55. data/lib/mdm/host/operating_system_normalization.rb +10 -7
  56. data/lib/metasploit_data_models.rb +0 -4
  57. data/lib/metasploit_data_models/engine.rb +0 -2
  58. data/lib/metasploit_data_models/serialized_prefs.rb +0 -6
  59. data/lib/metasploit_data_models/version.rb +10 -24
  60. data/lib/tasks/yard.rake +33 -0
  61. data/metasploit_data_models.gemspec +2 -9
  62. data/spec/app/models/mdm/api_key_spec.rb +3 -1
  63. data/spec/app/models/mdm/client_spec.rb +11 -9
  64. data/spec/app/models/mdm/cred_spec.rb +54 -42
  65. data/spec/app/models/mdm/event_spec.rb +23 -21
  66. data/spec/app/models/mdm/exploit_attempt_spec.rb +21 -19
  67. data/spec/app/models/mdm/exploited_host_spec.rb +13 -11
  68. data/spec/app/models/mdm/host_detail_spec.rb +17 -15
  69. data/spec/app/models/mdm/host_spec.rb +260 -261
  70. data/spec/app/models/mdm/host_tag_spec.rb +8 -6
  71. data/spec/app/models/mdm/listener_spec.rb +32 -30
  72. data/spec/app/models/mdm/loot_spec.rb +23 -21
  73. data/spec/app/models/mdm/macro_spec.rb +3 -1
  74. data/spec/app/models/mdm/mod_ref_spec.rb +3 -1
  75. data/spec/app/models/mdm/module/action_spec.rb +12 -10
  76. data/spec/app/models/mdm/module/arch_spec.rb +12 -10
  77. data/spec/app/models/mdm/module/author_spec.rb +17 -22
  78. data/spec/app/models/mdm/module/detail_spec.rb +75 -184
  79. data/spec/app/models/mdm/module/mixin_spec.rb +12 -10
  80. data/spec/app/models/mdm/module/platform_spec.rb +12 -10
  81. data/spec/app/models/mdm/module/ref_spec.rb +12 -10
  82. data/spec/app/models/mdm/module/target_spec.rb +15 -13
  83. data/spec/app/models/mdm/nexpose_console_spec.rb +37 -35
  84. data/spec/app/models/mdm/note_spec.rb +25 -23
  85. data/spec/app/models/mdm/profile_spec.rb +3 -1
  86. data/spec/app/models/mdm/ref_spec.rb +12 -10
  87. data/spec/app/models/mdm/route_spec.rb +8 -6
  88. data/spec/app/models/mdm/service_spec.rb +40 -38
  89. data/spec/app/models/mdm/session_event_spec.rb +12 -10
  90. data/spec/app/models/mdm/session_spec.rb +15 -13
  91. data/spec/app/models/mdm/tag_spec.rb +29 -29
  92. data/spec/app/models/mdm/task_cred_spec.rb +11 -9
  93. data/spec/app/models/mdm/task_host_spec.rb +11 -9
  94. data/spec/app/models/mdm/task_service_spec.rb +11 -9
  95. data/spec/app/models/mdm/task_session_spec.rb +9 -7
  96. data/spec/app/models/mdm/task_spec.rb +29 -27
  97. data/spec/app/models/mdm/user_spec.rb +19 -17
  98. data/spec/app/models/mdm/vuln_attempt_spec.rb +16 -14
  99. data/spec/app/models/mdm/vuln_detail_spec.rb +28 -26
  100. data/spec/app/models/mdm/vuln_ref_spec.rb +10 -8
  101. data/spec/app/models/mdm/vuln_spec.rb +26 -24
  102. data/spec/app/models/mdm/web_form_spec.rb +13 -11
  103. data/spec/app/models/mdm/web_page_spec.rb +21 -19
  104. data/spec/app/models/mdm/web_site_spec.rb +23 -21
  105. data/spec/app/models/mdm/web_vuln_spec.rb +65 -63
  106. data/spec/app/models/mdm/wmap_request_spec.rb +3 -1
  107. data/spec/app/models/mdm/wmap_target_spec.rb +3 -1
  108. data/spec/app/models/mdm/workspace_spec.rb +100 -97
  109. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_result_spec.rb +5 -3
  110. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_set_spec.rb +15 -13
  111. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_spec.rb +3 -1
  112. data/spec/app/models/metasploit_data_models/automatic_exploitation/run_spec.rb +3 -1
  113. data/spec/app/models/metasploit_data_models/ip_address/v4/cidr_spec.rb +12 -10
  114. data/spec/app/models/metasploit_data_models/ip_address/v4/nmap_spec.rb +6 -4
  115. data/spec/app/models/metasploit_data_models/ip_address/v4/range_spec.rb +23 -21
  116. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/list_spec.rb +11 -9
  117. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/range_spec.rb +23 -21
  118. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/segmented_spec.rb +6 -4
  119. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/single_spec.rb +15 -22
  120. data/spec/app/models/metasploit_data_models/ip_address/v4/single_spec.rb +6 -4
  121. data/spec/app/models/metasploit_data_models/module_run_spec.rb +3 -1
  122. data/spec/app/models/metasploit_data_models/search/operation/ip_address_spec.rb +20 -18
  123. data/spec/app/models/metasploit_data_models/search/operation/port/number_spec.rb +8 -6
  124. data/spec/app/models/metasploit_data_models/search/operation/port/range_spec.rb +10 -8
  125. data/spec/app/models/metasploit_data_models/search/operation/range_spec.rb +10 -8
  126. data/spec/app/models/metasploit_data_models/search/operator/ip_address_spec.rb +4 -2
  127. data/spec/app/models/metasploit_data_models/search/operator/multitext_spec.rb +10 -8
  128. data/spec/app/models/metasploit_data_models/search/operator/port/list_spec.rb +8 -6
  129. data/spec/app/models/metasploit_data_models/search/visitor/attribute_spec.rb +11 -9
  130. data/spec/app/models/metasploit_data_models/search/visitor/includes_spec.rb +7 -5
  131. data/spec/app/models/metasploit_data_models/search/visitor/joins_spec.rb +19 -17
  132. data/spec/app/models/metasploit_data_models/search/visitor/method_spec.rb +7 -5
  133. data/spec/app/models/metasploit_data_models/search/visitor/relation_spec.rb +23 -61
  134. data/spec/app/models/metasploit_data_models/search/visitor/where_spec.rb +10 -8
  135. data/spec/app/validators/parameters_validator_spec.rb +29 -29
  136. data/spec/app/validators/password_is_strong_validator_spec.rb +46 -54
  137. data/spec/dummy/db/structure.sql +3403 -0
  138. data/spec/factories/mdm/module/details.rb +1 -1
  139. data/spec/lib/base64_serializer_spec.rb +19 -19
  140. data/spec/lib/metasploit_data_models/ip_address/cidr_spec.rb +12 -18
  141. data/spec/lib/metasploit_data_models/ip_address/range_spec.rb +6 -4
  142. data/spec/lib/metasploit_data_models/match/child_spec.rb +4 -2
  143. data/spec/lib/metasploit_data_models/match/parent_spec.rb +6 -4
  144. data/spec/lib/metasploit_data_models/version_spec.rb +141 -3
  145. data/spec/spec_helper.rb +12 -86
  146. data/spec/support/shared/examples/mdm/module/detail/does_not_support_stance_with_mtype.rb +2 -2
  147. data/spec/support/shared/examples/mdm/module/detail/supports_stance_with_mtype.rb +4 -4
  148. data/spec/support/shared/examples/metasploit_data_models/search/operation/ipaddress/match.rb +2 -2
  149. data/spec/support/shared/examples/metasploit_data_models/search/visitor/includes/visit/with_children.rb +5 -5
  150. data/spec/support/shared/examples/metasploit_data_models/search/visitor/includes/visit/with_metasploit_model_search_operation_base.rb +5 -5
  151. data/spec/support/shared/examples/metasploit_data_models/search/visitor/where/visit/with_equality.rb +3 -3
  152. data/spec/support/shared/examples/metasploit_data_models/search/visitor/where/visit/with_metasploit_model_search_group_base.rb +6 -7
  153. metadata +9 -67
  154. data/CHANGELOG.md +0 -6
  155. data/RELEASING.md +0 -88
  156. data/UPGRADING.md +0 -1
  157. data/lib/metasploit_data_models/automatic_exploitation.rb +0 -25
  158. data/spec/lib/metasploit_data_models_spec.rb +0 -4
@@ -1,37 +1,42 @@
1
- # Matches {#matchable} {Mdm::Service} or {Mdm::Vuln} to a {#module_detail Metasploit Module} that can exploit it.
2
1
  class MetasploitDataModels::AutomaticExploitation::Match < ActiveRecord::Base
2
+ attr_accessible :match_set_id, :module_fullname
3
+
4
+
3
5
  #
4
6
  # Associations
5
7
  #
6
8
 
7
- # A (polymorphic) "matchable" entity like a {Mdm::Vuln} or {Mdm::Service}
9
+ # @!attribute matchable
10
+ # A (polymorphic) "matchable" entity like a {Mdm::Vuln} or {Mdm::Service}
8
11
  #
9
- # @return [Mdm::Service, Mdm::Vuln]
12
+ # @return [Mdm::Vuln, Mdm::Service]
10
13
  belongs_to :matchable, polymorphic: true
14
+ attr_accessible :matchable
11
15
 
12
- # The {MatchSet} this match is part of
13
- has_many :match_results,
14
- class_name: 'MetasploitDataModels::AutomaticExploitation::MatchResult',
15
- inverse_of: :match
16
-
17
- # The {MatchSet} this match is part of
18
- belongs_to :match_set,
19
- class_name: 'MetasploitDataModels::AutomaticExploitation::MatchSet',
20
- inverse_of: :matches
21
-
22
- # The Metasploit Module that this match connects to
16
+ # @!attribute module_detail
17
+ # The MSF module that this match connects to
18
+ #
19
+ # @return [Mdm::Module::Detail]
23
20
  belongs_to :module_detail,
24
21
  class_name: 'Mdm::Module::Detail',
25
22
  foreign_key: :module_fullname,
26
23
  primary_key: :fullname
27
24
 
25
+ # @!attribute match_set
26
+ # The {MatchSet} this match is part of
28
27
  #
29
- # Mass Assignment Security
30
- #
28
+ # @return [MetasploitDataModels::AutomaticExploitation::MatchResult]
29
+ has_many :match_results,
30
+ class_name: 'MetasploitDataModels::AutomaticExploitation::MatchResult',
31
+ inverse_of: :match
31
32
 
32
- attr_accessible :match_set_id
33
- attr_accessible :matchable
34
- attr_accessible :module_fullname
33
+ # @!attribute match_set
34
+ # The {MatchSet} this match is part of
35
+ #
36
+ # @return [MetasploitDataModels::AutomaticExploitation::MatchSet]
37
+ belongs_to :match_set,
38
+ class_name: 'MetasploitDataModels::AutomaticExploitation::MatchSet',
39
+ inverse_of: :matches
35
40
 
36
41
  Metasploit::Concern.run(self)
37
42
  end
@@ -1,52 +1,28 @@
1
- # The result of {#run running} a {#match}.
2
1
  class MetasploitDataModels::AutomaticExploitation::MatchResult < ActiveRecord::Base
3
- #
4
- # CONSTANTS
5
- #
2
+ attr_accessible :match_id, :run_id, :state
6
3
 
7
4
  # Running associated exploit did NOT create a session
8
5
  FAILED = "failed"
9
6
  # Running associated exploit created a session
10
7
  SUCCEEDED = "succeeded"
11
8
 
12
- # Valid values for {#state}
13
9
  VALID_STATES = [FAILED, SUCCEEDED]
14
10
 
15
11
  #
16
- # Associations
12
+ # ASSOCIATIONS
17
13
  #
18
14
 
19
- # A {MetasploitDataModels::AutomaticExploitation::Match#module_detail Metasploit Module} matched to
20
- # {MetasploitDataModels::AutomaticExploitation::Match#matchable Mdm::Host or Mdm::Service}.
21
15
  belongs_to :match,
22
16
  class_name: 'MetasploitDataModels::AutomaticExploitation::Match',
23
17
  inverse_of: :match_results,
24
18
  dependent: :destroy
25
19
 
26
- # A mass automatic exploitation run.
27
20
  belongs_to :run,
28
21
  inverse_of: :match_results,
29
22
  class_name: 'MetasploitDataModels::AutomaticExploitation::Run'
30
23
 
31
24
  #
32
- # Attributes
33
- #
34
-
35
- # @!attribute state
36
- # Whether the {#run} of {#match} succeeded.
37
- #
38
- # @return ['failed', 'succeeded']
39
-
40
- #
41
- # Mass Assignment Security
42
- #
43
-
44
- attr_accessible :match_id
45
- attr_accessible :run_id
46
- attr_accessible :state
47
-
48
- #
49
- # Validations
25
+ # VALIDATIONS
50
26
  #
51
27
 
52
28
  # must be present and one of allowable values
@@ -55,14 +31,10 @@ class MetasploitDataModels::AutomaticExploitation::MatchResult < ActiveRecord::B
55
31
  inclusion: VALID_STATES
56
32
 
57
33
  #
58
- # Scopes
34
+ # SCOPES
59
35
  #
60
-
61
- # Runs of {#match} that failed
62
- scope :failed, lambda { where(state:"failed") }
63
-
64
- # Runs of {#match} that succeeded
65
36
  scope :succeeded, lambda { where(state:"succeeded") }
37
+ scope :failed, lambda { where(state:"failed") }
66
38
 
67
39
  # Runs of {#match} by workspace ID
68
40
  scope :by_workspace, lambda { |workspace_id|
@@ -1,41 +1,23 @@
1
- # A set of {#matches automatic exploitation matches}.
2
1
  class MetasploitDataModels::AutomaticExploitation::MatchSet < ActiveRecord::Base
3
- #
4
- # Associations
5
- #
2
+ attr_accessible :user_id, :workspace_id, :minimum_rank
6
3
 
7
- # Runs of this set of {#matches}.
8
4
  has_many :runs,
9
5
  class_name: "MetasploitDataModels::AutomaticExploitation::Run",
10
6
  inverse_of: :match_set
11
7
 
12
- # Matches in this set.
13
8
  has_many :matches,
14
9
  class_name: "MetasploitDataModels::AutomaticExploitation::Match",
15
10
  inverse_of: :match_set,
16
11
  dependent: :destroy
17
12
 
18
- # User that created this match set.
19
- belongs_to :user,
20
- inverse_of: :automatic_exploitation_match_sets,
21
- class_name: "Mdm::User"
22
-
23
- # Workspace in which this match set exists.
24
13
  belongs_to :workspace,
25
14
  inverse_of: :automatic_exploitation_match_sets,
26
15
  class_name: "Mdm::Workspace"
27
16
 
28
- #
29
- # Mass Assignment Security
30
- #
31
-
32
- attr_accessible :minimum_rank
33
- attr_accessible :user_id
34
- attr_accessible :workspace_id
17
+ belongs_to :user,
18
+ inverse_of: :automatic_exploitation_match_sets,
19
+ class_name: "Mdm::User"
35
20
 
36
- #
37
- # Validations
38
- #
39
21
 
40
22
  validates :user,
41
23
  presence: true
@@ -1,37 +1,27 @@
1
- # Runs a {#match_set set of matches} to produce {#match_results results}.
2
1
  class MetasploitDataModels::AutomaticExploitation::Run < ActiveRecord::Base
2
+ attr_accessible :user_id, :workspace_id, :match_set_id
3
+
3
4
  #
4
- # Associations
5
+ # ASSOCIATIONS
5
6
  #
6
-
7
- # Results of each match in {#match_set}.
8
7
  has_many :match_results,
9
8
  class_name:'MetasploitDataModels::AutomaticExploitation::MatchResult',
10
9
  inverse_of: :run,
11
10
  dependent: :destroy
12
11
 
13
- # Set of matches to run
14
12
  belongs_to :match_set,
15
13
  class_name: 'MetasploitDataModels::AutomaticExploitation::MatchSet',
16
14
  inverse_of: :runs
17
15
 
18
- # User that initiated this run.
19
16
  belongs_to :user,
20
17
  class_name: "Mdm::User",
21
18
  inverse_of: :automatic_exploitation_runs
22
19
 
23
- # Workspace in which this run was performed.
24
20
  belongs_to :workspace,
25
21
  class_name: "Mdm::Workspace",
26
22
  inverse_of: :automatic_exploitation_runs
27
23
 
28
- #
29
- # Mass Assignment Security
30
- #
31
24
 
32
- attr_accessible :match_set_id
33
- attr_accessible :user_id
34
- attr_accessible :workspace_id
35
25
 
36
26
  Metasploit::Concern.run(self)
37
27
  end
@@ -67,7 +67,7 @@ class MetasploitDataModels::IPAddress::V4::Segmented < Metasploit::Model::Base
67
67
  #
68
68
  # @return [Regexp]
69
69
  def self.regexp
70
- unless instance_variable_defined? :@regexp
70
+ unless @regexp
71
71
  separated_segment_count = SEGMENT_COUNT - 1
72
72
 
73
73
  @regexp = %r{
@@ -34,7 +34,7 @@ class MetasploitDataModels::ModuleRun < ActiveRecord::Base
34
34
  # @return [String]
35
35
 
36
36
  # @!attribute [rw] fail_reason
37
- # One of the values of the constants in `Msf::Module::Failure`
37
+ # One of the values of the constants in {Msf::Module::Failure}
38
38
  # @return [String]
39
39
 
40
40
  # @!attribute [rw] module_name
@@ -32,7 +32,7 @@ class MetasploitDataModels::Search::Visitor::Where
32
32
  }
33
33
  end
34
34
 
35
- visit(*EQUALITY_OPERATION_CLASS_NAMES) do |operation|
35
+ visit *EQUALITY_OPERATION_CLASS_NAMES do |operation|
36
36
  attribute = attribute_visitor.visit operation.operator
37
37
 
38
38
  attribute.eq(operation.value)
@@ -1,10 +1,6 @@
1
1
  require "ipaddr"
2
2
 
3
- # Validates that attribute is a valid IPv4 or IPv6 address.
4
3
  class IpFormatValidator < ActiveModel::EachValidator
5
- # Validates that `attribute`'s `value` on `object` is a valid IPv4 or IPv6 address.
6
- #
7
- # @return [void]
8
4
  def validate_each(object, attribute, value)
9
5
  error_message_block = lambda{ object.errors[attribute] << " must be a valid IPv4 or IPv6 address" }
10
6
  begin
@@ -1,21 +1,9 @@
1
1
  # Validates that attribute's value is Array<Array(String, String)> which is the only valid type signature for serialized
2
2
  # parameters.
3
3
  class ParametersValidator < ActiveModel::EachValidator
4
- #
5
- # CONSTANTS
6
- #
7
-
8
4
  # Sentence explaining the valid type signature for parameters.
9
5
  TYPE_SIGNATURE_SENTENCE = 'Valid parameters are an Array<Array(String, String)>.'
10
6
 
11
- #
12
- # Instance Methods
13
- #
14
-
15
- # Validates that `attribute`'s `value` on `record` is `Array<Array(String, String)>` which is the only valid type
16
- # signature for serialized parameters.
17
- #
18
- # @return [void]
19
7
  def validate_each(record, attribute, value)
20
8
  if value.is_a? Array
21
9
  value.each_with_index do |element, index|
@@ -1,21 +1,12 @@
1
- # Validates that
2
1
  class PasswordIsStrongValidator < ActiveModel::EachValidator
3
- #
4
- # CONSTANTS
5
- #
6
-
7
- # Known passwords that should NOT be allowed and should be considered weak.
8
2
  COMMON_PASSWORDS = %w{
9
3
  password pass root admin metasploit
10
4
  msf 123456 qwerty abc123 letmein monkey link182 demo
11
5
  changeme test1234 rapid7
12
6
  }
13
7
 
14
- # Special characters that are considered to strength passwords and are required once in a strong password.
15
8
  SPECIAL_CHARS = %q{!@"#$%&'()*+,-./:;<=>?[\\]^_`{|}~ }
16
9
 
17
- # Validates that the `attribute`'s `value` on `record` contains letters, numbers, and at least one special character
18
- # without containing the `record.username`, any {COMMON_PASSWORDS} or repetition.
19
10
  def validate_each(record, attribute, value)
20
11
  return if value.blank?
21
12
 
@@ -43,7 +34,7 @@ class PasswordIsStrongValidator < ActiveModel::EachValidator
43
34
  end
44
35
 
45
36
  def contains_username?(username, password)
46
- !!(password =~ /#{username}/i)
37
+ password =~ /#{username}/i
47
38
  end
48
39
 
49
40
  def is_common_password?(password)
@@ -185,6 +185,15 @@ module Mdm::Host::OperatingSystemNormalization
185
185
  # Merge and normalize the best match to the host object
186
186
  apply_match_to_host(match) if match
187
187
 
188
+ # Handle cases where the flavor contains the base name (legacy parsing, etc)
189
+ # TODO: Remove this once we are sure it is no longer needed
190
+ if host.os_name && host.os_flavor && host.os_flavor.index(host.os_name)
191
+ dlog("Host #{host.address} has os_flavor that contains os_name")
192
+ dlog("os_flavor: #{host.os_flavor}")
193
+ dlog("os_name: #{host.os_name}")
194
+ host.os_flavor = host.os_flavor.gsub(host.os_name, '').strip
195
+ end
196
+
188
197
  # Set some sane defaults if needed
189
198
  host.os_name ||= 'Unknown'
190
199
  host.purpose ||= 'device'
@@ -192,10 +201,6 @@ module Mdm::Host::OperatingSystemNormalization
192
201
  host.save if host.changed?
193
202
  end
194
203
 
195
- # Recog matches for the `s` service.
196
- #
197
- # @param s [Mdm::Service]
198
- # @return [Array<Hash>] Keys will be host, service, and os attributes
199
204
  def recog_matches_for_service(s)
200
205
  #
201
206
  # We assume that the service.info field contains certain types of probe
@@ -237,9 +242,6 @@ module Mdm::Host::OperatingSystemNormalization
237
242
  matches
238
243
  end
239
244
 
240
- # Recog matches for the fingerprint in `note`.
241
- #
242
- # @return [Array<Hash>] Keys will be host, service, and os attributes
243
245
  def recog_matches_for_note(note)
244
246
  # Skip notes that are missing the correct structure or have been blacklisted
245
247
  return [] if not validate_fingerprint_data(note)
@@ -300,6 +302,7 @@ module Mdm::Host::OperatingSystemNormalization
300
302
  # name collision seems silly.
301
303
  return false
302
304
  else
305
+ dlog("Could not validate fingerprint data: #{fp.inspect}")
303
306
  return false
304
307
  end
305
308
  end
@@ -25,7 +25,6 @@ require 'metasploit_data_models/version'
25
25
 
26
26
  autoload :Mdm, 'mdm'
27
27
 
28
- # Core database models for metasploit-framework.
29
28
  module MetasploitDataModels
30
29
  extend ActiveSupport::Autoload
31
30
 
@@ -38,9 +37,6 @@ module MetasploitDataModels
38
37
  autoload :Search
39
38
  autoload :SerializedPrefs
40
39
 
41
- # The root directory of `metasploit_data_models` gem in both development and gem installs.
42
- #
43
- # @return [Pathname]
44
40
  def self.root
45
41
  unless instance_variable_defined? :@root
46
42
  lib_pathname = Pathname.new(__FILE__).dirname
@@ -1,7 +1,5 @@
1
1
  require 'rails'
2
2
 
3
- # `Rails::Engine` that exposes MetasploitDataModel's `ActiveRecord::Base` subclasses and automatically loads its
4
- # `FactoryGirl` factories, sequences, and traits.
5
3
  class MetasploitDataModels::Engine < Rails::Engine
6
4
  # @see http://viget.com/extend/rails-engine-testing-with-rspec-capybara-and-factorygirl
7
5
  config.generators do |g|
@@ -1,10 +1,4 @@
1
- # Allows attributes to be extracted and written to key of serialized `Hash` `prefs`.
2
1
  module MetasploitDataModels::SerializedPrefs
3
- # Setup each arg in `args` as the name of an attribute embedded in the `prefs` `Hash`. Defines `#<arg>` and
4
- # `#<arg>=(value)` methods like standard `attr_accessor`.
5
- #
6
- # @param args [Array<Symbol>] The names of the attributes to store in the `prefs` `Hash`.
7
- # @return [void]
8
2
  def serialized_prefs_attr_accessor(*args)
9
3
  args.each do |method_name|
10
4
 
@@ -1,29 +1,18 @@
1
1
  module MetasploitDataModels
2
2
  # Holds components of {VERSION} as defined by {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0}.
3
3
  module Version
4
- #
5
- # CONSTANTS
6
- #
7
-
8
4
  # The major version number.
9
5
  MAJOR = 0
10
6
  # The minor version number, scoped to the {MAJOR} version number.
11
7
  MINOR = 24
12
- # The patch version number, scoped to the {MAJOR} and {MINOR} version numbers.
13
- PATCH = 4
14
-
15
- #
16
- # Module Methods
17
- #
8
+ # The patch number, scoped to the {MAJOR} and {MINOR} version numbers.
9
+ PATCH = 5
18
10
 
19
- # The full version string, including the {MetasploitDataModels::Version::MAJOR},
20
- # {MetasploitDataModels::Version::MINOR}, {MetasploitDataModels::Version::PATCH}, and optionally, the
21
- # `MetasploitDataModels::Version::PRERELEASE` in the
11
+ # The full version string, including the {MAJOR}, {MINOR}, {PATCH}, and optionally, the `PRERELEASE` in the
22
12
  # {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
23
13
  #
24
- # @return [String] '{MetasploitDataModels::Version::MAJOR}.{MetasploitDataModels::Version::MINOR}.{MetasploitDataModels::Version::PATCH}'
25
- # on master. '{MetasploitDataModels::Version::MAJOR}.{MetasploitDataModels::Version::MINOR}.{MetasploitDataModels::Version::PATCH}-PRERELEASE'
26
- # on any branch other than master.
14
+ # @return [String] '{MAJOR}.{MINOR}.{PATCH}' on master. '{MAJOR}.{MINOR}.{PATCH}-PRERELEASE' on any branch
15
+ # other than master.
27
16
  def self.full
28
17
  version = "#{MAJOR}.#{MINOR}.#{PATCH}"
29
18
 
@@ -34,22 +23,19 @@ module MetasploitDataModels
34
23
  version
35
24
  end
36
25
 
37
- # The full gem version string, including the {MetasploitDataModels::Version::MAJOR},
38
- # {MetasploitDataModels::Version::MINOR}, {MetasploitDataModels::Version::PATCH}, and optionally, the
39
- # `MetasploitDataModels::Version::PRERELEASE` in the
26
+ # The full gem version string, including the {MAJOR}, {MINOR}, {PATCH}, and optionally, the {PRERELEASE} in the
40
27
  # {http://guides.rubygems.org/specification-reference/#version RubyGems versioning} format.
41
28
  #
42
- # @return [String] '{MetasploitDataModels::Version::MAJOR}.{MetasploitDataModels::Version::MINOR}.{MetasploitDataModels::Version::PATCH}'
43
- # on master. '{MetasploitDataModels::Version::MAJOR}.{MetasploitDataModels::Version::MINOR}.{MetasploitDataModels::Version::PATCH}.PRERELEASE'
44
- # on any branch other than master.
29
+ # @return [String] '{MAJOR}.{MINOR}.{PATCH}' on master. '{MAJOR}.{MINOR}.{PATCH}.{PRERELEASE}' on any branch
30
+ # other than master.
45
31
  def self.gem
46
32
  full.gsub('-', '.pre.')
47
33
  end
48
34
  end
49
35
 
50
- # (see Version.gem)
36
+ # @see Version.gem
51
37
  GEM_VERSION = Version.gem
52
38
 
53
- # (see Version.full)
39
+ # @see Version.full
54
40
  VERSION = Version.full
55
41
  end