metasploit_data_models 0.7.0-java

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 (214) hide show
  1. data/.gitignore +24 -0
  2. data/.rspec +3 -0
  3. data/.simplecov +38 -0
  4. data/.travis.yml +6 -0
  5. data/.yardopts +4 -0
  6. data/Gemfile +27 -0
  7. data/LICENSE +27 -0
  8. data/README.md +72 -0
  9. data/Rakefile +53 -0
  10. data/app/models/mdm/api_key.rb +20 -0
  11. data/app/models/mdm/client.rb +9 -0
  12. data/app/models/mdm/cred.rb +93 -0
  13. data/app/models/mdm/event.rb +30 -0
  14. data/app/models/mdm/exploit_attempt.rb +14 -0
  15. data/app/models/mdm/exploited_host.rb +11 -0
  16. data/app/models/mdm/host.rb +134 -0
  17. data/app/models/mdm/host_detail.rb +15 -0
  18. data/app/models/mdm/host_tag.rb +13 -0
  19. data/app/models/mdm/imported_cred.rb +10 -0
  20. data/app/models/mdm/listener.rb +24 -0
  21. data/app/models/mdm/loot.rb +63 -0
  22. data/app/models/mdm/macro.rb +20 -0
  23. data/app/models/mdm/mod_ref.rb +3 -0
  24. data/app/models/mdm/module_action.rb +24 -0
  25. data/app/models/mdm/module_arch.rb +24 -0
  26. data/app/models/mdm/module_author.rb +25 -0
  27. data/app/models/mdm/module_detail.rb +59 -0
  28. data/app/models/mdm/module_mixin.rb +24 -0
  29. data/app/models/mdm/module_platform.rb +24 -0
  30. data/app/models/mdm/module_ref.rb +24 -0
  31. data/app/models/mdm/module_target.rb +26 -0
  32. data/app/models/mdm/nexpose_console.rb +20 -0
  33. data/app/models/mdm/note.rb +49 -0
  34. data/app/models/mdm/profile.rb +9 -0
  35. data/app/models/mdm/ref.rb +14 -0
  36. data/app/models/mdm/report.rb +50 -0
  37. data/app/models/mdm/report_template.rb +27 -0
  38. data/app/models/mdm/route.rb +9 -0
  39. data/app/models/mdm/service.rb +56 -0
  40. data/app/models/mdm/session.rb +48 -0
  41. data/app/models/mdm/session_event.rb +9 -0
  42. data/app/models/mdm/tag.rb +46 -0
  43. data/app/models/mdm/task.rb +41 -0
  44. data/app/models/mdm/user.rb +25 -0
  45. data/app/models/mdm/vuln.rb +60 -0
  46. data/app/models/mdm/vuln_attempt.rb +15 -0
  47. data/app/models/mdm/vuln_detail.rb +14 -0
  48. data/app/models/mdm/vuln_ref.rb +13 -0
  49. data/app/models/mdm/web_form.rb +16 -0
  50. data/app/models/mdm/web_page.rb +16 -0
  51. data/app/models/mdm/web_site.rb +47 -0
  52. data/app/models/mdm/web_vuln.rb +190 -0
  53. data/app/models/mdm/wmap_request.rb +3 -0
  54. data/app/models/mdm/wmap_target.rb +3 -0
  55. data/app/models/mdm/workspace.rb +196 -0
  56. data/bin/mdm_console +68 -0
  57. data/console_db.yml +9 -0
  58. data/db/migrate/000_create_tables.rb +79 -0
  59. data/db/migrate/001_add_wmap_tables.rb +35 -0
  60. data/db/migrate/002_add_workspaces.rb +36 -0
  61. data/db/migrate/003_move_notes.rb +20 -0
  62. data/db/migrate/004_add_events_table.rb +16 -0
  63. data/db/migrate/005_expand_info.rb +58 -0
  64. data/db/migrate/006_add_timestamps.rb +26 -0
  65. data/db/migrate/007_add_loots.rb +20 -0
  66. data/db/migrate/008_create_users.rb +16 -0
  67. data/db/migrate/009_add_loots_ctype.rb +10 -0
  68. data/db/migrate/010_add_alert_fields.rb +16 -0
  69. data/db/migrate/011_add_reports.rb +19 -0
  70. data/db/migrate/012_add_tasks.rb +24 -0
  71. data/db/migrate/013_add_tasks_result.rb +10 -0
  72. data/db/migrate/014_add_loots_fields.rb +12 -0
  73. data/db/migrate/015_rename_user.rb +16 -0
  74. data/db/migrate/016_add_host_purpose.rb +10 -0
  75. data/db/migrate/017_expand_info2.rb +58 -0
  76. data/db/migrate/018_add_workspace_user_info.rb +29 -0
  77. data/db/migrate/019_add_workspace_desc.rb +23 -0
  78. data/db/migrate/020_add_user_preferences.rb +11 -0
  79. data/db/migrate/021_standardize_info_and_data.rb +18 -0
  80. data/db/migrate/022_enlarge_event_info.rb +10 -0
  81. data/db/migrate/023_add_report_downloaded_at.rb +10 -0
  82. data/db/migrate/024_convert_service_info_to_text.rb +12 -0
  83. data/db/migrate/025_add_user_admin.rb +19 -0
  84. data/db/migrate/026_add_creds_table.rb +19 -0
  85. data/db/migrate/20100819123300_migrate_cred_data.rb +154 -0
  86. data/db/migrate/20100824151500_add_exploited_table.rb +16 -0
  87. data/db/migrate/20100908001428_add_owner_to_workspaces.rb +9 -0
  88. data/db/migrate/20100911122000_add_report_templates.rb +18 -0
  89. data/db/migrate/20100916151530_require_admin_flag.rb +15 -0
  90. data/db/migrate/20100916175000_add_campaigns_and_templates.rb +61 -0
  91. data/db/migrate/20100920012100_add_generate_exe_column.rb +8 -0
  92. data/db/migrate/20100926214000_add_template_prefs.rb +11 -0
  93. data/db/migrate/20101001000000_add_web_tables.rb +57 -0
  94. data/db/migrate/20101002000000_add_query.rb +10 -0
  95. data/db/migrate/20101007000000_add_vuln_info.rb +15 -0
  96. data/db/migrate/20101008111800_add_clients_to_campaigns.rb +10 -0
  97. data/db/migrate/20101009023300_add_campaign_attachments.rb +15 -0
  98. data/db/migrate/20101104135100_add_imported_creds.rb +17 -0
  99. data/db/migrate/20101203000000_fix_web_tables.rb +34 -0
  100. data/db/migrate/20101203000001_expand_host_comment.rb +12 -0
  101. data/db/migrate/20101206212033_add_limit_to_network_to_workspaces.rb +9 -0
  102. data/db/migrate/20110112154300_add_module_uuid_to_tasks.rb +9 -0
  103. data/db/migrate/20110204112800_add_host_tags.rb +28 -0
  104. data/db/migrate/20110317144932_add_session_table.rb +110 -0
  105. data/db/migrate/20110414180600_add_local_id_to_session_table.rb +11 -0
  106. data/db/migrate/20110415175705_add_routes_table.rb +18 -0
  107. data/db/migrate/20110422000000_convert_binary.rb +73 -0
  108. data/db/migrate/20110425095900_add_last_seen_to_sessions.rb +8 -0
  109. data/db/migrate/20110513143900_track_successful_exploits.rb +31 -0
  110. data/db/migrate/20110517160800_rename_and_prune_nessus_vulns.rb +26 -0
  111. data/db/migrate/20110527000000_add_task_id_to_reports_table.rb +11 -0
  112. data/db/migrate/20110527000001_add_api_keys_table.rb +12 -0
  113. data/db/migrate/20110606000001_add_macros_table.rb +16 -0
  114. data/db/migrate/20110622000000_add_settings_to_tasks_table.rb +12 -0
  115. data/db/migrate/20110624000001_add_listeners_table.rb +19 -0
  116. data/db/migrate/20110625000001_add_macro_to_listeners_table.rb +12 -0
  117. data/db/migrate/20110630000001_add_nexpose_consoles_table.rb +21 -0
  118. data/db/migrate/20110630000002_add_name_to_nexpose_consoles_table.rb +12 -0
  119. data/db/migrate/20110717000001_add_profiles_table.rb +15 -0
  120. data/db/migrate/20110727163801_expand_cred_ptype_column.rb +9 -0
  121. data/db/migrate/20110730000001_add_initial_indexes.rb +85 -0
  122. data/db/migrate/20110812000001_prune_indexes.rb +23 -0
  123. data/db/migrate/20110922000000_expand_notes.rb +9 -0
  124. data/db/migrate/20110928101300_add_mod_ref_table.rb +17 -0
  125. data/db/migrate/20111011110000_add_display_name_to_reports_table.rb +24 -0
  126. data/db/migrate/20111203000000_inet_columns.rb +13 -0
  127. data/db/migrate/20111204000000_more_inet_columns.rb +17 -0
  128. data/db/migrate/20111210000000_add_scope_to_hosts.rb +9 -0
  129. data/db/migrate/20120126110000_add_virtual_host_to_hosts.rb +9 -0
  130. data/db/migrate/20120411173220_rename_workspace_members.rb +9 -0
  131. data/db/migrate/20120601152442_add_counter_caches_to_hosts.rb +21 -0
  132. data/db/migrate/20120625000000_add_vuln_details.rb +34 -0
  133. data/db/migrate/20120625000001_add_host_details.rb +16 -0
  134. data/db/migrate/20120625000002_expand_details.rb +16 -0
  135. data/db/migrate/20120625000003_expand_details2.rb +24 -0
  136. data/db/migrate/20120625000004_add_vuln_attempts.rb +19 -0
  137. data/db/migrate/20120625000005_add_vuln_and_host_counter_caches.rb +14 -0
  138. data/db/migrate/20120625000006_add_module_details.rb +118 -0
  139. data/db/migrate/20120625000007_add_exploit_attempts.rb +26 -0
  140. data/db/migrate/20120625000008_add_fail_message.rb +12 -0
  141. data/db/migrate/20120718202805_add_owner_and_payload_to_web_vulns.rb +13 -0
  142. data/db/migrate/20130228214900_change_required_columns_to_null_false_in_web_vulns.rb +35 -0
  143. data/db/migrate/20130423211152_add_creds_counter_cache.rb +24 -0
  144. data/lib/mdm.rb +12 -0
  145. data/lib/mdm/host/operating_system_normalization.rb +984 -0
  146. data/lib/metasploit_data_models.rb +60 -0
  147. data/lib/metasploit_data_models/base64_serializer.rb +103 -0
  148. data/lib/metasploit_data_models/engine.rb +23 -0
  149. data/lib/metasploit_data_models/serialized_prefs.rb +23 -0
  150. data/lib/metasploit_data_models/validators/ip_format_validator.rb +13 -0
  151. data/lib/metasploit_data_models/validators/password_is_strong_validator.rb +70 -0
  152. data/lib/metasploit_data_models/version.rb +8 -0
  153. data/lib/tasks/yard.rake +26 -0
  154. data/metasploit_data_models.gemspec +54 -0
  155. data/script/rails +8 -0
  156. data/spec/app/models/mdm/module_action_spec.rb +38 -0
  157. data/spec/app/models/mdm/module_arch_spec.rb +38 -0
  158. data/spec/app/models/mdm/module_author_spec.rb +50 -0
  159. data/spec/app/models/mdm/module_detail_spec.rb +291 -0
  160. data/spec/app/models/mdm/module_mixin_spec.rb +38 -0
  161. data/spec/app/models/mdm/module_platform_spec.rb +38 -0
  162. data/spec/app/models/mdm/module_ref_spec.rb +38 -0
  163. data/spec/app/models/mdm/module_target_spec.rb +41 -0
  164. data/spec/app/models/mdm/web_vuln_spec.rb +126 -0
  165. data/spec/dummy/Rakefile +7 -0
  166. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  167. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  168. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  169. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  170. data/spec/dummy/app/mailers/.gitkeep +0 -0
  171. data/spec/dummy/app/models/.gitkeep +0 -0
  172. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  173. data/spec/dummy/config.ru +4 -0
  174. data/spec/dummy/config/application.rb +61 -0
  175. data/spec/dummy/config/boot.rb +10 -0
  176. data/spec/dummy/config/database.yml.example +22 -0
  177. data/spec/dummy/config/database.yml.travis +22 -0
  178. data/spec/dummy/config/environment.rb +5 -0
  179. data/spec/dummy/config/environments/development.rb +37 -0
  180. data/spec/dummy/config/environments/production.rb +67 -0
  181. data/spec/dummy/config/environments/test.rb +37 -0
  182. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  183. data/spec/dummy/config/initializers/inflections.rb +15 -0
  184. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  185. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  186. data/spec/dummy/config/initializers/session_store.rb +8 -0
  187. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  188. data/spec/dummy/config/routes.rb +2 -0
  189. data/spec/dummy/db/schema.rb +639 -0
  190. data/spec/dummy/lib/assets/.gitkeep +0 -0
  191. data/spec/dummy/log/.gitkeep +0 -0
  192. data/spec/dummy/public/404.html +26 -0
  193. data/spec/dummy/public/422.html +26 -0
  194. data/spec/dummy/public/500.html +25 -0
  195. data/spec/dummy/public/favicon.ico +0 -0
  196. data/spec/dummy/script/rails +6 -0
  197. data/spec/factories/mdm/addresses.rb +7 -0
  198. data/spec/factories/mdm/hosts.rb +18 -0
  199. data/spec/factories/mdm/module_actions.rb +14 -0
  200. data/spec/factories/mdm/module_archs.rb +14 -0
  201. data/spec/factories/mdm/module_authors.rb +22 -0
  202. data/spec/factories/mdm/module_details.rb +9 -0
  203. data/spec/factories/mdm/module_mixins.rb +14 -0
  204. data/spec/factories/mdm/module_platforms.rb +14 -0
  205. data/spec/factories/mdm/module_refs.rb +14 -0
  206. data/spec/factories/mdm/module_targets.rb +19 -0
  207. data/spec/factories/mdm/services.rb +35 -0
  208. data/spec/factories/mdm/users.rb +22 -0
  209. data/spec/factories/mdm/web_sites.rb +8 -0
  210. data/spec/factories/mdm/web_vulns.rb +64 -0
  211. data/spec/factories/mdm/workspaces.rb +23 -0
  212. data/spec/lib/base64_serializer_spec.rb +174 -0
  213. data/spec/spec_helper.rb +36 -0
  214. metadata +472 -0
@@ -0,0 +1,24 @@
1
+ # bundler configuration
2
+ .bundle
3
+ # Mac OS X folder attributes
4
+ .DS_Store
5
+ # built gems
6
+ *.gem
7
+ # Rubymine project configuration
8
+ .idea
9
+ # logs
10
+ *.log
11
+ # Don't check in rvmrc since this is a gem
12
+ .rvmrc
13
+ # YARD database
14
+ .yardoc
15
+ # coverage report directory for simplecov/Rubymine
16
+ coverage
17
+ # generated yardocs
18
+ doc
19
+ # Installed gem versions. Not stored for the same reasons as .rvmrc
20
+ Gemfile.lock
21
+ # Packaging directory for builds
22
+ pkg/*
23
+ # Database configuration (with passwords) for specs
24
+ spec/dummy/config/database.yml
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format nested
2
+ --colour
3
+ --drb
@@ -0,0 +1,38 @@
1
+ # RM_INFO is set when using Rubymine. In Rubymine, starting SimpleCov is
2
+ # controlled by running with coverage, so don't explicitly start coverage (and
3
+ # therefore generate a report) when in Rubymine. This _will_ generate a report
4
+ # whenever `rake spec` is run.
5
+ unless ENV['RM_INFO']
6
+ SimpleCov.start
7
+ end
8
+
9
+ SimpleCov.configure do
10
+ load_adapter('rails')
11
+
12
+ # ignore this file
13
+ add_filter '.simplecov'
14
+
15
+ #
16
+ # Changed Files in Git Group
17
+ # @see http://fredwu.me/post/35625566267/simplecov-test-coverage-for-changed-files-only
18
+ #
19
+
20
+ untracked = `git ls-files --exclude-standard --others`
21
+ unstaged = `git diff --name-only`
22
+ staged = `git diff --name-only --cached`
23
+ all = untracked + unstaged + staged
24
+ changed_filenames = all.split("\n")
25
+
26
+ add_group 'Changed' do |source_file|
27
+ changed_filenames.detect { |changed_filename|
28
+ source_file.filename.end_with?(changed_filename)
29
+ }
30
+ end
31
+
32
+ #
33
+ # Specs are reported on to ensure that all examples are being run and all
34
+ # lets, befores, afters, etc are being used.
35
+ #
36
+
37
+ add_group 'Specs', 'spec'
38
+ end
@@ -0,0 +1,6 @@
1
+ before_script:
2
+ - cp spec/dummy/config/database.yml.travis spec/dummy/config/database.yml
3
+ - rake db:setup
4
+ language: ruby
5
+ rvm:
6
+ - '1.9.3'
@@ -0,0 +1,4 @@
1
+ --markup markdown
2
+ --protected
3
+ {app,lib}/**/*.rb
4
+ db/migrate/*.rb
data/Gemfile ADDED
@@ -0,0 +1,27 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in metasploit_data_models.gemspec
4
+ gemspec
5
+
6
+ # used by dummy application
7
+ group :development, :test do
8
+ # supplies factories for producing model instance for specs
9
+ # Version 4.1.0 or newer is needed to support generate calls without the 'FactoryGirl.' in factory definitions syntax.
10
+ gem 'factory_girl', '>= 4.1.0'
11
+ # auto-load factories from spec/factories
12
+ gem 'factory_girl_rails'
13
+ # rails is only used for the dummy application in spec/dummy
14
+ gem 'rails'
15
+ end
16
+
17
+ group :test do
18
+ # In a full rails project, factory_girl_rails would be in both the :development, and :test group, but since we only
19
+ # want rails in :test, factory_girl_rails must also only be in :test.
20
+ # add matchers from shoulda, such as validates_presence_of, which are useful for testing validations
21
+ gem 'shoulda-matchers'
22
+ # code coverage of tests
23
+ gem 'simplecov', :require => false
24
+ # need rspec-rails >= 2.12.0 as 2.12.0 adds support for redefining named subject in nested context that uses the
25
+ # named subject from the outer context without causing a stack overflow.
26
+ gem 'rspec-rails', '>= 2.12.0'
27
+ end
data/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ Copyright (C) 2012, Rapid7, Inc.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+
10
+ * Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ * Neither the name of Rapid7 LLC nor the names of its contributors
15
+ may be used to endorse or promote products derived from this software
16
+ without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
22
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
25
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,72 @@
1
+ #MetasploitDataModels [![Build Status](https://travis-ci.org/rapid7/metasploit_data_models.png)](https://travis-ci.org/rapid7/metasploit_data_models)
2
+
3
+ The database layer for Metasploit
4
+
5
+
6
+ ## Purpose
7
+ __MetasploitDataModels__ exists to do several key things:
8
+
9
+ 1. Allow code sharing between Metasploit Framework (MSF) and the commercial versions of Metasploit (Community, Express, Pro -- usually referred to collectively as "Pro")
10
+
11
+ 2. Give developers a lightweight entry point to MSF's backend for use in developing tools that gather data intended for later use with Metasploit (e.g. specialized scanners).
12
+
13
+ 3. Make it easy to keep commercial stuff private while increasing the functionality of the open-source tools we provide to the community.
14
+
15
+
16
+ ## Usage
17
+
18
+ ### Rails
19
+
20
+ In a Rails application, MetasploitDataModels acts a
21
+ [Rails Engine](http://edgeapi.rubyonrails.org/classes/Rails/Engine.html) and the models are available to application
22
+ just as if they were defined under app/models. If your Rails appliation needs to modify the models, this can be done
23
+ using ActiveSupport.on_load hooks in initializers. The block passed to on_load hook is evaluated in the context of the
24
+ model class, so defining method and including modules will work just like reopeninng the class, but
25
+ ActiveSupport.on_load ensures that the monkey patches will work after reloading in development mode. Each class has a
26
+ different on_load name, which is just the class name converted to an underscored symbol, so Mdm::ApiKey runs the
27
+ :mdm_api_key load hooks, etc.
28
+
29
+ # Gemfile
30
+ gem :metasploiit_data_models, :git => git://github.com/rapid7/metasploit_data_models.git, :tag => 'v0.3.0'
31
+
32
+ # config/initializers/metasploit_data_models.rb
33
+ ActiveSupport.on_load(:mdm_api_key) do
34
+ # Returns the String obfuscated token for display. Meant to avoid CSRF
35
+ # api-key stealing attackes.
36
+ def obfuscated_token
37
+ token[0..3] + "****************************"
38
+ end
39
+ end
40
+
41
+ ### Metasploit Framework
42
+
43
+ In Metasploit Framework, `MetasploitDataModels.require_models` is called by the `Msf::DbManager` to use the data models
44
+ only if the user wants to use the database.
45
+
46
+ ### Elsewhere
47
+
48
+ __NOTE: This isn't in RubyGems yet. Using a Gemfile entry pointing to this repo (i.e., using
49
+ [Bundler](http://gembundler.com)) is the suggested option for now.__
50
+
51
+ Usage outside of Rapid7 is still alpha, as reflected in the pre-1.0.0 version, and we're not making many promises. That
52
+ being said, usage is easy:
53
+
54
+ connection_info = YAML.load_file("path/to/rails-style/db_config_file")
55
+ ActiveRecord::Base.establish_connection(connection_info['development'])
56
+ MetasploitDataModels.require_models
57
+
58
+ Basically you need to do the following things:
59
+
60
+ 1. Establish an ActiveRecord connection. A Rails __config/database.yml__ is ideal for this.
61
+ 2. `MetasploitDataModels.require_models`
62
+
63
+
64
+ ## Developer Info
65
+
66
+ ### Console
67
+ The gem includes a console based on [Pry](https://github.com/pry/pry/)
68
+
69
+ Give it a path to a working MSF database.yml file for full
70
+ ActiveRecord-based access to your data.
71
+
72
+ __Note:__ "development" mode is hardcoded into the console currently.
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ print_without = false
9
+ APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
10
+
11
+ begin
12
+ load 'rails/tasks/engine.rake'
13
+ rescue LoadError
14
+ puts "railties not in bundle, so can't load engine tasks."
15
+ print_without = true
16
+ end
17
+
18
+ Bundler::GemHelper.install_tasks
19
+
20
+ #
21
+ # load rake files like a normal rails app
22
+ # @see http://viget.com/extend/rails-engine-testing-with-rspec-capybara-and-factorygirl
23
+ #
24
+
25
+ pathname = Pathname.new(__FILE__)
26
+ root = pathname.parent
27
+ rakefile_glob = root.join('lib', 'tasks', '**', '*.rake').to_path
28
+
29
+ Dir.glob(rakefile_glob) do |rakefile|
30
+ load rakefile
31
+ end
32
+
33
+ begin
34
+ require 'rspec/core'
35
+ rescue LoadError
36
+ puts "rspec not in bundle, so can't set up spec tasks. " \
37
+ "To run specs ensure to install the development and test groups."
38
+ print_without = true
39
+ else
40
+ require 'rspec/core/rake_task'
41
+
42
+ # Depend on app:db:test:prepare so that test database is recreated just like in a full rails app
43
+ # @see http://viget.com/extend/rails-engine-testing-with-rspec-capybara-and-factorygirl
44
+ RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
45
+
46
+ task :default => :spec
47
+ end
48
+
49
+ if print_without
50
+ puts "Bundle currently installed '--without #{Bundler.settings.without.join(' ')}'."
51
+ puts "To clear the without option do `bundle install --without ''` (the --without flag with an empty string) or " \
52
+ "`rm -rf .bundle` to remove the .bundle/config manually and then `bundle install`"
53
+ end
@@ -0,0 +1,20 @@
1
+ class Mdm::ApiKey < ActiveRecord::Base
2
+ #
3
+ # Validators
4
+ #
5
+
6
+ validate :supports_api
7
+ validates :token, :presence => true, :length => { :minimum => 8 }
8
+
9
+ protected
10
+
11
+ def supports_api
12
+ license = License.get
13
+
14
+ if license and not license.supports_api?
15
+ errors[:license] = " - this product does not support API access"
16
+ end
17
+ end
18
+
19
+ ActiveSupport.run_load_hooks(:mdm_api_key, self)
20
+ end
@@ -0,0 +1,9 @@
1
+ class Mdm::Client < ActiveRecord::Base
2
+ #
3
+ # Relations
4
+ #
5
+ belongs_to :campaign, :class_name => 'Mdm::Campaign'
6
+ belongs_to :host, :class_name => 'Mdm::Host'
7
+
8
+ ActiveSupport.run_load_hooks(:mdm_client, self)
9
+ end
@@ -0,0 +1,93 @@
1
+ class Mdm::Cred < ActiveRecord::Base
2
+ #
3
+ # CONSTANTS
4
+ #
5
+ KEY_ID_REGEX = /([0-9a-fA-F:]{47})/
6
+ PTYPES = {
7
+ 'read/write password' => 'password_rw',
8
+ 'read-only password' => 'password_ro',
9
+ 'SMB hash' => 'smb_hash',
10
+ 'SSH private key' => 'ssh_key',
11
+ 'SSH public key' => 'ssh_pubkey'
12
+ }
13
+
14
+ #
15
+ # Relations
16
+ #
17
+ belongs_to :service, :class_name => "Mdm::Service"
18
+
19
+ after_create :increment_host_counter_cache
20
+ after_destroy :decrement_host_counter_cache
21
+
22
+ def ptype_human
23
+ humanized = PTYPES.select do |k, v|
24
+ v == ptype
25
+ end.keys[0]
26
+
27
+ humanized ? humanized : ptype
28
+ end
29
+
30
+ # Returns its key id. If this is not an ssh-type key, returns nil.
31
+ def ssh_key_id
32
+ return nil unless self.ptype =~ /^ssh_/
33
+ return nil unless self.proof =~ KEY_ID_REGEX
34
+ $1.downcase # Can't run into NilClass problems.
35
+ end
36
+
37
+ def ssh_key_matches?(other_cred)
38
+ return false unless other_cred.kind_of? self.class
39
+ return false unless self.ptype == other_cred.ptype
40
+ case self.ptype
41
+ when "ssh_key"
42
+ matches = self.ssh_private_keys
43
+ when "ssh_pubkey"
44
+ matches = self.ssh_public_keys
45
+ else
46
+ false
47
+ end
48
+ matches.include?(self) and matches.include?(other_cred)
49
+ end
50
+
51
+ # Returns all keys with matching key ids, including itself
52
+ # If this is not an ssh-type key, always returns an empty array.
53
+ def ssh_keys
54
+ (self.ssh_private_keys | self.ssh_public_keys)
55
+ end
56
+
57
+ # Returns all private keys with matching key ids, including itself
58
+ # If this is not an ssh-type key, always returns an empty array.
59
+ def ssh_private_keys
60
+ return [] unless self.ssh_key_id
61
+ matches = self.class.all(
62
+ :conditions => ["creds.ptype = ? AND creds.proof ILIKE ?", "ssh_key", "%#{self.ssh_key_id}%"]
63
+ )
64
+ matches.select {|c| c.workspace == self.workspace}
65
+ end
66
+
67
+ # Returns all public keys with matching key ids, including itself
68
+ # If this is not an ssh-type key, always returns an empty array.
69
+ def ssh_public_keys
70
+ return [] unless self.ssh_key_id
71
+ matches = self.class.all(
72
+ :conditions => ["creds.ptype = ? AND creds.proof ILIKE ?", "ssh_pubkey", "%#{self.ssh_key_id}%"]
73
+ )
74
+ matches.select {|c| c.workspace == self.workspace}
75
+ end
76
+
77
+ # Returns its workspace
78
+ def workspace
79
+ self.service.host.workspace
80
+ end
81
+
82
+ ActiveSupport.run_load_hooks(:mdm_cred, self)
83
+
84
+ private
85
+
86
+ def decrement_host_counter_cache
87
+ Mdm::Host.decrement_counter("cred_count", self.service.host_id)
88
+ end
89
+
90
+ def increment_host_counter_cache
91
+ Mdm::Host.increment_counter("cred_count", self.service.host_id)
92
+ end
93
+ end
@@ -0,0 +1,30 @@
1
+ class Mdm::Event < ActiveRecord::Base
2
+ #
3
+ # Relations
4
+ #
5
+
6
+ belongs_to :host, :class_name => 'Mdm::Host'
7
+ belongs_to :workspace, :class_name => 'Mdm::Workspace'
8
+
9
+ #
10
+ # Scopes
11
+ #
12
+
13
+ scope :flagged, where(:critical => true, :seen => false)
14
+ scope :module_run, where(:name => 'module_run')
15
+
16
+ #
17
+ # Serializations
18
+ #
19
+
20
+ serialize :info, MetasploitDataModels::Base64Serializer.new
21
+
22
+ #
23
+ # Validations
24
+ #
25
+
26
+ validates :name, :presence => true
27
+
28
+ ActiveSupport.run_load_hooks(:mdm_event, self)
29
+ end
30
+
@@ -0,0 +1,14 @@
1
+ class Mdm::ExploitAttempt < ActiveRecord::Base
2
+ #
3
+ # Relations
4
+ #
5
+ belongs_to :host, :class_name => 'Mdm::Host', :counter_cache => :exploit_attempt_count
6
+
7
+ #
8
+ # Validations
9
+ #
10
+
11
+ validates :host_id, :presence => true
12
+
13
+ ActiveSupport.run_load_hooks(:mdm_exploit_attempt, self)
14
+ end
@@ -0,0 +1,11 @@
1
+ class Mdm::ExploitedHost < ActiveRecord::Base
2
+ #
3
+ # Relations
4
+ #
5
+
6
+ belongs_to :host, :class_name => 'Mdm::Host'
7
+ belongs_to :service, :class_name => 'Mdm::Service'
8
+ belongs_to :workspace, :class_name => 'Mdm::Workspace'
9
+
10
+ ActiveSupport.run_load_hooks(:mdm_exploited_host, self)
11
+ end