souleyez 3.0.0__py3-none-any.whl → 3.0.7__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 (325) hide show
  1. souleyez/__init__.py +1 -1
  2. souleyez/ai/__init__.py +7 -7
  3. souleyez/ai/action_mapper.py +3 -2
  4. souleyez/ai/chain_advisor.py +2 -1
  5. souleyez/ai/claude_provider.py +2 -2
  6. souleyez/ai/context_builder.py +4 -2
  7. souleyez/ai/executor.py +9 -6
  8. souleyez/ai/feedback_handler.py +4 -2
  9. souleyez/ai/llm_provider.py +2 -2
  10. souleyez/ai/ollama_provider.py +2 -2
  11. souleyez/ai/ollama_service.py +10 -26
  12. souleyez/ai/path_scorer.py +2 -1
  13. souleyez/ai/recommender.py +6 -4
  14. souleyez/ai/report_context.py +2 -2
  15. souleyez/ai/report_service.py +5 -5
  16. souleyez/ai/result_parser.py +3 -2
  17. souleyez/ai/safety.py +5 -2
  18. souleyez/auth/__init__.py +6 -6
  19. souleyez/auth/audit.py +2 -2
  20. souleyez/auth/engagement_access.py +5 -7
  21. souleyez/auth/permissions.py +1 -1
  22. souleyez/auth/session_manager.py +5 -5
  23. souleyez/auth/user_manager.py +4 -5
  24. souleyez/commands/audit.py +6 -5
  25. souleyez/commands/auth.py +6 -5
  26. souleyez/commands/deliverables.py +2 -3
  27. souleyez/commands/engagement.py +3 -3
  28. souleyez/commands/license.py +3 -2
  29. souleyez/commands/screenshots.py +5 -4
  30. souleyez/commands/user.py +10 -8
  31. souleyez/config.py +4 -2
  32. souleyez/core/credential_tester.py +4 -2
  33. souleyez/core/cve_mappings.py +2 -1
  34. souleyez/core/cve_matcher.py +2 -1
  35. souleyez/core/msf_auto_mapper.py +2 -0
  36. souleyez/core/msf_chain_engine.py +3 -1
  37. souleyez/core/msf_database.py +7 -13
  38. souleyez/core/msf_integration.py +2 -2
  39. souleyez/core/msf_rpc_client.py +3 -2
  40. souleyez/core/msf_rpc_manager.py +4 -4
  41. souleyez/core/msf_sync_manager.py +7 -7
  42. souleyez/core/network_utils.py +1 -1
  43. souleyez/core/parser_handler.py +2 -1
  44. souleyez/core/pending_chains.py +4 -3
  45. souleyez/core/templates.py +5 -2
  46. souleyez/core/tool_chaining.py +101 -70
  47. souleyez/core/version_utils.py +1 -0
  48. souleyez/core/vuln_correlation.py +3 -2
  49. souleyez/core/web_utils.py +2 -1
  50. souleyez/detection/__init__.py +1 -1
  51. souleyez/detection/attack_signatures.py +1 -1
  52. souleyez/detection/mitre_mappings.py +1 -2
  53. souleyez/detection/validator.py +5 -4
  54. souleyez/devtools.py +4 -2
  55. souleyez/docs/README.md +2 -2
  56. souleyez/engine/background.py +168 -7
  57. souleyez/engine/base.py +2 -1
  58. souleyez/engine/loader.py +4 -2
  59. souleyez/engine/log_sanitizer.py +1 -0
  60. souleyez/engine/manager.py +3 -1
  61. souleyez/engine/result_handler.py +50 -67
  62. souleyez/engine/worker_manager.py +6 -4
  63. souleyez/export/evidence_bundle.py +1 -0
  64. souleyez/handlers/base.py +1 -0
  65. souleyez/handlers/bash_handler.py +1 -0
  66. souleyez/handlers/bloodhound_handler.py +1 -0
  67. souleyez/handlers/certipy_handler.py +1 -0
  68. souleyez/handlers/crackmapexec_handler.py +2 -20
  69. souleyez/handlers/dnsrecon_handler.py +2 -1
  70. souleyez/handlers/enum4linux_handler.py +65 -37
  71. souleyez/handlers/evil_winrm_handler.py +1 -0
  72. souleyez/handlers/ffuf_handler.py +3 -1
  73. souleyez/handlers/gobuster_handler.py +7 -6
  74. souleyez/handlers/gpp_extract_handler.py +1 -0
  75. souleyez/handlers/hashcat_handler.py +1 -0
  76. souleyez/handlers/hydra_handler.py +5 -2
  77. souleyez/handlers/impacket_getuserspns_handler.py +1 -0
  78. souleyez/handlers/impacket_psexec_handler.py +1 -0
  79. souleyez/handlers/impacket_secretsdump_handler.py +1 -0
  80. souleyez/handlers/john_handler.py +1 -0
  81. souleyez/handlers/katana_handler.py +39 -2
  82. souleyez/handlers/kerbrute_handler.py +1 -0
  83. souleyez/handlers/ldapsearch_handler.py +90 -17
  84. souleyez/handlers/lfi_extract_handler.py +1 -0
  85. souleyez/handlers/msf_auxiliary_handler.py +1 -0
  86. souleyez/handlers/msf_exploit_handler.py +1 -0
  87. souleyez/handlers/nikto_handler.py +2 -1
  88. souleyez/handlers/nmap_handler.py +2 -1
  89. souleyez/handlers/nuclei_handler.py +2 -1
  90. souleyez/handlers/nxc_handler.py +3 -18
  91. souleyez/handlers/rdp_sec_check_handler.py +1 -0
  92. souleyez/handlers/registry.py +1 -0
  93. souleyez/handlers/responder_handler.py +1 -0
  94. souleyez/handlers/service_explorer_handler.py +2 -1
  95. souleyez/handlers/smbclient_handler.py +1 -0
  96. souleyez/handlers/smbmap_handler.py +3 -2
  97. souleyez/handlers/sqlmap_handler.py +6 -4
  98. souleyez/handlers/theharvester_handler.py +2 -1
  99. souleyez/handlers/web_login_test_handler.py +1 -0
  100. souleyez/handlers/whois_handler.py +3 -2
  101. souleyez/handlers/wpscan_handler.py +2 -1
  102. souleyez/history.py +4 -3
  103. souleyez/importers/msf_importer.py +5 -3
  104. souleyez/importers/smart_importer.py +6 -4
  105. souleyez/integrations/siem/__init__.py +6 -6
  106. souleyez/integrations/siem/base.py +1 -1
  107. souleyez/integrations/siem/elastic.py +3 -3
  108. souleyez/integrations/siem/factory.py +1 -2
  109. souleyez/integrations/siem/googlesecops.py +4 -4
  110. souleyez/integrations/siem/rule_mappings/wazuh_rules.py +1 -1
  111. souleyez/integrations/siem/sentinel.py +3 -3
  112. souleyez/integrations/siem/splunk.py +3 -3
  113. souleyez/integrations/siem/wazuh.py +4 -4
  114. souleyez/integrations/wazuh/__init__.py +1 -1
  115. souleyez/integrations/wazuh/client.py +3 -2
  116. souleyez/integrations/wazuh/config.py +3 -2
  117. souleyez/integrations/wazuh/host_mapper.py +3 -1
  118. souleyez/integrations/wazuh/sync.py +4 -1
  119. souleyez/intelligence/__init__.py +1 -1
  120. souleyez/intelligence/correlation_analyzer.py +6 -5
  121. souleyez/intelligence/exploit_knowledge.py +4 -4
  122. souleyez/intelligence/exploit_suggestions.py +4 -3
  123. souleyez/intelligence/gap_analyzer.py +5 -3
  124. souleyez/intelligence/gap_detector.py +2 -0
  125. souleyez/intelligence/sensitive_tables.py +1 -1
  126. souleyez/intelligence/service_parser.py +1 -0
  127. souleyez/intelligence/surface_analyzer.py +9 -9
  128. souleyez/intelligence/target_parser.py +1 -0
  129. souleyez/licensing/__init__.py +3 -3
  130. souleyez/main.py +25 -18
  131. souleyez/migrations/fix_job_counter.py +2 -1
  132. souleyez/parsers/bloodhound_parser.py +1 -0
  133. souleyez/parsers/crackmapexec_parser.py +2 -1
  134. souleyez/parsers/dalfox_parser.py +3 -2
  135. souleyez/parsers/dnsrecon_parser.py +2 -1
  136. souleyez/parsers/enum4linux_parser.py +2 -1
  137. souleyez/parsers/ffuf_parser.py +2 -1
  138. souleyez/parsers/gobuster_parser.py +2 -1
  139. souleyez/parsers/hashcat_parser.py +3 -2
  140. souleyez/parsers/http_fingerprint_parser.py +2 -1
  141. souleyez/parsers/hydra_parser.py +2 -1
  142. souleyez/parsers/impacket_parser.py +2 -1
  143. souleyez/parsers/john_parser.py +4 -3
  144. souleyez/parsers/katana_parser.py +134 -2
  145. souleyez/parsers/msf_parser.py +2 -1
  146. souleyez/parsers/nikto_parser.py +2 -1
  147. souleyez/parsers/nmap_parser.py +14 -3
  148. souleyez/parsers/nuclei_parser.py +3 -2
  149. souleyez/parsers/responder_parser.py +1 -0
  150. souleyez/parsers/searchsploit_parser.py +3 -2
  151. souleyez/parsers/service_explorer_parser.py +1 -0
  152. souleyez/parsers/smbmap_parser.py +2 -1
  153. souleyez/parsers/sqlmap_parser.py +36 -2
  154. souleyez/parsers/theharvester_parser.py +2 -1
  155. souleyez/parsers/whois_parser.py +2 -1
  156. souleyez/parsers/wpscan_parser.py +3 -2
  157. souleyez/plugins/afp.py +3 -1
  158. souleyez/plugins/afp_brute.py +3 -1
  159. souleyez/plugins/ard.py +3 -1
  160. souleyez/plugins/bloodhound.py +3 -2
  161. souleyez/plugins/certipy.py +1 -0
  162. souleyez/plugins/crackmapexec.py +11 -7
  163. souleyez/plugins/dalfox.py +5 -2
  164. souleyez/plugins/dns_hijack.py +3 -1
  165. souleyez/plugins/dnsrecon.py +3 -1
  166. souleyez/plugins/enum4linux.py +3 -1
  167. souleyez/plugins/evil_winrm.py +1 -0
  168. souleyez/plugins/ffuf.py +3 -1
  169. souleyez/plugins/firmware_extract.py +3 -2
  170. souleyez/plugins/gobuster.py +6 -3
  171. souleyez/plugins/gpp_extract.py +1 -0
  172. souleyez/plugins/hashcat.py +2 -1
  173. souleyez/plugins/http_fingerprint.py +57 -7
  174. souleyez/plugins/hydra.py +5 -3
  175. souleyez/plugins/impacket_common.py +40 -0
  176. souleyez/plugins/impacket_getnpusers.py +19 -2
  177. souleyez/plugins/impacket_getuserspns.py +158 -0
  178. souleyez/plugins/impacket_psexec.py +19 -2
  179. souleyez/plugins/impacket_secretsdump.py +19 -2
  180. souleyez/plugins/impacket_smbclient.py +19 -2
  181. souleyez/plugins/john.py +2 -1
  182. souleyez/plugins/katana.py +48 -6
  183. souleyez/plugins/kerbrute.py +1 -0
  184. souleyez/plugins/lfi_extract.py +1 -0
  185. souleyez/plugins/macos_ssh.py +3 -1
  186. souleyez/plugins/mdns.py +3 -1
  187. souleyez/plugins/msf_auxiliary.py +3 -2
  188. souleyez/plugins/msf_exploit.py +6 -5
  189. souleyez/plugins/nikto.py +5 -2
  190. souleyez/plugins/nmap.py +6 -4
  191. souleyez/plugins/nuclei.py +3 -1
  192. souleyez/plugins/nxc.py +1 -0
  193. souleyez/plugins/plugin_base.py +3 -2
  194. souleyez/plugins/plugin_template.py +3 -2
  195. souleyez/plugins/rdp_sec_check.py +1 -0
  196. souleyez/plugins/responder.py +2 -1
  197. souleyez/plugins/router_http_brute.py +3 -1
  198. souleyez/plugins/router_ssh_brute.py +3 -1
  199. souleyez/plugins/router_telnet_brute.py +3 -1
  200. souleyez/plugins/routersploit.py +5 -3
  201. souleyez/plugins/routersploit_exploit.py +5 -3
  202. souleyez/plugins/searchsploit.py +1 -0
  203. souleyez/plugins/service_explorer.py +2 -1
  204. souleyez/plugins/smbmap.py +3 -1
  205. souleyez/plugins/smbpasswd.py +1 -0
  206. souleyez/plugins/sqlmap.py +3 -1
  207. souleyez/plugins/theharvester.py +3 -1
  208. souleyez/plugins/tr069.py +3 -1
  209. souleyez/plugins/upnp.py +3 -1
  210. souleyez/plugins/upnp_abuse.py +4 -2
  211. souleyez/plugins/vnc_access.py +4 -2
  212. souleyez/plugins/vnc_brute.py +3 -1
  213. souleyez/plugins/web_login_test.py +1 -0
  214. souleyez/plugins/whois.py +3 -1
  215. souleyez/plugins/wpscan.py +3 -1
  216. souleyez/reporting/attack_chain.py +2 -1
  217. souleyez/reporting/charts.py +1 -0
  218. souleyez/reporting/compliance_mappings.py +1 -0
  219. souleyez/reporting/detection_report.py +10 -10
  220. souleyez/reporting/formatters.py +7 -12
  221. souleyez/reporting/generator.py +34 -46
  222. souleyez/reporting/metrics.py +2 -1
  223. souleyez/scanner.py +6 -3
  224. souleyez/security/__init__.py +7 -5
  225. souleyez/security/scope_validator.py +5 -4
  226. souleyez/security.py +5 -2
  227. souleyez/storage/credentials.py +14 -19
  228. souleyez/storage/crypto.py +7 -4
  229. souleyez/storage/database.py +6 -6
  230. souleyez/storage/db.py +8 -8
  231. souleyez/storage/deliverable_evidence.py +2 -1
  232. souleyez/storage/deliverable_exporter.py +3 -2
  233. souleyez/storage/deliverable_templates.py +2 -1
  234. souleyez/storage/deliverables.py +2 -1
  235. souleyez/storage/engagements.py +6 -4
  236. souleyez/storage/evidence.py +5 -4
  237. souleyez/storage/execution_log.py +4 -2
  238. souleyez/storage/exploit_attempts.py +3 -2
  239. souleyez/storage/exploits.py +3 -1
  240. souleyez/storage/findings.py +3 -1
  241. souleyez/storage/hosts.py +5 -2
  242. souleyez/storage/migrate_to_engagements.py +14 -24
  243. souleyez/storage/migrations/_001_add_credential_enhancements.py +12 -21
  244. souleyez/storage/migrations/_003_add_execution_log.py +8 -13
  245. souleyez/storage/migrations/_005_screenshots.py +2 -4
  246. souleyez/storage/migrations/_006_deliverables.py +2 -4
  247. souleyez/storage/migrations/_007_deliverable_templates.py +4 -8
  248. souleyez/storage/migrations/_008_add_nuclei_table.py +2 -4
  249. souleyez/storage/migrations/_010_evidence_linking.py +6 -12
  250. souleyez/storage/migrations/_012_team_collaboration.py +12 -24
  251. souleyez/storage/migrations/_013_add_host_tags.py +2 -4
  252. souleyez/storage/migrations/_014_exploit_attempts.py +10 -20
  253. souleyez/storage/migrations/_015_add_mac_os_fields.py +4 -8
  254. souleyez/storage/migrations/_016_add_domain_field.py +2 -4
  255. souleyez/storage/migrations/_017_msf_sessions.py +8 -16
  256. souleyez/storage/migrations/_018_add_osint_target.py +4 -8
  257. souleyez/storage/migrations/_019_add_engagement_type.py +4 -8
  258. souleyez/storage/migrations/_020_add_rbac.py +9 -17
  259. souleyez/storage/migrations/_021_wazuh_integration.py +4 -8
  260. souleyez/storage/migrations/_023_fix_detection_results_fk.py +2 -4
  261. souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +4 -8
  262. souleyez/storage/migrations/_026_add_engagement_scope.py +4 -8
  263. souleyez/storage/migrations/_027_multi_siem_persistence.py +8 -16
  264. souleyez/storage/migrations/__init__.py +1 -4
  265. souleyez/storage/migrations/migration_manager.py +6 -9
  266. souleyez/storage/msf_sessions.py +1 -1
  267. souleyez/storage/osint.py +3 -1
  268. souleyez/storage/recommendation_engine.py +3 -2
  269. souleyez/storage/screenshots.py +2 -1
  270. souleyez/storage/smb_shares.py +3 -1
  271. souleyez/storage/sqlmap_data.py +6 -4
  272. souleyez/storage/team_collaboration.py +3 -2
  273. souleyez/storage/timeline_tracker.py +2 -1
  274. souleyez/storage/wazuh_vulns.py +3 -1
  275. souleyez/storage/web_paths.py +3 -1
  276. souleyez/testing/credential_tester.py +2 -0
  277. souleyez/ui/__init__.py +2 -1
  278. souleyez/ui/ai_quotes.py +1 -1
  279. souleyez/ui/attack_surface.py +50 -28
  280. souleyez/ui/chain_rules_view.py +6 -3
  281. souleyez/ui/correlation_view.py +3 -2
  282. souleyez/ui/dashboard.py +85 -139
  283. souleyez/ui/deliverables_view.py +1 -1
  284. souleyez/ui/design_system.py +5 -3
  285. souleyez/ui/errors.py +3 -1
  286. souleyez/ui/evidence_linking_view.py +2 -1
  287. souleyez/ui/evidence_vault.py +11 -6
  288. souleyez/ui/exploit_suggestions_view.py +11 -7
  289. souleyez/ui/export_view.py +3 -1
  290. souleyez/ui/gap_analysis_view.py +6 -3
  291. souleyez/ui/help_system.py +4 -1
  292. souleyez/ui/intelligence_view.py +7 -3
  293. souleyez/ui/interactive.py +1280 -558
  294. souleyez/ui/interactive_selector.py +3 -2
  295. souleyez/ui/log_formatter.py +1 -0
  296. souleyez/ui/menu_components.py +3 -1
  297. souleyez/ui/msf_auxiliary_menu.py +4 -1
  298. souleyez/ui/pending_chains_view.py +15 -12
  299. souleyez/ui/progress_indicators.py +5 -2
  300. souleyez/ui/recommendations_view.py +4 -2
  301. souleyez/ui/rule_builder.py +4 -1
  302. souleyez/ui/setup_wizard.py +10 -8
  303. souleyez/ui/shortcuts.py +1 -1
  304. souleyez/ui/splunk_gap_analysis_view.py +7 -4
  305. souleyez/ui/splunk_vulns_view.py +4 -1
  306. souleyez/ui/team_dashboard.py +7 -5
  307. souleyez/ui/template_selector.py +2 -1
  308. souleyez/ui/terminal.py +3 -2
  309. souleyez/ui/timeline_view.py +2 -1
  310. souleyez/ui/tool_setup.py +92 -31
  311. souleyez/ui/tutorial.py +7 -4
  312. souleyez/ui/tutorial_state.py +3 -2
  313. souleyez/ui/wazuh_vulns_view.py +5 -2
  314. souleyez/ui/wordlist_browser.py +4 -3
  315. souleyez/ui.py +13 -7
  316. souleyez/utils/tool_checker.py +61 -12
  317. souleyez/utils.py +4 -4
  318. souleyez/wordlists.py +1 -0
  319. {souleyez-3.0.0.dist-info → souleyez-3.0.7.dist-info}/METADATA +1 -1
  320. souleyez-3.0.7.dist-info/RECORD +445 -0
  321. souleyez-3.0.0.dist-info/RECORD +0 -443
  322. {souleyez-3.0.0.dist-info → souleyez-3.0.7.dist-info}/WHEEL +0 -0
  323. {souleyez-3.0.0.dist-info → souleyez-3.0.7.dist-info}/entry_points.txt +0 -0
  324. {souleyez-3.0.0.dist-info → souleyez-3.0.7.dist-info}/licenses/LICENSE +0 -0
  325. {souleyez-3.0.0.dist-info → souleyez-3.0.7.dist-info}/top_level.txt +0 -0
@@ -4,12 +4,12 @@ souleyez.core.tool_chaining - Intelligent tool chaining and workflow automation
4
4
 
5
5
  Automatically triggers follow-up scans based on discovered services and findings.
6
6
  """
7
- from typing import List, Dict, Any, Optional
7
+
8
8
  from dataclasses import dataclass, field
9
9
  from datetime import datetime
10
+ from typing import Any, Dict, List, Optional
10
11
  from urllib.parse import urlparse
11
12
 
12
-
13
13
  # Category constants for chain rules
14
14
  CATEGORY_CTF = "ctf" # Lab/learning scenarios - vulnerable by design
15
15
  CATEGORY_ENTERPRISE = "enterprise" # Real-world enterprise testing
@@ -58,7 +58,8 @@ CATEGORY_ICONS = {
58
58
  SERVICE_GROUPS = {
59
59
  "http": {
60
60
  "services": ["http", "https", "http-alt", "http-proxy", "https-alt"],
61
- "ports": [80, 443, 8080, 8000, 8443, 3000, 5000, 8888, 9000, 9090],
61
+ # Port 11434 is Ollama API - runs HTTP but nmap often identifies as "unknown"
62
+ "ports": [80, 443, 8080, 8000, 8443, 3000, 5000, 8888, 9000, 9090, 11434],
62
63
  },
63
64
  "smb": {
64
65
  "services": ["microsoft-ds", "netbios-ssn", "smb"],
@@ -150,8 +151,8 @@ def should_test_url_for_sqli(endpoint_url: str) -> bool:
150
151
  if has_params:
151
152
  # Even with params, skip known non-injectable applications
152
153
  hard_skip = [
153
- "/phpmyadmin/", # phpMyAdmin - DB admin tool, not a target
154
- "/phpmyadmin?", # phpMyAdmin with params
154
+ "/phpmyadmin/", # phpMyAdmin - DB admin tool, not a target
155
+ "/phpmyadmin?", # phpMyAdmin with params
155
156
  ]
156
157
  if any(pattern in path_lower for pattern in hard_skip):
157
158
  return False
@@ -165,13 +166,13 @@ def should_test_url_for_sqli(endpoint_url: str) -> bool:
165
166
  # No query params - apply stricter filtering
166
167
  # Skip known non-injectable paths (only when no params)
167
168
  skip_patterns = [
168
- "/twiki/", # TWiki wiki - not SQLi vulnerable
169
- "/phpmyadmin/", # phpMyAdmin - DB admin, not SQLi target
170
- "/phpmyadmin.", # phpMyAdmin CSS/JS files
171
- "/phpinfo", # phpinfo() output - no injection
172
- "/cgi-bin/", # Base CGI dir without script - no injection
173
- "/misc/", # Drupal/CMS static assets directory
174
- "/modules/", # Drupal modules directory (static files)
169
+ "/twiki/", # TWiki wiki - not SQLi vulnerable
170
+ "/phpmyadmin/", # phpMyAdmin - DB admin, not SQLi target
171
+ "/phpmyadmin.", # phpMyAdmin CSS/JS files
172
+ "/phpinfo", # phpinfo() output - no injection
173
+ "/cgi-bin/", # Base CGI dir without script - no injection
174
+ "/misc/", # Drupal/CMS static assets directory
175
+ "/modules/", # Drupal modules directory (static files)
175
176
  ]
176
177
  if any(pattern in path_lower for pattern in skip_patterns):
177
178
  return False
@@ -186,10 +187,17 @@ def should_test_url_for_sqli(endpoint_url: str) -> bool:
186
187
 
187
188
  # Skip common default/utility pages that rarely have injectable forms
188
189
  useless_dynamic_pages = [
189
- "/index.php", "/index.asp", "/index.aspx", "/index.jsp",
190
- "/default.php", "/default.asp", "/default.aspx",
191
- "/home.php", "/home.asp",
192
- "/info.php", "/test.php",
190
+ "/index.php",
191
+ "/index.asp",
192
+ "/index.aspx",
193
+ "/index.jsp",
194
+ "/default.php",
195
+ "/default.asp",
196
+ "/default.aspx",
197
+ "/home.php",
198
+ "/home.asp",
199
+ "/info.php",
200
+ "/test.php",
193
201
  ]
194
202
  if not has_params:
195
203
  # Only check this list for pages without params
@@ -361,8 +369,8 @@ def get_managed_hosting_platform(
361
369
  # These patterns identify URLs/paths that should be skipped for specific tools
362
370
  # to reduce noise and wasted scans.
363
371
 
364
- import re
365
372
  import logging
373
+ import re
366
374
 
367
375
  logger = logging.getLogger(__name__)
368
376
 
@@ -867,9 +875,9 @@ class ChainRule:
867
875
  # Check product version (e.g., 'version:nginx:<1.19', 'version:apache:>=2.4.49,<=2.4.50')
868
876
  # cond_value format: 'product:version_conditions'
869
877
  from souleyez.core.version_utils import (
870
- parse_version_spec,
871
878
  matches_version,
872
879
  normalize_product_name,
880
+ parse_version_spec,
873
881
  )
874
882
 
875
883
  target_product, version_conditions = parse_version_spec(cond_value)
@@ -1006,7 +1014,7 @@ class ChainRule:
1006
1014
  # For has:services condition, extract port from the services array
1007
1015
  # Prioritize HTTP services for web tools (gobuster, nuclei, etc.)
1008
1016
  services = context.get("services", [])
1009
- http_ports = {80, 443, 8080, 8443, 8000, 8888, 3000, 5000}
1017
+ http_ports = {80, 443, 8080, 8443, 8000, 8888, 3000, 5000, 11434}
1010
1018
 
1011
1019
  # First pass: look for HTTP service by name or common HTTP ports
1012
1020
  for svc in services:
@@ -4579,8 +4587,8 @@ class ToolChaining:
4579
4587
  """Generate ChainRules from CVE database for version-aware chaining."""
4580
4588
  try:
4581
4589
  from souleyez.core.cve_mappings import (
4582
- get_all_cves,
4583
4590
  generate_version_condition,
4591
+ get_all_cves,
4584
4592
  )
4585
4593
  except ImportError:
4586
4594
  return # CVE mappings not available
@@ -4711,8 +4719,8 @@ class ToolChaining:
4711
4719
 
4712
4720
  # Verify license allows auto-chaining
4713
4721
  try:
4722
+ from souleyez.feature_flags.features import Feature, FeatureFlags
4714
4723
  from souleyez.licensing import get_active_license
4715
- from souleyez.feature_flags.features import Features, Feature
4716
4724
 
4717
4725
  license_info = get_active_license()
4718
4726
  # Check tier directly - if license exists with PRO tier, allow it
@@ -4724,7 +4732,7 @@ class ToolChaining:
4724
4732
  elif license_info.is_valid and license_info.tier:
4725
4733
  user_tier = license_info.tier
4726
4734
 
4727
- if not Features.is_enabled(Feature.AUTO_CHAINING, user_tier):
4735
+ if not FeatureFlags.is_enabled(Feature.AUTO_CHAINING, user_tier):
4728
4736
  # User doesn't have PRO - disable auto-chaining
4729
4737
  from souleyez.log_config import get_logger
4730
4738
 
@@ -4752,9 +4760,9 @@ class ToolChaining:
4752
4760
  try:
4753
4761
  from souleyez import config
4754
4762
 
4755
- return config.get("ai.chain_mode", "suggest")
4763
+ return config.get("ai.chain_mode", "off")
4756
4764
  except Exception:
4757
- return "suggest" # Default to suggest mode
4765
+ return "off" # Default to off - AI advisor is opt-in
4758
4766
 
4759
4767
  def get_ai_recommendations(
4760
4768
  self,
@@ -5327,9 +5335,9 @@ class ToolChaining:
5327
5335
  ...
5328
5336
  ]
5329
5337
  """
5330
- from souleyez.log_config import get_logger
5331
5338
  from souleyez.core.web_utils import check_http_redirect
5332
5339
  from souleyez.engine.background import get_job
5340
+ from souleyez.log_config import get_logger
5333
5341
 
5334
5342
  logger = get_logger(__name__)
5335
5343
 
@@ -6000,9 +6008,9 @@ class ToolChaining:
6000
6008
  if is_wordlist:
6001
6009
  logger.info(f"Discovered potential wordlist: {path_url}")
6002
6010
  try:
6003
- import urllib.request
6004
- import ssl
6005
6011
  import os as os_module
6012
+ import ssl
6013
+ import urllib.request
6006
6014
 
6007
6015
  # Create discovered wordlists directory
6008
6016
  wordlist_dir = os_module.path.join(
@@ -6092,8 +6100,14 @@ class ToolChaining:
6092
6100
  f"http_fingerprint detected CMS: {cms_detected.get('name')} ({cms_confidence} confidence)"
6093
6101
  )
6094
6102
 
6095
- # Trigger appropriate CMS scanner
6096
- if "wordpress" in cms_name:
6103
+ # Only trigger CMS scanners with high confidence detection
6104
+ # Medium/low confidence often means false positives (e.g., SPAs returning
6105
+ # non-404 for /wp-admin/ paths). Require 2+ paths matched for high confidence.
6106
+ if cms_confidence != "high":
6107
+ logger.info(
6108
+ f"Skipping CMS scanner - {cms_confidence} confidence is insufficient (need 'high')"
6109
+ )
6110
+ elif "wordpress" in cms_name:
6097
6111
  try:
6098
6112
  enqueue_job(
6099
6113
  tool="wpscan",
@@ -6390,10 +6404,10 @@ class ToolChaining:
6390
6404
  if is_tables_phase and not is_dump_phase and tables and len(tables) > 0:
6391
6405
  # Just finished --tables phase, use hybrid approach
6392
6406
  from souleyez.intelligence.sensitive_tables import (
6393
- prioritize_tables,
6407
+ is_sensitive_table_name,
6394
6408
  is_system_database,
6395
6409
  is_system_table,
6396
- is_sensitive_table_name,
6410
+ prioritize_tables,
6397
6411
  )
6398
6412
  from souleyez.log_config import get_logger
6399
6413
 
@@ -6693,8 +6707,8 @@ class ToolChaining:
6693
6707
  if is_dump_phase:
6694
6708
  # === Chain to Hydra for credential reuse testing ===
6695
6709
  from souleyez.engine.background import enqueue_job
6696
- from souleyez.storage.hosts import HostManager
6697
6710
  from souleyez.log_config import get_logger
6711
+ from souleyez.storage.hosts import HostManager
6698
6712
 
6699
6713
  logger = get_logger(__name__)
6700
6714
 
@@ -6838,8 +6852,8 @@ class ToolChaining:
6838
6852
  hash_groups[hash_type].append(cred)
6839
6853
 
6840
6854
  if hash_groups:
6841
- import tempfile
6842
6855
  import os
6856
+ import tempfile
6843
6857
 
6844
6858
  # Map hash types to hashcat modes
6845
6859
  hashcat_modes = {
@@ -6988,10 +7002,11 @@ class ToolChaining:
6988
7002
  # Check if databases were enumerated (trigger --tables per database)
6989
7003
  elif databases and len(databases) > 0:
6990
7004
  # Filter out system databases (zero pentest value)
7005
+ import re
7006
+
6991
7007
  from souleyez.intelligence.sensitive_tables import (
6992
7008
  is_system_database,
6993
7009
  )
6994
- import re
6995
7010
 
6996
7011
  def is_garbage_db_name(name: str) -> bool:
6997
7012
  """Detect SQLMap marker strings or broken extraction results."""
@@ -8764,8 +8779,8 @@ class ToolChaining:
8764
8779
  lfi_extract_args = ["--max-urls", "10"]
8765
8780
 
8766
8781
  # Write URLs to temp file for batch processing
8767
- import tempfile
8768
8782
  import os as os_module
8783
+ import tempfile
8769
8784
 
8770
8785
  tmp_dir = os_module.path.join(
8771
8786
  os_module.path.expanduser("~"), ".souleyez", "tmp"
@@ -9008,8 +9023,8 @@ class ToolChaining:
9008
9023
  path = ""
9009
9024
 
9010
9025
  # Create temp file with usernames
9011
- import tempfile
9012
9026
  import os as os_module
9027
+ import tempfile
9013
9028
 
9014
9029
  tmp_dir = os_module.path.join(
9015
9030
  os_module.path.expanduser("~"), ".souleyez", "tmp"
@@ -9259,10 +9274,14 @@ class ToolChaining:
9259
9274
  # Skip external URLs - only test URLs on the original target host
9260
9275
  try:
9261
9276
  from urllib.parse import urlparse
9277
+
9262
9278
  parsed_url = urlparse(url)
9263
9279
  parsed_target = urlparse(target)
9264
9280
  if parsed_url.netloc and parsed_target.netloc:
9265
- if parsed_url.netloc.lower() != parsed_target.netloc.lower():
9281
+ if (
9282
+ parsed_url.netloc.lower()
9283
+ != parsed_target.netloc.lower()
9284
+ ):
9266
9285
  logger.debug(f" Skipping external URL: {url}")
9267
9286
  continue
9268
9287
  except Exception:
@@ -9270,19 +9289,26 @@ class ToolChaining:
9270
9289
 
9271
9290
  # Skip non-injectable paths (TWiki, phpMyAdmin, Apache dir params)
9272
9291
  skip_patterns = [
9273
- "/twiki/", # TWiki wiki - not SQLi vulnerable
9274
- "/phpmyadmin/", # phpMyAdmin - DB admin, not SQLi
9275
- "/phpmyadmin.", # phpMyAdmin CSS/JS files
9276
- "?c=d", "?c=s", "?c=m", "?c=n", # Apache dir listing sort params
9277
- "?o=a", "?o=d", # Apache dir listing order params
9278
- ";o=a", ";o=d", # Apache dir listing (semicolon variant)
9279
- "/misc/", # Drupal/CMS static assets directory
9280
- "/modules/", # Drupal modules directory (static files)
9292
+ "/twiki/", # TWiki wiki - not SQLi vulnerable
9293
+ "/phpmyadmin/", # phpMyAdmin - DB admin, not SQLi
9294
+ "/phpmyadmin.", # phpMyAdmin CSS/JS files
9295
+ "?c=d",
9296
+ "?c=s",
9297
+ "?c=m",
9298
+ "?c=n", # Apache dir listing sort params
9299
+ "?o=a",
9300
+ "?o=d", # Apache dir listing order params
9301
+ ";o=a",
9302
+ ";o=d", # Apache dir listing (semicolon variant)
9303
+ "/misc/", # Drupal/CMS static assets directory
9304
+ "/modules/", # Drupal modules directory (static files)
9281
9305
  ]
9282
9306
  # Also skip static files with version/cache-busting params
9283
9307
  # These are not injectable: /jquery.js?v=1.2.3, /style.css?ver=5.0
9284
9308
  if ".js?" in path_lower or ".css?" in path_lower:
9285
- logger.debug(f" Skipping static file with cache param: {url}")
9309
+ logger.debug(
9310
+ f" Skipping static file with cache param: {url}"
9311
+ )
9286
9312
  continue
9287
9313
  if any(pattern in path_lower for pattern in skip_patterns):
9288
9314
  logger.debug(f" Skipping non-injectable path: {url}")
@@ -9696,8 +9722,8 @@ class ToolChaining:
9696
9722
 
9697
9723
  if asrep_hashes:
9698
9724
  # Create temp file with AS-REP hashes for hashcat
9699
- import tempfile
9700
9725
  import os
9726
+ import tempfile
9701
9727
 
9702
9728
  # Create hash file (uses secure tempdir)
9703
9729
  hash_file = tempfile.NamedTemporaryFile(
@@ -9746,8 +9772,8 @@ class ToolChaining:
9746
9772
 
9747
9773
  if hashes:
9748
9774
  # Create temp file with NTLM hashes for hashcat
9749
- import tempfile
9750
9775
  import os
9776
+ import tempfile
9751
9777
 
9752
9778
  # Create hash file in format: username:hash (uses secure tempdir)
9753
9779
  hash_file = tempfile.NamedTemporaryFile(
@@ -9934,7 +9960,8 @@ class ToolChaining:
9934
9960
  stored_creds = cred_mgr.list_credentials(
9935
9961
  engagement_id, host_id=host["id"]
9936
9962
  )
9937
- # Find SMB/Windows credentials
9963
+ # Find SMB/Windows credentials - prefer passwords over hashes
9964
+ # Hashes require different auth flags and may be from later chain stages
9938
9965
  for cred in stored_creds:
9939
9966
  if cred.get("service") in [
9940
9967
  "smb",
@@ -9942,8 +9969,12 @@ class ToolChaining:
9942
9969
  "ldap",
9943
9970
  "windows",
9944
9971
  ]:
9945
- smb_creds = cred
9946
- break
9972
+ # Only use password-type creds, not hashes
9973
+ # Hashes need --hash flag and may be stale from previous runs
9974
+ cred_type = cred.get("credential_type", "password")
9975
+ if cred_type in ["password", "plaintext"]:
9976
+ smb_creds = cred
9977
+ break
9947
9978
  except Exception as e:
9948
9979
  logger.debug(f"Could not get stored credentials: {e}")
9949
9980
 
@@ -9980,14 +10011,10 @@ class ToolChaining:
9980
10011
  f"Using stored credentials ({username}) for share access"
9981
10012
  )
9982
10013
  else:
9983
- # Use null session - smbmap handles this with empty creds
10014
+ # Use null session - smbmap defaults to anonymous without -u/-p
9984
10015
  smbmap_args = [
9985
10016
  "-H",
9986
10017
  target,
9987
- "-u",
9988
- "",
9989
- "-p",
9990
- "",
9991
10018
  "-r",
9992
10019
  share_name,
9993
10020
  "--depth",
@@ -10094,8 +10121,9 @@ class ToolChaining:
10094
10121
 
10095
10122
  if password_changed and username and new_password:
10096
10123
  # Check for existing evil-winrm job for same user to avoid duplicates
10124
+ from datetime import datetime, timedelta, timezone
10125
+
10097
10126
  from souleyez.engine.background import list_jobs
10098
- from datetime import datetime, timezone, timedelta
10099
10127
 
10100
10128
  try:
10101
10129
  all_jobs = list_jobs(limit=500)
@@ -10180,9 +10208,10 @@ class ToolChaining:
10180
10208
  f"Secretsdump extracted {hashes_count} NTLM hash(es), chaining to hashcat"
10181
10209
  )
10182
10210
 
10183
- from souleyez.engine.background import enqueue_job
10184
- import tempfile
10185
10211
  import os
10212
+ import tempfile
10213
+
10214
+ from souleyez.engine.background import enqueue_job
10186
10215
 
10187
10216
  # Create a temporary hash file for hashcat
10188
10217
  # Format: username:rid:lm:nt::: (but hashcat mode 1000 just needs NT hash)
@@ -10242,9 +10271,10 @@ class ToolChaining:
10242
10271
  f"GetNPUsers extracted {hashes_count} AS-REP hash(es), chaining to hashcat"
10243
10272
  )
10244
10273
 
10245
- from souleyez.engine.background import enqueue_job
10246
10274
  import os
10247
10275
 
10276
+ from souleyez.engine.background import enqueue_job
10277
+
10248
10278
  # Create a hash file for hashcat
10249
10279
  hash_dir = os.path.join(
10250
10280
  os.path.expanduser("~"), ".souleyez", "hashes"
@@ -10433,10 +10463,11 @@ class ToolChaining:
10433
10463
  hashes = parse_results.get("hashes", [])
10434
10464
 
10435
10465
  if hashes:
10466
+ import os
10467
+ import tempfile
10468
+
10436
10469
  from souleyez.engine.background import enqueue_job
10437
10470
  from souleyez.log_config import get_logger
10438
- import tempfile
10439
- import os
10440
10471
 
10441
10472
  logger = get_logger(__name__)
10442
10473
  logger.info(
@@ -10485,9 +10516,9 @@ class ToolChaining:
10485
10516
 
10486
10517
  if users:
10487
10518
  # Create temp file with enumerated WordPress usernames
10488
- import tempfile
10489
10519
  import os
10490
10520
  import re
10521
+ import tempfile
10491
10522
 
10492
10523
  fd, usernames_file = tempfile.mkstemp(
10493
10524
  suffix=".txt", prefix="wpscan_users_"
@@ -10549,8 +10580,8 @@ class ToolChaining:
10549
10580
 
10550
10581
  if usernames:
10551
10582
  # Create temp file with validated usernames
10552
- import tempfile
10553
10583
  import os
10584
+ import tempfile
10554
10585
 
10555
10586
  fd, usernames_file = tempfile.mkstemp(
10556
10587
  suffix=".txt", prefix="hydra_users_"
@@ -10599,8 +10630,8 @@ class ToolChaining:
10599
10630
  credentials = parse_results.get("credentials", [])
10600
10631
  if credentials:
10601
10632
  from souleyez.engine.background import enqueue_job
10602
- from souleyez.storage.hosts import HostManager
10603
10633
  from souleyez.log_config import get_logger
10634
+ from souleyez.storage.hosts import HostManager
10604
10635
 
10605
10636
  logger = get_logger(__name__)
10606
10637
 
@@ -10681,8 +10712,8 @@ class ToolChaining:
10681
10712
  # === NetExec (nxc) credential chain: valid creds → evil_winrm, Kerberoasting, secretsdump ===
10682
10713
  elif tool == "nxc":
10683
10714
  from souleyez.engine.background import enqueue_job
10684
- from souleyez.storage.hosts import HostManager
10685
10715
  from souleyez.log_config import get_logger
10716
+ from souleyez.storage.hosts import HostManager
10686
10717
 
10687
10718
  logger = get_logger(__name__)
10688
10719
  logger.info(
@@ -11406,8 +11437,8 @@ class ToolChaining:
11406
11437
  host_manager = None
11407
11438
  credentials_manager = None
11408
11439
  try:
11409
- from souleyez.storage.hosts import HostManager
11410
11440
  from souleyez.storage.credentials import CredentialsManager
11441
+ from souleyez.storage.hosts import HostManager
11411
11442
 
11412
11443
  host_manager = HostManager()
11413
11444
  credentials_manager = CredentialsManager()
@@ -11668,8 +11699,8 @@ class ToolChaining:
11668
11699
  spray_password = credentials_found[0].get("password", "")
11669
11700
  if spray_password and len(all_users) > 1:
11670
11701
  # Create temporary user list file
11671
- import tempfile
11672
11702
  import os
11703
+ import tempfile
11673
11704
 
11674
11705
  # Write users to temp file
11675
11706
  users_file = os.path.join(
@@ -11760,8 +11791,8 @@ class ToolChaining:
11760
11791
 
11761
11792
  if domain:
11762
11793
  # Create temp file with discovered users
11763
- import tempfile
11764
11794
  import os as os_module
11795
+ import tempfile
11765
11796
 
11766
11797
  users_file = os_module.path.join(
11767
11798
  tempfile.gettempdir(),
@@ -12112,7 +12143,7 @@ class ToolChaining:
12112
12143
  # === END PRE-DEDUPLICATION ===
12113
12144
 
12114
12145
  try:
12115
- from souleyez.engine.background import enqueue_job, list_jobs, _lock
12146
+ from souleyez.engine.background import _lock, enqueue_job, list_jobs
12116
12147
 
12117
12148
  for cmd in commands:
12118
12149
  cmd_target = cmd.get("target", "")
@@ -5,6 +5,7 @@ souleyez.core.version_utils
5
5
  Semantic version parsing and comparison for version-aware tool chaining.
6
6
  Supports conditions like: version:nginx:<1.19, version:apache:>=2.4.49,<=2.4.50
7
7
  """
8
+
8
9
  import re
9
10
  from dataclasses import dataclass
10
11
  from enum import Enum
@@ -8,9 +8,10 @@ Analyzes findings from multiple tools to:
8
8
  3. Prioritize findings based on correlation
9
9
  4. Suggest exploit paths
10
10
  """
11
- from typing import List, Dict, Any, Optional
12
- from dataclasses import dataclass, field
11
+
13
12
  import re
13
+ from dataclasses import dataclass, field
14
+ from typing import Any, Dict, List, Optional
14
15
 
15
16
 
16
17
  @dataclass
@@ -4,10 +4,11 @@ Web utility functions for SoulEyez.
4
4
  Includes HTTP redirect detection and other web-related helpers.
5
5
  """
6
6
 
7
- import requests
8
7
  from typing import Dict, Optional
9
8
  from urllib.parse import urlparse
10
9
 
10
+ import requests
11
+
11
12
 
12
13
  def check_http_redirect(ip: str, port: int = 80, timeout: int = 3) -> Dict[str, any]:
13
14
  """
@@ -1,7 +1,7 @@
1
1
  # SoulEyez Detection Validation
2
2
  # Correlates attacks with SIEM detections
3
3
 
4
- from .validator import DetectionValidator
5
4
  from .attack_signatures import ATTACK_SIGNATURES
5
+ from .validator import DetectionValidator
6
6
 
7
7
  __all__ = ["DetectionValidator", "ATTACK_SIGNATURES"]
@@ -5,7 +5,7 @@ Maps SoulEyez tool names to expected Wazuh detection rules and search patterns.
5
5
  Used for correlating attacks with SIEM alerts.
6
6
  """
7
7
 
8
- from typing import Dict, Any, List
8
+ from typing import Any, Dict, List
9
9
 
10
10
  # Detection window in seconds after attack completes
11
11
  DEFAULT_DETECTION_WINDOW = 300 # 5 minutes
@@ -5,9 +5,8 @@ Maps SoulEyez attack tools to MITRE ATT&CK techniques and tactics.
5
5
  Used for generating detection coverage reports with ATT&CK heatmaps.
6
6
  """
7
7
 
8
- from typing import Dict, List, Any, Optional
9
8
  from dataclasses import dataclass, field
10
-
9
+ from typing import Any, Dict, List, Optional
11
10
 
12
11
  # MITRE ATT&CK Tactics (Enterprise Matrix)
13
12
  # Reference: https://attack.mitre.org/tactics/enterprise/
@@ -9,13 +9,14 @@ Supports multiple SIEM platforms: Wazuh, Splunk, Elastic, Sentinel.
9
9
 
10
10
  import json
11
11
  import os
12
+ from dataclasses import asdict, dataclass, field
12
13
  from datetime import datetime, timedelta
13
- from dataclasses import dataclass, field, asdict
14
- from typing import List, Dict, Any, Optional
14
+ from typing import Any, Dict, List, Optional
15
15
 
16
+ from souleyez.integrations.siem import SIEMClient, SIEMFactory
16
17
  from souleyez.storage.database import get_db
17
- from souleyez.integrations.siem import SIEMFactory, SIEMClient
18
- from .attack_signatures import get_signature, DEFAULT_DETECTION_WINDOW
18
+
19
+ from .attack_signatures import DEFAULT_DETECTION_WINDOW, get_signature
19
20
 
20
21
  # Job queue file location (same as background.py)
21
22
  DATA_DIR = os.path.join(os.path.expanduser("~"), ".souleyez", "data")
souleyez/devtools.py CHANGED
@@ -9,11 +9,13 @@ Command: souleyez dev repair
9
9
  - Verifies installed version and import path
10
10
  - Prints helpful guidance (no destructive data ops)
11
11
  """
12
+
12
13
  from __future__ import annotations
14
+
13
15
  import os
14
- import sys
15
- import subprocess
16
16
  import shutil
17
+ import subprocess
18
+ import sys
17
19
  from pathlib import Path
18
20
 
19
21
  CSI = "\033["
souleyez/docs/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 3.0.0
4
- **Last Updated:** January 29, 2026
3
+ **Version:** 3.0.7
4
+ **Last Updated:** January 31, 2026
5
5
  **Organization:** CyberSoul Security
6
6
 
7
7
  Welcome to the SoulEyez documentation! This documentation covers architecture, development, user guides, and operational information for the SoulEyez penetration testing platform.