souleyez 2.43.2__tar.gz → 2.43.16__tar.gz

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 (407) hide show
  1. {souleyez-2.43.2/souleyez.egg-info → souleyez-2.43.16}/PKG-INFO +1 -1
  2. {souleyez-2.43.2 → souleyez-2.43.16}/pyproject.toml +1 -1
  3. souleyez-2.43.16/souleyez/__init__.py +2 -0
  4. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/tool_chaining.py +103 -0
  5. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/README.md +2 -2
  6. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/engine/background.py +2 -1
  7. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/engine/result_handler.py +51 -1
  8. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/main.py +1 -1
  9. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/dnsrecon_parser.py +5 -3
  10. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/gobuster.py +48 -1
  11. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/http_fingerprint.py +13 -9
  12. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/engagements.py +6 -2
  13. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/dashboard.py +31 -15
  14. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/interactive.py +58 -13
  15. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/tutorial.py +7 -6
  16. souleyez-2.43.16/souleyez/ui/wordlist_browser.py +481 -0
  17. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/utils/tool_checker.py +2 -2
  18. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/wordlists.py +12 -0
  19. {souleyez-2.43.2 → souleyez-2.43.16/souleyez.egg-info}/PKG-INFO +1 -1
  20. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez.egg-info/SOURCES.txt +1 -0
  21. souleyez-2.43.2/souleyez/__init__.py +0 -2
  22. {souleyez-2.43.2 → souleyez-2.43.16}/LICENSE +0 -0
  23. {souleyez-2.43.2 → souleyez-2.43.16}/MANIFEST.in +0 -0
  24. {souleyez-2.43.2 → souleyez-2.43.16}/README.md +0 -0
  25. {souleyez-2.43.2 → souleyez-2.43.16}/setup.cfg +0 -0
  26. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/__init__.py +0 -0
  27. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/action_mapper.py +0 -0
  28. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/chain_advisor.py +0 -0
  29. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/claude_provider.py +0 -0
  30. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/context_builder.py +0 -0
  31. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/executor.py +0 -0
  32. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/feedback_handler.py +0 -0
  33. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/llm_factory.py +0 -0
  34. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/llm_provider.py +0 -0
  35. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/ollama_provider.py +0 -0
  36. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/ollama_service.py +0 -0
  37. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/path_scorer.py +0 -0
  38. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/recommender.py +0 -0
  39. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/report_context.py +0 -0
  40. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/report_prompts.py +0 -0
  41. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/report_service.py +0 -0
  42. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/result_parser.py +0 -0
  43. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ai/safety.py +0 -0
  44. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/assets/__init__.py +0 -0
  45. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/assets/souleyez-icon.png +0 -0
  46. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/auth/__init__.py +0 -0
  47. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/auth/audit.py +0 -0
  48. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/auth/engagement_access.py +0 -0
  49. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/auth/permissions.py +0 -0
  50. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/auth/session_manager.py +0 -0
  51. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/auth/user_manager.py +0 -0
  52. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/commands/__init__.py +0 -0
  53. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/commands/audit.py +0 -0
  54. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/commands/auth.py +0 -0
  55. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/commands/deliverables.py +0 -0
  56. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/commands/engagement.py +0 -0
  57. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/commands/license.py +0 -0
  58. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/commands/screenshots.py +0 -0
  59. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/commands/user.py +0 -0
  60. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/config.py +0 -0
  61. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/__init__.py +0 -0
  62. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/credential_tester.py +0 -0
  63. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/cve_mappings.py +0 -0
  64. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/cve_matcher.py +0 -0
  65. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/msf_auto_mapper.py +0 -0
  66. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/msf_chain_engine.py +0 -0
  67. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/msf_database.py +0 -0
  68. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/msf_integration.py +0 -0
  69. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/msf_rpc_client.py +0 -0
  70. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/msf_rpc_manager.py +0 -0
  71. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/msf_sync_manager.py +0 -0
  72. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/network_utils.py +0 -0
  73. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/parser_handler.py +0 -0
  74. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/pending_chains.py +0 -0
  75. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/templates.py +0 -0
  76. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/version_utils.py +0 -0
  77. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/vuln_correlation.py +0 -0
  78. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/core/web_utils.py +0 -0
  79. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/README.md +0 -0
  80. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/active_directory.json +0 -0
  81. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/cis_controls_v8.json +0 -0
  82. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/cloud_security.json +0 -0
  83. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/cmmc_2.0.json +0 -0
  84. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/external_network.json +0 -0
  85. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/ffiec_cat.json +0 -0
  86. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/gdpr_article32.json +0 -0
  87. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/glba_safeguards.json +0 -0
  88. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/hipaa_security.json +0 -0
  89. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/hitrust_csf.json +0 -0
  90. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/internal_network.json +0 -0
  91. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/iso27001.json +0 -0
  92. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/nerc_cip.json +0 -0
  93. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/nist_csf.json +0 -0
  94. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/owasp_top10_2021.json +0 -0
  95. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/pci_dss_4.0.json +0 -0
  96. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/ptes_standard.json +0 -0
  97. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/red_team.json +0 -0
  98. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/soc2_type2.json +0 -0
  99. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/templates/webapp_advanced.json +0 -0
  100. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/README.md +0 -0
  101. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/all_users.txt +0 -0
  102. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/api_endpoints.txt +0 -0
  103. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/default_credentials.txt +0 -0
  104. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/macos_users.txt +0 -0
  105. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/router_passwords.txt +0 -0
  106. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/router_users.txt +0 -0
  107. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/soul_pass.txt +0 -0
  108. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/soul_users.txt +0 -0
  109. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/subdomains_common.txt +0 -0
  110. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/top100.txt +0 -0
  111. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/top20_quick.txt +0 -0
  112. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/vnc_passwords.txt +0 -0
  113. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/web_dirs_common.txt +0 -0
  114. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/web_extensions.txt +0 -0
  115. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/data/wordlists/web_files_common.txt +0 -0
  116. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/detection/__init__.py +0 -0
  117. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/detection/attack_signatures.py +0 -0
  118. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/detection/mitre_mappings.py +0 -0
  119. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/detection/validator.py +0 -0
  120. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/devtools.py +0 -0
  121. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/api-reference/cli-commands.md +0 -0
  122. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/api-reference/engagement-api.md +0 -0
  123. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/api-reference/integration-guide.md +0 -0
  124. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/api-reference/parser-formats.md +0 -0
  125. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/architecture/decisions/000-template.md +0 -0
  126. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/architecture/decisions/001-local-llm-over-cloud.md +0 -0
  127. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/architecture/decisions/002-master-password-approach.md +0 -0
  128. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/architecture/decisions/003-database-schema-design.md +0 -0
  129. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/architecture/overview.md +0 -0
  130. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/database/MIGRATIONS.md +0 -0
  131. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/database/SCHEMA.md +0 -0
  132. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/database/SCHEMA_ERD.md +0 -0
  133. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/developer-guide/test_coverage_plan.md +0 -0
  134. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/developer-guide/ui-design-system.md +0 -0
  135. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/images/README.md +0 -0
  136. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/security/best-practices.md +0 -0
  137. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/security/credential-encryption.md +0 -0
  138. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/security/password-protected-commands.md +0 -0
  139. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/security/secure-defaults.md +0 -0
  140. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/security/threat-model.md +0 -0
  141. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/ai-integration.md +0 -0
  142. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/attack-surface.md +0 -0
  143. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/auto-chaining.md +0 -0
  144. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/configuration.md +0 -0
  145. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/deliverables-screenshots.md +0 -0
  146. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/dependencies.md +0 -0
  147. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/evidence-vault.md +0 -0
  148. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/exploit-suggestions.md +0 -0
  149. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/getting-started.md +0 -0
  150. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/installation.md +0 -0
  151. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/metasploit-integration.md +0 -0
  152. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/rbac.md +0 -0
  153. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/report-generation.md +0 -0
  154. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/scope-management.md +0 -0
  155. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/siem-integration.md +0 -0
  156. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/tools-reference.md +0 -0
  157. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/troubleshooting.md +0 -0
  158. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/uninstall.md +0 -0
  159. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/worker-management.md +0 -0
  160. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/docs/user-guide/workflows.md +0 -0
  161. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/engine/__init__.py +0 -0
  162. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/engine/base.py +0 -0
  163. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/engine/job_status.py +0 -0
  164. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/engine/loader.py +0 -0
  165. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/engine/log_sanitizer.py +0 -0
  166. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/engine/manager.py +0 -0
  167. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/engine/worker_manager.py +0 -0
  168. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/export/__init__.py +0 -0
  169. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/export/evidence_bundle.py +0 -0
  170. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/feature_flags/__init__.py +0 -0
  171. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/feature_flags/features.py +0 -0
  172. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/feature_flags.py +0 -0
  173. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/history.py +0 -0
  174. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/importers/__init__.py +0 -0
  175. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/importers/msf_importer.py +0 -0
  176. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/importers/smart_importer.py +0 -0
  177. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/__init__.py +0 -0
  178. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/siem/__init__.py +0 -0
  179. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/siem/base.py +0 -0
  180. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/siem/elastic.py +0 -0
  181. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/siem/factory.py +0 -0
  182. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/siem/googlesecops.py +0 -0
  183. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/siem/rule_mappings/__init__.py +0 -0
  184. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/siem/rule_mappings/wazuh_rules.py +0 -0
  185. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/siem/sentinel.py +0 -0
  186. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/siem/splunk.py +0 -0
  187. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/siem/wazuh.py +0 -0
  188. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/wazuh/__init__.py +0 -0
  189. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/wazuh/client.py +0 -0
  190. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/wazuh/config.py +0 -0
  191. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/wazuh/host_mapper.py +0 -0
  192. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/integrations/wazuh/sync.py +0 -0
  193. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/intelligence/__init__.py +0 -0
  194. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/intelligence/correlation_analyzer.py +0 -0
  195. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/intelligence/exploit_knowledge.py +0 -0
  196. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/intelligence/exploit_suggestions.py +0 -0
  197. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/intelligence/gap_analyzer.py +0 -0
  198. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/intelligence/gap_detector.py +0 -0
  199. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/intelligence/sensitive_tables.py +0 -0
  200. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/intelligence/service_parser.py +0 -0
  201. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/intelligence/surface_analyzer.py +0 -0
  202. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/intelligence/target_parser.py +0 -0
  203. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/licensing/__init__.py +0 -0
  204. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/licensing/validator.py +0 -0
  205. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/log_config.py +0 -0
  206. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/migrations/__init__.py +0 -0
  207. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/migrations/fix_job_counter.py +0 -0
  208. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/__init__.py +0 -0
  209. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/bloodhound_parser.py +0 -0
  210. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/crackmapexec_parser.py +0 -0
  211. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/dalfox_parser.py +0 -0
  212. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/enum4linux_parser.py +0 -0
  213. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/ffuf_parser.py +0 -0
  214. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/gobuster_parser.py +0 -0
  215. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/hashcat_parser.py +0 -0
  216. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/http_fingerprint_parser.py +0 -0
  217. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/hydra_parser.py +0 -0
  218. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/impacket_parser.py +0 -0
  219. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/john_parser.py +0 -0
  220. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/msf_parser.py +0 -0
  221. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/nikto_parser.py +0 -0
  222. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/nmap_parser.py +0 -0
  223. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/nuclei_parser.py +0 -0
  224. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/responder_parser.py +0 -0
  225. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/searchsploit_parser.py +0 -0
  226. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/smbmap_parser.py +0 -0
  227. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/sqlmap_parser.py +0 -0
  228. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/theharvester_parser.py +0 -0
  229. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/whois_parser.py +0 -0
  230. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/parsers/wpscan_parser.py +0 -0
  231. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/__init__.py +0 -0
  232. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/afp.py +0 -0
  233. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/afp_brute.py +0 -0
  234. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/ard.py +0 -0
  235. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/bloodhound.py +0 -0
  236. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/crackmapexec.py +0 -0
  237. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/dalfox.py +0 -0
  238. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/dns_hijack.py +0 -0
  239. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/dnsrecon.py +0 -0
  240. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/enum4linux.py +0 -0
  241. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/ffuf.py +0 -0
  242. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/firmware_extract.py +0 -0
  243. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/hashcat.py +0 -0
  244. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/hydra.py +0 -0
  245. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/impacket_getnpusers.py +0 -0
  246. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/impacket_psexec.py +0 -0
  247. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/impacket_secretsdump.py +0 -0
  248. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/impacket_smbclient.py +0 -0
  249. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/john.py +0 -0
  250. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/macos_ssh.py +0 -0
  251. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/mdns.py +0 -0
  252. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/msf_auxiliary.py +0 -0
  253. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/msf_exploit.py +0 -0
  254. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/nikto.py +0 -0
  255. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/nmap.py +0 -0
  256. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/nuclei.py +0 -0
  257. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/plugin_base.py +0 -0
  258. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/plugin_template.py +0 -0
  259. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/responder.py +0 -0
  260. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/router_http_brute.py +0 -0
  261. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/router_ssh_brute.py +0 -0
  262. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/router_telnet_brute.py +0 -0
  263. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/routersploit.py +0 -0
  264. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/routersploit_exploit.py +0 -0
  265. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/searchsploit.py +0 -0
  266. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/smbmap.py +0 -0
  267. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/sqlmap.py +0 -0
  268. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/theharvester.py +0 -0
  269. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/tr069.py +0 -0
  270. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/upnp.py +0 -0
  271. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/upnp_abuse.py +0 -0
  272. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/vnc_access.py +0 -0
  273. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/vnc_brute.py +0 -0
  274. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/whois.py +0 -0
  275. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/plugins/wpscan.py +0 -0
  276. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/reporting/__init__.py +0 -0
  277. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/reporting/attack_chain.py +0 -0
  278. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/reporting/charts.py +0 -0
  279. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/reporting/compliance_mappings.py +0 -0
  280. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/reporting/detection_report.py +0 -0
  281. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/reporting/formatters.py +0 -0
  282. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/reporting/generator.py +0 -0
  283. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/reporting/metrics.py +0 -0
  284. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/scanner.py +0 -0
  285. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/security/__init__.py +0 -0
  286. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/security/scope_validator.py +0 -0
  287. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/security/validation.py +0 -0
  288. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/security.py +0 -0
  289. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/__init__.py +0 -0
  290. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/credentials.py +0 -0
  291. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/crypto.py +0 -0
  292. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/database.py +0 -0
  293. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/db.py +0 -0
  294. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/deliverable_evidence.py +0 -0
  295. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/deliverable_exporter.py +0 -0
  296. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/deliverable_templates.py +0 -0
  297. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/deliverables.py +0 -0
  298. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/evidence.py +0 -0
  299. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/execution_log.py +0 -0
  300. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/exploit_attempts.py +0 -0
  301. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/exploits.py +0 -0
  302. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/findings.py +0 -0
  303. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/hosts.py +0 -0
  304. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrate_to_engagements.py +0 -0
  305. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_001_add_credential_enhancements.py +0 -0
  306. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_002_add_status_tracking.py +0 -0
  307. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_003_add_execution_log.py +0 -0
  308. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_005_screenshots.py +0 -0
  309. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_006_deliverables.py +0 -0
  310. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_007_deliverable_templates.py +0 -0
  311. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_008_add_nuclei_table.py +0 -0
  312. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_009_add_cme_tables.py +0 -0
  313. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_010_evidence_linking.py +0 -0
  314. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_011_timeline_tracking.py +0 -0
  315. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_012_team_collaboration.py +0 -0
  316. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_013_add_host_tags.py +0 -0
  317. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_014_exploit_attempts.py +0 -0
  318. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_015_add_mac_os_fields.py +0 -0
  319. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_016_add_domain_field.py +0 -0
  320. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_017_msf_sessions.py +0 -0
  321. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_018_add_osint_target.py +0 -0
  322. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_019_add_engagement_type.py +0 -0
  323. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_020_add_rbac.py +0 -0
  324. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_021_wazuh_integration.py +0 -0
  325. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_022_wazuh_indexer_columns.py +0 -0
  326. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_023_fix_detection_results_fk.py +0 -0
  327. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +0 -0
  328. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_025_multi_siem_support.py +0 -0
  329. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_026_add_engagement_scope.py +0 -0
  330. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/_027_multi_siem_persistence.py +0 -0
  331. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/__init__.py +0 -0
  332. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/migrations/migration_manager.py +0 -0
  333. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/msf_sessions.py +0 -0
  334. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/osint.py +0 -0
  335. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/recommendation_engine.py +0 -0
  336. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/schema.sql +0 -0
  337. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/screenshots.py +0 -0
  338. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/smb_shares.py +0 -0
  339. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/sqlmap_data.py +0 -0
  340. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/team_collaboration.py +0 -0
  341. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/timeline_tracker.py +0 -0
  342. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/wazuh_vulns.py +0 -0
  343. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/storage/web_paths.py +0 -0
  344. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/testing/__init__.py +0 -0
  345. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/testing/credential_tester.py +0 -0
  346. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/__init__.py +0 -0
  347. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/ai_quotes.py +0 -0
  348. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/attack_surface.py +0 -0
  349. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/chain_rules_view.py +0 -0
  350. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/correlation_view.py +0 -0
  351. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/deliverables_view.py +0 -0
  352. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/design_system.py +0 -0
  353. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/errors.py +0 -0
  354. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/evidence_linking_view.py +0 -0
  355. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/evidence_vault.py +0 -0
  356. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/exploit_suggestions_view.py +0 -0
  357. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/export_view.py +0 -0
  358. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/gap_analysis_view.py +0 -0
  359. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/help_system.py +0 -0
  360. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/intelligence_view.py +0 -0
  361. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/interactive_selector.py +0 -0
  362. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/log_formatter.py +0 -0
  363. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/menu_components.py +0 -0
  364. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/msf_auxiliary_menu.py +0 -0
  365. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/pending_chains_view.py +0 -0
  366. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/progress_indicators.py +0 -0
  367. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/recommendations_view.py +0 -0
  368. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/rule_builder.py +0 -0
  369. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/setup_wizard.py +0 -0
  370. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/shortcuts.py +0 -0
  371. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/splunk_gap_analysis_view.py +0 -0
  372. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/splunk_vulns_view.py +0 -0
  373. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/team_dashboard.py +0 -0
  374. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/template_selector.py +0 -0
  375. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/terminal.py +0 -0
  376. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/timeline_view.py +0 -0
  377. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/tool_setup.py +0 -0
  378. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/tutorial_state.py +0 -0
  379. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui/wazuh_vulns_view.py +0 -0
  380. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/ui.py +0 -0
  381. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/utils/__init__.py +0 -0
  382. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez/utils.py +0 -0
  383. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez.egg-info/dependency_links.txt +0 -0
  384. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez.egg-info/entry_points.txt +0 -0
  385. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez.egg-info/requires.txt +0 -0
  386. {souleyez-2.43.2 → souleyez-2.43.16}/souleyez.egg-info/top_level.txt +0 -0
  387. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_config.py +0 -0
  388. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_config_enhanced.py +0 -0
  389. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_crypto.py +0 -0
  390. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_database_100_final.py +0 -0
  391. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_engagements.py +0 -0
  392. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_engagements_simple.py +0 -0
  393. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_job_status_tracking.py +0 -0
  394. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_logging.py +0 -0
  395. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_network_utils.py +0 -0
  396. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_ollama_service.py +0 -0
  397. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_plugin_base.py +0 -0
  398. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_recommender.py +0 -0
  399. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_result_handler_sqlmap.py +0 -0
  400. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_schema.py +0 -0
  401. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_scope_integration.py +0 -0
  402. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_scope_validator.py +0 -0
  403. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_security_hardening.py +0 -0
  404. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_security_validation.py +0 -0
  405. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_sqlmap_parser.py +0 -0
  406. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_storage.py +0 -0
  407. {souleyez-2.43.2 → souleyez-2.43.16}/tests/test_version_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: souleyez
3
- Version: 2.43.2
3
+ Version: 2.43.16
4
4
  Summary: AI-Powered Penetration Testing Platform with 40+ integrated tools
5
5
  Author-email: CyberSoul Security <contact@cybersoulsecurity.com>
6
6
  Maintainer-email: CyberSoul Security <contact@cybersoulsecurity.com>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "souleyez"
7
- version = "2.43.2"
7
+ version = "2.43.16"
8
8
  description = "AI-Powered Penetration Testing Platform with 40+ integrated tools"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -0,0 +1,2 @@
1
+ __version__ = '2.43.16'
2
+
@@ -4451,6 +4451,58 @@ class ToolChaining:
4451
4451
  return job_ids
4452
4452
  # === END Wildcard Auto-Retry ===
4453
4453
 
4454
+ # === Host Redirect Auto-Retry Logic ===
4455
+ # If gobuster detected a host-level redirect (e.g., non-www to www), auto-retry with corrected target
4456
+ if parse_results.get('host_redirect_detected') and parse_results.get('redirect_target'):
4457
+ # Check if this is already a retry attempt (prevent loops)
4458
+ is_retry = job.get('metadata', {}).get('redirect_retry', False)
4459
+
4460
+ if not is_retry:
4461
+ redirect_target = parse_results['redirect_target']
4462
+ original_target = target
4463
+ logger.info(f"🔄 Host redirect detected ({original_target} → {redirect_target}), creating auto-retry with corrected target")
4464
+
4465
+ # Get original args and update the -u parameter with new target
4466
+ args = job.get('args', [])
4467
+ retry_args = []
4468
+ for i, arg in enumerate(args):
4469
+ if arg == '-u' and i + 1 < len(args):
4470
+ # Next arg is the URL, replace it
4471
+ retry_args.append(arg)
4472
+ retry_args.append(redirect_target)
4473
+ # Skip the next iteration since we handled it
4474
+ elif i > 0 and args[i - 1] == '-u':
4475
+ # This is the URL after -u, skip it (already handled)
4476
+ continue
4477
+ else:
4478
+ # Replace <target> placeholder if present
4479
+ retry_args.append(arg.replace(original_target, redirect_target) if original_target in arg else arg)
4480
+
4481
+ # Build retry job command with corrected target
4482
+ retry_command = {
4483
+ 'tool': 'gobuster',
4484
+ 'target': redirect_target,
4485
+ 'args': retry_args,
4486
+ 'reason': f'Auto-retry: gobuster (host redirect detected: {original_target} → {redirect_target})',
4487
+ 'metadata': {
4488
+ 'redirect_retry': True,
4489
+ 'retry_parent_job_id': job.get('id'),
4490
+ 'original_target': original_target,
4491
+ 'redirect_target': redirect_target
4492
+ }
4493
+ }
4494
+
4495
+ # Enqueue the retry job
4496
+ retry_job_ids = self._enqueue_commands([retry_command], tool, engagement_id, redirect_target, parent_job_id=job.get('id'))
4497
+ if retry_job_ids:
4498
+ job_ids.extend(retry_job_ids)
4499
+ logger.info(f"✓ Retry job created with corrected target: {redirect_target}")
4500
+
4501
+ # Skip further processing of this redirect scan
4502
+ # Let the retry job complete and process properly
4503
+ return job_ids
4504
+ # === END Host Redirect Auto-Retry ===
4505
+
4454
4506
  # PHP/ASP files found → trigger SQLMap intelligently
4455
4507
  # High-value targets get direct testing, others get base URL crawl
4456
4508
  php_files = parse_results.get('php_files', [])
@@ -5041,6 +5093,57 @@ class ToolChaining:
5041
5093
  return job_ids
5042
5094
  # === END Gobuster wildcard retry ===
5043
5095
 
5096
+ # === Special handling for Gobuster host redirect retry ===
5097
+ if tool == 'gobuster' and parse_results.get('host_redirect_detected'):
5098
+ # Gobuster detected host-level redirect, auto-retry with corrected target
5099
+ from souleyez.engine.background import enqueue_job
5100
+ from souleyez.log_config import get_logger
5101
+ logger = get_logger(__name__)
5102
+
5103
+ # Check if this is already a redirect retry (prevent loops)
5104
+ is_redirect_retry = job.get('metadata', {}).get('redirect_retry', False)
5105
+ if is_redirect_retry:
5106
+ logger.info(f"Gobuster host redirect: Already attempted redirect retry, skipping")
5107
+ return job_ids
5108
+
5109
+ # Get the redirect target
5110
+ redirect_target = parse_results.get('redirect_target')
5111
+ if not redirect_target:
5112
+ logger.warning(f"Gobuster host redirect detected but no redirect_target found")
5113
+ return job_ids
5114
+
5115
+ original_target = target
5116
+ logger.info(f"Gobuster host redirect: Auto-retrying with corrected target {redirect_target}")
5117
+
5118
+ # Get original args and update the -u parameter with new target
5119
+ job_args = job.get('args', [])
5120
+ retry_args = []
5121
+ for i, arg in enumerate(job_args):
5122
+ if arg == '-u' and i + 1 < len(job_args):
5123
+ retry_args.append(arg)
5124
+ retry_args.append(redirect_target)
5125
+ elif i > 0 and job_args[i - 1] == '-u':
5126
+ continue
5127
+ else:
5128
+ retry_args.append(arg.replace(original_target, redirect_target) if original_target in arg else arg)
5129
+
5130
+ retry_job_id = enqueue_job(
5131
+ tool='gobuster',
5132
+ target=redirect_target,
5133
+ args=retry_args,
5134
+ label=f"Auto-retry: gobuster (redirect → {redirect_target})",
5135
+ engagement_id=engagement_id,
5136
+ parent_id=job.get('id'),
5137
+ reason=f"Auto-triggered by gobuster: Host redirect detected ({original_target} → {redirect_target})",
5138
+ metadata={'redirect_retry': True, 'retry_parent_job_id': job.get('id'), 'original_target': original_target}
5139
+ )
5140
+
5141
+ job_ids.append(retry_job_id)
5142
+ logger.info(f"Created gobuster redirect retry job #{retry_job_id}")
5143
+
5144
+ return job_ids
5145
+ # === END Gobuster host redirect retry ===
5146
+
5044
5147
  # === Special handling for ffuf: Create SQLMap jobs and recursive ffuf scans ===
5045
5148
  if tool == 'ffuf':
5046
5149
  from souleyez.engine.background import enqueue_job
@@ -1,7 +1,7 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 2.43.2
4
- **Last Updated:** January 11, 2026
3
+ **Version:** 2.43.16
4
+ **Last Updated:** January 12, 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.
@@ -1395,7 +1395,8 @@ def _is_true_error_exit_code(rc: int, tool: str) -> bool:
1395
1395
  # Parser will determine the actual status based on output
1396
1396
  # msf_exploit returns 1 when no session opened (exploit ran but target not vulnerable)
1397
1397
  # nikto returns non-zero when it finds vulnerabilities (not an error!)
1398
- tools_with_nonzero_success = ['gobuster', 'hydra', 'medusa', 'msf_exploit', 'nikto']
1398
+ # dnsrecon returns 1 when crt.sh lookup fails (known bug) but still collects valid DNS data
1399
+ tools_with_nonzero_success = ['gobuster', 'hydra', 'medusa', 'msf_exploit', 'nikto', 'dnsrecon']
1399
1400
 
1400
1401
  if tool.lower() in tools_with_nonzero_success:
1401
1402
  # Let parser determine status
@@ -1218,12 +1218,27 @@ def parse_gobuster_job(engagement_id: int, log_path: str, job: Dict[str, Any]) -
1218
1218
  exclude_length = length_match.group(1)
1219
1219
  logger.info(f"Gobuster wildcard detected: Length {exclude_length}b")
1220
1220
 
1221
+ # Check for host-level redirect (for auto-retry with corrected target)
1222
+ host_redirect_detected = False
1223
+ redirect_target = None
1224
+
1225
+ if "HOST_REDIRECT_TARGET:" in log_content:
1226
+ host_redirect_detected = True
1227
+ import re
1228
+ redirect_match = re.search(r'HOST_REDIRECT_TARGET:\s*(\S+)', log_content)
1229
+ if redirect_match:
1230
+ redirect_target = redirect_match.group(1)
1231
+ logger.info(f"Gobuster host redirect detected: {redirect_target}")
1232
+
1221
1233
  # Check for gobuster errors
1222
1234
  gobuster_error = detect_tool_error(log_content, 'gobuster')
1223
1235
 
1224
1236
  # Determine status based on results
1225
1237
  if gobuster_error:
1226
1238
  status = STATUS_ERROR # Tool failed to connect
1239
+ elif host_redirect_detected:
1240
+ # Host redirect detected - warning status (triggers auto-retry with corrected target)
1241
+ status = STATUS_WARNING
1227
1242
  elif wildcard_detected:
1228
1243
  # Wildcard detected - warning status (triggers auto-retry)
1229
1244
  status = STATUS_WARNING
@@ -1255,6 +1270,12 @@ def parse_gobuster_job(engagement_id: int, log_path: str, job: Dict[str, Any]) -
1255
1270
  if exclude_length:
1256
1271
  result['exclude_length'] = exclude_length
1257
1272
 
1273
+ # Add host redirect info if detected
1274
+ if host_redirect_detected:
1275
+ result['host_redirect_detected'] = True
1276
+ if redirect_target:
1277
+ result['redirect_target'] = redirect_target
1278
+
1258
1279
  return result
1259
1280
  except Exception as e:
1260
1281
  return {'error': str(e)}
@@ -2643,6 +2664,12 @@ def parse_nuclei_job(engagement_id: int, log_path: str, job: Dict[str, Any]) ->
2643
2664
  'info': parsed.get('info', 0)
2644
2665
  }
2645
2666
  except Exception as e:
2667
+ logger.error("parse_nuclei_job exception", extra={
2668
+ "error": str(e),
2669
+ "error_type": type(e).__name__,
2670
+ "target": job.get('target', ''),
2671
+ "job_id": job.get('id')
2672
+ })
2646
2673
  return {'error': str(e)}
2647
2674
 
2648
2675
 
@@ -3285,9 +3312,12 @@ def parse_http_fingerprint_job(engagement_id: int, log_path: str, job: Dict[str,
3285
3312
  # Get tool recommendations
3286
3313
  recommendations = get_tool_recommendations(parsed)
3287
3314
 
3288
- # Determine status
3315
+ # Determine status and build summary
3316
+ summary_parts = []
3317
+
3289
3318
  if parsed.get('error'):
3290
3319
  status = STATUS_ERROR
3320
+ summary_parts.append(f"Error: {parsed.get('error')}")
3291
3321
  elif parsed.get('managed_hosting') or parsed.get('waf') or parsed.get('cdn'):
3292
3322
  status = STATUS_DONE # Found useful info
3293
3323
  elif parsed.get('server'):
@@ -3295,11 +3325,31 @@ def parse_http_fingerprint_job(engagement_id: int, log_path: str, job: Dict[str,
3295
3325
  else:
3296
3326
  status = STATUS_NO_RESULTS
3297
3327
 
3328
+ # Build summary for successful scans
3329
+ if not parsed.get('error'):
3330
+ if parsed.get('server'):
3331
+ summary_parts.append(f"Server: {parsed.get('server')}")
3332
+ if parsed.get('managed_hosting'):
3333
+ summary_parts.append(f"Platform: {parsed.get('managed_hosting')}")
3334
+ if parsed.get('waf'):
3335
+ summary_parts.append(f"WAF: {', '.join(parsed.get('waf', []))}")
3336
+ if parsed.get('cdn'):
3337
+ summary_parts.append(f"CDN: {', '.join(parsed.get('cdn', []))}")
3338
+ if parsed.get('technologies'):
3339
+ techs = parsed.get('technologies', [])
3340
+ if len(techs) <= 3:
3341
+ summary_parts.append(f"Tech: {', '.join(techs)}")
3342
+ else:
3343
+ summary_parts.append(f"Tech: {', '.join(techs[:3])} +{len(techs)-3} more")
3344
+
3345
+ summary = ' | '.join(summary_parts) if summary_parts else 'No fingerprint data detected'
3346
+
3298
3347
  return {
3299
3348
  'tool': 'http_fingerprint',
3300
3349
  'status': status,
3301
3350
  'target': target,
3302
3351
  'target_host': target_host,
3352
+ 'summary': summary,
3303
3353
  # Core fingerprint data
3304
3354
  'server': parsed.get('server'),
3305
3355
  'managed_hosting': parsed.get('managed_hosting'),
@@ -173,7 +173,7 @@ def _check_privileged_tools():
173
173
 
174
174
 
175
175
  @click.group()
176
- @click.version_option(version='2.43.2')
176
+ @click.version_option(version='2.43.16')
177
177
  def cli():
178
178
  """SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
179
179
  from souleyez.log_config import init_logging
@@ -57,7 +57,8 @@ def parse_dnsrecon_output(output: str, target: str = "") -> Dict[str, Any]:
57
57
  continue
58
58
 
59
59
  # Parse DNS records from dnsrecon output
60
- # Old format: [*] A cybersoulsecurity.com 198.185.159.144
60
+ # Format: [*] A cybersoulsecurity.com 198.185.159.144 (info)
61
+ # Format: [+] A www.vulnweb.com 44.228.249.3 (found records)
61
62
  # New format: 2026-01-08T13:50:16.302153-1000 INFO SOA dns1.p01.nsone.net 198.51.44.1
62
63
  # New format: 2026-01-08T13:50:17.112742-1000 INFO NS dns4.p01.nsone.net 198.51.45.65
63
64
 
@@ -65,8 +66,9 @@ def parse_dnsrecon_output(output: str, target: str = "") -> Dict[str, Any]:
65
66
  hostname = None
66
67
  ip = None
67
68
 
68
- if line_stripped.startswith('[*]'):
69
- # Old format: [*] <type> <hostname> <ip>
69
+ if line_stripped.startswith('[*]') or line_stripped.startswith('[+]'):
70
+ # Format: [*] or [+] <type> <hostname> <ip>
71
+ # [*] = informational, [+] = found/success
70
72
  parts = line_stripped.split()
71
73
  if len(parts) >= 4:
72
74
  record_type = parts[1]
@@ -239,18 +239,25 @@ class GobusterPlugin(PluginBase):
239
239
  This causes gobuster to fail or produce false positives. We detect this
240
240
  upfront and auto-add --exclude-length to filter them out.
241
241
 
242
+ Also detects host-level redirects (e.g., non-www to www) and warns the user.
243
+
242
244
  Returns:
243
245
  dict with keys:
244
246
  - exclude_length: str or None (response length to exclude)
245
247
  - exclude_status: str or None (status code detected)
246
248
  - reason: str or None (explanation)
249
+ - redirect_host: str or None (suggested target if host redirect detected)
247
250
  """
248
- result = {'exclude_length': None, 'exclude_status': None, 'reason': None}
251
+ result = {'exclude_length': None, 'exclude_status': None, 'reason': None, 'redirect_host': None}
249
252
 
250
253
  # Generate random UUID path that definitely doesn't exist
251
254
  test_path = str(uuid.uuid4())
252
255
  test_url = f"{base_url.rstrip('/')}/{test_path}"
253
256
 
257
+ # Parse the original target host for comparison
258
+ original_parsed = urlparse(base_url)
259
+ original_host = original_parsed.netloc.lower()
260
+
254
261
  try:
255
262
  resp = requests.get(
256
263
  test_url,
@@ -263,6 +270,46 @@ class GobusterPlugin(PluginBase):
263
270
  if resp.status_code == 404:
264
271
  return result
265
272
 
273
+ # Check for host-level redirects (301/302/307/308)
274
+ if resp.status_code in [301, 302, 307, 308]:
275
+ location = resp.headers.get('Location', '')
276
+ if location:
277
+ # Parse the redirect location
278
+ redirect_parsed = urlparse(location)
279
+ redirect_host = redirect_parsed.netloc.lower()
280
+
281
+ # If Location is relative, it's not a host redirect
282
+ if redirect_host and redirect_host != original_host:
283
+ # This is a host-level redirect (e.g., non-www to www)
284
+ suggested_url = f"{redirect_parsed.scheme or original_parsed.scheme}://{redirect_host}"
285
+ result['redirect_host'] = suggested_url
286
+ result['exclude_status'] = str(resp.status_code)
287
+ result['reason'] = (
288
+ f"Host redirect detected: {original_host} → {redirect_host}"
289
+ )
290
+
291
+ if log_path:
292
+ with open(log_path, 'a') as f:
293
+ f.write(f"\n{'=' * 70}\n")
294
+ f.write("⚠️ HOST-LEVEL REDIRECT DETECTED\n")
295
+ f.write(f"{'=' * 70}\n")
296
+ f.write(f"Target: {base_url}\n")
297
+ f.write(f"Redirects to: {redirect_host}\n")
298
+ f.write(f"Status: {resp.status_code}\n\n")
299
+ f.write("The server redirects ALL requests to a different host.\n")
300
+ f.write("This causes unreliable results because:\n")
301
+ f.write(" - Response sizes vary based on path length in redirect URL\n")
302
+ f.write(" - Gobuster may report false positives or miss real paths\n\n")
303
+ # Parseable marker for auto-retry
304
+ f.write(f"HOST_REDIRECT_TARGET: {suggested_url}\n\n")
305
+ f.write("Auto-retrying with corrected target...\n")
306
+ f.write(f"{'=' * 70}\n\n")
307
+
308
+ # Still try to exclude the response length for this scan
309
+ content_length = len(resp.content)
310
+ result['exclude_length'] = str(content_length)
311
+ return result
312
+
266
313
  # Any other status for a random UUID = false positive indicator
267
314
  # Common: 403 (blocked), 401 (auth required), 200 (catch-all), 500 (error page)
268
315
  if resp.status_code in [200, 301, 302, 400, 401, 403, 500, 503]:
@@ -334,6 +334,10 @@ class HttpFingerprintPlugin(PluginBase):
334
334
 
335
335
  is_https = parsed.scheme == 'https'
336
336
 
337
+ # Check if target is an IP address (for special handling)
338
+ import re
339
+ is_ip_target = bool(re.match(r'^(\d{1,3}\.){3}\d{1,3}$', parsed.hostname or ''))
340
+
337
341
  # Create request with common browser headers
338
342
  req = urllib.request.Request(
339
343
  url,
@@ -346,14 +350,15 @@ class HttpFingerprintPlugin(PluginBase):
346
350
  }
347
351
  )
348
352
 
353
+ # Always create SSL context with verification disabled
354
+ # This handles: 1) HTTPS targets, 2) HTTP->HTTPS redirects, 3) IP targets with invalid certs
355
+ ctx = ssl.create_default_context()
356
+ ctx.check_hostname = False
357
+ ctx.verify_mode = ssl.CERT_NONE
358
+
349
359
  try:
350
- # Create SSL context for HTTPS
360
+ # Get TLS info for HTTPS targets
351
361
  if is_https:
352
- ctx = ssl.create_default_context()
353
- ctx.check_hostname = False
354
- ctx.verify_mode = ssl.CERT_NONE
355
-
356
- # Get TLS info
357
362
  try:
358
363
  with socket.create_connection((parsed.hostname, parsed.port or 443), timeout=timeout) as sock:
359
364
  with ctx.wrap_socket(sock, server_hostname=parsed.hostname) as ssock:
@@ -368,9 +373,8 @@ class HttpFingerprintPlugin(PluginBase):
368
373
  except Exception:
369
374
  pass # TLS info is optional
370
375
 
371
- response = urllib.request.urlopen(req, timeout=timeout, context=ctx) # nosec B310 - scheme validated above
372
- else:
373
- response = urllib.request.urlopen(req, timeout=timeout) # nosec B310 - scheme validated above
376
+ # Always pass SSL context (handles HTTP->HTTPS redirects)
377
+ response = urllib.request.urlopen(req, timeout=timeout, context=ctx) # nosec B310 - scheme validated above
374
378
 
375
379
  result['status_code'] = response.getcode()
376
380
 
@@ -125,8 +125,12 @@ class EngagementManager:
125
125
  # File contains invalid data, reset to default
126
126
  pass
127
127
 
128
- # Reset to default engagement
129
- default_id = self.create("default", "Default engagement")
128
+ # Reset to default engagement - use existing or create new
129
+ default_eng = self.get("default")
130
+ if default_eng:
131
+ default_id = default_eng['id']
132
+ else:
133
+ default_id = self.create("default", "Default engagement")
130
134
  self.set_current("default")
131
135
  return self.get_by_id(default_id)
132
136
 
@@ -1392,9 +1392,20 @@ def render_active_jobs(width: int, engagement_id: Optional[int] = None):
1392
1392
  if engagement_id is not None and job_eng_id != engagement_id:
1393
1393
  warning = click.style(" [!other]", fg='red')
1394
1394
 
1395
- job_line = f" [{jid:>3}] {tool:<10} {target:<30} {status_str:<18} {elapsed}{warning}"
1395
+ # Check for scope warnings
1396
+ job_warnings = job.get('metadata', {}).get('warnings', [])
1397
+ scope_warning = any('SCOPE' in w for w in job_warnings)
1398
+ scope_indicator = click.style("⚠ ", fg='yellow') if scope_warning else ""
1399
+
1400
+ job_line = f" [{jid:>3}] {scope_indicator}{tool:<10} {target:<30} {status_str:<18} {elapsed}{warning}"
1396
1401
  lines.append(job_line)
1397
1402
 
1403
+ # Show scope warning details on next line if present
1404
+ if scope_warning:
1405
+ for w in job_warnings:
1406
+ if 'SCOPE' in w:
1407
+ lines.append(click.style(f" └─ {w}", fg='yellow'))
1408
+
1398
1409
  return lines
1399
1410
 
1400
1411
 
@@ -3333,14 +3344,14 @@ def _show_dashboard_menu(engagement_id: int) -> str:
3333
3344
  click.echo(click.style(" 📋 DOCUMENTATION", bold=True, fg='yellow'))
3334
3345
  click.echo(" " + "─" * 76)
3335
3346
  click.echo(" " + click.style("[e]", fg='yellow', bold=True) + " or " +
3336
- click.style("[6]", fg='yellow') + " 📦 Evidence & Artifacts - Screenshots, files, exports")
3347
+ click.style("[5]", fg='yellow') + " 📦 Evidence & Artifacts - Screenshots, files, exports")
3337
3348
  click.echo(" " + click.style("[d]", fg='yellow', bold=True) + " or " +
3338
- click.style("[7]", fg='yellow') + " ✅ Deliverables - Progress tracking, checklists")
3349
+ click.style("[6]", fg='yellow') + " ✅ Deliverables - Progress tracking, checklists")
3339
3350
 
3340
3351
  # Reports - Pro feature (show to all with appropriate badge)
3341
3352
  pro_badge_yellow = click.style("💎", fg='yellow') if is_pro_user else click.style("🔒 PRO", fg='yellow')
3342
3353
  click.echo(" " + click.style("[r]", fg='yellow', bold=True) + " or " +
3343
- click.style("[8]", fg='yellow') + " 📄 Reports " +
3354
+ click.style("[7]", fg='yellow') + " 📄 Reports " +
3344
3355
  pro_badge_yellow + " - Generate & export reports")
3345
3356
  click.echo()
3346
3357
 
@@ -3348,30 +3359,30 @@ def _show_dashboard_menu(engagement_id: int) -> str:
3348
3359
  click.echo(click.style(" 📊 DATA MANAGEMENT (Deep Dive)", bold=True, fg='green'))
3349
3360
  click.echo(" " + "─" * 76)
3350
3361
  click.echo(" " + click.style("[h]", fg='cyan', bold=True) + " or " +
3351
- click.style("[9]", fg='cyan') + " 🎯 Hosts - Discovered hosts, tags, filtering")
3362
+ click.style("[8]", fg='cyan') + " 🎯 Hosts - Discovered hosts, tags, filtering")
3352
3363
  click.echo(" " + click.style("[v]", fg='cyan', bold=True) + " or " +
3353
- click.style("[10]", fg='cyan') + " 🔌 Services - Open ports, service enumeration")
3364
+ click.style("[9]", fg='cyan') + " 🔌 Services - Open ports, service enumeration")
3354
3365
  click.echo(" " + click.style("[f]", fg='cyan', bold=True) + " or " +
3355
- click.style("[11]", fg='cyan') + " 🔍 Findings - All vulnerabilities (detailed view)")
3366
+ click.style("[10]", fg='cyan') + " 🔍 Findings - All vulnerabilities (detailed view)")
3356
3367
  click.echo(" " + click.style("[c]", fg='cyan', bold=True) + " or " +
3357
- click.style("[12]", fg='cyan') + " 🔑 Credentials - Discovered users, passwords, hashes")
3368
+ click.style("[11]", fg='cyan') + " 🔑 Credentials - Discovered users, passwords, hashes")
3358
3369
  click.echo()
3359
3370
  click.echo(" " + click.style("[b]", fg='cyan', bold=True) + " or " +
3360
- click.style("[13]", fg='cyan') + " 🌐 Web Paths - Directory enumeration results")
3371
+ click.style("[12]", fg='cyan') + " 🌐 Web Paths - Directory enumeration results")
3361
3372
  click.echo(" " + click.style("[n]", fg='cyan', bold=True) + " or " +
3362
- click.style("[14]", fg='cyan') + " 📁 SMB Shares - SMB enumeration, accessible shares")
3373
+ click.style("[13]", fg='cyan') + " 📁 SMB Shares - SMB enumeration, accessible shares")
3363
3374
  click.echo(" " + click.style("[l]", fg='cyan', bold=True) + " or " +
3364
- click.style("[15]", fg='cyan') + " 💉 SQLMap Intelligence - Deduplicated injections, high-value tables")
3375
+ click.style("[14]", fg='cyan') + " 💉 SQLMap Intelligence - Deduplicated injections, high-value tables")
3365
3376
  click.echo(" " + click.style("[p]", fg='cyan', bold=True) + " or " +
3366
- click.style("[16]", fg='cyan') + " 🔌 WordPress Data - WPScan vulnerabilities")
3377
+ click.style("[15]", fg='cyan') + " 🔌 WordPress Data - WPScan vulnerabilities")
3367
3378
  click.echo(" " + click.style("[o]", fg='cyan', bold=True) + " or " +
3368
- click.style("[17]", fg='cyan') + " 💣 Exploits - SearchSploit exploit database")
3379
+ click.style("[16]", fg='cyan') + " 💣 Exploits - SearchSploit exploit database")
3369
3380
  click.echo(" " + click.style("[t]", fg='cyan', bold=True) + " or " +
3370
- click.style("[18]", fg='cyan') + " 🔍 OSINT/Discovery - DNS, WHOIS, emails, infrastructure")
3381
+ click.style("[17]", fg='cyan') + " 🔍 OSINT/Discovery - DNS, WHOIS, emails, infrastructure")
3371
3382
  click.echo()
3372
3383
 
3373
3384
  click.echo(" " + click.style("[q]", fg='red', bold=True) + " or " +
3374
- click.style("[19]", fg='red') + " ← Return to Command Center")
3385
+ click.style("[18]", fg='red') + " ← Return to Command Center")
3375
3386
  click.echo()
3376
3387
 
3377
3388
  # Footer instructions
@@ -3414,6 +3425,11 @@ def _show_dashboard_menu(engagement_id: int) -> str:
3414
3425
 
3415
3426
  # Intelligence Section (Consolidated - 3 items)
3416
3427
  elif action == 'intelligence_hub':
3428
+ # Pro feature - check tier
3429
+ if not is_pro_user:
3430
+ from souleyez.ui.interactive import _show_upgrade_prompt
3431
+ _show_upgrade_prompt("Intelligence Hub")
3432
+ continue
3417
3433
  # Unified Intelligence Hub (was Attack Correlation)
3418
3434
  from souleyez.ui.attack_surface import view_attack_surface
3419
3435
  view_attack_surface(engagement_id)