souleyez 2.43.28__py3-none-any.whl → 2.43.32__py3-none-any.whl

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 (356) hide show
  1. souleyez/__init__.py +1 -2
  2. souleyez/ai/__init__.py +21 -15
  3. souleyez/ai/action_mapper.py +249 -150
  4. souleyez/ai/chain_advisor.py +116 -100
  5. souleyez/ai/claude_provider.py +29 -28
  6. souleyez/ai/context_builder.py +80 -62
  7. souleyez/ai/executor.py +158 -117
  8. souleyez/ai/feedback_handler.py +136 -121
  9. souleyez/ai/llm_factory.py +27 -20
  10. souleyez/ai/llm_provider.py +4 -2
  11. souleyez/ai/ollama_provider.py +6 -9
  12. souleyez/ai/ollama_service.py +44 -37
  13. souleyez/ai/path_scorer.py +91 -76
  14. souleyez/ai/recommender.py +176 -144
  15. souleyez/ai/report_context.py +74 -73
  16. souleyez/ai/report_service.py +84 -66
  17. souleyez/ai/result_parser.py +222 -229
  18. souleyez/ai/safety.py +67 -44
  19. souleyez/auth/__init__.py +23 -22
  20. souleyez/auth/audit.py +36 -26
  21. souleyez/auth/engagement_access.py +65 -48
  22. souleyez/auth/permissions.py +14 -3
  23. souleyez/auth/session_manager.py +54 -37
  24. souleyez/auth/user_manager.py +109 -64
  25. souleyez/commands/audit.py +40 -43
  26. souleyez/commands/auth.py +35 -15
  27. souleyez/commands/deliverables.py +55 -50
  28. souleyez/commands/engagement.py +47 -28
  29. souleyez/commands/license.py +32 -23
  30. souleyez/commands/screenshots.py +36 -32
  31. souleyez/commands/user.py +82 -36
  32. souleyez/config.py +52 -44
  33. souleyez/core/credential_tester.py +87 -81
  34. souleyez/core/cve_mappings.py +179 -192
  35. souleyez/core/cve_matcher.py +162 -148
  36. souleyez/core/msf_auto_mapper.py +100 -83
  37. souleyez/core/msf_chain_engine.py +294 -256
  38. souleyez/core/msf_database.py +153 -70
  39. souleyez/core/msf_integration.py +679 -673
  40. souleyez/core/msf_rpc_client.py +40 -42
  41. souleyez/core/msf_rpc_manager.py +77 -79
  42. souleyez/core/msf_sync_manager.py +241 -181
  43. souleyez/core/network_utils.py +22 -15
  44. souleyez/core/parser_handler.py +34 -25
  45. souleyez/core/pending_chains.py +114 -63
  46. souleyez/core/templates.py +158 -107
  47. souleyez/core/tool_chaining.py +9592 -2879
  48. souleyez/core/version_utils.py +79 -94
  49. souleyez/core/vuln_correlation.py +136 -89
  50. souleyez/core/web_utils.py +33 -32
  51. souleyez/data/wordlists/ad_users.txt +378 -0
  52. souleyez/data/wordlists/api_endpoints_large.txt +769 -0
  53. souleyez/data/wordlists/home_dir_sensitive.txt +39 -0
  54. souleyez/data/wordlists/lfi_payloads.txt +82 -0
  55. souleyez/data/wordlists/passwords_brute.txt +1548 -0
  56. souleyez/data/wordlists/passwords_crack.txt +2479 -0
  57. souleyez/data/wordlists/passwords_spray.txt +386 -0
  58. souleyez/data/wordlists/subdomains_large.txt +5057 -0
  59. souleyez/data/wordlists/usernames_common.txt +694 -0
  60. souleyez/data/wordlists/web_dirs_large.txt +4769 -0
  61. souleyez/detection/__init__.py +1 -1
  62. souleyez/detection/attack_signatures.py +12 -17
  63. souleyez/detection/mitre_mappings.py +61 -55
  64. souleyez/detection/validator.py +97 -86
  65. souleyez/devtools.py +23 -10
  66. souleyez/docs/README.md +4 -4
  67. souleyez/docs/api-reference/cli-commands.md +2 -2
  68. souleyez/docs/developer-guide/adding-new-tools.md +562 -0
  69. souleyez/docs/user-guide/auto-chaining.md +30 -8
  70. souleyez/docs/user-guide/getting-started.md +1 -1
  71. souleyez/docs/user-guide/installation.md +26 -3
  72. souleyez/docs/user-guide/metasploit-integration.md +2 -2
  73. souleyez/docs/user-guide/rbac.md +1 -1
  74. souleyez/docs/user-guide/scope-management.md +1 -1
  75. souleyez/docs/user-guide/siem-integration.md +1 -1
  76. souleyez/docs/user-guide/tools-reference.md +1 -8
  77. souleyez/docs/user-guide/worker-management.md +1 -1
  78. souleyez/engine/background.py +1238 -535
  79. souleyez/engine/base.py +4 -1
  80. souleyez/engine/job_status.py +17 -49
  81. souleyez/engine/log_sanitizer.py +103 -77
  82. souleyez/engine/manager.py +38 -7
  83. souleyez/engine/result_handler.py +2198 -1550
  84. souleyez/engine/worker_manager.py +50 -41
  85. souleyez/export/evidence_bundle.py +72 -62
  86. souleyez/feature_flags/features.py +16 -20
  87. souleyez/feature_flags.py +5 -9
  88. souleyez/handlers/__init__.py +11 -0
  89. souleyez/handlers/base.py +188 -0
  90. souleyez/handlers/bash_handler.py +277 -0
  91. souleyez/handlers/bloodhound_handler.py +243 -0
  92. souleyez/handlers/certipy_handler.py +311 -0
  93. souleyez/handlers/crackmapexec_handler.py +486 -0
  94. souleyez/handlers/dnsrecon_handler.py +344 -0
  95. souleyez/handlers/enum4linux_handler.py +400 -0
  96. souleyez/handlers/evil_winrm_handler.py +493 -0
  97. souleyez/handlers/ffuf_handler.py +815 -0
  98. souleyez/handlers/gobuster_handler.py +1114 -0
  99. souleyez/handlers/gpp_extract_handler.py +334 -0
  100. souleyez/handlers/hashcat_handler.py +444 -0
  101. souleyez/handlers/hydra_handler.py +563 -0
  102. souleyez/handlers/impacket_getuserspns_handler.py +343 -0
  103. souleyez/handlers/impacket_psexec_handler.py +222 -0
  104. souleyez/handlers/impacket_secretsdump_handler.py +426 -0
  105. souleyez/handlers/john_handler.py +286 -0
  106. souleyez/handlers/katana_handler.py +425 -0
  107. souleyez/handlers/kerbrute_handler.py +298 -0
  108. souleyez/handlers/ldapsearch_handler.py +636 -0
  109. souleyez/handlers/lfi_extract_handler.py +464 -0
  110. souleyez/handlers/msf_auxiliary_handler.py +408 -0
  111. souleyez/handlers/msf_exploit_handler.py +380 -0
  112. souleyez/handlers/nikto_handler.py +413 -0
  113. souleyez/handlers/nmap_handler.py +821 -0
  114. souleyez/handlers/nuclei_handler.py +359 -0
  115. souleyez/handlers/nxc_handler.py +371 -0
  116. souleyez/handlers/rdp_sec_check_handler.py +353 -0
  117. souleyez/handlers/registry.py +288 -0
  118. souleyez/handlers/responder_handler.py +232 -0
  119. souleyez/handlers/service_explorer_handler.py +434 -0
  120. souleyez/handlers/smbclient_handler.py +344 -0
  121. souleyez/handlers/smbmap_handler.py +510 -0
  122. souleyez/handlers/smbpasswd_handler.py +296 -0
  123. souleyez/handlers/sqlmap_handler.py +1116 -0
  124. souleyez/handlers/theharvester_handler.py +601 -0
  125. souleyez/handlers/whois_handler.py +277 -0
  126. souleyez/handlers/wpscan_handler.py +554 -0
  127. souleyez/history.py +32 -16
  128. souleyez/importers/msf_importer.py +106 -75
  129. souleyez/importers/smart_importer.py +208 -147
  130. souleyez/integrations/siem/__init__.py +10 -10
  131. souleyez/integrations/siem/base.py +17 -18
  132. souleyez/integrations/siem/elastic.py +108 -122
  133. souleyez/integrations/siem/factory.py +207 -80
  134. souleyez/integrations/siem/googlesecops.py +146 -154
  135. souleyez/integrations/siem/rule_mappings/__init__.py +1 -1
  136. souleyez/integrations/siem/rule_mappings/wazuh_rules.py +8 -5
  137. souleyez/integrations/siem/sentinel.py +107 -109
  138. souleyez/integrations/siem/splunk.py +246 -212
  139. souleyez/integrations/siem/wazuh.py +65 -71
  140. souleyez/integrations/wazuh/__init__.py +5 -5
  141. souleyez/integrations/wazuh/client.py +70 -93
  142. souleyez/integrations/wazuh/config.py +85 -57
  143. souleyez/integrations/wazuh/host_mapper.py +28 -36
  144. souleyez/integrations/wazuh/sync.py +78 -68
  145. souleyez/intelligence/__init__.py +4 -5
  146. souleyez/intelligence/correlation_analyzer.py +309 -295
  147. souleyez/intelligence/exploit_knowledge.py +661 -623
  148. souleyez/intelligence/exploit_suggestions.py +159 -139
  149. souleyez/intelligence/gap_analyzer.py +132 -97
  150. souleyez/intelligence/gap_detector.py +251 -214
  151. souleyez/intelligence/sensitive_tables.py +266 -129
  152. souleyez/intelligence/service_parser.py +137 -123
  153. souleyez/intelligence/surface_analyzer.py +407 -268
  154. souleyez/intelligence/target_parser.py +159 -162
  155. souleyez/licensing/__init__.py +6 -6
  156. souleyez/licensing/validator.py +17 -19
  157. souleyez/log_config.py +79 -54
  158. souleyez/main.py +1505 -687
  159. souleyez/migrations/fix_job_counter.py +16 -14
  160. souleyez/parsers/bloodhound_parser.py +41 -39
  161. souleyez/parsers/crackmapexec_parser.py +178 -111
  162. souleyez/parsers/dalfox_parser.py +72 -77
  163. souleyez/parsers/dnsrecon_parser.py +103 -91
  164. souleyez/parsers/enum4linux_parser.py +183 -153
  165. souleyez/parsers/ffuf_parser.py +29 -25
  166. souleyez/parsers/gobuster_parser.py +301 -41
  167. souleyez/parsers/hashcat_parser.py +324 -79
  168. souleyez/parsers/http_fingerprint_parser.py +350 -103
  169. souleyez/parsers/hydra_parser.py +131 -111
  170. souleyez/parsers/impacket_parser.py +231 -178
  171. souleyez/parsers/john_parser.py +98 -86
  172. souleyez/parsers/katana_parser.py +316 -0
  173. souleyez/parsers/msf_parser.py +943 -498
  174. souleyez/parsers/nikto_parser.py +346 -65
  175. souleyez/parsers/nmap_parser.py +262 -174
  176. souleyez/parsers/nuclei_parser.py +40 -44
  177. souleyez/parsers/responder_parser.py +26 -26
  178. souleyez/parsers/searchsploit_parser.py +74 -74
  179. souleyez/parsers/service_explorer_parser.py +279 -0
  180. souleyez/parsers/smbmap_parser.py +180 -124
  181. souleyez/parsers/sqlmap_parser.py +434 -308
  182. souleyez/parsers/theharvester_parser.py +75 -57
  183. souleyez/parsers/whois_parser.py +135 -94
  184. souleyez/parsers/wpscan_parser.py +278 -190
  185. souleyez/plugins/afp.py +44 -36
  186. souleyez/plugins/afp_brute.py +114 -46
  187. souleyez/plugins/ard.py +48 -37
  188. souleyez/plugins/bloodhound.py +95 -61
  189. souleyez/plugins/certipy.py +303 -0
  190. souleyez/plugins/crackmapexec.py +186 -85
  191. souleyez/plugins/dalfox.py +120 -59
  192. souleyez/plugins/dns_hijack.py +146 -41
  193. souleyez/plugins/dnsrecon.py +97 -61
  194. souleyez/plugins/enum4linux.py +91 -66
  195. souleyez/plugins/evil_winrm.py +291 -0
  196. souleyez/plugins/ffuf.py +166 -90
  197. souleyez/plugins/firmware_extract.py +133 -29
  198. souleyez/plugins/gobuster.py +387 -190
  199. souleyez/plugins/gpp_extract.py +393 -0
  200. souleyez/plugins/hashcat.py +100 -73
  201. souleyez/plugins/http_fingerprint.py +854 -267
  202. souleyez/plugins/hydra.py +566 -200
  203. souleyez/plugins/impacket_getnpusers.py +117 -69
  204. souleyez/plugins/impacket_psexec.py +84 -64
  205. souleyez/plugins/impacket_secretsdump.py +103 -69
  206. souleyez/plugins/impacket_smbclient.py +89 -75
  207. souleyez/plugins/john.py +86 -69
  208. souleyez/plugins/katana.py +313 -0
  209. souleyez/plugins/kerbrute.py +237 -0
  210. souleyez/plugins/lfi_extract.py +541 -0
  211. souleyez/plugins/macos_ssh.py +117 -48
  212. souleyez/plugins/mdns.py +35 -30
  213. souleyez/plugins/msf_auxiliary.py +253 -130
  214. souleyez/plugins/msf_exploit.py +239 -161
  215. souleyez/plugins/nikto.py +134 -78
  216. souleyez/plugins/nmap.py +275 -91
  217. souleyez/plugins/nuclei.py +180 -89
  218. souleyez/plugins/nxc.py +285 -0
  219. souleyez/plugins/plugin_base.py +35 -36
  220. souleyez/plugins/plugin_template.py +13 -5
  221. souleyez/plugins/rdp_sec_check.py +130 -0
  222. souleyez/plugins/responder.py +112 -71
  223. souleyez/plugins/router_http_brute.py +76 -65
  224. souleyez/plugins/router_ssh_brute.py +118 -41
  225. souleyez/plugins/router_telnet_brute.py +124 -42
  226. souleyez/plugins/routersploit.py +91 -59
  227. souleyez/plugins/routersploit_exploit.py +77 -55
  228. souleyez/plugins/searchsploit.py +91 -77
  229. souleyez/plugins/service_explorer.py +1160 -0
  230. souleyez/plugins/smbmap.py +122 -72
  231. souleyez/plugins/smbpasswd.py +215 -0
  232. souleyez/plugins/sqlmap.py +301 -113
  233. souleyez/plugins/theharvester.py +127 -75
  234. souleyez/plugins/tr069.py +79 -57
  235. souleyez/plugins/upnp.py +65 -47
  236. souleyez/plugins/upnp_abuse.py +73 -55
  237. souleyez/plugins/vnc_access.py +129 -42
  238. souleyez/plugins/vnc_brute.py +109 -38
  239. souleyez/plugins/whois.py +77 -58
  240. souleyez/plugins/wpscan.py +173 -69
  241. souleyez/reporting/__init__.py +2 -1
  242. souleyez/reporting/attack_chain.py +411 -346
  243. souleyez/reporting/charts.py +436 -501
  244. souleyez/reporting/compliance_mappings.py +334 -201
  245. souleyez/reporting/detection_report.py +126 -125
  246. souleyez/reporting/formatters.py +828 -591
  247. souleyez/reporting/generator.py +386 -302
  248. souleyez/reporting/metrics.py +72 -75
  249. souleyez/scanner.py +35 -29
  250. souleyez/security/__init__.py +37 -11
  251. souleyez/security/scope_validator.py +175 -106
  252. souleyez/security/validation.py +223 -149
  253. souleyez/security.py +22 -6
  254. souleyez/storage/credentials.py +247 -186
  255. souleyez/storage/crypto.py +296 -129
  256. souleyez/storage/database.py +73 -50
  257. souleyez/storage/db.py +58 -36
  258. souleyez/storage/deliverable_evidence.py +177 -128
  259. souleyez/storage/deliverable_exporter.py +282 -246
  260. souleyez/storage/deliverable_templates.py +134 -116
  261. souleyez/storage/deliverables.py +135 -130
  262. souleyez/storage/engagements.py +109 -56
  263. souleyez/storage/evidence.py +181 -152
  264. souleyez/storage/execution_log.py +31 -17
  265. souleyez/storage/exploit_attempts.py +93 -57
  266. souleyez/storage/exploits.py +67 -36
  267. souleyez/storage/findings.py +48 -61
  268. souleyez/storage/hosts.py +176 -144
  269. souleyez/storage/migrate_to_engagements.py +43 -19
  270. souleyez/storage/migrations/_001_add_credential_enhancements.py +22 -12
  271. souleyez/storage/migrations/_002_add_status_tracking.py +10 -7
  272. souleyez/storage/migrations/_003_add_execution_log.py +14 -8
  273. souleyez/storage/migrations/_005_screenshots.py +13 -5
  274. souleyez/storage/migrations/_006_deliverables.py +13 -5
  275. souleyez/storage/migrations/_007_deliverable_templates.py +12 -7
  276. souleyez/storage/migrations/_008_add_nuclei_table.py +10 -4
  277. souleyez/storage/migrations/_010_evidence_linking.py +17 -10
  278. souleyez/storage/migrations/_011_timeline_tracking.py +20 -13
  279. souleyez/storage/migrations/_012_team_collaboration.py +34 -21
  280. souleyez/storage/migrations/_013_add_host_tags.py +12 -6
  281. souleyez/storage/migrations/_014_exploit_attempts.py +22 -10
  282. souleyez/storage/migrations/_015_add_mac_os_fields.py +15 -7
  283. souleyez/storage/migrations/_016_add_domain_field.py +10 -4
  284. souleyez/storage/migrations/_017_msf_sessions.py +16 -8
  285. souleyez/storage/migrations/_018_add_osint_target.py +10 -6
  286. souleyez/storage/migrations/_019_add_engagement_type.py +10 -6
  287. souleyez/storage/migrations/_020_add_rbac.py +36 -15
  288. souleyez/storage/migrations/_021_wazuh_integration.py +20 -8
  289. souleyez/storage/migrations/_022_wazuh_indexer_columns.py +6 -4
  290. souleyez/storage/migrations/_023_fix_detection_results_fk.py +16 -6
  291. souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +26 -10
  292. souleyez/storage/migrations/_025_multi_siem_support.py +3 -5
  293. souleyez/storage/migrations/_026_add_engagement_scope.py +31 -12
  294. souleyez/storage/migrations/_027_multi_siem_persistence.py +32 -15
  295. souleyez/storage/migrations/__init__.py +26 -26
  296. souleyez/storage/migrations/migration_manager.py +19 -19
  297. souleyez/storage/msf_sessions.py +100 -65
  298. souleyez/storage/osint.py +17 -24
  299. souleyez/storage/recommendation_engine.py +269 -235
  300. souleyez/storage/screenshots.py +33 -32
  301. souleyez/storage/smb_shares.py +136 -92
  302. souleyez/storage/sqlmap_data.py +183 -128
  303. souleyez/storage/team_collaboration.py +135 -141
  304. souleyez/storage/timeline_tracker.py +122 -94
  305. souleyez/storage/wazuh_vulns.py +64 -66
  306. souleyez/storage/web_paths.py +33 -37
  307. souleyez/testing/credential_tester.py +221 -205
  308. souleyez/ui/__init__.py +1 -1
  309. souleyez/ui/ai_quotes.py +12 -12
  310. souleyez/ui/attack_surface.py +2439 -1516
  311. souleyez/ui/chain_rules_view.py +914 -382
  312. souleyez/ui/correlation_view.py +312 -230
  313. souleyez/ui/dashboard.py +2382 -1130
  314. souleyez/ui/deliverables_view.py +148 -62
  315. souleyez/ui/design_system.py +13 -13
  316. souleyez/ui/errors.py +49 -49
  317. souleyez/ui/evidence_linking_view.py +284 -179
  318. souleyez/ui/evidence_vault.py +393 -285
  319. souleyez/ui/exploit_suggestions_view.py +555 -349
  320. souleyez/ui/export_view.py +100 -66
  321. souleyez/ui/gap_analysis_view.py +315 -171
  322. souleyez/ui/help_system.py +105 -97
  323. souleyez/ui/intelligence_view.py +436 -293
  324. souleyez/ui/interactive.py +23142 -10430
  325. souleyez/ui/interactive_selector.py +75 -68
  326. souleyez/ui/log_formatter.py +47 -39
  327. souleyez/ui/menu_components.py +22 -13
  328. souleyez/ui/msf_auxiliary_menu.py +184 -133
  329. souleyez/ui/pending_chains_view.py +336 -172
  330. souleyez/ui/progress_indicators.py +5 -3
  331. souleyez/ui/recommendations_view.py +195 -137
  332. souleyez/ui/rule_builder.py +343 -225
  333. souleyez/ui/setup_wizard.py +678 -284
  334. souleyez/ui/shortcuts.py +217 -165
  335. souleyez/ui/splunk_gap_analysis_view.py +452 -270
  336. souleyez/ui/splunk_vulns_view.py +139 -86
  337. souleyez/ui/team_dashboard.py +498 -335
  338. souleyez/ui/template_selector.py +196 -105
  339. souleyez/ui/terminal.py +6 -6
  340. souleyez/ui/timeline_view.py +198 -127
  341. souleyez/ui/tool_setup.py +264 -164
  342. souleyez/ui/tutorial.py +202 -72
  343. souleyez/ui/tutorial_state.py +40 -40
  344. souleyez/ui/wazuh_vulns_view.py +235 -141
  345. souleyez/ui/wordlist_browser.py +260 -107
  346. souleyez/ui.py +464 -312
  347. souleyez/utils/tool_checker.py +427 -367
  348. souleyez/utils.py +33 -29
  349. souleyez/wordlists.py +134 -167
  350. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/METADATA +1 -1
  351. souleyez-2.43.32.dist-info/RECORD +441 -0
  352. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/WHEEL +1 -1
  353. souleyez-2.43.28.dist-info/RECORD +0 -379
  354. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/entry_points.txt +0 -0
  355. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/licenses/LICENSE +0 -0
  356. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/top_level.txt +0 -0
@@ -9,14 +9,14 @@ from souleyez.intelligence.correlation_analyzer import CorrelationAnalyzer
9
9
 
10
10
  class GapDetector:
11
11
  """Detect gaps in exploitation coverage."""
12
-
12
+
13
13
  def __init__(self):
14
14
  self.analyzer = CorrelationAnalyzer()
15
-
15
+
16
16
  def find_gaps(self, engagement_id: int) -> List[Dict]:
17
17
  """
18
18
  Find services that haven't been attempted.
19
-
19
+
20
20
  Returns:
21
21
  [
22
22
  {
@@ -35,32 +35,31 @@ class GapDetector:
35
35
  """
36
36
  # Run full engagement analysis
37
37
  analysis = self.analyzer.analyze_engagement(engagement_id)
38
-
38
+
39
39
  # Extract gaps
40
- gaps = analysis.get('gaps', [])
41
-
40
+ gaps = analysis.get("gaps", [])
41
+
42
42
  # Enrich gaps with MSF modules and priority scores
43
43
  enriched_gaps = []
44
44
  for gap in gaps:
45
45
  enriched = gap.copy()
46
-
46
+
47
47
  # Add MSF module suggestions
48
- enriched['msf_modules'] = self._get_msf_modules(
49
- gap.get('service'),
50
- gap.get('version')
48
+ enriched["msf_modules"] = self._get_msf_modules(
49
+ gap.get("service"), gap.get("version")
51
50
  )
52
-
51
+
53
52
  # Calculate priority score
54
- enriched['priority_score'] = self._calculate_priority_score(gap)
55
-
53
+ enriched["priority_score"] = self._calculate_priority_score(gap)
54
+
56
55
  enriched_gaps.append(enriched)
57
-
56
+
58
57
  return enriched_gaps
59
-
58
+
60
59
  def prioritize_gaps(self, gaps: List[Dict]) -> List[Dict]:
61
60
  """
62
61
  Prioritize gaps by exploitation potential.
63
-
62
+
64
63
  Ranking factors:
65
64
  1. Service criticality (database > admin > standard)
66
65
  2. Known vulnerabilities (version-specific exploits)
@@ -68,14 +67,16 @@ class GapDetector:
68
67
  4. Version info available
69
68
  """
70
69
  # Sort by priority_score (descending)
71
- prioritized = sorted(gaps, key=lambda g: g.get('priority_score', 0), reverse=True)
72
-
70
+ prioritized = sorted(
71
+ gaps, key=lambda g: g.get("priority_score", 0), reverse=True
72
+ )
73
+
73
74
  return prioritized
74
-
75
+
75
76
  def _calculate_priority_score(self, gap: Dict) -> int:
76
77
  """
77
78
  Calculate priority score (0-100).
78
-
79
+
79
80
  Factors:
80
81
  - Severity: critical=40, high=30, medium=20, low=10
81
82
  - Version known: +20
@@ -83,235 +84,274 @@ class GapDetector:
83
84
  - Database/admin service: +10
84
85
  """
85
86
  score = 0
86
-
87
+
87
88
  # Severity baseline
88
- severity_scores = {
89
- 'critical': 40,
90
- 'high': 30,
91
- 'medium': 20,
92
- 'low': 10
93
- }
94
- score += severity_scores.get(gap.get('severity', 'low'), 10)
95
-
89
+ severity_scores = {"critical": 40, "high": 30, "medium": 20, "low": 10}
90
+ score += severity_scores.get(gap.get("severity", "low"), 10)
91
+
96
92
  # Version information available
97
- if gap.get('version'):
93
+ if gap.get("version"):
98
94
  score += 20
99
-
95
+
100
96
  # Check for known vulnerable versions
101
- if gap.get('service') and self._has_known_vulnerability(gap['service'], gap['version']):
97
+ if gap.get("service") and self._has_known_vulnerability(
98
+ gap["service"], gap["version"]
99
+ ):
102
100
  score += 30
103
-
101
+
104
102
  # High-value service types
105
- service = (gap.get('service') or '').lower()
106
- if service in ['mysql', 'postgres', 'mssql', 'mongodb', 'redis', 'ssh', 'rdp', 'smb']:
103
+ service = (gap.get("service") or "").lower()
104
+ if service in [
105
+ "mysql",
106
+ "postgres",
107
+ "mssql",
108
+ "mongodb",
109
+ "redis",
110
+ "ssh",
111
+ "rdp",
112
+ "smb",
113
+ ]:
107
114
  score += 10
108
-
115
+
109
116
  return min(score, 100)
110
-
117
+
111
118
  def _has_known_vulnerability(self, service: str, version: str) -> bool:
112
119
  """Check if service version has known vulnerabilities."""
113
120
  if not version:
114
121
  return False
115
-
122
+
116
123
  if not service:
117
124
  return False
118
-
125
+
119
126
  version_lower = version.lower()
120
127
  service_lower = service.lower()
121
-
128
+
122
129
  # Known vulnerable versions
123
130
  vulnerable_patterns = {
124
- 'vsftpd': ['2.3.4'],
125
- 'mysql': ['5.0', '5.1'],
126
- 'samba': ['3.5', '3.6', '4.4', '4.5'],
127
- 'openssh': ['7.2', '7.3', '7.4'],
128
- 'proftpd': ['1.3.3', '1.3.5'],
131
+ "vsftpd": ["2.3.4"],
132
+ "mysql": ["5.0", "5.1"],
133
+ "samba": ["3.5", "3.6", "4.4", "4.5"],
134
+ "openssh": ["7.2", "7.3", "7.4"],
135
+ "proftpd": ["1.3.3", "1.3.5"],
129
136
  }
130
-
137
+
131
138
  if service_lower in vulnerable_patterns:
132
139
  for vuln_version in vulnerable_patterns[service_lower]:
133
140
  if vuln_version in version_lower:
134
141
  return True
135
-
142
+
136
143
  return False
137
-
144
+
138
145
  def get_suggested_actions(self, service: str, version: str = None) -> List[str]:
139
146
  """
140
147
  Get suggested exploitation actions for a service.
141
-
148
+
142
149
  Examples:
143
150
  get_suggested_actions('mysql') → ['Try mysql_login', 'Check for weak passwords']
144
151
  get_suggested_actions('ftp', 'vsftpd 2.3.4') → ['Try vsftpd_234_backdoor exploit']
145
152
  """
146
153
  actions = []
147
-
154
+
148
155
  if not service:
149
156
  return actions
150
-
157
+
151
158
  service_lower = service.lower()
152
-
159
+
153
160
  # Version-specific exploits
154
161
  if version:
155
162
  version_lower = version.lower()
156
-
157
- if 'vsftpd 2.3.4' in version_lower:
158
- actions.append('💥 CRITICAL: Try vsftpd_234_backdoor exploit')
159
-
160
- if 'samba' in version_lower or 'smb' in service_lower:
161
- if any(v in version_lower for v in ['3.5', '3.6', '4.4', '4.5', '4.6']):
162
- actions.append('💥 CRITICAL: Check for SambaCry (CVE-2017-7494)')
163
-
164
- if 'mysql' in version_lower and '5.0' in version_lower:
165
- actions.append('💥 HIGH: Try mysql_yassl_getname exploit (CVE-2009-2446)')
166
-
163
+
164
+ if "vsftpd 2.3.4" in version_lower:
165
+ actions.append("💥 CRITICAL: Try vsftpd_234_backdoor exploit")
166
+
167
+ if "samba" in version_lower or "smb" in service_lower:
168
+ if any(v in version_lower for v in ["3.5", "3.6", "4.4", "4.5", "4.6"]):
169
+ actions.append("💥 CRITICAL: Check for SambaCry (CVE-2017-7494)")
170
+
171
+ if "mysql" in version_lower and "5.0" in version_lower:
172
+ actions.append(
173
+ "💥 HIGH: Try mysql_yassl_getname exploit (CVE-2009-2446)"
174
+ )
175
+
167
176
  # Generic service actions
168
- if service_lower == 'ssh':
169
- actions.extend([
170
- 'Try ssh_login with default credentials',
171
- 'Brute force with rockyou.txt',
172
- 'Check for user enumeration (CVE-2018-15473)'
173
- ])
174
-
175
- elif service_lower == 'ftp':
176
- actions.extend([
177
- 'Try anonymous FTP login',
178
- 'Check for directory traversal',
179
- 'Test for bounce attack'
180
- ])
181
-
182
- elif service_lower in ['mysql', 'mariadb']:
183
- actions.extend([
184
- 'Try mysql_login brute force',
185
- 'Check for default root password',
186
- 'Test for mysql_hashdump access'
187
- ])
188
-
189
- elif service_lower == 'smb':
190
- actions.extend([
191
- 'Try SMB null session enumeration',
192
- 'Check for EternalBlue (MS17-010)',
193
- 'Test smb_login brute force'
194
- ])
195
-
196
- elif service_lower in ['http', 'https']:
197
- actions.extend([
198
- 'Run Nuclei vulnerability scan',
199
- 'Try Gobuster directory enumeration',
200
- 'Check for SQLi with SQLMap'
201
- ])
202
-
203
- elif service_lower == 'rdp':
204
- actions.extend([
205
- 'Try BlueKeep exploit (CVE-2019-0708)',
206
- 'Brute force RDP credentials',
207
- 'Check for weak encryption'
208
- ])
209
-
210
- elif service_lower == 'postgres':
211
- actions.extend([
212
- 'Try postgres_login brute force',
213
- 'Check for default postgres password',
214
- 'Test for SQL injection'
215
- ])
216
-
217
- elif service_lower == 'telnet':
218
- actions.extend([
219
- 'Try telnet_login with defaults',
220
- 'Brute force credentials',
221
- 'Capture credentials with packet sniffing'
222
- ])
223
-
224
- elif service_lower == 'smtp':
225
- actions.extend([
226
- 'Enumerate users with VRFY/EXPN',
227
- 'Check for open relay',
228
- 'Try SMTP auth brute force'
229
- ])
230
-
177
+ if service_lower == "ssh":
178
+ actions.extend(
179
+ [
180
+ "Try ssh_login with default credentials",
181
+ "Brute force with passwords_brute.txt",
182
+ "Check for user enumeration (CVE-2018-15473)",
183
+ ]
184
+ )
185
+
186
+ elif service_lower == "ftp":
187
+ actions.extend(
188
+ [
189
+ "Try anonymous FTP login",
190
+ "Check for directory traversal",
191
+ "Test for bounce attack",
192
+ ]
193
+ )
194
+
195
+ elif service_lower in ["mysql", "mariadb"]:
196
+ actions.extend(
197
+ [
198
+ "Try mysql_login brute force",
199
+ "Check for default root password",
200
+ "Test for mysql_hashdump access",
201
+ ]
202
+ )
203
+
204
+ elif service_lower == "smb":
205
+ actions.extend(
206
+ [
207
+ "Try SMB null session enumeration",
208
+ "Check for EternalBlue (MS17-010)",
209
+ "Test smb_login brute force",
210
+ ]
211
+ )
212
+
213
+ elif service_lower in ["http", "https"]:
214
+ actions.extend(
215
+ [
216
+ "Run Nuclei vulnerability scan",
217
+ "Try Gobuster directory enumeration",
218
+ "Check for SQLi with SQLMap",
219
+ ]
220
+ )
221
+
222
+ elif service_lower == "rdp":
223
+ actions.extend(
224
+ [
225
+ "Try BlueKeep exploit (CVE-2019-0708)",
226
+ "Brute force RDP credentials",
227
+ "Check for weak encryption",
228
+ ]
229
+ )
230
+
231
+ elif service_lower == "postgres":
232
+ actions.extend(
233
+ [
234
+ "Try postgres_login brute force",
235
+ "Check for default postgres password",
236
+ "Test for SQL injection",
237
+ ]
238
+ )
239
+
240
+ elif service_lower == "telnet":
241
+ actions.extend(
242
+ [
243
+ "Try telnet_login with defaults",
244
+ "Brute force credentials",
245
+ "Capture credentials with packet sniffing",
246
+ ]
247
+ )
248
+
249
+ elif service_lower == "smtp":
250
+ actions.extend(
251
+ [
252
+ "Enumerate users with VRFY/EXPN",
253
+ "Check for open relay",
254
+ "Try SMTP auth brute force",
255
+ ]
256
+ )
257
+
231
258
  else:
232
- actions.append(f'Research exploits for {service}')
233
- actions.append(f'Try default credential lists')
234
-
259
+ actions.append(f"Research exploits for {service}")
260
+ actions.append(f"Try default credential lists")
261
+
235
262
  return actions
236
-
263
+
237
264
  def _get_msf_modules(self, service: str, version: str = None) -> List[str]:
238
265
  """Get relevant Metasploit modules for a service."""
239
266
  if not service:
240
267
  return []
241
-
268
+
242
269
  modules = []
243
270
  service_lower = service.lower()
244
-
271
+
245
272
  # Version-specific exploits
246
273
  if version:
247
274
  version_lower = version.lower()
248
-
249
- if 'vsftpd 2.3.4' in version_lower:
250
- modules.append('exploit/unix/ftp/vsftpd_234_backdoor')
251
-
252
- if 'mysql' in version_lower and '5.0' in version_lower:
253
- modules.append('exploit/linux/mysql/mysql_yassl_getname')
254
-
255
- if 'samba' in version_lower:
256
- modules.append('exploit/linux/samba/is_known_pipename')
257
-
275
+
276
+ if "vsftpd 2.3.4" in version_lower:
277
+ modules.append("exploit/unix/ftp/vsftpd_234_backdoor")
278
+
279
+ if "mysql" in version_lower and "5.0" in version_lower:
280
+ modules.append("exploit/linux/mysql/mysql_yassl_getname")
281
+
282
+ if "samba" in version_lower:
283
+ modules.append("exploit/linux/samba/is_known_pipename")
284
+
258
285
  # Generic service modules
259
- if service_lower == 'ssh':
260
- modules.extend([
261
- 'auxiliary/scanner/ssh/ssh_login',
262
- 'auxiliary/scanner/ssh/ssh_enumusers'
263
- ])
264
-
265
- elif service_lower == 'ftp':
266
- modules.extend([
267
- 'auxiliary/scanner/ftp/ftp_login',
268
- 'auxiliary/scanner/ftp/anonymous'
269
- ])
270
-
271
- elif service_lower in ['mysql', 'mariadb']:
272
- modules.extend([
273
- 'auxiliary/scanner/mysql/mysql_login',
274
- 'auxiliary/admin/mysql/mysql_enum',
275
- 'auxiliary/admin/mysql/mysql_hashdump'
276
- ])
277
-
278
- elif service_lower == 'smb':
279
- modules.extend([
280
- 'auxiliary/scanner/smb/smb_login',
281
- 'exploit/windows/smb/ms17_010_eternalblue',
282
- 'auxiliary/scanner/smb/smb_ms17_010'
283
- ])
284
-
285
- elif service_lower == 'rdp':
286
- modules.extend([
287
- 'auxiliary/scanner/rdp/rdp_scanner',
288
- 'exploit/windows/rdp/cve_2019_0708_bluekeep_rce'
289
- ])
290
-
291
- elif service_lower == 'postgres':
292
- modules.extend([
293
- 'auxiliary/scanner/postgres/postgres_login',
294
- 'auxiliary/admin/postgres/postgres_sql'
295
- ])
296
-
297
- elif service_lower == 'telnet':
298
- modules.extend([
299
- 'auxiliary/scanner/telnet/telnet_login',
300
- 'auxiliary/scanner/telnet/telnet_version'
301
- ])
302
-
303
- elif service_lower == 'smtp':
304
- modules.extend([
305
- 'auxiliary/scanner/smtp/smtp_enum',
306
- 'auxiliary/scanner/smtp/smtp_version'
307
- ])
308
-
286
+ if service_lower == "ssh":
287
+ modules.extend(
288
+ [
289
+ "auxiliary/scanner/ssh/ssh_login",
290
+ "auxiliary/scanner/ssh/ssh_enumusers",
291
+ ]
292
+ )
293
+
294
+ elif service_lower == "ftp":
295
+ modules.extend(
296
+ ["auxiliary/scanner/ftp/ftp_login", "auxiliary/scanner/ftp/anonymous"]
297
+ )
298
+
299
+ elif service_lower in ["mysql", "mariadb"]:
300
+ modules.extend(
301
+ [
302
+ "auxiliary/scanner/mysql/mysql_login",
303
+ "auxiliary/admin/mysql/mysql_enum",
304
+ "auxiliary/admin/mysql/mysql_hashdump",
305
+ ]
306
+ )
307
+
308
+ elif service_lower == "smb":
309
+ modules.extend(
310
+ [
311
+ "auxiliary/scanner/smb/smb_login",
312
+ "exploit/windows/smb/ms17_010_eternalblue",
313
+ "auxiliary/scanner/smb/smb_ms17_010",
314
+ ]
315
+ )
316
+
317
+ elif service_lower == "rdp":
318
+ modules.extend(
319
+ [
320
+ "auxiliary/scanner/rdp/rdp_scanner",
321
+ "exploit/windows/rdp/cve_2019_0708_bluekeep_rce",
322
+ ]
323
+ )
324
+
325
+ elif service_lower == "postgres":
326
+ modules.extend(
327
+ [
328
+ "auxiliary/scanner/postgres/postgres_login",
329
+ "auxiliary/admin/postgres/postgres_sql",
330
+ ]
331
+ )
332
+
333
+ elif service_lower == "telnet":
334
+ modules.extend(
335
+ [
336
+ "auxiliary/scanner/telnet/telnet_login",
337
+ "auxiliary/scanner/telnet/telnet_version",
338
+ ]
339
+ )
340
+
341
+ elif service_lower == "smtp":
342
+ modules.extend(
343
+ [
344
+ "auxiliary/scanner/smtp/smtp_enum",
345
+ "auxiliary/scanner/smtp/smtp_version",
346
+ ]
347
+ )
348
+
309
349
  return modules
310
-
350
+
311
351
  def get_gap_summary(self, engagement_id: int) -> Dict:
312
352
  """
313
353
  Get quick summary of exploitation gaps.
314
-
354
+
315
355
  Returns:
316
356
  {
317
357
  'total_gaps': 10,
@@ -328,31 +368,28 @@ class GapDetector:
328
368
  """
329
369
  gaps = self.find_gaps(engagement_id)
330
370
  prioritized = self.prioritize_gaps(gaps)
331
-
371
+
332
372
  # Count by severity
333
- by_severity = {
334
- 'critical': 0,
335
- 'high': 0,
336
- 'medium': 0,
337
- 'low': 0
338
- }
339
-
373
+ by_severity = {"critical": 0, "high": 0, "medium": 0, "low": 0}
374
+
340
375
  for gap in gaps:
341
- severity = gap.get('severity', 'low')
376
+ severity = gap.get("severity", "low")
342
377
  by_severity[severity] = by_severity.get(severity, 0) + 1
343
-
378
+
344
379
  # Get top 5 priorities
345
380
  top_priorities = []
346
381
  for gap in prioritized[:5]:
347
- top_priorities.append({
348
- 'host': gap['host'],
349
- 'port': gap['port'],
350
- 'service': gap.get('service') or 'unknown',
351
- 'score': gap['priority_score']
352
- })
353
-
382
+ top_priorities.append(
383
+ {
384
+ "host": gap["host"],
385
+ "port": gap["port"],
386
+ "service": gap.get("service") or "unknown",
387
+ "score": gap["priority_score"],
388
+ }
389
+ )
390
+
354
391
  return {
355
- 'total_gaps': len(gaps),
356
- 'by_severity': by_severity,
357
- 'top_priorities': top_priorities
392
+ "total_gaps": len(gaps),
393
+ "by_severity": by_severity,
394
+ "top_priorities": top_priorities,
358
395
  }