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
@@ -33,20 +33,22 @@ class MSFAutoMapper:
33
33
 
34
34
  for host in hosts:
35
35
  # Get services for this host
36
- services = hm.get_host_services(host['id'])
36
+ services = hm.get_host_services(host["id"])
37
37
 
38
38
  for service in services:
39
- service_id = service['id']
40
- service_name = service.get('service_name', '').lower()
41
- version = service.get('service_version', '')
39
+ service_id = service["id"]
40
+ service_name = service.get("service_name", "").lower()
41
+ version = service.get("service_version", "")
42
42
 
43
43
  # Get recommendations
44
- recommendations = self.module_selector.get_recommendations_for_service(
45
- service=service_name,
46
- version=version,
47
- engagement_id=self.engagement_id,
48
- include_cve_matches=True,
49
- risk_levels=['safe', 'noisy', 'moderate', 'dangerous']
44
+ recommendations = (
45
+ self.module_selector.get_recommendations_for_service(
46
+ service=service_name,
47
+ version=version,
48
+ engagement_id=self.engagement_id,
49
+ include_cve_matches=True,
50
+ risk_levels=["safe", "noisy", "moderate", "dangerous"],
51
+ )
50
52
  )
51
53
 
52
54
  # Only store services with actual recommendations
@@ -73,16 +75,16 @@ class MSFAutoMapper:
73
75
  findings = fm.list_findings(self.engagement_id)
74
76
 
75
77
  for finding in findings:
76
- finding_id = finding['id']
78
+ finding_id = finding["id"]
77
79
 
78
80
  # Extract CVEs from finding
79
81
  cves = self._extract_cves_from_finding(finding)
80
82
 
81
83
  # Match to exploits
82
84
  exploits = self.module_selector.match_vulnerability_to_exploit(
83
- vuln_title=finding.get('title', ''),
84
- vuln_desc=finding.get('description', ''),
85
- cves=cves
85
+ vuln_title=finding.get("title", ""),
86
+ vuln_desc=finding.get("description", ""),
87
+ cves=cves,
86
88
  )
87
89
 
88
90
  if exploits:
@@ -94,8 +96,8 @@ class MSFAutoMapper:
94
96
 
95
97
  def _extract_cves_from_finding(self, finding: Dict) -> List[str]:
96
98
  """Extract CVE IDs from finding title/description."""
97
- text = finding.get('title', '') + ' ' + finding.get('description', '')
98
- cve_pattern = r'CVE-\d{4}-\d{4,7}'
99
+ text = finding.get("title", "") + " " + finding.get("description", "")
100
+ cve_pattern = r"CVE-\d{4}-\d{4,7}"
99
101
 
100
102
  return re.findall(cve_pattern, text, re.IGNORECASE)
101
103
 
@@ -116,8 +118,9 @@ class MSFAutoMapper:
116
118
  # Count services
117
119
  total_services = len(service_map)
118
120
  exploitable_services = sum(
119
- 1 for modules in service_map.values()
120
- if any(m.get('category') == 'exploit' for m in modules)
121
+ 1
122
+ for modules in service_map.values()
123
+ if any(m.get("category") == "exploit" for m in modules)
121
124
  )
122
125
 
123
126
  # Identify critical targets
@@ -125,45 +128,51 @@ class MSFAutoMapper:
125
128
 
126
129
  for service_id, modules in service_map.items():
127
130
  # Find high-value targets (exploits with high scores)
128
- exploits = [m for m in modules if m.get('category') == 'exploit']
129
- high_score_exploits = [e for e in exploits if e.get('score', 0) >= 80]
131
+ exploits = [m for m in modules if m.get("category") == "exploit"]
132
+ high_score_exploits = [e for e in exploits if e.get("score", 0) >= 80]
130
133
 
131
134
  if high_score_exploits:
132
135
  try:
133
136
  service = hm.get_service(service_id)
134
137
  if service:
135
- host = hm.get_host(service.get('host_id'))
136
- critical_targets.append({
137
- 'host': host.get('ip_address', 'Unknown'),
138
- 'service': service.get('service_name', 'Unknown'),
139
- 'port': service.get('port', 0),
140
- 'modules': [e.get('path') for e in high_score_exploits],
141
- 'success_probability': 'high',
142
- 'impact': 'critical',
143
- 'top_score': max(e.get('score', 0) for e in high_score_exploits)
144
- })
138
+ host = hm.get_host(service.get("host_id"))
139
+ critical_targets.append(
140
+ {
141
+ "host": host.get("ip_address", "Unknown"),
142
+ "service": service.get("service_name", "Unknown"),
143
+ "port": service.get("port", 0),
144
+ "modules": [
145
+ e.get("path") for e in high_score_exploits
146
+ ],
147
+ "success_probability": "high",
148
+ "impact": "critical",
149
+ "top_score": max(
150
+ e.get("score", 0) for e in high_score_exploits
151
+ ),
152
+ }
153
+ )
145
154
  except:
146
155
  pass
147
156
 
148
157
  # Sort critical targets by score
149
- critical_targets.sort(key=lambda x: x.get('top_score', 0), reverse=True)
158
+ critical_targets.sort(key=lambda x: x.get("top_score", 0), reverse=True)
150
159
 
151
160
  report = {
152
- 'total_services': total_services,
153
- 'exploitable_services': exploitable_services,
154
- 'critical_targets': critical_targets[:10], # Top 10
155
- 'total_findings_with_exploits': len(finding_map),
156
- 'recommended_attack_path': self._generate_attack_path(critical_targets)
161
+ "total_services": total_services,
162
+ "exploitable_services": exploitable_services,
163
+ "critical_targets": critical_targets[:10], # Top 10
164
+ "total_findings_with_exploits": len(finding_map),
165
+ "recommended_attack_path": self._generate_attack_path(critical_targets),
157
166
  }
158
167
 
159
168
  return report
160
169
  except Exception as e:
161
170
  return {
162
- 'total_services': 0,
163
- 'exploitable_services': 0,
164
- 'critical_targets': [],
165
- 'total_findings_with_exploits': 0,
166
- 'recommended_attack_path': []
171
+ "total_services": 0,
172
+ "exploitable_services": 0,
173
+ "critical_targets": [],
174
+ "total_findings_with_exploits": 0,
175
+ "recommended_attack_path": [],
167
176
  }
168
177
 
169
178
  def _generate_attack_path(self, critical_targets: List[Dict]) -> List[str]:
@@ -189,9 +198,7 @@ class MSFAutoMapper:
189
198
 
190
199
  # Add lateral movement if multiple targets
191
200
  if len(critical_targets) > 1:
192
- path.append(
193
- "Step 3: Use credentials for lateral movement to other hosts"
194
- )
201
+ path.append("Step 3: Use credentials for lateral movement to other hosts")
195
202
 
196
203
  return path
197
204
 
@@ -210,28 +217,32 @@ class MSFAutoMapper:
210
217
  hosts = hm.list_hosts(self.engagement_id)
211
218
 
212
219
  for host in hosts:
213
- services = hm.get_host_services(host['id'])
220
+ services = hm.get_host_services(host["id"])
214
221
 
215
222
  for service in services:
216
- service_name = service.get('service_name', '').lower()
217
- version = service.get('service_version', '')
218
-
219
- recommendations = self.module_selector.get_recommendations_for_service(
220
- service=service_name,
221
- version=version,
222
- engagement_id=self.engagement_id,
223
- include_cve_matches=True,
224
- risk_levels=['safe', 'noisy', 'moderate', 'dangerous']
223
+ service_name = service.get("service_name", "").lower()
224
+ version = service.get("service_version", "")
225
+
226
+ recommendations = (
227
+ self.module_selector.get_recommendations_for_service(
228
+ service=service_name,
229
+ version=version,
230
+ engagement_id=self.engagement_id,
231
+ include_cve_matches=True,
232
+ risk_levels=["safe", "noisy", "moderate", "dangerous"],
233
+ )
225
234
  )
226
235
 
227
236
  if recommendations:
228
- results.append({
229
- 'ip_address': host.get('ip_address', '?'),
230
- 'port': service.get('port', '?'),
231
- 'service': service_name or 'unknown',
232
- 'version': version,
233
- 'modules': recommendations[:5]
234
- })
237
+ results.append(
238
+ {
239
+ "ip_address": host.get("ip_address", "?"),
240
+ "port": service.get("port", "?"),
241
+ "service": service_name or "unknown",
242
+ "version": version,
243
+ "modules": recommendations[:5],
244
+ }
245
+ )
235
246
 
236
247
  return results
237
248
  except Exception:
@@ -255,18 +266,20 @@ class MSFAutoMapper:
255
266
  cves = self._extract_cves_from_finding(finding)
256
267
 
257
268
  exploits = self.module_selector.match_vulnerability_to_exploit(
258
- vuln_title=finding.get('title', ''),
259
- vuln_desc=finding.get('description', ''),
260
- cves=cves
269
+ vuln_title=finding.get("title", ""),
270
+ vuln_desc=finding.get("description", ""),
271
+ cves=cves,
261
272
  )
262
273
 
263
274
  if exploits:
264
- results.append({
265
- 'title': finding.get('title', '?'),
266
- 'severity': finding.get('severity', 'unknown'),
267
- 'cves': cves,
268
- 'exploits': exploits[:5]
269
- })
275
+ results.append(
276
+ {
277
+ "title": finding.get("title", "?"),
278
+ "severity": finding.get("severity", "unknown"),
279
+ "cves": cves,
280
+ "exploits": exploits[:5],
281
+ }
282
+ )
270
283
 
271
284
  return results
272
285
  except Exception:
@@ -291,9 +304,9 @@ class MSFAutoMapper:
291
304
  if not service:
292
305
  return {}
293
306
 
294
- host = hm.get_host(service.get('host_id'))
295
- service_name = service.get('service_name', '')
296
- version = service.get('service_version', '')
307
+ host = hm.get_host(service.get("host_id"))
308
+ service_name = service.get("service_name", "")
309
+ version = service.get("service_version", "")
297
310
 
298
311
  # Get recommendations
299
312
  recommendations = self.module_selector.get_recommendations_for_service(
@@ -301,21 +314,25 @@ class MSFAutoMapper:
301
314
  version=version,
302
315
  engagement_id=self.engagement_id,
303
316
  include_cve_matches=True,
304
- risk_levels=['safe', 'noisy', 'moderate', 'dangerous']
317
+ risk_levels=["safe", "noisy", "moderate", "dangerous"],
305
318
  )
306
319
 
307
320
  # Separate scanners and exploits
308
- scanners = [r for r in recommendations if r.get('category') == 'scanner']
309
- exploits = [r for r in recommendations if r.get('category') == 'exploit']
321
+ scanners = [r for r in recommendations if r.get("category") == "scanner"]
322
+ exploits = [r for r in recommendations if r.get("category") == "exploit"]
310
323
 
311
324
  return {
312
- 'host': host.get('ip_address', 'Unknown'),
313
- 'service': service_name,
314
- 'version': version,
315
- 'port': service.get('port', 0),
316
- 'recommended_scanners': scanners[:5],
317
- 'recommended_exploits': exploits[:5],
318
- 'exploitation_complexity': 'low' if exploits and exploits[0].get('score', 0) >= 80 else 'medium'
325
+ "host": host.get("ip_address", "Unknown"),
326
+ "service": service_name,
327
+ "version": version,
328
+ "port": service.get("port", 0),
329
+ "recommended_scanners": scanners[:5],
330
+ "recommended_exploits": exploits[:5],
331
+ "exploitation_complexity": (
332
+ "low"
333
+ if exploits and exploits[0].get("score", 0) >= 80
334
+ else "medium"
335
+ ),
319
336
  }
320
337
  except Exception as e:
321
338
  return {}