wg-metasploit_data_models 4.1.4.01 → 4.1.4.02

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 (440) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.github/workflows/verify.yml +68 -0
  4. data/.gitignore +29 -0
  5. data/.rspec +3 -0
  6. data/.simplecov +38 -0
  7. data/.yardopts +4 -0
  8. data/CHANGELOG.md +6 -0
  9. data/CONTRIBUTING.md +133 -0
  10. data/Gemfile +46 -0
  11. data/LICENSE +27 -0
  12. data/README.md +65 -0
  13. data/RELEASING.md +82 -0
  14. data/Rakefile +72 -0
  15. data/UPGRADING.md +1 -0
  16. data/app/models/mdm/api_key.rb +61 -0
  17. data/app/models/mdm/async_callback.rb +64 -0
  18. data/app/models/mdm/client.rb +50 -0
  19. data/app/models/mdm/cred.rb +205 -0
  20. data/app/models/mdm/event.rb +83 -0
  21. data/app/models/mdm/exploit_attempt.rb +105 -0
  22. data/app/models/mdm/exploited_host.rb +42 -0
  23. data/app/models/mdm/host.rb +619 -0
  24. data/app/models/mdm/host_detail.rb +62 -0
  25. data/app/models/mdm/host_tag.rb +49 -0
  26. data/app/models/mdm/listener.rb +82 -0
  27. data/app/models/mdm/loot.rb +161 -0
  28. data/app/models/mdm/macro.rb +62 -0
  29. data/app/models/mdm/mod_ref.rb +24 -0
  30. data/app/models/mdm/module/action.rb +33 -0
  31. data/app/models/mdm/module/arch.rb +28 -0
  32. data/app/models/mdm/module/author.rb +34 -0
  33. data/app/models/mdm/module/detail.rb +388 -0
  34. data/app/models/mdm/module/mixin.rb +31 -0
  35. data/app/models/mdm/module/platform.rb +29 -0
  36. data/app/models/mdm/module/ref.rb +42 -0
  37. data/app/models/mdm/module/target.rb +37 -0
  38. data/app/models/mdm/nexpose_console.rb +121 -0
  39. data/app/models/mdm/note.rb +125 -0
  40. data/app/models/mdm/payload.rb +103 -0
  41. data/app/models/mdm/profile.rb +45 -0
  42. data/app/models/mdm/ref.rb +48 -0
  43. data/app/models/mdm/route.rb +28 -0
  44. data/app/models/mdm/service.rb +267 -0
  45. data/app/models/mdm/session.rb +203 -0
  46. data/app/models/mdm/session_event.rb +44 -0
  47. data/app/models/mdm/tag.rb +114 -0
  48. data/app/models/mdm/task.rb +168 -0
  49. data/app/models/mdm/task_cred.rb +45 -0
  50. data/app/models/mdm/task_host.rb +41 -0
  51. data/app/models/mdm/task_service.rb +41 -0
  52. data/app/models/mdm/task_session.rb +41 -0
  53. data/app/models/mdm/user.rb +230 -0
  54. data/app/models/mdm/vuln.rb +204 -0
  55. data/app/models/mdm/vuln_attempt.rb +76 -0
  56. data/app/models/mdm/vuln_detail.rb +156 -0
  57. data/app/models/mdm/vuln_ref.rb +21 -0
  58. data/app/models/mdm/web_form.rb +53 -0
  59. data/app/models/mdm/web_page.rb +92 -0
  60. data/app/models/mdm/web_site.rb +113 -0
  61. data/app/models/mdm/web_vuln.rb +193 -0
  62. data/app/models/mdm/wmap_request.rb +101 -0
  63. data/app/models/mdm/wmap_target.rb +56 -0
  64. data/app/models/mdm/workspace.rb +286 -0
  65. data/app/models/metasploit_data_models/automatic_exploitation/match.rb +43 -0
  66. data/app/models/metasploit_data_models/automatic_exploitation/match_result.rb +71 -0
  67. data/app/models/metasploit_data_models/automatic_exploitation/match_set.rb +40 -0
  68. data/app/models/metasploit_data_models/automatic_exploitation/run.rb +29 -0
  69. data/app/models/metasploit_data_models/ip_address/v4/cidr.rb +14 -0
  70. data/app/models/metasploit_data_models/ip_address/v4/nmap.rb +14 -0
  71. data/app/models/metasploit_data_models/ip_address/v4/range.rb +12 -0
  72. data/app/models/metasploit_data_models/ip_address/v4/segment/nmap/list.rb +125 -0
  73. data/app/models/metasploit_data_models/ip_address/v4/segment/nmap/range.rb +12 -0
  74. data/app/models/metasploit_data_models/ip_address/v4/segment/single.rb +123 -0
  75. data/app/models/metasploit_data_models/ip_address/v4/segmented.rb +200 -0
  76. data/app/models/metasploit_data_models/ip_address/v4/single.rb +53 -0
  77. data/app/models/metasploit_data_models/module_run.rb +213 -0
  78. data/app/models/metasploit_data_models/search/operation/ip_address.rb +60 -0
  79. data/app/models/metasploit_data_models/search/operation/port/number.rb +25 -0
  80. data/app/models/metasploit_data_models/search/operation/port/range.rb +79 -0
  81. data/app/models/metasploit_data_models/search/operation/range.rb +56 -0
  82. data/app/models/metasploit_data_models/search/operator/ip_address.rb +33 -0
  83. data/app/models/metasploit_data_models/search/operator/multitext.rb +73 -0
  84. data/app/models/metasploit_data_models/search/operator/port/list.rb +67 -0
  85. data/app/models/metasploit_data_models/search/visitor/attribute.rb +17 -0
  86. data/app/models/metasploit_data_models/search/visitor/includes.rb +47 -0
  87. data/app/models/metasploit_data_models/search/visitor/joins.rb +67 -0
  88. data/app/models/metasploit_data_models/search/visitor/method.rb +16 -0
  89. data/app/models/metasploit_data_models/search/visitor/relation.rb +91 -0
  90. data/app/models/metasploit_data_models/search/visitor/where.rb +128 -0
  91. data/config/initializers/arel_helper.rb +5 -0
  92. data/config/initializers/ipaddr.rb +29 -0
  93. data/config/locales/en.yml +94 -0
  94. data/console_db.yml +9 -0
  95. data/db/migrate/000_create_tables.rb +79 -0
  96. data/db/migrate/001_add_wmap_tables.rb +35 -0
  97. data/db/migrate/002_add_workspaces.rb +36 -0
  98. data/db/migrate/003_move_notes.rb +20 -0
  99. data/db/migrate/004_add_events_table.rb +16 -0
  100. data/db/migrate/005_expand_info.rb +58 -0
  101. data/db/migrate/006_add_timestamps.rb +26 -0
  102. data/db/migrate/007_add_loots.rb +20 -0
  103. data/db/migrate/008_create_users.rb +16 -0
  104. data/db/migrate/009_add_loots_ctype.rb +10 -0
  105. data/db/migrate/010_add_alert_fields.rb +16 -0
  106. data/db/migrate/011_add_reports.rb +19 -0
  107. data/db/migrate/012_add_tasks.rb +24 -0
  108. data/db/migrate/013_add_tasks_result.rb +10 -0
  109. data/db/migrate/014_add_loots_fields.rb +12 -0
  110. data/db/migrate/015_rename_user.rb +16 -0
  111. data/db/migrate/016_add_host_purpose.rb +10 -0
  112. data/db/migrate/017_expand_info2.rb +58 -0
  113. data/db/migrate/018_add_workspace_user_info.rb +29 -0
  114. data/db/migrate/019_add_workspace_desc.rb +23 -0
  115. data/db/migrate/020_add_user_preferences.rb +11 -0
  116. data/db/migrate/021_standardize_info_and_data.rb +18 -0
  117. data/db/migrate/022_enlarge_event_info.rb +10 -0
  118. data/db/migrate/023_add_report_downloaded_at.rb +10 -0
  119. data/db/migrate/024_convert_service_info_to_text.rb +12 -0
  120. data/db/migrate/025_add_user_admin.rb +19 -0
  121. data/db/migrate/026_add_creds_table.rb +19 -0
  122. data/db/migrate/20100819123300_migrate_cred_data.rb +154 -0
  123. data/db/migrate/20100824151500_add_exploited_table.rb +16 -0
  124. data/db/migrate/20100908001428_add_owner_to_workspaces.rb +9 -0
  125. data/db/migrate/20100911122000_add_report_templates.rb +18 -0
  126. data/db/migrate/20100916151530_require_admin_flag.rb +15 -0
  127. data/db/migrate/20100916175000_add_campaigns_and_templates.rb +61 -0
  128. data/db/migrate/20100920012100_add_generate_exe_column.rb +8 -0
  129. data/db/migrate/20100926214000_add_template_prefs.rb +11 -0
  130. data/db/migrate/20101001000000_add_web_tables.rb +57 -0
  131. data/db/migrate/20101002000000_add_query.rb +10 -0
  132. data/db/migrate/20101007000000_add_vuln_info.rb +15 -0
  133. data/db/migrate/20101008111800_add_clients_to_campaigns.rb +10 -0
  134. data/db/migrate/20101009023300_add_campaign_attachments.rb +15 -0
  135. data/db/migrate/20101104135100_add_imported_creds.rb +17 -0
  136. data/db/migrate/20101203000000_fix_web_tables.rb +34 -0
  137. data/db/migrate/20101203000001_expand_host_comment.rb +12 -0
  138. data/db/migrate/20101206212033_add_limit_to_network_to_workspaces.rb +9 -0
  139. data/db/migrate/20110112154300_add_module_uuid_to_tasks.rb +9 -0
  140. data/db/migrate/20110204112800_add_host_tags.rb +28 -0
  141. data/db/migrate/20110317144932_add_session_table.rb +110 -0
  142. data/db/migrate/20110414180600_add_local_id_to_session_table.rb +11 -0
  143. data/db/migrate/20110415175705_add_routes_table.rb +18 -0
  144. data/db/migrate/20110422000000_convert_binary.rb +73 -0
  145. data/db/migrate/20110425095900_add_last_seen_to_sessions.rb +8 -0
  146. data/db/migrate/20110513143900_track_successful_exploits.rb +31 -0
  147. data/db/migrate/20110517160800_rename_and_prune_nessus_vulns.rb +26 -0
  148. data/db/migrate/20110527000000_add_task_id_to_reports_table.rb +11 -0
  149. data/db/migrate/20110527000001_add_api_keys_table.rb +12 -0
  150. data/db/migrate/20110606000001_add_macros_table.rb +16 -0
  151. data/db/migrate/20110622000000_add_settings_to_tasks_table.rb +12 -0
  152. data/db/migrate/20110624000001_add_listeners_table.rb +19 -0
  153. data/db/migrate/20110625000001_add_macro_to_listeners_table.rb +12 -0
  154. data/db/migrate/20110630000001_add_nexpose_consoles_table.rb +21 -0
  155. data/db/migrate/20110630000002_add_name_to_nexpose_consoles_table.rb +12 -0
  156. data/db/migrate/20110717000001_add_profiles_table.rb +15 -0
  157. data/db/migrate/20110727163801_expand_cred_ptype_column.rb +9 -0
  158. data/db/migrate/20110730000001_add_initial_indexes.rb +85 -0
  159. data/db/migrate/20110812000001_prune_indexes.rb +23 -0
  160. data/db/migrate/20110922000000_expand_notes.rb +9 -0
  161. data/db/migrate/20110928101300_add_mod_ref_table.rb +17 -0
  162. data/db/migrate/20111011110000_add_display_name_to_reports_table.rb +24 -0
  163. data/db/migrate/20111203000000_inet_columns.rb +13 -0
  164. data/db/migrate/20111204000000_more_inet_columns.rb +17 -0
  165. data/db/migrate/20111210000000_add_scope_to_hosts.rb +9 -0
  166. data/db/migrate/20120126110000_add_virtual_host_to_hosts.rb +9 -0
  167. data/db/migrate/20120411173220_rename_workspace_members.rb +9 -0
  168. data/db/migrate/20120601152442_add_counter_caches_to_hosts.rb +21 -0
  169. data/db/migrate/20120625000000_add_vuln_details.rb +34 -0
  170. data/db/migrate/20120625000001_add_host_details.rb +16 -0
  171. data/db/migrate/20120625000002_expand_details.rb +16 -0
  172. data/db/migrate/20120625000003_expand_details2.rb +24 -0
  173. data/db/migrate/20120625000004_add_vuln_attempts.rb +19 -0
  174. data/db/migrate/20120625000005_add_vuln_and_host_counter_caches.rb +14 -0
  175. data/db/migrate/20120625000006_add_module_details.rb +118 -0
  176. data/db/migrate/20120625000007_add_exploit_attempts.rb +26 -0
  177. data/db/migrate/20120625000008_add_fail_message.rb +12 -0
  178. data/db/migrate/20120718202805_add_owner_and_payload_to_web_vulns.rb +13 -0
  179. data/db/migrate/20130228214900_change_required_columns_to_null_false_in_web_vulns.rb +19 -0
  180. data/db/migrate/20130412154159_change_foreign_key_in_module_actions.rb +25 -0
  181. data/db/migrate/20130412171844_change_foreign_key_in_module_archs.rb +25 -0
  182. data/db/migrate/20130412173121_change_foreign_key_in_module_authors.rb +25 -0
  183. data/db/migrate/20130412173640_change_foreign_key_in_module_mixins.rb +25 -0
  184. data/db/migrate/20130412174254_change_foreign_key_in_module_platforms.rb +25 -0
  185. data/db/migrate/20130412174719_change_foreign_key_in_module_refs.rb +25 -0
  186. data/db/migrate/20130412175040_change_foreign_key_in_module_targets.rb +25 -0
  187. data/db/migrate/20130423211152_add_creds_counter_cache.rb +24 -0
  188. data/db/migrate/20130430151353_change_required_columns_to_null_false_in_hosts.rb +11 -0
  189. data/db/migrate/20130430162145_enforce_address_uniqueness_in_workspace_in_hosts.rb +101 -0
  190. data/db/migrate/20130510021637_remove_campaigns.rb +11 -0
  191. data/db/migrate/20130515164311_change_web_vulns_confidence_to_integer.rb +48 -0
  192. data/db/migrate/20130515172727_valid_mdm_web_vuln_params.rb +30 -0
  193. data/db/migrate/20130516204810_making_vulns_refs_a_real_ar_model.rb +5 -0
  194. data/db/migrate/20130522001343_create_task_creds.rb +9 -0
  195. data/db/migrate/20130522032517_create_task_hosts.rb +9 -0
  196. data/db/migrate/20130522041110_create_task_services.rb +9 -0
  197. data/db/migrate/20130525015035_remove_campaign_id_from_clients.rb +9 -0
  198. data/db/migrate/20130525212420_drop_table_imported_creds.rb +14 -0
  199. data/db/migrate/20130531144949_making_host_tags_a_real_ar_model.rb +6 -0
  200. data/db/migrate/20130604145732_create_task_sessions.rb +9 -0
  201. data/db/migrate/20130717150737_remove_pname_validation.rb +7 -0
  202. data/db/migrate/20131002004641_create_automatic_exploitation_matches.rb +13 -0
  203. data/db/migrate/20131002164449_create_automatic_exploitation_match_sets.rb +12 -0
  204. data/db/migrate/20131008213344_create_automatic_exploitation_runs.rb +11 -0
  205. data/db/migrate/20131011184338_module_detail_on_automatic_exploitation_match.rb +10 -0
  206. data/db/migrate/20131017150735_create_automatic_exploitation_match_results.rb +11 -0
  207. data/db/migrate/20131021185657_make_match_polymorphic.rb +11 -0
  208. data/db/migrate/20140905031549_add_detected_arch_to_host.rb +5 -0
  209. data/db/migrate/20150112203945_remove_duplicate_services.rb +17 -0
  210. data/db/migrate/20150205192745_drop_service_uniqueness_index.rb +5 -0
  211. data/db/migrate/20150209195939_add_vuln_id_to_note.rb +6 -0
  212. data/db/migrate/20150212214222_remove_duplicate_services2.rb +17 -0
  213. data/db/migrate/20150219173821_create_module_runs.rb +23 -0
  214. data/db/migrate/20150219215039_add_module_run_to_session.rb +8 -0
  215. data/db/migrate/20150226151459_add_module_run_fk_to_loot.rb +8 -0
  216. data/db/migrate/20150312155312_add_module_full_name_to_match.rb +6 -0
  217. data/db/migrate/20150317145455_rename_module_indices.rb +29 -0
  218. data/db/migrate/20150326183742_add_missing_ae_indices.rb +13 -0
  219. data/db/migrate/20150421211719_rename_automatic_exploitation_index.rb +16 -0
  220. data/db/migrate/20150514182921_add_origin_to_mdm_vuln.rb +13 -0
  221. data/db/migrate/20160415153312_remove_not_null_from_web_vuln_p_arams.rb +5 -0
  222. data/db/migrate/20161004165612_add_fingerprinted_to_workspace.rb +5 -0
  223. data/db/migrate/20161227212223_add_os_family_to_hosts.rb +5 -0
  224. data/db/migrate/20180904120211_create_payloads.rb +21 -0
  225. data/db/migrate/20190308134512_create_async_callbacks.rb +13 -0
  226. data/db/migrate/20190507120211_remove_payload_workspaces.rb +5 -0
  227. data/lib/mdm/host/operating_system_normalization.rb +942 -0
  228. data/lib/mdm/module.rb +13 -0
  229. data/lib/mdm.rb +57 -0
  230. data/lib/metasploit_data_models/automatic_exploitation.rb +25 -0
  231. data/lib/metasploit_data_models/base64_serializer.rb +99 -0
  232. data/lib/metasploit_data_models/change_required_columns_to_null_false.rb +21 -0
  233. data/lib/metasploit_data_models/engine.rb +32 -0
  234. data/lib/metasploit_data_models/ip_address/cidr.rb +174 -0
  235. data/lib/metasploit_data_models/ip_address/range.rb +181 -0
  236. data/lib/metasploit_data_models/ip_address/v4/segment/nmap.rb +7 -0
  237. data/lib/metasploit_data_models/ip_address/v4/segment.rb +7 -0
  238. data/lib/metasploit_data_models/ip_address/v4.rb +11 -0
  239. data/lib/metasploit_data_models/ip_address.rb +9 -0
  240. data/lib/metasploit_data_models/match/child.rb +48 -0
  241. data/lib/metasploit_data_models/match/parent.rb +103 -0
  242. data/lib/metasploit_data_models/match.rb +8 -0
  243. data/lib/metasploit_data_models/search/operation/port.rb +9 -0
  244. data/lib/metasploit_data_models/search/operation.rb +9 -0
  245. data/lib/metasploit_data_models/search/operator/port.rb +6 -0
  246. data/lib/metasploit_data_models/search/operator.rb +8 -0
  247. data/lib/metasploit_data_models/search/visitor.rb +11 -0
  248. data/lib/metasploit_data_models/search.rb +8 -0
  249. data/lib/metasploit_data_models/serialized_prefs.rb +27 -0
  250. data/lib/metasploit_data_models/version.rb +13 -0
  251. data/lib/metasploit_data_models.rb +56 -0
  252. data/metasploit_data_models.gemspec +65 -0
  253. data/script/rails +8 -0
  254. data/spec/app/models/mdm/api_key_spec.rb +3 -0
  255. data/spec/app/models/mdm/client_spec.rb +43 -0
  256. data/spec/app/models/mdm/cred_spec.rb +346 -0
  257. data/spec/app/models/mdm/event_spec.rb +90 -0
  258. data/spec/app/models/mdm/exploit_attempt_spec.rb +59 -0
  259. data/spec/app/models/mdm/exploited_host_spec.rb +44 -0
  260. data/spec/app/models/mdm/host_detail_spec.rb +48 -0
  261. data/spec/app/models/mdm/host_spec.rb +1139 -0
  262. data/spec/app/models/mdm/host_tag_spec.rb +69 -0
  263. data/spec/app/models/mdm/listener_spec.rb +107 -0
  264. data/spec/app/models/mdm/loot_spec.rb +84 -0
  265. data/spec/app/models/mdm/macro_spec.rb +3 -0
  266. data/spec/app/models/mdm/mod_ref_spec.rb +3 -0
  267. data/spec/app/models/mdm/module/action_spec.rb +34 -0
  268. data/spec/app/models/mdm/module/arch_spec.rb +34 -0
  269. data/spec/app/models/mdm/module/author_spec.rb +52 -0
  270. data/spec/app/models/mdm/module/detail_spec.rb +746 -0
  271. data/spec/app/models/mdm/module/mixin_spec.rb +34 -0
  272. data/spec/app/models/mdm/module/platform_spec.rb +34 -0
  273. data/spec/app/models/mdm/module/ref_spec.rb +58 -0
  274. data/spec/app/models/mdm/module/target_spec.rb +36 -0
  275. data/spec/app/models/mdm/nexpose_console_spec.rb +146 -0
  276. data/spec/app/models/mdm/note_spec.rb +91 -0
  277. data/spec/app/models/mdm/profile_spec.rb +3 -0
  278. data/spec/app/models/mdm/ref_spec.rb +71 -0
  279. data/spec/app/models/mdm/route_spec.rb +35 -0
  280. data/spec/app/models/mdm/service_spec.rb +232 -0
  281. data/spec/app/models/mdm/session_event_spec.rb +42 -0
  282. data/spec/app/models/mdm/session_spec.rb +118 -0
  283. data/spec/app/models/mdm/tag_spec.rb +116 -0
  284. data/spec/app/models/mdm/task_cred_spec.rb +51 -0
  285. data/spec/app/models/mdm/task_host_spec.rb +50 -0
  286. data/spec/app/models/mdm/task_service_spec.rb +50 -0
  287. data/spec/app/models/mdm/task_session_spec.rb +46 -0
  288. data/spec/app/models/mdm/task_spec.rb +71 -0
  289. data/spec/app/models/mdm/user_spec.rb +50 -0
  290. data/spec/app/models/mdm/vuln_attempt_spec.rb +53 -0
  291. data/spec/app/models/mdm/vuln_detail_spec.rb +65 -0
  292. data/spec/app/models/mdm/vuln_ref_spec.rb +46 -0
  293. data/spec/app/models/mdm/vuln_spec.rb +299 -0
  294. data/spec/app/models/mdm/web_form_spec.rb +46 -0
  295. data/spec/app/models/mdm/web_page_spec.rb +101 -0
  296. data/spec/app/models/mdm/web_site_spec.rb +85 -0
  297. data/spec/app/models/mdm/web_vuln_spec.rb +312 -0
  298. data/spec/app/models/mdm/wmap_request_spec.rb +5 -0
  299. data/spec/app/models/mdm/wmap_target_spec.rb +5 -0
  300. data/spec/app/models/mdm/workspace_spec.rb +500 -0
  301. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_result_spec.rb +86 -0
  302. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_set_spec.rb +46 -0
  303. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_spec.rb +37 -0
  304. data/spec/app/models/metasploit_data_models/automatic_exploitation/run_spec.rb +38 -0
  305. data/spec/app/models/metasploit_data_models/ip_address/v4/cidr_spec.rb +119 -0
  306. data/spec/app/models/metasploit_data_models/ip_address/v4/nmap_spec.rb +149 -0
  307. data/spec/app/models/metasploit_data_models/ip_address/v4/range_spec.rb +298 -0
  308. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/list_spec.rb +276 -0
  309. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/range_spec.rb +302 -0
  310. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/segmented_spec.rb +27 -0
  311. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/single_spec.rb +324 -0
  312. data/spec/app/models/metasploit_data_models/ip_address/v4/single_spec.rb +181 -0
  313. data/spec/app/models/metasploit_data_models/module_run_spec.rb +134 -0
  314. data/spec/app/models/metasploit_data_models/search/operation/ip_address_spec.rb +180 -0
  315. data/spec/app/models/metasploit_data_models/search/operation/port/number_spec.rb +39 -0
  316. data/spec/app/models/metasploit_data_models/search/operation/port/range_spec.rb +138 -0
  317. data/spec/app/models/metasploit_data_models/search/operation/range_spec.rb +233 -0
  318. data/spec/app/models/metasploit_data_models/search/operator/ip_address_spec.rb +17 -0
  319. data/spec/app/models/metasploit_data_models/search/operator/multitext_spec.rb +160 -0
  320. data/spec/app/models/metasploit_data_models/search/operator/port/list_spec.rb +162 -0
  321. data/spec/app/models/metasploit_data_models/search/visitor/attribute_spec.rb +96 -0
  322. data/spec/app/models/metasploit_data_models/search/visitor/includes_spec.rb +175 -0
  323. data/spec/app/models/metasploit_data_models/search/visitor/joins_spec.rb +396 -0
  324. data/spec/app/models/metasploit_data_models/search/visitor/method_spec.rb +49 -0
  325. data/spec/app/models/metasploit_data_models/search/visitor/relation_spec.rb +925 -0
  326. data/spec/app/models/metasploit_data_models/search/visitor/where_spec.rb +187 -0
  327. data/spec/dummy/Rakefile +7 -0
  328. data/spec/dummy/app/assets/config/manifest.js +1 -0
  329. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  330. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  331. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  332. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  333. data/spec/dummy/app/mailers/.gitkeep +0 -0
  334. data/spec/dummy/app/models/.gitkeep +0 -0
  335. data/spec/dummy/app/models/application_record.rb +3 -0
  336. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  337. data/spec/dummy/bin/bundle +3 -0
  338. data/spec/dummy/bin/rails +4 -0
  339. data/spec/dummy/bin/rake +4 -0
  340. data/spec/dummy/config/application.rb +61 -0
  341. data/spec/dummy/config/boot.rb +4 -0
  342. data/spec/dummy/config/database.yml.example +22 -0
  343. data/spec/dummy/config/database.yml.github_actions +21 -0
  344. data/spec/dummy/config/environment.rb +5 -0
  345. data/spec/dummy/config/environments/development.rb +37 -0
  346. data/spec/dummy/config/environments/production.rb +78 -0
  347. data/spec/dummy/config/environments/test.rb +39 -0
  348. data/spec/dummy/config/initializers/active_record_migrations.rb +4 -0
  349. data/spec/dummy/config/initializers/assets.rb +8 -0
  350. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  351. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  352. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  353. data/spec/dummy/config/initializers/inflections.rb +16 -0
  354. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  355. data/spec/dummy/config/initializers/session_store.rb +3 -0
  356. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  357. data/spec/dummy/config/locales/en.yml +23 -0
  358. data/spec/dummy/config/routes.rb +2 -0
  359. data/spec/dummy/config.ru +4 -0
  360. data/spec/dummy/db/structure.sql +3430 -0
  361. data/spec/dummy/db/structure.sql.from_rails_3 +3403 -0
  362. data/spec/dummy/lib/assets/.gitkeep +0 -0
  363. data/spec/dummy/log/.gitkeep +0 -0
  364. data/spec/dummy/public/404.html +26 -0
  365. data/spec/dummy/public/422.html +26 -0
  366. data/spec/dummy/public/500.html +25 -0
  367. data/spec/dummy/public/favicon.ico +0 -0
  368. data/spec/dummy/script/rails +6 -0
  369. data/spec/factories/mdm/addresses.rb +12 -0
  370. data/spec/factories/mdm/clients.rb +8 -0
  371. data/spec/factories/mdm/creds.rb +17 -0
  372. data/spec/factories/mdm/events.rb +15 -0
  373. data/spec/factories/mdm/exploit_attempts.rb +8 -0
  374. data/spec/factories/mdm/exploited_hosts.rb +7 -0
  375. data/spec/factories/mdm/fingerprints/nessus_fingerprints.rb +6 -0
  376. data/spec/factories/mdm/fingerprints/nexpose_fingerprints.rb +6 -0
  377. data/spec/factories/mdm/fingerprints/nmap_fingerprints.rb +6 -0
  378. data/spec/factories/mdm/fingerprints/retina_fingerprints.rb +6 -0
  379. data/spec/factories/mdm/fingerprints/session_fingerprints.rb +6 -0
  380. data/spec/factories/mdm/host_details.rb +8 -0
  381. data/spec/factories/mdm/host_tags.rb +9 -0
  382. data/spec/factories/mdm/hosts.rb +85 -0
  383. data/spec/factories/mdm/listeners.rb +12 -0
  384. data/spec/factories/mdm/loots.rb +11 -0
  385. data/spec/factories/mdm/module/actions.rb +14 -0
  386. data/spec/factories/mdm/module/archs.rb +14 -0
  387. data/spec/factories/mdm/module/authors.rb +22 -0
  388. data/spec/factories/mdm/module/details.rb +73 -0
  389. data/spec/factories/mdm/module/mixins.rb +14 -0
  390. data/spec/factories/mdm/module/platforms.rb +14 -0
  391. data/spec/factories/mdm/module/refs.rb +14 -0
  392. data/spec/factories/mdm/module/targets.rb +19 -0
  393. data/spec/factories/mdm/nexpose_consoles.rb +15 -0
  394. data/spec/factories/mdm/notes.rb +12 -0
  395. data/spec/factories/mdm/refs.rb +9 -0
  396. data/spec/factories/mdm/routes.rb +36 -0
  397. data/spec/factories/mdm/services.rb +41 -0
  398. data/spec/factories/mdm/session_events.rb +8 -0
  399. data/spec/factories/mdm/sessions.rb +13 -0
  400. data/spec/factories/mdm/tags.rb +14 -0
  401. data/spec/factories/mdm/task.rb +16 -0
  402. data/spec/factories/mdm/task_creds.rb +9 -0
  403. data/spec/factories/mdm/task_hosts.rb +9 -0
  404. data/spec/factories/mdm/task_services.rb +8 -0
  405. data/spec/factories/mdm/task_sessions.rb +8 -0
  406. data/spec/factories/mdm/users.rb +22 -0
  407. data/spec/factories/mdm/vuln_attempts.rb +8 -0
  408. data/spec/factories/mdm/vuln_details.rb +8 -0
  409. data/spec/factories/mdm/vuln_refs.rb +4 -0
  410. data/spec/factories/mdm/vulns.rb +20 -0
  411. data/spec/factories/mdm/web_forms.rb +33 -0
  412. data/spec/factories/mdm/web_pages.rb +64 -0
  413. data/spec/factories/mdm/web_sites.rb +8 -0
  414. data/spec/factories/mdm/web_vulns.rb +64 -0
  415. data/spec/factories/mdm/workspaces.rb +23 -0
  416. data/spec/factories/metasploit_data_models/automatic_exploitation/match_results.rb +7 -0
  417. data/spec/factories/metasploit_data_models/automatic_exploitation/match_sets.rb +8 -0
  418. data/spec/factories/metasploit_data_models/automatic_exploitation/matches.rb +7 -0
  419. data/spec/factories/metasploit_data_models/automatic_exploitation/runs.rb +6 -0
  420. data/spec/factories/module_runs.rb +40 -0
  421. data/spec/lib/base64_serializer_spec.rb +172 -0
  422. data/spec/lib/ipaddr_spec.rb +29 -0
  423. data/spec/lib/metasploit_data_models/ip_address/cidr_spec.rb +356 -0
  424. data/spec/lib/metasploit_data_models/ip_address/range_spec.rb +75 -0
  425. data/spec/lib/metasploit_data_models/match/child_spec.rb +59 -0
  426. data/spec/lib/metasploit_data_models/match/parent_spec.rb +153 -0
  427. data/spec/lib/metasploit_data_models_spec.rb +13 -0
  428. data/spec/spec_helper.rb +148 -0
  429. data/spec/support/matchers/match_regex_exactly.rb +28 -0
  430. data/spec/support/shared/contexts/rex/text.rb +15 -0
  431. data/spec/support/shared/examples/coerces_inet_column_type_to_string.rb +15 -0
  432. data/spec/support/shared/examples/mdm/module/detail/does_not_support_stance_with_mtype.rb +20 -0
  433. data/spec/support/shared/examples/mdm/module/detail/supports_stance_with_mtype.rb +36 -0
  434. data/spec/support/shared/examples/metasploit_data_models/search/operation/ipaddress/match.rb +109 -0
  435. data/spec/support/shared/examples/metasploit_data_models/search/visitor/includes/visit/with_children.rb +38 -0
  436. data/spec/support/shared/examples/metasploit_data_models/search/visitor/includes/visit/with_metasploit_model_search_operation_base.rb +26 -0
  437. data/spec/support/shared/examples/metasploit_data_models/search/visitor/relation/visit/matching_record.rb +50 -0
  438. data/spec/support/shared/examples/metasploit_data_models/search/visitor/where/visit/with_equality.rb +34 -0
  439. data/spec/support/shared/examples/metasploit_data_models/search/visitor/where/visit/with_metasploit_model_search_group_base.rb +51 -0
  440. metadata +444 -6
@@ -0,0 +1,746 @@
1
+ RSpec.describe Mdm::Module::Detail, type: :model do
2
+ subject(:detail) do
3
+ FactoryBot.build(
4
+ :mdm_module_detail,
5
+ :mtype => mtype,
6
+ :stance => stance
7
+ )
8
+ end
9
+
10
+ let(:mtype) do
11
+ FactoryBot.generate :mdm_module_detail_mtype
12
+ end
13
+
14
+ let(:ranks) do
15
+ [
16
+ 0,
17
+ 100,
18
+ 200,
19
+ 300,
20
+ 400,
21
+ 500,
22
+ 600
23
+ ]
24
+ end
25
+
26
+ let(:stance) do
27
+ FactoryBot.generate :mdm_module_detail_stance
28
+ end
29
+
30
+ let(:stances) do
31
+ [
32
+ 'aggressive',
33
+ 'passive'
34
+ ]
35
+ end
36
+
37
+ let(:types) do
38
+ [
39
+ 'auxiliary',
40
+ 'encoder',
41
+ 'exploit',
42
+ 'nop',
43
+ 'payload',
44
+ 'post'
45
+ ]
46
+ end
47
+
48
+ it_should_behave_like 'Metasploit::Concern.run'
49
+
50
+ context 'associations' do
51
+ it { is_expected.to have_many(:actions).class_name('Mdm::Module::Action').dependent(:destroy) }
52
+ it { is_expected.to have_many(:archs).class_name('Mdm::Module::Arch').dependent(:destroy) }
53
+ it { is_expected.to have_many(:authors).class_name('Mdm::Module::Author').dependent(:destroy) }
54
+ it { is_expected.to have_many(:mixins).class_name('Mdm::Module::Mixin').dependent(:destroy) }
55
+ it { is_expected.to have_many(:platforms).class_name('Mdm::Module::Platform').dependent(:destroy) }
56
+ it { is_expected.to have_many(:refs).class_name('Mdm::Module::Ref').dependent(:destroy) }
57
+ it { is_expected.to have_many(:targets).class_name('Mdm::Module::Target').dependent(:destroy) }
58
+ end
59
+
60
+ context 'CONSTANTS' do
61
+ context 'DIRECTORY_BY_TYPE' do
62
+ subject(:directory_by_type) do
63
+ described_class::DIRECTORY_BY_TYPE
64
+ end
65
+
66
+ it "maps 'auxiliary' to 'auxiliary'" do
67
+ expect(directory_by_type['auxiliary']).to eq('auxiliary')
68
+ end
69
+
70
+ it "maps 'encoder' to 'encoders'" do
71
+ expect(directory_by_type['encoder']).to eq('encoders')
72
+ end
73
+
74
+ it "maps 'exploit' to 'exploits'" do
75
+ expect(directory_by_type['exploit']).to eq('exploits')
76
+ end
77
+
78
+ it "maps 'nop' to 'nops'" do
79
+ expect(directory_by_type['nop']).to eq('nops')
80
+ end
81
+
82
+ it "maps 'payload' to 'payloads'" do
83
+ expect(directory_by_type['payload']).to eq('payloads')
84
+ end
85
+
86
+ it "maps 'post' to 'post'" do
87
+ expect(directory_by_type['post']).to eq('post')
88
+ end
89
+ end
90
+
91
+ context 'PRIVILEGES' do
92
+ subject(:privileges) do
93
+ described_class::PRIVILEGES
94
+ end
95
+
96
+ it 'should contain both Boolean values' do
97
+ expect(privileges).to include(false)
98
+ expect(privileges).to include(true)
99
+ end
100
+ end
101
+
102
+ context 'RANK_BY_NAME' do
103
+ subject(:rank_by_name) do
104
+ described_class::RANK_BY_NAME
105
+ end
106
+
107
+ it "maps 'Manual' to 0" do
108
+ expect(rank_by_name['Manual']).to eq(0)
109
+ end
110
+
111
+ it "maps 'Low' to 100" do
112
+ expect(rank_by_name['Low']).to eq(100)
113
+ end
114
+
115
+ it "maps 'Average' to 200" do
116
+ expect(rank_by_name['Average']).to eq(200)
117
+ end
118
+
119
+ it "maps 'Normal' to 300" do
120
+ expect(rank_by_name['Normal']).to eq(300)
121
+ end
122
+
123
+ it "maps 'Good' to 400" do
124
+ expect(rank_by_name['Good']).to eq(400)
125
+ end
126
+
127
+ it "maps 'Great' to 500" do
128
+ expect(rank_by_name['Great']).to eq(500)
129
+ end
130
+
131
+ it "maps 'Excellent' to 600" do
132
+ expect(rank_by_name['Excellent']).to eq(600)
133
+ end
134
+ end
135
+
136
+ context 'STANCES' do
137
+ subject(:stances) do
138
+ described_class::STANCES
139
+ end
140
+
141
+ it { is_expected.to include('aggressive') }
142
+ it { is_expected.to include('passive') }
143
+ end
144
+ end
145
+
146
+ context 'database' do
147
+ context 'columns' do
148
+ it { is_expected.to have_db_column(:default_target).of_type(:integer) }
149
+ it { is_expected.to have_db_column(:description).of_type(:text) }
150
+ it { is_expected.to have_db_column(:disclosure_date).of_type(:datetime)}
151
+ it { is_expected.to have_db_column(:file).of_type(:text) }
152
+ it { is_expected.to have_db_column(:fullname).of_type(:text) }
153
+ it { is_expected.to have_db_column(:license).of_type(:string) }
154
+ it { is_expected.to have_db_column(:mtime).of_type(:datetime) }
155
+ it { is_expected.to have_db_column(:mtype).of_type(:string) }
156
+ it { is_expected.to have_db_column(:name).of_type(:text) }
157
+ it { is_expected.to have_db_column(:privileged).of_type(:boolean) }
158
+ it { is_expected.to have_db_column(:rank).of_type(:integer) }
159
+ it { is_expected.to have_db_column(:ready).of_type(:boolean) }
160
+ it { is_expected.to have_db_column(:refname).of_type(:text) }
161
+ it { is_expected.to have_db_column(:stance).of_type(:string).with_options(:null => true) }
162
+ end
163
+
164
+ context 'indices' do
165
+ it { is_expected.to have_db_index(:description) }
166
+ it { is_expected.to have_db_index(:mtype) }
167
+ it { is_expected.to have_db_index(:name) }
168
+ it { is_expected.to have_db_index(:refname) }
169
+ end
170
+ end
171
+
172
+ context 'factories' do
173
+ context 'mdm_module_detail' do
174
+ subject(:mdm_module_detail) do
175
+ FactoryBot.build(:mdm_module_detail)
176
+ end
177
+
178
+ it { is_expected.to be_valid }
179
+
180
+ context 'stance' do
181
+ subject(:mdm_module_detail) do
182
+ FactoryBot.build(:mdm_module_detail, :mtype => mtype)
183
+ end
184
+
185
+ context 'with supports_stance?' do
186
+ let(:mtype) do
187
+ 'exploit'
188
+ end
189
+
190
+ it { is_expected.to be_valid }
191
+
192
+ context '#stance' do
193
+ subject(:stance) {
194
+ mdm_module_detail.stance
195
+ }
196
+
197
+ it { is_expected.not_to be_nil }
198
+ end
199
+
200
+ context '#supports_stance?' do
201
+ subject(:supports_stance?) {
202
+ mdm_module_detail.supports_stance?
203
+ }
204
+
205
+ it { is_expected.to eq(true) }
206
+ end
207
+ end
208
+
209
+ context 'without supports_stance?' do
210
+ let(:mtype) do
211
+ 'post'
212
+ end
213
+
214
+ it { is_expected.to be_valid }
215
+
216
+ context '#stance' do
217
+ subject(:stance) {
218
+ mdm_module_detail.stance
219
+ }
220
+
221
+ it { is_expected.to be_nil }
222
+ end
223
+
224
+ context '#supports_stance?' do
225
+ subject(:supports_stance?) {
226
+ mdm_module_detail.supports_stance?
227
+ }
228
+
229
+ it { is_expected.to eq(false) }
230
+ end
231
+ end
232
+ end
233
+ end
234
+ end
235
+
236
+ context 'scopes' do
237
+
238
+ before(:each) do
239
+ @ms12_020 = FactoryBot.create(:mdm_module_detail,
240
+ name: "MS12-020 Microsoft Remote Desktop Use-After-Free DoS",
241
+ fullname: 'auxiliary/dos/windows/rdp/ms12_020_maxchannelids',
242
+ description: "This module exploits the MS12-020 RDP vulnerability originally discovered and\n reported by Luigi Auriemma. The flaw can be found in the way the T.125\n ConnectMCSPDU packet is handled in the maxChannelIDs field, which will result\n an invalid pointer being used, therefore causing a denial-of-service condition.",
243
+ mtype: 'auxiliary',
244
+ stance: 'aggressive')
245
+ @ms08_067 = FactoryBot.create(:mdm_module_detail,
246
+ name: "MS08-067 Microsoft Server Service Relative Path Stack Corruption",
247
+ fullname: 'exploit/windows/smb/ms08_067_netapi',
248
+ description: "This module exploits a parsing flaw in the path canonicalization code of\n NetAPI32.dll through the Server Service. This module is capable of bypassing\n NX on some operating systems and service packs. The correct target must be\n used to prevent the Server Service (along with a dozen others in the same\n process) from crashing. Windows XP targets seem to handle multiple successful\n exploitation events, but 2003 targets will often crash or hang on subsequent\n attempts. This is just the first version of this module, full support for\n NX bypass on 2003, along with other platforms, is still in development.",
249
+ mtype: 'exploit',
250
+ stance: 'aggressive')
251
+ @ms06_040 = FactoryBot.create(:mdm_module_detail,
252
+ name: "MS06-040 Microsoft Server Service NetpwPathCanonicalize Overflow",
253
+ fullname: 'exploit/windows/smb/ms06_040_netapi',
254
+ description: "This module exploits a stack buffer overflow in the NetApi32 CanonicalizePathName() function\n using the NetpwPathCanonicalize RPC call in the Server Service. It is likely that\n other RPC calls could be used to exploit this service. This exploit will result in\n a denial of service on Windows XP SP2 or Windows 2003 SP1. A failed exploit attempt\n will likely result in a complete reboot on Windows 2000 and the termination of all\n SMB-related services on Windows XP. The default target for this exploit should succeed\n on Windows NT 4.0, Windows 2000 SP0-SP4+, Windows XP SP0-SP1 and Windows 2003 SP0.",
255
+ mtype: 'exploit',
256
+ stance: 'aggressive')
257
+ @cve_2012_0507 = FactoryBot.create(:mdm_module_detail,
258
+ name: "Java AtomicReferenceArray Type Violation Vulnerability",
259
+ fullname: 'exploit/multi/browser/java_atomicreferencearray',
260
+ description: "This module exploits a vulnerability due to the fact that\n AtomicReferenceArray uses the Unsafe class to store a reference in an\n array directly, which may violate type safety if not used properly.\n This allows a way to escape the JRE sandbox, and load additional classes\n in order to perform malicious operations.",
261
+ mtype: 'exploit',
262
+ stance: 'passive')
263
+ @cve_2010_0425 = FactoryBot.create(:mdm_module_detail,
264
+ name: "PHP Remote File Include Generic Code Execution",
265
+ fullname: 'exploit/unix/webapp/php_include',
266
+ description: "This module can be used to exploit any generic PHP file include vulnerability,\n where the application includes code like the following:\n\n <?php include($_GET['path']); ?>",
267
+ mtype: 'exploit',
268
+ stance: 'aggressive')
269
+
270
+ @author1 = "hdm <x@hdm.io>"
271
+ @author2 = "jduck <jduck@metasploit.com>"
272
+ @author3 = "juan vazquez <juan.vazquez@metasploit.com>"
273
+ @author4 = "egypt <egypt@metasploit.com>"
274
+
275
+ FactoryBot.create(:mdm_module_author, detail: @ms12_020, name: @author2)
276
+ FactoryBot.create(:mdm_module_author, detail: @ms08_067, name: @author1)
277
+ FactoryBot.create(:mdm_module_author, detail: @ms08_067, name: @author2)
278
+ FactoryBot.create(:mdm_module_author, detail: @ms06_040, name: @author1)
279
+ FactoryBot.create(:mdm_module_author, detail: @cve_2012_0507, name: @author3)
280
+ FactoryBot.create(:mdm_module_author, detail: @cve_2012_0507, name: @author4)
281
+
282
+ FactoryBot.create(:mdm_module_platform, detail: @ms12_020, name: 'windows')
283
+ FactoryBot.create(:mdm_module_platform, detail: @ms08_067, name: 'windows')
284
+ FactoryBot.create(:mdm_module_platform, detail: @ms06_040, name: 'windows')
285
+ FactoryBot.create(:mdm_module_platform, detail: @cve_2012_0507, name: 'linux')
286
+ FactoryBot.create(:mdm_module_platform, detail: @cve_2012_0507, name: 'java')
287
+
288
+ FactoryBot.create(:mdm_module_arch, detail: @cve_2012_0507, name: '["ppc"]')
289
+ FactoryBot.create(:mdm_module_arch, detail: @cve_2012_0507, name: '["x86"]')
290
+ FactoryBot.create(:mdm_module_arch, detail: @cve_2012_0507, name: '["java"]')
291
+ FactoryBot.create(:mdm_module_arch, detail: @cve_2010_0425, name: 'php')
292
+
293
+ FactoryBot.create(:mdm_module_ref, detail: @ms12_020, name: 'EDB-18606')
294
+ FactoryBot.create(:mdm_module_ref, detail: @ms12_020, name: 'MSB-MS12-020')
295
+ FactoryBot.create(:mdm_module_ref, detail: @ms12_020, name: 'CVE-2012-0002')
296
+ FactoryBot.create(:mdm_module_ref, detail: @ms08_067, name: 'MSB-MS08-067')
297
+ FactoryBot.create(:mdm_module_ref, detail: @ms08_067, name: 'OSVDB-49243')
298
+ FactoryBot.create(:mdm_module_ref, detail: @ms08_067, name: 'CVE-2008-4250')
299
+ FactoryBot.create(:mdm_module_ref, detail: @ms06_040, name: 'MSB-MS06-040')
300
+ FactoryBot.create(:mdm_module_ref, detail: @ms06_040, name: 'BID-19409')
301
+ FactoryBot.create(:mdm_module_ref, detail: @ms06_040, name: 'OSVDB-27845')
302
+ FactoryBot.create(:mdm_module_ref, detail: @ms06_040, name: 'CVE-2006-3439')
303
+ FactoryBot.create(:mdm_module_ref, detail: @cve_2012_0507, name: 'BID-52161')
304
+ FactoryBot.create(:mdm_module_ref, detail: @cve_2012_0507, name: 'OSVDB-80724')
305
+ FactoryBot.create(:mdm_module_ref, detail: @cve_2012_0507, name: 'CVE-2012-0507')
306
+
307
+ FactoryBot.create(:mdm_module_target, detail: @ms08_067, name: 'Windows 2003 SP2 English (NX)')
308
+ FactoryBot.create(:mdm_module_target, detail: @ms08_067, name: 'Windows 2003 SP2 English (NO NX)')
309
+ FactoryBot.create(:mdm_module_target, detail: @ms08_067, name: 'Windows 2003 SP1 English (NX)')
310
+ FactoryBot.create(:mdm_module_target, detail: @ms08_067, name: 'Windows 2003 SP1 English (NO NX)')
311
+ FactoryBot.create(:mdm_module_target, detail: @ms08_067, name: 'Windows XP SP3 English (NX)')
312
+ FactoryBot.create(:mdm_module_target, detail: @ms08_067, name: 'Windows XP SP3 English (AlwaysOn NX)')
313
+ FactoryBot.create(:mdm_module_target, detail: @ms08_067, name: 'Windows XP SP2 English (NX)')
314
+ FactoryBot.create(:mdm_module_target, detail: @ms08_067, name: 'Windows XP SP2 English (AlwaysOn NX)')
315
+ FactoryBot.create(:mdm_module_target, detail: @ms08_067, name: 'Automatic Targeting')
316
+ FactoryBot.create(:mdm_module_target, detail: @ms06_040, name: '(wcscpy) Windows 2003 SP0')
317
+ FactoryBot.create(:mdm_module_target, detail: @ms06_040, name: '(stack) Windows XP SP1 English')
318
+ FactoryBot.create(:mdm_module_target, detail: @ms06_040, name: '(wcscpy) Windows XP SP0/SP1')
319
+ FactoryBot.create(:mdm_module_target, detail: @ms06_040, name: '(wcscpy) Windows NT 4.0 / Windows 2000 SP0-SP4')
320
+ FactoryBot.create(:mdm_module_target, detail: @ms06_040, name: '(wcscpy) Automatic (NT 4.0, 2000 SP0-SP4, XP SP0-SP1)')
321
+ FactoryBot.create(:mdm_module_target, detail: @cve_2012_0507, name: 'Linux x86 (Native Payload)')
322
+ FactoryBot.create(:mdm_module_target, detail: @cve_2012_0507, name: 'Mac OS X x86 (Native Payload)')
323
+ FactoryBot.create(:mdm_module_target, detail: @cve_2012_0507, name: 'Mac OS X PPC (Native Payload)')
324
+ FactoryBot.create(:mdm_module_target, detail: @cve_2012_0507, name: 'Windows x86 (Native Payload)')
325
+ FactoryBot.create(:mdm_module_target, detail: @cve_2012_0507, name: 'Generic (Java Payload)')
326
+ FactoryBot.create(:mdm_module_target, detail: @cve_2010_0425, name: 'Automatic')
327
+ end
328
+
329
+ context '#module_arch' do
330
+ it 'finds all modules with a stance matching "java"' do
331
+ expect(Mdm::Module::Detail.module_arch(['%java%']).distinct).to contain_exactly(@cve_2012_0507)
332
+ end
333
+ it 'finds all modules with a stance matching "pass"' do
334
+ expect(Mdm::Module::Detail.module_arch(['%java%', '%php%']).distinct).to contain_exactly(@cve_2012_0507, @cve_2010_0425)
335
+ end
336
+ end
337
+
338
+ context '#module_author' do
339
+ it 'finds all modules with author matching "Juan"' do
340
+ expect(Mdm::Module::Detail.module_author(['%juan%'])).to contain_exactly(@cve_2012_0507)
341
+ end
342
+
343
+ it 'finds all modules for author matching "hdm"' do
344
+ expect(Mdm::Module::Detail.module_author(['%hdm%'])).to contain_exactly(@ms08_067, @ms06_040)
345
+ end
346
+ it 'finds all modules with authors matching "juan", "jduck"' do
347
+ expect(Mdm::Module::Detail.module_author(['%juan%','%jduck%'])).to contain_exactly(@ms12_020,@ms08_067,@cve_2012_0507)
348
+ end
349
+ end
350
+
351
+ context '#module_name' do
352
+ it 'finds all modules with name matching "DoS"' do
353
+ expect(Mdm::Module::Detail.module_name(['%DoS%'])).to contain_exactly(@ms12_020)
354
+ end
355
+
356
+ it 'finds all modules with name matching "netapi"' do
357
+ expect(Mdm::Module::Detail.module_name(['%netapi%'])).to contain_exactly(@ms08_067, @ms06_040)
358
+ end
359
+
360
+ it 'finds all modules with name matching "browser"' do
361
+ expect(Mdm::Module::Detail.module_name(['%browser%'])).to contain_exactly(@cve_2012_0507)
362
+ end
363
+ end
364
+
365
+ context '#module_os_or_platform' do
366
+ it 'finds all modules with a platform matching "linux"' do
367
+ expect(Mdm::Module::Detail.module_os_or_platform(['%linux%']).distinct).to contain_exactly(@cve_2012_0507)
368
+ end
369
+
370
+ it 'finds all modules with a platform matching "windows"' do
371
+ expect(Mdm::Module::Detail.module_os_or_platform(['%windows%']).distinct).to contain_exactly(
372
+ @ms12_020,@ms08_067,@ms06_040,@cve_2012_0507)
373
+ end
374
+ end
375
+
376
+ context 'module_ref' do
377
+ it 'finds all modules with a reff matching "CVE-2012"' do
378
+ expect(Mdm::Module::Detail.module_ref(['%CVE-2012%']).distinct).to contain_exactly(
379
+ @ms12_020,@cve_2012_0507)
380
+ end
381
+ it 'finds all modules with a reff matching "EDB"' do
382
+ expect(Mdm::Module::Detail.module_ref(['%EDB%']).distinct).to contain_exactly(@ms12_020)
383
+ end
384
+ end
385
+
386
+ context '#module_stance' do
387
+ it 'finds all modules with a stance matching "agg"' do
388
+ expect(Mdm::Module::Detail.module_stance(['%agg%']).distinct).to contain_exactly(
389
+ @ms12_020,@ms08_067,@ms06_040,@cve_2010_0425)
390
+ end
391
+ it 'finds all modules with a stance matching "pass"' do
392
+ expect(Mdm::Module::Detail.module_stance(['%pass%']).distinct).to contain_exactly(@cve_2012_0507)
393
+ end
394
+ end
395
+
396
+ context '#module_text' do
397
+ it 'finds all modules with a description matching "ConnectMCSPDU"' do
398
+ expect(Mdm::Module::Detail.module_text(['%ConnectMCSPDU%']).distinct).to contain_exactly(@ms12_020)
399
+ end
400
+ it 'finds all modules with a fullname matching "smb/ms0"' do
401
+ expect(Mdm::Module::Detail.module_text(['%smb/ms0%']).distinct).to contain_exactly(@ms08_067,@ms06_040)
402
+ end
403
+ it 'finds all modules with a name matching "Microsoft Server Service"' do
404
+ expect(Mdm::Module::Detail.module_text(['%Microsoft Server Service%']).distinct).to contain_exactly(@ms08_067,@ms06_040)
405
+ end
406
+ it 'finds all modules with a arch matching "php"' do
407
+ expect(Mdm::Module::Detail.module_text(['%php%']).distinct).to contain_exactly(@cve_2010_0425)
408
+ end
409
+ it 'finds all modules with a author matching "jduck"' do
410
+ expect(Mdm::Module::Detail.module_text(['%jduck%']).distinct).to contain_exactly(@ms12_020,@ms08_067)
411
+ end
412
+ it 'finds all modules with a platform matching "linux"' do
413
+ expect(Mdm::Module::Detail.module_text(['%linux%']).distinct).to contain_exactly(@cve_2012_0507)
414
+ end
415
+ it 'finds all modules with a ref matching "MSB-MS"' do
416
+ expect(Mdm::Module::Detail.module_text(['%MSB-MS%']).distinct).to contain_exactly(@ms12_020,@ms08_067,@ms06_040)
417
+ end
418
+ it 'finds all modules with a target matching "Auto"' do
419
+ expect(Mdm::Module::Detail.module_text(['%Auto%']).distinct).to contain_exactly(@ms08_067,@ms06_040,@cve_2010_0425)
420
+ end
421
+ end
422
+
423
+ context 'module_type' do
424
+ it 'finds all modules with a mtype matching "aux"' do
425
+ expect(Mdm::Module::Detail.module_type(['%aux%']).distinct).to contain_exactly(@ms12_020)
426
+ end
427
+ it 'finds all modules with a mtype matching "exp"' do
428
+ expect(Mdm::Module::Detail.module_type(['%exp%']).distinct).to contain_exactly(
429
+ @ms08_067,@ms06_040,@cve_2012_0507,@cve_2010_0425)
430
+ end
431
+ end
432
+
433
+
434
+ end
435
+
436
+ context 'validations' do
437
+ it { is_expected.to validate_inclusion_of(:mtype).in_array(types) }
438
+
439
+ # Because the boolean field will cast most strings to false,
440
+ # validate_inclusion_of(:privileged).in_array([true, false]) will fail on the disallowed values check.
441
+
442
+ context 'rank' do
443
+ it 'validates rank is only an integer' do
444
+ is_expected.to validate_numericality_of(:rank).only_integer
445
+ end
446
+
447
+ it { is_expected.to validate_inclusion_of(:rank).in_array(ranks) }
448
+ end
449
+
450
+ it { is_expected.to validate_presence_of(:refname) }
451
+
452
+ context 'stance' do
453
+ context 'mtype' do
454
+ it_should_behave_like 'Mdm::Module::Detail supports stance with mtype', 'auxiliary'
455
+ it_should_behave_like 'Mdm::Module::Detail supports stance with mtype', 'exploit'
456
+
457
+ it_should_behave_like 'Mdm::Module::Detail does not support stance with mtype', 'encoder'
458
+ it_should_behave_like 'Mdm::Module::Detail does not support stance with mtype', 'nop'
459
+ it_should_behave_like 'Mdm::Module::Detail does not support stance with mtype', 'payload'
460
+ it_should_behave_like 'Mdm::Module::Detail does not support stance with mtype', 'post'
461
+ end
462
+ end
463
+ end
464
+
465
+ context 'with saved' do
466
+ before(:example) do
467
+ detail.save!
468
+ end
469
+
470
+ context '#add_action' do
471
+ def add_action
472
+ detail.add_action(name)
473
+ end
474
+
475
+ let(:name) do
476
+ FactoryBot.generate :mdm_module_action_name
477
+ end
478
+
479
+ it 'should add an Mdm::Action under the Mdm::ModuleDetail' do
480
+ expect {
481
+ add_action
482
+ }.to change(detail.actions, :length).by(1)
483
+ end
484
+
485
+ context 'new Mdm::Action' do
486
+ subject(:module_action) do
487
+ add_action
488
+
489
+ detail.actions.last
490
+ end
491
+
492
+ it { is_expected.to be_valid }
493
+
494
+ context '#name' do
495
+ it 'is name passed to add_action' do
496
+ expect(module_action.name).to eq(name)
497
+ end
498
+ end
499
+ end
500
+ end
501
+
502
+ context '#add_arch' do
503
+ def add_arch
504
+ detail.add_arch(name)
505
+ end
506
+
507
+ let(:name) do
508
+ FactoryBot.generate :mdm_module_arch_name
509
+ end
510
+
511
+ it 'should add an Mdm::ModuleArch under the Mdm::ModuleDetail' do
512
+ expect {
513
+ add_arch
514
+ }.to change(detail.archs, :length).by(1)
515
+ end
516
+
517
+ context 'new Mdm::ModuleArch' do
518
+ subject(:module_arch) do
519
+ add_arch
520
+
521
+ detail.archs.last
522
+ end
523
+
524
+ it { is_expected.to be_valid }
525
+
526
+ context '#name' do
527
+ it 'is name passed to add_arch' do
528
+ expect(module_arch.name).to eq(name)
529
+ end
530
+ end
531
+ end
532
+ end
533
+
534
+ context '#add_author' do
535
+ let(:name) do
536
+ FactoryBot.generate :mdm_module_author_name
537
+ end
538
+
539
+ context 'with email' do
540
+ def add_author
541
+ detail.add_author(name, email)
542
+ end
543
+
544
+ let(:email) do
545
+ FactoryBot.generate :mdm_module_author_email
546
+ end
547
+
548
+ it 'should add an Mdm::ModuleAuthor under the Mdm::ModuleDetail' do
549
+ expect {
550
+ add_author
551
+ }.to change(detail.authors, :length).by(1)
552
+ end
553
+
554
+ context 'new Mdm::ModuleAuthor' do
555
+ subject(:module_author) do
556
+ add_author
557
+
558
+ detail.authors.last
559
+ end
560
+
561
+ it { is_expected.to be_valid }
562
+
563
+ context '#email' do
564
+ it 'is email passed to add_author' do
565
+ expect(module_author.email).to eq(email)
566
+ end
567
+ end
568
+
569
+ context '#name' do
570
+ it 'is name passed to add_author' do
571
+ expect(module_author.name).to eq(name)
572
+ end
573
+ end
574
+ end
575
+ end
576
+
577
+ context 'without email' do
578
+ def add_author
579
+ detail.add_author(name)
580
+ end
581
+
582
+ it 'should add an Mdm::ModuleAuthor under the Mdm::ModuleDetail' do
583
+ expect {
584
+ add_author
585
+ }.to change(detail.authors, :length).by(1)
586
+ end
587
+
588
+ context 'new Mdm::ModuleAuthor' do
589
+ subject(:module_author) do
590
+ add_author
591
+
592
+ detail.authors.last
593
+ end
594
+
595
+ it { is_expected.to be_valid }
596
+
597
+ context '#email' do
598
+ subject(:module_author_email) {
599
+ module_author.email
600
+ }
601
+
602
+ it { is_expected.to be_nil }
603
+ end
604
+
605
+ context '#name' do
606
+ it 'is name passed to add_author' do
607
+ expect(module_author.name).to eq(name)
608
+ end
609
+ end
610
+ end
611
+ end
612
+ end
613
+
614
+ context '#add_mixin' do
615
+ def add_mixin
616
+ detail.add_mixin(name)
617
+ end
618
+
619
+ let(:name) do
620
+ FactoryBot.generate :mdm_module_mixin_name
621
+ end
622
+
623
+ it 'should add an Mdm::ModuleMixin under the Mdm::ModuleDetail' do
624
+ expect {
625
+ add_mixin
626
+ }.to change(detail.mixins, :length).by(1)
627
+ end
628
+
629
+ context 'new Mdm::ModuleMixin' do
630
+ subject(:mdm_module_mixin) do
631
+ add_mixin
632
+
633
+ detail.mixins.last
634
+ end
635
+
636
+ it { is_expected.to be_valid }
637
+
638
+ context '#name' do
639
+ it 'is name passed to add_mixin' do
640
+ expect(mdm_module_mixin.name).to eq(name)
641
+ end
642
+ end
643
+ end
644
+ end
645
+
646
+ context '#add_platform' do
647
+ def add_platform
648
+ detail.add_platform(name)
649
+ end
650
+
651
+ let(:name) do
652
+ FactoryBot.generate :mdm_module_platform_name
653
+ end
654
+
655
+ it 'should add an Mdm::ModulePlatform under the Mdm::ModuleDetail' do
656
+ expect {
657
+ add_platform
658
+ }.to change(detail.platforms, :length).by(1)
659
+ end
660
+
661
+ context 'new Mdm::ModulePlatform' do
662
+ subject(:module_platform) do
663
+ add_platform
664
+
665
+ detail.platforms.last
666
+ end
667
+
668
+ it { is_expected.to be_valid }
669
+
670
+ context '#name' do
671
+ it 'is name passed to add_platform' do
672
+ expect(module_platform.name).to eq(name)
673
+ end
674
+ end
675
+ end
676
+ end
677
+
678
+ context '#add_ref' do
679
+ def add_ref
680
+ detail.add_ref(name)
681
+ end
682
+
683
+ let(:name) do
684
+ FactoryBot.generate :mdm_module_ref_name
685
+ end
686
+
687
+ it 'should add an Mdm::ModuleRef under the Mdm::ModuleDetail' do
688
+ expect {
689
+ add_ref
690
+ }.to change(detail.refs, :length).by(1)
691
+ end
692
+
693
+ context 'new Mdm::ModuleRef' do
694
+ subject(:module_ref) do
695
+ add_ref
696
+
697
+ detail.refs.last
698
+ end
699
+
700
+ it { is_expected.to be_valid }
701
+
702
+ context '#name' do
703
+ it 'is name passed to add_ref' do
704
+ expect(module_ref.name).to eq(name)
705
+ end
706
+ end
707
+ end
708
+ end
709
+
710
+ context '#add_target' do
711
+ def add_target
712
+ detail.add_target(index, name)
713
+ end
714
+
715
+ let(:index) do
716
+ FactoryBot.generate :mdm_module_target_index
717
+ end
718
+
719
+ let(:name) do
720
+ FactoryBot.generate :mdm_module_target_name
721
+ end
722
+
723
+ it 'should add an Mdm::ModuleTarget under the Mdm::ModuleDetail' do
724
+ expect {
725
+ add_target
726
+ }.to change(detail.targets, :length).by(1)
727
+ end
728
+
729
+ context 'new Mdm::ModuleTarget' do
730
+ subject(:module_target) do
731
+ add_target
732
+
733
+ detail.targets.last
734
+ end
735
+
736
+ it { is_expected.to be_valid }
737
+
738
+ context '#name' do
739
+ it 'is name passed to add_target' do
740
+ expect(module_target.name).to eq(name)
741
+ end
742
+ end
743
+ end
744
+ end
745
+ end
746
+ end