metasploit_data_models 0.17.0 → 0.17.1

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 (42) hide show
  1. checksums.yaml +15 -0
  2. data/.yardopts +1 -1
  3. data/Gemfile +6 -1
  4. data/app/models/mdm/client.rb +3 -1
  5. data/app/models/mdm/cred.rb +7 -2
  6. data/app/models/mdm/event.rb +7 -2
  7. data/app/models/mdm/exploit_attempt.rb +43 -2
  8. data/app/models/mdm/exploited_host.rb +7 -2
  9. data/app/models/mdm/host.rb +85 -49
  10. data/app/models/mdm/host_detail.rb +4 -1
  11. data/app/models/mdm/host_tag.rb +41 -3
  12. data/app/models/mdm/listener.rb +7 -2
  13. data/app/models/mdm/loot.rb +25 -3
  14. data/app/models/mdm/nexpose_console.rb +13 -0
  15. data/app/models/mdm/note.rb +10 -3
  16. data/app/models/mdm/ref.rb +4 -2
  17. data/app/models/mdm/route.rb +7 -1
  18. data/app/models/mdm/service.rb +71 -28
  19. data/app/models/mdm/session.rb +28 -3
  20. data/app/models/mdm/session_event.rb +3 -1
  21. data/app/models/mdm/tag.rb +29 -10
  22. data/app/models/mdm/task.rb +56 -17
  23. data/app/models/mdm/task_cred.rb +7 -3
  24. data/app/models/mdm/task_host.rb +7 -3
  25. data/app/models/mdm/task_service.rb +7 -3
  26. data/app/models/mdm/task_session.rb +7 -2
  27. data/app/models/mdm/user.rb +9 -2
  28. data/app/models/mdm/vuln.rb +27 -7
  29. data/app/models/mdm/vuln_attempt.rb +37 -2
  30. data/app/models/mdm/vuln_detail.rb +9 -1
  31. data/app/models/mdm/vuln_ref.rb +7 -2
  32. data/app/models/mdm/web_form.rb +3 -1
  33. data/app/models/mdm/web_page.rb +3 -1
  34. data/app/models/mdm/web_site.rb +19 -4
  35. data/app/models/mdm/web_vuln.rb +3 -1
  36. data/lib/metasploit_data_models/version.rb +1 -1
  37. data/lib/tasks/yard.rake +7 -0
  38. data/metasploit_data_models.gemspec +3 -1
  39. data/spec/app/models/mdm/host_spec.rb +0 -67
  40. data/spec/app/models/mdm/host_tag_spec.rb +38 -7
  41. data/spec/app/models/mdm/tag_spec.rb +5 -23
  42. metadata +11 -27
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YzgwYmExOTgyYjQyMTk5YzVlYjM0MWI2ZGEzNmQ5ZDU2NTQ3ZGI5Yw==
5
+ data.tar.gz: !binary |-
6
+ MzcxMjM2YmVkOTE4OWIwODRjYjE2NjIyMDMyZDBmY2I3OWQzYWZlNg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ODM4ZTQwMzc4MWNlNTIzM2Q4ZjY1OTU1ZGQ3MGViNTg5MzBlZjc1YjE3MGZl
10
+ YTkxYjdlNzY3MmQyZTU2Y2NlNmJlNmNkN2U3OWY5ZWUxMGI1ZTIyMWRlYmU3
11
+ YmVhNDZjMjc0MTA3MWJlOGQ1ZTY5NjFjYWI3MTlkYmNkYjVlNmI=
12
+ data.tar.gz: !binary |-
13
+ ZGI0M2RlMDNlNzhhYjA5ZWUyOTJmNDIyNDZhYzIwNGI3ODAzN2I0NjkzMWYy
14
+ MTc3N2U1MWQxYzc4ZThjYTRhYmJhMTBjY2MyMzJmN2FjNzEzNDBjMmU2MDdk
15
+ ZWQ5YThhMDdiZDk5MGFhNzUxMjNhYjhiZDYxYTdjYTFhNzEzMTk=
data/.yardopts CHANGED
@@ -1,4 +1,4 @@
1
1
  --markup markdown
2
+ --plugin yard-metasploit-erd
2
3
  --protected
3
4
  {app,lib}/**/*.rb
4
- db/migrate/*.rb
data/Gemfile CHANGED
@@ -3,6 +3,11 @@ source "http://rubygems.org"
3
3
  # Specify your gem's dependencies in metasploit_data_models.gemspec
4
4
  gemspec
5
5
 
6
+ group :development do
7
+ # embed ERDs on index, namespace Module and Class<ActiveRecord::Base> pages
8
+ gem 'yard-metasploit-erd', '~> 0.0.2'
9
+ end
10
+
6
11
  # used by dummy application
7
12
  group :development, :test do
8
13
  # supplies factories for producing model instance for specs
@@ -12,7 +17,7 @@ group :development, :test do
12
17
  gem 'factory_girl_rails'
13
18
  # rails is only used for the dummy application in spec/dummy
14
19
  # restrict from rails 4.0 as it requires protected_attributes gem and other changes for compatibility
15
- # @see https://www.pivotaltracker.com/story/show/52309083
20
+ # @see MSP-2971
16
21
  gem 'rails', '>= 3.2', '< 4.0.0'
17
22
  # Used to create fake data
18
23
  gem "faker"
@@ -2,7 +2,9 @@ class Mdm::Client < ActiveRecord::Base
2
2
  #
3
3
  # Relations
4
4
  #
5
- belongs_to :host, :class_name => 'Mdm::Host'
5
+ belongs_to :host,
6
+ class_name: 'Mdm::Host',
7
+ inverse_of: :clients
6
8
 
7
9
  ActiveSupport.run_load_hooks(:mdm_client, self)
8
10
  end
@@ -19,13 +19,18 @@ class Mdm::Cred < ActiveRecord::Base
19
19
  # The service this cred is for
20
20
  #
21
21
  # @return [Mdm::Service]
22
- belongs_to :service, :class_name => "Mdm::Service"
22
+ belongs_to :service,
23
+ class_name: 'Mdm::Service',
24
+ inverse_of: :creds
23
25
 
24
26
  # @!attribute [rw] task_creds
25
27
  # Details about what Tasks touched this cred
26
28
  #
27
29
  # @return [Array<Mdm::TaskCred>]
28
- has_many :task_creds, :dependent => :destroy, :class_name => "Mdm::TaskCred"
30
+ has_many :task_creds,
31
+ class_name: 'Mdm::TaskCred',
32
+ dependent: :destroy,
33
+ inverse_of: :cred
29
34
 
30
35
  # @!attribute [rw] tasks
31
36
  # Tasks that touched this service
@@ -3,8 +3,13 @@ class Mdm::Event < ActiveRecord::Base
3
3
  # Relations
4
4
  #
5
5
 
6
- belongs_to :host, :class_name => 'Mdm::Host'
7
- belongs_to :workspace, :class_name => 'Mdm::Workspace'
6
+ belongs_to :host,
7
+ class_name: 'Mdm::Host',
8
+ inverse_of: :events
9
+
10
+ belongs_to :workspace,
11
+ class_name: 'Mdm::Workspace',
12
+ inverse_of: :events
8
13
 
9
14
  #
10
15
  # Scopes
@@ -1,8 +1,49 @@
1
1
  class Mdm::ExploitAttempt < ActiveRecord::Base
2
2
  #
3
- # Relations
3
+ # Associations
4
4
  #
5
- belongs_to :host, :class_name => 'Mdm::Host', :counter_cache => :exploit_attempt_count
5
+
6
+ # @!attribute host
7
+ # Host that was attempted to be exploited.
8
+ #
9
+ # @return [Mdm::Host]
10
+ belongs_to :host,
11
+ class_name: 'Mdm::Host',
12
+ counter_cache: :exploit_attempt_count,
13
+ inverse_of: :exploit_attempts
14
+
15
+ # @!attribute loot
16
+ # Loot gathers from the successful exploit.
17
+ #
18
+ # @return [Mdm::Loot, nil]
19
+ belongs_to :loot,
20
+ class_name: 'Mdm::Loot',
21
+ inverse_of: :exploit_attempt
22
+
23
+ # @!attribute service
24
+ # The service being exploited on {#host}.
25
+ #
26
+ # @return [Mdm::Service, nil]
27
+ belongs_to :service,
28
+ class_name: 'Mdm::Service',
29
+ inverse_of: :exploit_attempts
30
+
31
+ # @!attribute session
32
+ # The session that was established when this attempt was successful.
33
+ #
34
+ # @return [Mdm::Session]
35
+ # @return [nil] if session was not established.
36
+ belongs_to :session,
37
+ class_name: 'Mdm::Session',
38
+ inverse_of: :exploit_attempt
39
+
40
+ # @!attribute vuln
41
+ # The vulnerability that was attempted to be exploited.
42
+ #
43
+ # @return [Mdm::Vuln, nil]
44
+ belongs_to :vuln,
45
+ class_name: 'Mdm::Vuln',
46
+ inverse_of: :exploit_attempts
6
47
 
7
48
  #
8
49
  # Validations
@@ -3,8 +3,13 @@ class Mdm::ExploitedHost < ActiveRecord::Base
3
3
  # Relations
4
4
  #
5
5
 
6
- belongs_to :host, :class_name => 'Mdm::Host'
7
- belongs_to :service, :class_name => 'Mdm::Service'
6
+ belongs_to :host,
7
+ class_name: 'Mdm::Host',
8
+ inverse_of: :exploited_hosts
9
+
10
+ belongs_to :service,
11
+ class_name: 'Mdm::Service',
12
+ inverse_of: :exploited_hosts
8
13
 
9
14
  ActiveSupport.run_load_hooks(:mdm_exploited_host, self)
10
15
  end
@@ -57,83 +57,122 @@ class Mdm::Host < ActiveRecord::Base
57
57
  # Users connected to this host
58
58
  #
59
59
  # @return [Array<Mdm::Client>]
60
- has_many :clients, class_name: 'Mdm::Client', dependent: :destroy
60
+ has_many :clients,
61
+ class_name: 'Mdm::Client',
62
+ dependent: :destroy,
63
+ inverse_of: :host
64
+
65
+ # @!attribute events
66
+ # Events that occurred on this host.
67
+ #
68
+ # @return [ActiveRecord::Relation<Mdm::Event>]
69
+ has_many :events,
70
+ class_name: 'Mdm::Event',
71
+ dependent: :destroy,
72
+ inverse_of: :host
61
73
 
62
74
  # @!attribute [rw] task_hosts
63
75
  # Details about what Tasks touched this host
64
76
  #
65
77
  # @return [Array<Mdm::TaskHost>]
66
- has_many :task_hosts, :dependent => :destroy, :class_name => 'Mdm::TaskHost'
67
-
68
- # @!attribute [rw] tasks
69
- # Tasks that touched this service
70
- #
71
- # @return [Array<Mdm::Task>]
72
- has_many :tasks, :through => :task_hosts, :class_name => 'Mdm::Task'
78
+ has_many :task_hosts,
79
+ class_name: 'Mdm::TaskHost',
80
+ dependent: :destroy,
81
+ inverse_of: :host
73
82
 
74
83
  # @!attribute [rw] exploit_attempts
75
84
  # Attempts to run exploits against this host.
76
85
  #
77
86
  # @return [Array<Mdm::ExploitAttempt]
78
87
  has_many :exploit_attempts,
79
- :class_name => 'Mdm::ExploitAttempt',
80
- :dependent => :destroy
81
-
82
- # @!attribute [rw] exploited_hosts
83
- # @todo https://www.pivotaltracker.com/story/show/48993731
84
- # @return [Array<Mdm::ExploitedHost>]
85
- has_many :exploited_hosts, :class_name => 'Mdm::ExploitedHost', :dependent => :destroy
88
+ class_name: 'Mdm::ExploitAttempt',
89
+ dependent: :destroy,
90
+ inverse_of: :host
91
+
92
+ # @!attribute exploited_hosts
93
+ # @todo MSP-2732
94
+ # @return [ActiveRecord::Relation<Mdm::ExploitedHost>]
95
+ has_many :exploited_hosts,
96
+ class_name: 'Mdm::ExploitedHost',
97
+ dependent: :destroy,
98
+ inverse_of: :host
86
99
 
87
100
  # @!attribute [rw] host_details
88
101
  # @return [Array<Mdm::HostDetail>]
89
- has_many :host_details, :class_name => 'Mdm::HostDetail', :dependent => :destroy
102
+ has_many :host_details,
103
+ class_name: 'Mdm::HostDetail',
104
+ dependent: :destroy,
105
+ inverse_of: :host
90
106
 
91
- # @!attribute [rw] hosts_tags
107
+ # @!attribute hosts_tags
92
108
  # A join model between {Mdm::Tag} and {Mdm::Host}. Use {#tags} to get the actual {Mdm::Tag Mdm::Tags} on this host.
93
- # {#hosts_tags} are cleaned up in a before_destroy: {#cleanup_tags}.
94
109
  #
95
- # @todo https://www.pivotaltracker.com/story/show/48923201
96
- # @return [Array<Mdm::HostTag>]
97
- has_many :hosts_tags, :class_name => 'Mdm::HostTag'
110
+ # @todo MSP-2723
111
+ # @return [ActiveRecord::Relation<Mdm::HostTag>]
112
+ has_many :hosts_tags,
113
+ class_name: 'Mdm::HostTag',
114
+ dependent: :destroy,
115
+ inverse_of: :host
98
116
 
99
- # @!attribute [rw] loots
117
+ # @!attribute loots
100
118
  # Loot gathered from the host with {Mdm::Loot#created_at newest loot} first.
101
119
  #
102
- # @todo https://www.pivotaltracker.com/story/show/48991525
103
- # @return [Array<Mdm::Loot>]
104
- has_many :loots, :class_name => 'Mdm::Loot', :dependent => :destroy, :order => 'loots.created_at DESC'
120
+ # @todo MSP-3065
121
+ # @return [ActiveRecord::Relation<Mdm::Loot>]
122
+ has_many :loots,
123
+ class_name: 'Mdm::Loot',
124
+ dependent: :destroy,
125
+ inverse_of: :host,
126
+ order: 'loots.created_at DESC'
105
127
 
106
128
  # @!attribute [rw] notes
107
129
  # Notes about the host entered by a user with {Mdm::Note#created_at oldest notes} first.
108
130
  #
109
131
  # @return [Array<Mdm::Note>]
110
- has_many :notes, :class_name => 'Mdm::Note', :dependent => :delete_all, :order => 'notes.created_at'
132
+ has_many :notes,
133
+ class_name: 'Mdm::Note',
134
+ inverse_of: :host,
135
+ dependent: :delete_all,
136
+ order: 'notes.created_at'
111
137
 
112
138
  # @!attribute [rw] services
113
139
  # The services running on {Mdm::Service#port ports} on the host with services ordered by {Mdm::Service#port port}
114
140
  # and {Mdm::Service#proto protocol}.
115
141
  #
116
142
  # @return [Array<Mdm::Service>]
117
- has_many :services, :class_name => 'Mdm::Service', :dependent => :destroy, :order => 'services.port, services.proto'
143
+ has_many :services,
144
+ class_name: 'Mdm::Service',
145
+ dependent: :destroy,
146
+ inverse_of: :host,
147
+ order: 'services.port, services.proto'
118
148
 
119
149
  # @!attribute [rw] sessions
120
150
  # Sessions that are open or previously were open on the host ordered by {Mdm::Session#opened_at when the session was
121
151
  # opened}
122
152
  #
123
153
  # @return [Array<Mdm::Session]
124
- has_many :sessions, :class_name => 'Mdm::Session', :dependent => :destroy, :order => 'sessions.opened_at'
154
+ has_many :sessions,
155
+ class_name: 'Mdm::Session',
156
+ dependent: :destroy,
157
+ inverse_of: :host,
158
+ order: 'sessions.opened_at'
125
159
 
126
160
  # @!attribute [rw] vulns
127
161
  # Vulnerabilities found on the host.
128
162
  #
129
163
  # @return [Array<Mdm::Vuln>]
130
- has_many :vulns, :class_name => 'Mdm::Vuln', :dependent => :delete_all
164
+ has_many :vulns,
165
+ class_name: 'Mdm::Vuln',
166
+ dependent: :delete_all,
167
+ inverse_of: :host
131
168
 
132
169
  # @!attribute [rw] workspace
133
170
  # The workspace in which this host was found.
134
171
  #
135
172
  # @return [Mdm::Workspace]
136
- belongs_to :workspace, :class_name => 'Mdm::Workspace'
173
+ belongs_to :workspace,
174
+ class_name: 'Mdm::Workspace',
175
+ inverse_of: :hosts
137
176
 
138
177
  #
139
178
  # Through host_tags
@@ -162,7 +201,10 @@ class Mdm::Host < ActiveRecord::Base
162
201
  #
163
202
  # @return [Array<Mdm::Note>]
164
203
  # @see #services
165
- has_many :service_notes, :class_name => 'Mdm::Note', :through => :services
204
+ has_many :service_notes,
205
+ class_name: 'Mdm::Note',
206
+ source: :notes,
207
+ through: :services
166
208
 
167
209
  # @!attribute [r] web_sites
168
210
  # {Mdm::WebSite Web sites} running on top of {#services} on this host.
@@ -171,6 +213,18 @@ class Mdm::Host < ActiveRecord::Base
171
213
  # @see services
172
214
  has_many :web_sites, :class_name => 'Mdm::WebSite', :through => :services
173
215
 
216
+ #
217
+ # through: :task_hosts
218
+ #
219
+
220
+ # @!attribute tasks
221
+ # Tasks that touched this service
222
+ #
223
+ # @return [ActiveRecord::Relation<Mdm::Task>]
224
+ has_many :tasks,
225
+ class_name: 'Mdm::Task',
226
+ through: :task_hosts
227
+
174
228
  #
175
229
  # Through vulns
176
230
  #
@@ -351,12 +405,6 @@ class Mdm::Host < ActiveRecord::Base
351
405
  #
352
406
  # @return [Integer]
353
407
 
354
- #
355
- # Callbacks
356
- #
357
-
358
- before_destroy :cleanup_tags
359
-
360
408
  #
361
409
  # Nested Attributes
362
410
  # @note Must be declared after relations being referenced.
@@ -423,18 +471,6 @@ class Mdm::Host < ActiveRecord::Base
423
471
  n && n.data[:locked]
424
472
  end
425
473
 
426
- # Destroys any {Mdm::Tag Mdm::Tags} that will have no {Mdm::Tag#hosts} left after this host is deleted.
427
- #
428
- # @return [void]
429
- def cleanup_tags
430
- # No need to keep tags with no hosts
431
- tags.each do |tag|
432
- tag.destroy if tag.hosts == [self]
433
- end
434
- # Clean up association table records
435
- Mdm::HostTag.delete_all("host_id = #{self.id}")
436
- end
437
-
438
474
  # This is replicated by the IpAddressValidator class. Had to put it here as well to avoid
439
475
  # SQL errors when checking address uniqueness.
440
476
  #
@@ -3,7 +3,10 @@ class Mdm::HostDetail < ActiveRecord::Base
3
3
  # Relations
4
4
  #
5
5
 
6
- belongs_to :host, :class_name => 'Mdm::Host', :counter_cache => :host_detail_count
6
+ belongs_to :host,
7
+ class_name: 'Mdm::Host',
8
+ counter_cache: :host_detail_count,
9
+ inverse_of: :host_details
7
10
 
8
11
  #
9
12
  # Validations
@@ -2,11 +2,49 @@ class Mdm::HostTag < ActiveRecord::Base
2
2
  self.table_name = "hosts_tags"
3
3
 
4
4
  #
5
- # Relations
5
+ # Associations
6
6
  #
7
7
 
8
- belongs_to :host, :class_name => 'Mdm::Host'
9
- belongs_to :tag, :class_name => 'Mdm::Tag'
8
+ # @!attribute host
9
+ # Host with {#tag}.
10
+ #
11
+ # @todo MSP-2723
12
+ # @return [Mdm::Host]
13
+ belongs_to :host,
14
+ class_name: 'Mdm::Host',
15
+ inverse_of: :hosts_tags
16
+
17
+ # @!attribute tag
18
+ # Tag on {#host}.
19
+ #
20
+ # @todo MSP-2723
21
+ # @return [Mdm::Tag]
22
+ belongs_to :tag,
23
+ class_name: 'Mdm::Tag',
24
+ inverse_of: :hosts_tags
25
+
26
+ #
27
+ # Callbacks
28
+ #
29
+
30
+ # @see http://stackoverflow.com/a/11694704
31
+ after_destroy :destroy_orphan_tag
32
+
33
+ #
34
+ # Instance Methods
35
+ #
36
+
37
+ private
38
+
39
+ # Destroys {#tag} if it is orphaned
40
+ #
41
+ # @see http://stackoverflow.com/a/11694704
42
+ # @return [void]
43
+ def destroy_orphan_tag
44
+ tag.destroy_if_orphaned
45
+ end
46
+
47
+ public
10
48
 
11
49
  ActiveSupport.run_load_hooks(:mdm_host_tag, self)
12
50
  end
@@ -3,8 +3,13 @@ class Mdm::Listener < ActiveRecord::Base
3
3
  # Relations
4
4
  #
5
5
 
6
- belongs_to :task, :class_name => 'Mdm::Task'
7
- belongs_to :workspace, :class_name => 'Mdm::Workspace'
6
+ belongs_to :task,
7
+ class_name: 'Mdm::Task',
8
+ inverse_of: :listeners
9
+
10
+ belongs_to :workspace,
11
+ class_name: 'Mdm::Workspace',
12
+ inverse_of: :listeners
8
13
 
9
14
  #
10
15
  # Serializations