souleyez 2.43.29__py3-none-any.whl → 2.43.34__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 (358) 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 +9526 -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 +1239 -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 +2200 -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 +292 -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/web_login_test_handler.py +327 -0
  126. souleyez/handlers/whois_handler.py +277 -0
  127. souleyez/handlers/wpscan_handler.py +554 -0
  128. souleyez/history.py +32 -16
  129. souleyez/importers/msf_importer.py +106 -75
  130. souleyez/importers/smart_importer.py +208 -147
  131. souleyez/integrations/siem/__init__.py +10 -10
  132. souleyez/integrations/siem/base.py +17 -18
  133. souleyez/integrations/siem/elastic.py +108 -122
  134. souleyez/integrations/siem/factory.py +207 -80
  135. souleyez/integrations/siem/googlesecops.py +146 -154
  136. souleyez/integrations/siem/rule_mappings/__init__.py +1 -1
  137. souleyez/integrations/siem/rule_mappings/wazuh_rules.py +8 -5
  138. souleyez/integrations/siem/sentinel.py +107 -109
  139. souleyez/integrations/siem/splunk.py +246 -212
  140. souleyez/integrations/siem/wazuh.py +65 -71
  141. souleyez/integrations/wazuh/__init__.py +5 -5
  142. souleyez/integrations/wazuh/client.py +70 -93
  143. souleyez/integrations/wazuh/config.py +85 -57
  144. souleyez/integrations/wazuh/host_mapper.py +28 -36
  145. souleyez/integrations/wazuh/sync.py +78 -68
  146. souleyez/intelligence/__init__.py +4 -5
  147. souleyez/intelligence/correlation_analyzer.py +309 -295
  148. souleyez/intelligence/exploit_knowledge.py +661 -623
  149. souleyez/intelligence/exploit_suggestions.py +159 -139
  150. souleyez/intelligence/gap_analyzer.py +132 -97
  151. souleyez/intelligence/gap_detector.py +251 -214
  152. souleyez/intelligence/sensitive_tables.py +266 -129
  153. souleyez/intelligence/service_parser.py +137 -123
  154. souleyez/intelligence/surface_analyzer.py +407 -268
  155. souleyez/intelligence/target_parser.py +159 -162
  156. souleyez/licensing/__init__.py +6 -6
  157. souleyez/licensing/validator.py +17 -19
  158. souleyez/log_config.py +79 -54
  159. souleyez/main.py +1505 -687
  160. souleyez/migrations/fix_job_counter.py +16 -14
  161. souleyez/parsers/bloodhound_parser.py +41 -39
  162. souleyez/parsers/crackmapexec_parser.py +178 -111
  163. souleyez/parsers/dalfox_parser.py +72 -77
  164. souleyez/parsers/dnsrecon_parser.py +103 -91
  165. souleyez/parsers/enum4linux_parser.py +183 -153
  166. souleyez/parsers/ffuf_parser.py +29 -25
  167. souleyez/parsers/gobuster_parser.py +301 -41
  168. souleyez/parsers/hashcat_parser.py +324 -79
  169. souleyez/parsers/http_fingerprint_parser.py +350 -103
  170. souleyez/parsers/hydra_parser.py +131 -111
  171. souleyez/parsers/impacket_parser.py +231 -178
  172. souleyez/parsers/john_parser.py +98 -86
  173. souleyez/parsers/katana_parser.py +316 -0
  174. souleyez/parsers/msf_parser.py +943 -498
  175. souleyez/parsers/nikto_parser.py +346 -65
  176. souleyez/parsers/nmap_parser.py +262 -174
  177. souleyez/parsers/nuclei_parser.py +40 -44
  178. souleyez/parsers/responder_parser.py +26 -26
  179. souleyez/parsers/searchsploit_parser.py +74 -74
  180. souleyez/parsers/service_explorer_parser.py +279 -0
  181. souleyez/parsers/smbmap_parser.py +180 -124
  182. souleyez/parsers/sqlmap_parser.py +434 -308
  183. souleyez/parsers/theharvester_parser.py +75 -57
  184. souleyez/parsers/whois_parser.py +135 -94
  185. souleyez/parsers/wpscan_parser.py +278 -190
  186. souleyez/plugins/afp.py +44 -36
  187. souleyez/plugins/afp_brute.py +114 -46
  188. souleyez/plugins/ard.py +48 -37
  189. souleyez/plugins/bloodhound.py +95 -61
  190. souleyez/plugins/certipy.py +303 -0
  191. souleyez/plugins/crackmapexec.py +186 -85
  192. souleyez/plugins/dalfox.py +120 -59
  193. souleyez/plugins/dns_hijack.py +146 -41
  194. souleyez/plugins/dnsrecon.py +97 -61
  195. souleyez/plugins/enum4linux.py +91 -66
  196. souleyez/plugins/evil_winrm.py +291 -0
  197. souleyez/plugins/ffuf.py +166 -90
  198. souleyez/plugins/firmware_extract.py +133 -29
  199. souleyez/plugins/gobuster.py +387 -190
  200. souleyez/plugins/gpp_extract.py +393 -0
  201. souleyez/plugins/hashcat.py +100 -73
  202. souleyez/plugins/http_fingerprint.py +854 -267
  203. souleyez/plugins/hydra.py +566 -200
  204. souleyez/plugins/impacket_getnpusers.py +117 -69
  205. souleyez/plugins/impacket_psexec.py +84 -64
  206. souleyez/plugins/impacket_secretsdump.py +103 -69
  207. souleyez/plugins/impacket_smbclient.py +89 -75
  208. souleyez/plugins/john.py +86 -69
  209. souleyez/plugins/katana.py +313 -0
  210. souleyez/plugins/kerbrute.py +237 -0
  211. souleyez/plugins/lfi_extract.py +541 -0
  212. souleyez/plugins/macos_ssh.py +117 -48
  213. souleyez/plugins/mdns.py +35 -30
  214. souleyez/plugins/msf_auxiliary.py +253 -130
  215. souleyez/plugins/msf_exploit.py +239 -161
  216. souleyez/plugins/nikto.py +134 -78
  217. souleyez/plugins/nmap.py +275 -91
  218. souleyez/plugins/nuclei.py +180 -89
  219. souleyez/plugins/nxc.py +285 -0
  220. souleyez/plugins/plugin_base.py +35 -36
  221. souleyez/plugins/plugin_template.py +13 -5
  222. souleyez/plugins/rdp_sec_check.py +130 -0
  223. souleyez/plugins/responder.py +112 -71
  224. souleyez/plugins/router_http_brute.py +76 -65
  225. souleyez/plugins/router_ssh_brute.py +118 -41
  226. souleyez/plugins/router_telnet_brute.py +124 -42
  227. souleyez/plugins/routersploit.py +91 -59
  228. souleyez/plugins/routersploit_exploit.py +77 -55
  229. souleyez/plugins/searchsploit.py +91 -77
  230. souleyez/plugins/service_explorer.py +1160 -0
  231. souleyez/plugins/smbmap.py +122 -72
  232. souleyez/plugins/smbpasswd.py +215 -0
  233. souleyez/plugins/sqlmap.py +301 -113
  234. souleyez/plugins/theharvester.py +127 -75
  235. souleyez/plugins/tr069.py +79 -57
  236. souleyez/plugins/upnp.py +65 -47
  237. souleyez/plugins/upnp_abuse.py +73 -55
  238. souleyez/plugins/vnc_access.py +129 -42
  239. souleyez/plugins/vnc_brute.py +109 -38
  240. souleyez/plugins/web_login_test.py +417 -0
  241. souleyez/plugins/whois.py +77 -58
  242. souleyez/plugins/wpscan.py +173 -69
  243. souleyez/reporting/__init__.py +2 -1
  244. souleyez/reporting/attack_chain.py +411 -346
  245. souleyez/reporting/charts.py +436 -501
  246. souleyez/reporting/compliance_mappings.py +334 -201
  247. souleyez/reporting/detection_report.py +126 -125
  248. souleyez/reporting/formatters.py +828 -591
  249. souleyez/reporting/generator.py +386 -302
  250. souleyez/reporting/metrics.py +72 -75
  251. souleyez/scanner.py +35 -29
  252. souleyez/security/__init__.py +37 -11
  253. souleyez/security/scope_validator.py +175 -106
  254. souleyez/security/validation.py +223 -149
  255. souleyez/security.py +22 -6
  256. souleyez/storage/credentials.py +247 -186
  257. souleyez/storage/crypto.py +296 -129
  258. souleyez/storage/database.py +73 -50
  259. souleyez/storage/db.py +58 -36
  260. souleyez/storage/deliverable_evidence.py +177 -128
  261. souleyez/storage/deliverable_exporter.py +282 -246
  262. souleyez/storage/deliverable_templates.py +134 -116
  263. souleyez/storage/deliverables.py +135 -130
  264. souleyez/storage/engagements.py +109 -56
  265. souleyez/storage/evidence.py +181 -152
  266. souleyez/storage/execution_log.py +31 -17
  267. souleyez/storage/exploit_attempts.py +93 -57
  268. souleyez/storage/exploits.py +67 -36
  269. souleyez/storage/findings.py +48 -61
  270. souleyez/storage/hosts.py +176 -144
  271. souleyez/storage/migrate_to_engagements.py +43 -19
  272. souleyez/storage/migrations/_001_add_credential_enhancements.py +22 -12
  273. souleyez/storage/migrations/_002_add_status_tracking.py +10 -7
  274. souleyez/storage/migrations/_003_add_execution_log.py +14 -8
  275. souleyez/storage/migrations/_005_screenshots.py +13 -5
  276. souleyez/storage/migrations/_006_deliverables.py +13 -5
  277. souleyez/storage/migrations/_007_deliverable_templates.py +12 -7
  278. souleyez/storage/migrations/_008_add_nuclei_table.py +10 -4
  279. souleyez/storage/migrations/_010_evidence_linking.py +17 -10
  280. souleyez/storage/migrations/_011_timeline_tracking.py +20 -13
  281. souleyez/storage/migrations/_012_team_collaboration.py +34 -21
  282. souleyez/storage/migrations/_013_add_host_tags.py +12 -6
  283. souleyez/storage/migrations/_014_exploit_attempts.py +22 -10
  284. souleyez/storage/migrations/_015_add_mac_os_fields.py +15 -7
  285. souleyez/storage/migrations/_016_add_domain_field.py +10 -4
  286. souleyez/storage/migrations/_017_msf_sessions.py +16 -8
  287. souleyez/storage/migrations/_018_add_osint_target.py +10 -6
  288. souleyez/storage/migrations/_019_add_engagement_type.py +10 -6
  289. souleyez/storage/migrations/_020_add_rbac.py +36 -15
  290. souleyez/storage/migrations/_021_wazuh_integration.py +20 -8
  291. souleyez/storage/migrations/_022_wazuh_indexer_columns.py +6 -4
  292. souleyez/storage/migrations/_023_fix_detection_results_fk.py +16 -6
  293. souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +26 -10
  294. souleyez/storage/migrations/_025_multi_siem_support.py +3 -5
  295. souleyez/storage/migrations/_026_add_engagement_scope.py +31 -12
  296. souleyez/storage/migrations/_027_multi_siem_persistence.py +32 -15
  297. souleyez/storage/migrations/__init__.py +26 -26
  298. souleyez/storage/migrations/migration_manager.py +19 -19
  299. souleyez/storage/msf_sessions.py +100 -65
  300. souleyez/storage/osint.py +17 -24
  301. souleyez/storage/recommendation_engine.py +269 -235
  302. souleyez/storage/screenshots.py +33 -32
  303. souleyez/storage/smb_shares.py +136 -92
  304. souleyez/storage/sqlmap_data.py +183 -128
  305. souleyez/storage/team_collaboration.py +135 -141
  306. souleyez/storage/timeline_tracker.py +122 -94
  307. souleyez/storage/wazuh_vulns.py +64 -66
  308. souleyez/storage/web_paths.py +33 -37
  309. souleyez/testing/credential_tester.py +221 -205
  310. souleyez/ui/__init__.py +1 -1
  311. souleyez/ui/ai_quotes.py +12 -12
  312. souleyez/ui/attack_surface.py +2439 -1516
  313. souleyez/ui/chain_rules_view.py +914 -382
  314. souleyez/ui/correlation_view.py +312 -230
  315. souleyez/ui/dashboard.py +2382 -1130
  316. souleyez/ui/deliverables_view.py +148 -62
  317. souleyez/ui/design_system.py +13 -13
  318. souleyez/ui/errors.py +49 -49
  319. souleyez/ui/evidence_linking_view.py +284 -179
  320. souleyez/ui/evidence_vault.py +393 -285
  321. souleyez/ui/exploit_suggestions_view.py +555 -349
  322. souleyez/ui/export_view.py +100 -66
  323. souleyez/ui/gap_analysis_view.py +315 -171
  324. souleyez/ui/help_system.py +105 -97
  325. souleyez/ui/intelligence_view.py +436 -293
  326. souleyez/ui/interactive.py +22827 -10678
  327. souleyez/ui/interactive_selector.py +75 -68
  328. souleyez/ui/log_formatter.py +47 -39
  329. souleyez/ui/menu_components.py +22 -13
  330. souleyez/ui/msf_auxiliary_menu.py +184 -133
  331. souleyez/ui/pending_chains_view.py +336 -172
  332. souleyez/ui/progress_indicators.py +5 -3
  333. souleyez/ui/recommendations_view.py +195 -137
  334. souleyez/ui/rule_builder.py +343 -225
  335. souleyez/ui/setup_wizard.py +678 -284
  336. souleyez/ui/shortcuts.py +217 -165
  337. souleyez/ui/splunk_gap_analysis_view.py +452 -270
  338. souleyez/ui/splunk_vulns_view.py +139 -86
  339. souleyez/ui/team_dashboard.py +498 -335
  340. souleyez/ui/template_selector.py +196 -105
  341. souleyez/ui/terminal.py +6 -6
  342. souleyez/ui/timeline_view.py +198 -127
  343. souleyez/ui/tool_setup.py +264 -164
  344. souleyez/ui/tutorial.py +202 -72
  345. souleyez/ui/tutorial_state.py +40 -40
  346. souleyez/ui/wazuh_vulns_view.py +235 -141
  347. souleyez/ui/wordlist_browser.py +260 -107
  348. souleyez/ui.py +464 -312
  349. souleyez/utils/tool_checker.py +427 -367
  350. souleyez/utils.py +33 -29
  351. souleyez/wordlists.py +134 -167
  352. {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/METADATA +1 -1
  353. souleyez-2.43.34.dist-info/RECORD +443 -0
  354. {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/WHEEL +1 -1
  355. souleyez-2.43.29.dist-info/RECORD +0 -379
  356. {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/entry_points.txt +0 -0
  357. {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/licenses/LICENSE +0 -0
  358. {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/top_level.txt +0 -0
@@ -19,6 +19,7 @@ logger = get_logger(__name__)
19
19
  @dataclass
20
20
  class SyncResult:
21
21
  """Result of a vulnerability sync operation."""
22
+
22
23
  success: bool = True
23
24
  total_fetched: int = 0
24
25
  new_vulns: int = 0
@@ -50,19 +51,19 @@ class WazuhVulnSync:
50
51
  return self._client
51
52
 
52
53
  config = WazuhConfig.get_config(self.engagement_id)
53
- if not config or not config.get('enabled'):
54
+ if not config or not config.get("enabled"):
54
55
  logger.warning(f"Wazuh not configured for engagement {self.engagement_id}")
55
56
  return None
56
57
 
57
58
  try:
58
59
  self._client = WazuhClient(
59
- api_url=config['api_url'],
60
- username=config['api_user'],
61
- password=config['api_password'],
62
- verify_ssl=config.get('verify_ssl', False),
63
- indexer_url=config.get('indexer_url'),
64
- indexer_user=config.get('indexer_user'),
65
- indexer_password=config.get('indexer_password')
60
+ api_url=config["api_url"],
61
+ username=config["api_user"],
62
+ password=config["api_password"],
63
+ verify_ssl=config.get("verify_ssl", False),
64
+ indexer_url=config.get("indexer_url"),
65
+ indexer_user=config.get("indexer_user"),
66
+ indexer_password=config.get("indexer_password"),
66
67
  )
67
68
  return self._client
68
69
  except Exception as e:
@@ -88,9 +89,11 @@ class WazuhVulnSync:
88
89
  try:
89
90
  # Test vulnerability index access
90
91
  index_status = client.test_vulnerability_index()
91
- if not index_status.get('accessible'):
92
+ if not index_status.get("accessible"):
92
93
  result.success = False
93
- result.errors.append(index_status.get('error', 'Vulnerability index not accessible'))
94
+ result.errors.append(
95
+ index_status.get("error", "Vulnerability index not accessible")
96
+ )
94
97
  return result
95
98
 
96
99
  # Build agent ID -> IP lookup table
@@ -99,25 +102,27 @@ class WazuhVulnSync:
99
102
  try:
100
103
  agents = client.get_agents()
101
104
  for agent in agents:
102
- agent_id = agent.get('id')
103
- agent_ip = agent.get('ip')
105
+ agent_id = agent.get("id")
106
+ agent_ip = agent.get("ip")
104
107
  if agent_id and agent_ip:
105
108
  agent_ip_lookup[agent_id] = agent_ip
106
- logger.info(f"Built agent IP lookup with {len(agent_ip_lookup)} entries")
109
+ logger.info(
110
+ f"Built agent IP lookup with {len(agent_ip_lookup)} entries"
111
+ )
107
112
  except Exception as e:
108
113
  logger.warning(f"Could not fetch agent IPs: {e}")
109
114
 
110
115
  # Fetch all vulnerabilities
111
- logger.info(f"Fetching vulnerabilities from Wazuh for engagement {self.engagement_id}")
116
+ logger.info(
117
+ f"Fetching vulnerabilities from Wazuh for engagement {self.engagement_id}"
118
+ )
112
119
  vulns = client.get_all_vulnerabilities()
113
120
  result.total_fetched = len(vulns)
114
121
 
115
122
  if not vulns:
116
123
  logger.info("No vulnerabilities found in Wazuh")
117
124
  self.vulns_manager.update_sync_status(
118
- self.engagement_id,
119
- count=0,
120
- status='success'
125
+ self.engagement_id, count=0, status="success"
121
126
  )
122
127
  result.duration_seconds = (datetime.now() - start_time).total_seconds()
123
128
  return result
@@ -129,28 +134,28 @@ class WazuhVulnSync:
129
134
  for vuln in vulns:
130
135
  try:
131
136
  # Get agent_ip from vuln, or look it up by agent_id
132
- agent_id = vuln.get('agent_id')
133
- agent_ip = vuln.get('agent_ip')
137
+ agent_id = vuln.get("agent_id")
138
+ agent_ip = vuln.get("agent_ip")
134
139
  if not agent_ip and agent_id and agent_id in agent_ip_lookup:
135
140
  agent_ip = agent_ip_lookup[agent_id]
136
141
 
137
142
  vuln_id = self.vulns_manager.upsert_vulnerability(
138
143
  engagement_id=self.engagement_id,
139
144
  agent_id=agent_id,
140
- cve_id=vuln.get('cve_id'),
141
- package_name=vuln.get('package_name'),
142
- agent_name=vuln.get('agent_name'),
145
+ cve_id=vuln.get("cve_id"),
146
+ package_name=vuln.get("package_name"),
147
+ agent_name=vuln.get("agent_name"),
143
148
  agent_ip=agent_ip,
144
- name=vuln.get('name'),
145
- severity=vuln.get('severity'),
146
- cvss_score=vuln.get('cvss_score'),
147
- cvss_version=vuln.get('cvss_version'),
148
- package_version=vuln.get('package_version'),
149
- package_architecture=vuln.get('package_architecture'),
150
- detection_time=vuln.get('detection_time'),
151
- published_date=vuln.get('published_date'),
152
- reference_urls=vuln.get('reference_urls'),
153
- raw_data=vuln.get('raw_data')
149
+ name=vuln.get("name"),
150
+ severity=vuln.get("severity"),
151
+ cvss_score=vuln.get("cvss_score"),
152
+ cvss_version=vuln.get("cvss_version"),
153
+ package_version=vuln.get("package_version"),
154
+ package_architecture=vuln.get("package_architecture"),
155
+ detection_time=vuln.get("detection_time"),
156
+ published_date=vuln.get("published_date"),
157
+ reference_urls=vuln.get("reference_urls"),
158
+ raw_data=vuln.get("raw_data"),
154
159
  )
155
160
 
156
161
  if vuln_id:
@@ -159,7 +164,9 @@ class WazuhVulnSync:
159
164
  updated_count += 1
160
165
 
161
166
  except Exception as e:
162
- logger.error(f"Error processing vulnerability {vuln.get('cve_id')}: {e}")
167
+ logger.error(
168
+ f"Error processing vulnerability {vuln.get('cve_id')}: {e}"
169
+ )
163
170
  result.errors.append(f"CVE {vuln.get('cve_id')}: {str(e)}")
164
171
 
165
172
  result.new_vulns = new_count
@@ -174,14 +181,16 @@ class WazuhVulnSync:
174
181
 
175
182
  # Get unmapped agents
176
183
  unmapped = self.host_mapper.get_unmapped_agents(self.engagement_id)
177
- result.unmapped_agents = [a.get('agent_ip') for a in unmapped if a.get('agent_ip')]
184
+ result.unmapped_agents = [
185
+ a.get("agent_ip") for a in unmapped if a.get("agent_ip")
186
+ ]
178
187
 
179
188
  # Update sync status
180
189
  self.vulns_manager.update_sync_status(
181
190
  self.engagement_id,
182
191
  count=result.total_fetched,
183
- status='success' if not result.errors else 'partial',
184
- errors=result.errors if result.errors else None
192
+ status="success" if not result.errors else "partial",
193
+ errors=result.errors if result.errors else None,
185
194
  )
186
195
 
187
196
  result.duration_seconds = (datetime.now() - start_time).total_seconds()
@@ -200,10 +209,7 @@ class WazuhVulnSync:
200
209
  result.errors.append(str(e))
201
210
 
202
211
  self.vulns_manager.update_sync_status(
203
- self.engagement_id,
204
- count=0,
205
- status='error',
206
- errors=[str(e)]
212
+ self.engagement_id, count=0, status="error", errors=[str(e)]
207
213
  )
208
214
 
209
215
  result.duration_seconds = (datetime.now() - start_time).total_seconds()
@@ -237,32 +243,36 @@ class WazuhVulnSync:
237
243
  try:
238
244
  self.vulns_manager.upsert_vulnerability(
239
245
  engagement_id=self.engagement_id,
240
- agent_id=vuln.get('agent_id'),
241
- cve_id=vuln.get('cve_id'),
242
- package_name=vuln.get('package_name'),
243
- agent_name=vuln.get('agent_name'),
244
- agent_ip=vuln.get('agent_ip'),
245
- name=vuln.get('name'),
246
- severity=vuln.get('severity'),
247
- cvss_score=vuln.get('cvss_score'),
248
- cvss_version=vuln.get('cvss_version'),
249
- package_version=vuln.get('package_version'),
250
- package_architecture=vuln.get('package_architecture'),
251
- detection_time=vuln.get('detection_time'),
252
- published_date=vuln.get('published_date'),
253
- reference_urls=vuln.get('reference_urls'),
254
- raw_data=vuln.get('raw_data')
246
+ agent_id=vuln.get("agent_id"),
247
+ cve_id=vuln.get("cve_id"),
248
+ package_name=vuln.get("package_name"),
249
+ agent_name=vuln.get("agent_name"),
250
+ agent_ip=vuln.get("agent_ip"),
251
+ name=vuln.get("name"),
252
+ severity=vuln.get("severity"),
253
+ cvss_score=vuln.get("cvss_score"),
254
+ cvss_version=vuln.get("cvss_version"),
255
+ package_version=vuln.get("package_version"),
256
+ package_architecture=vuln.get("package_architecture"),
257
+ detection_time=vuln.get("detection_time"),
258
+ published_date=vuln.get("published_date"),
259
+ reference_urls=vuln.get("reference_urls"),
260
+ raw_data=vuln.get("raw_data"),
255
261
  )
256
262
  result.new_vulns += 1
257
263
  except Exception as e:
258
264
  result.errors.append(f"CVE {vuln.get('cve_id')}: {str(e)}")
259
265
 
260
266
  # Auto-map this agent's IP
261
- if vulns and vulns[0].get('agent_ip'):
262
- agent_ip = vulns[0]['agent_ip']
263
- host_id = self.host_mapper.map_agent_to_host(self.engagement_id, agent_ip)
267
+ if vulns and vulns[0].get("agent_ip"):
268
+ agent_ip = vulns[0]["agent_ip"]
269
+ host_id = self.host_mapper.map_agent_to_host(
270
+ self.engagement_id, agent_ip
271
+ )
264
272
  if host_id:
265
- self.host_mapper._update_vuln_host_mapping(self.engagement_id, agent_ip, host_id)
273
+ self.host_mapper._update_vuln_host_mapping(
274
+ self.engagement_id, agent_ip, host_id
275
+ )
266
276
  result.mapped_hosts = 1
267
277
  else:
268
278
  result.unmapped_agents = [agent_ip]
@@ -312,16 +322,16 @@ class WazuhVulnSync:
312
322
  status = self.vulns_manager.get_sync_status(self.engagement_id)
313
323
  if not status:
314
324
  return {
315
- 'synced': False,
316
- 'last_sync_at': None,
317
- 'last_sync_count': 0,
318
- 'is_stale': True
325
+ "synced": False,
326
+ "last_sync_at": None,
327
+ "last_sync_count": 0,
328
+ "is_stale": True,
319
329
  }
320
330
 
321
331
  return {
322
- 'synced': True,
323
- 'last_sync_at': status.get('last_sync_at'),
324
- 'last_sync_count': status.get('last_sync_count', 0),
325
- 'last_sync_status': status.get('last_sync_status'),
326
- 'is_stale': self.is_stale()
332
+ "synced": True,
333
+ "last_sync_at": status.get("last_sync_at"),
334
+ "last_sync_count": status.get("last_sync_count", 0),
335
+ "last_sync_status": status.get("last_sync_status"),
336
+ "is_stale": self.is_stale(),
327
337
  }
@@ -1,13 +1,12 @@
1
1
  """Intelligence and analysis modules for pentest automation."""
2
2
 
3
3
  __all__ = [
4
- 'ServiceVersionExtractor',
5
- 'ExploitKnowledgeBase',
6
- 'ExploitSuggestionEngine',
7
- 'AttackSurfaceAnalyzer'
4
+ "ServiceVersionExtractor",
5
+ "ExploitKnowledgeBase",
6
+ "ExploitSuggestionEngine",
7
+ "AttackSurfaceAnalyzer",
8
8
  ]
9
9
 
10
10
  from souleyez.intelligence.service_parser import ServiceVersionExtractor
11
11
  from souleyez.intelligence.exploit_knowledge import ExploitKnowledgeBase
12
12
  from souleyez.intelligence.exploit_suggestions import ExploitSuggestionEngine
13
-