souleyez 2.43.8__tar.gz → 2.43.17__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.
Potentially problematic release.
This version of souleyez might be problematic. Click here for more details.
- {souleyez-2.43.8/souleyez.egg-info → souleyez-2.43.17}/PKG-INFO +2 -2
- {souleyez-2.43.8 → souleyez-2.43.17}/README.md +1 -1
- {souleyez-2.43.8 → souleyez-2.43.17}/pyproject.toml +1 -1
- souleyez-2.43.17/souleyez/__init__.py +2 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/tool_chaining.py +103 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/README.md +1 -1
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/engine/background.py +2 -1
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/engine/result_handler.py +27 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/main.py +1 -1
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/dnsrecon_parser.py +5 -3
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/gobuster.py +48 -1
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/http_fingerprint.py +13 -9
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/dashboard.py +21 -16
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/interactive.py +3 -2
- souleyez-2.43.17/souleyez/ui/wordlist_browser.py +481 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/wordlists.py +12 -0
- {souleyez-2.43.8 → souleyez-2.43.17/souleyez.egg-info}/PKG-INFO +2 -2
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez.egg-info/SOURCES.txt +1 -0
- souleyez-2.43.8/souleyez/__init__.py +0 -2
- {souleyez-2.43.8 → souleyez-2.43.17}/LICENSE +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/MANIFEST.in +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/setup.cfg +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/action_mapper.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/chain_advisor.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/claude_provider.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/context_builder.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/executor.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/feedback_handler.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/llm_factory.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/llm_provider.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/ollama_provider.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/ollama_service.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/path_scorer.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/recommender.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/report_context.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/report_prompts.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/report_service.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/result_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ai/safety.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/assets/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/assets/souleyez-icon.png +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/auth/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/auth/audit.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/auth/engagement_access.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/auth/permissions.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/auth/session_manager.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/auth/user_manager.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/commands/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/commands/audit.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/commands/auth.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/commands/deliverables.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/commands/engagement.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/commands/license.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/commands/screenshots.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/commands/user.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/config.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/credential_tester.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/cve_mappings.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/cve_matcher.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/msf_auto_mapper.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/msf_chain_engine.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/msf_database.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/msf_integration.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/msf_rpc_client.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/msf_rpc_manager.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/msf_sync_manager.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/network_utils.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/parser_handler.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/pending_chains.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/templates.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/version_utils.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/vuln_correlation.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/core/web_utils.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/README.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/active_directory.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/cis_controls_v8.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/cloud_security.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/cmmc_2.0.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/external_network.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/ffiec_cat.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/gdpr_article32.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/glba_safeguards.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/hipaa_security.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/hitrust_csf.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/internal_network.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/iso27001.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/nerc_cip.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/nist_csf.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/owasp_top10_2021.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/pci_dss_4.0.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/ptes_standard.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/red_team.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/soc2_type2.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/templates/webapp_advanced.json +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/README.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/all_users.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/api_endpoints.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/default_credentials.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/macos_users.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/router_passwords.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/router_users.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/soul_pass.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/soul_users.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/subdomains_common.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/top100.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/top20_quick.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/vnc_passwords.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/web_dirs_common.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/web_extensions.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/data/wordlists/web_files_common.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/detection/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/detection/attack_signatures.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/detection/mitre_mappings.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/detection/validator.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/devtools.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/api-reference/cli-commands.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/api-reference/engagement-api.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/api-reference/integration-guide.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/api-reference/parser-formats.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/architecture/decisions/000-template.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/architecture/decisions/001-local-llm-over-cloud.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/architecture/decisions/002-master-password-approach.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/architecture/decisions/003-database-schema-design.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/architecture/overview.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/database/MIGRATIONS.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/database/SCHEMA.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/database/SCHEMA_ERD.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/developer-guide/test_coverage_plan.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/developer-guide/ui-design-system.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/images/README.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/security/best-practices.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/security/credential-encryption.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/security/password-protected-commands.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/security/secure-defaults.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/security/threat-model.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/ai-integration.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/attack-surface.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/auto-chaining.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/configuration.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/deliverables-screenshots.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/dependencies.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/evidence-vault.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/exploit-suggestions.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/getting-started.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/installation.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/metasploit-integration.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/rbac.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/report-generation.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/scope-management.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/siem-integration.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/tools-reference.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/troubleshooting.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/uninstall.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/worker-management.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/docs/user-guide/workflows.md +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/engine/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/engine/base.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/engine/job_status.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/engine/loader.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/engine/log_sanitizer.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/engine/manager.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/engine/worker_manager.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/export/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/export/evidence_bundle.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/feature_flags/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/feature_flags/features.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/feature_flags.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/history.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/importers/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/importers/msf_importer.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/importers/smart_importer.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/siem/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/siem/base.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/siem/elastic.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/siem/factory.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/siem/googlesecops.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/siem/rule_mappings/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/siem/rule_mappings/wazuh_rules.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/siem/sentinel.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/siem/splunk.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/siem/wazuh.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/wazuh/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/wazuh/client.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/wazuh/config.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/wazuh/host_mapper.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/integrations/wazuh/sync.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/intelligence/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/intelligence/correlation_analyzer.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/intelligence/exploit_knowledge.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/intelligence/exploit_suggestions.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/intelligence/gap_analyzer.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/intelligence/gap_detector.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/intelligence/sensitive_tables.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/intelligence/service_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/intelligence/surface_analyzer.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/intelligence/target_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/licensing/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/licensing/validator.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/log_config.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/migrations/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/migrations/fix_job_counter.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/bloodhound_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/crackmapexec_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/dalfox_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/enum4linux_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/ffuf_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/gobuster_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/hashcat_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/http_fingerprint_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/hydra_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/impacket_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/john_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/msf_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/nikto_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/nmap_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/nuclei_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/responder_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/searchsploit_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/smbmap_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/sqlmap_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/theharvester_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/whois_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/parsers/wpscan_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/afp.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/afp_brute.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/ard.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/bloodhound.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/crackmapexec.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/dalfox.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/dns_hijack.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/dnsrecon.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/enum4linux.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/ffuf.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/firmware_extract.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/hashcat.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/hydra.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/impacket_getnpusers.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/impacket_psexec.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/impacket_secretsdump.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/impacket_smbclient.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/john.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/macos_ssh.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/mdns.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/msf_auxiliary.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/msf_exploit.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/nikto.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/nmap.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/nuclei.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/plugin_base.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/plugin_template.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/responder.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/router_http_brute.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/router_ssh_brute.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/router_telnet_brute.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/routersploit.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/routersploit_exploit.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/searchsploit.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/smbmap.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/sqlmap.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/theharvester.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/tr069.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/upnp.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/upnp_abuse.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/vnc_access.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/vnc_brute.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/whois.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/plugins/wpscan.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/reporting/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/reporting/attack_chain.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/reporting/charts.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/reporting/compliance_mappings.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/reporting/detection_report.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/reporting/formatters.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/reporting/generator.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/reporting/metrics.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/scanner.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/security/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/security/scope_validator.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/security/validation.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/security.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/credentials.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/crypto.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/database.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/db.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/deliverable_evidence.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/deliverable_exporter.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/deliverable_templates.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/deliverables.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/engagements.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/evidence.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/execution_log.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/exploit_attempts.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/exploits.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/findings.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/hosts.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrate_to_engagements.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_001_add_credential_enhancements.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_002_add_status_tracking.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_003_add_execution_log.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_005_screenshots.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_006_deliverables.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_007_deliverable_templates.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_008_add_nuclei_table.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_009_add_cme_tables.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_010_evidence_linking.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_011_timeline_tracking.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_012_team_collaboration.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_013_add_host_tags.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_014_exploit_attempts.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_015_add_mac_os_fields.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_016_add_domain_field.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_017_msf_sessions.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_018_add_osint_target.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_019_add_engagement_type.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_020_add_rbac.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_021_wazuh_integration.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_022_wazuh_indexer_columns.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_023_fix_detection_results_fk.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_025_multi_siem_support.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_026_add_engagement_scope.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/_027_multi_siem_persistence.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/migrations/migration_manager.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/msf_sessions.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/osint.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/recommendation_engine.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/schema.sql +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/screenshots.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/smb_shares.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/sqlmap_data.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/team_collaboration.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/timeline_tracker.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/wazuh_vulns.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/storage/web_paths.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/testing/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/testing/credential_tester.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/ai_quotes.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/attack_surface.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/chain_rules_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/correlation_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/deliverables_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/design_system.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/errors.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/evidence_linking_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/evidence_vault.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/exploit_suggestions_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/export_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/gap_analysis_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/help_system.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/intelligence_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/interactive_selector.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/log_formatter.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/menu_components.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/msf_auxiliary_menu.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/pending_chains_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/progress_indicators.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/recommendations_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/rule_builder.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/setup_wizard.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/shortcuts.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/splunk_gap_analysis_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/splunk_vulns_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/team_dashboard.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/template_selector.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/terminal.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/timeline_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/tool_setup.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/tutorial.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/tutorial_state.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui/wazuh_vulns_view.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/ui.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/utils/__init__.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/utils/tool_checker.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez/utils.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez.egg-info/dependency_links.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez.egg-info/entry_points.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez.egg-info/requires.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/souleyez.egg-info/top_level.txt +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_config.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_config_enhanced.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_crypto.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_database_100_final.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_engagements.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_engagements_simple.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_job_status_tracking.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_logging.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_network_utils.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_ollama_service.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_plugin_base.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_recommender.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_result_handler_sqlmap.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_schema.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_scope_integration.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_scope_validator.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_security_hardening.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_security_validation.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_sqlmap_parser.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/tests/test_storage.py +0 -0
- {souleyez-2.43.8 → souleyez-2.43.17}/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.
|
|
3
|
+
Version: 2.43.17
|
|
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>
|
|
@@ -266,4 +266,4 @@ See [LICENSE](LICENSE) for details.
|
|
|
266
266
|
|
|
267
267
|
---
|
|
268
268
|
|
|
269
|
-
**Version**: 2.43.
|
|
269
|
+
**Version**: 2.43.17 | **Maintainer**: [CyberSoul Security](https://www.cybersoulsecurity.com)
|
|
@@ -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
|
|
@@ -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
|
-
|
|
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
|
|
|
@@ -173,7 +173,7 @@ def _check_privileged_tools():
|
|
|
173
173
|
|
|
174
174
|
|
|
175
175
|
@click.group()
|
|
176
|
-
@click.version_option(version='2.43.
|
|
176
|
+
@click.version_option(version='2.43.17')
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
372
|
-
|
|
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
|
|
|
@@ -3344,14 +3344,14 @@ def _show_dashboard_menu(engagement_id: int) -> str:
|
|
|
3344
3344
|
click.echo(click.style(" 📋 DOCUMENTATION", bold=True, fg='yellow'))
|
|
3345
3345
|
click.echo(" " + "─" * 76)
|
|
3346
3346
|
click.echo(" " + click.style("[e]", fg='yellow', bold=True) + " or " +
|
|
3347
|
-
click.style("[
|
|
3347
|
+
click.style("[5]", fg='yellow') + " 📦 Evidence & Artifacts - Screenshots, files, exports")
|
|
3348
3348
|
click.echo(" " + click.style("[d]", fg='yellow', bold=True) + " or " +
|
|
3349
|
-
click.style("[
|
|
3349
|
+
click.style("[6]", fg='yellow') + " ✅ Deliverables - Progress tracking, checklists")
|
|
3350
3350
|
|
|
3351
3351
|
# Reports - Pro feature (show to all with appropriate badge)
|
|
3352
3352
|
pro_badge_yellow = click.style("💎", fg='yellow') if is_pro_user else click.style("🔒 PRO", fg='yellow')
|
|
3353
3353
|
click.echo(" " + click.style("[r]", fg='yellow', bold=True) + " or " +
|
|
3354
|
-
click.style("[
|
|
3354
|
+
click.style("[7]", fg='yellow') + " 📄 Reports " +
|
|
3355
3355
|
pro_badge_yellow + " - Generate & export reports")
|
|
3356
3356
|
click.echo()
|
|
3357
3357
|
|
|
@@ -3359,30 +3359,30 @@ def _show_dashboard_menu(engagement_id: int) -> str:
|
|
|
3359
3359
|
click.echo(click.style(" 📊 DATA MANAGEMENT (Deep Dive)", bold=True, fg='green'))
|
|
3360
3360
|
click.echo(" " + "─" * 76)
|
|
3361
3361
|
click.echo(" " + click.style("[h]", fg='cyan', bold=True) + " or " +
|
|
3362
|
-
click.style("[
|
|
3363
|
-
click.echo(" " + click.style("[
|
|
3364
|
-
click.style("[
|
|
3362
|
+
click.style("[8]", fg='cyan') + " 🎯 Hosts - Discovered hosts, tags, filtering")
|
|
3363
|
+
click.echo(" " + click.style("[s]", fg='cyan', bold=True) + " or " +
|
|
3364
|
+
click.style("[9]", fg='cyan') + " 🔌 Services - Open ports, service enumeration")
|
|
3365
3365
|
click.echo(" " + click.style("[f]", fg='cyan', bold=True) + " or " +
|
|
3366
|
-
click.style("[
|
|
3366
|
+
click.style("[10]", fg='cyan') + " 🔍 Findings - All vulnerabilities (detailed view)")
|
|
3367
3367
|
click.echo(" " + click.style("[c]", fg='cyan', bold=True) + " or " +
|
|
3368
|
-
click.style("[
|
|
3368
|
+
click.style("[11]", fg='cyan') + " 🔑 Credentials - Discovered users, passwords, hashes")
|
|
3369
3369
|
click.echo()
|
|
3370
3370
|
click.echo(" " + click.style("[b]", fg='cyan', bold=True) + " or " +
|
|
3371
|
-
click.style("[
|
|
3371
|
+
click.style("[12]", fg='cyan') + " 🌐 Web Paths - Directory enumeration results")
|
|
3372
3372
|
click.echo(" " + click.style("[n]", fg='cyan', bold=True) + " or " +
|
|
3373
|
-
click.style("[
|
|
3373
|
+
click.style("[13]", fg='cyan') + " 📁 SMB Shares - SMB enumeration, accessible shares")
|
|
3374
3374
|
click.echo(" " + click.style("[l]", fg='cyan', bold=True) + " or " +
|
|
3375
|
-
click.style("[
|
|
3375
|
+
click.style("[14]", fg='cyan') + " 💉 SQLMap Intelligence - Deduplicated injections, high-value tables")
|
|
3376
3376
|
click.echo(" " + click.style("[p]", fg='cyan', bold=True) + " or " +
|
|
3377
|
-
click.style("[
|
|
3377
|
+
click.style("[15]", fg='cyan') + " 🔌 WordPress Data - WPScan vulnerabilities")
|
|
3378
3378
|
click.echo(" " + click.style("[o]", fg='cyan', bold=True) + " or " +
|
|
3379
|
-
click.style("[
|
|
3379
|
+
click.style("[16]", fg='cyan') + " 💣 Exploits - SearchSploit exploit database")
|
|
3380
3380
|
click.echo(" " + click.style("[t]", fg='cyan', bold=True) + " or " +
|
|
3381
|
-
click.style("[
|
|
3381
|
+
click.style("[17]", fg='cyan') + " 🔍 OSINT/Discovery - DNS, WHOIS, emails, infrastructure")
|
|
3382
3382
|
click.echo()
|
|
3383
3383
|
|
|
3384
3384
|
click.echo(" " + click.style("[q]", fg='red', bold=True) + " or " +
|
|
3385
|
-
click.style("[
|
|
3385
|
+
click.style("[18]", fg='red') + " ← Return to Command Center")
|
|
3386
3386
|
click.echo()
|
|
3387
3387
|
|
|
3388
3388
|
# Footer instructions
|
|
@@ -3405,7 +3405,7 @@ def _show_dashboard_menu(engagement_id: int) -> str:
|
|
|
3405
3405
|
'r': 'reports', '7': 'reports',
|
|
3406
3406
|
# Data Management (10 items: 8-17)
|
|
3407
3407
|
'h': 'hosts', '8': 'hosts',
|
|
3408
|
-
'
|
|
3408
|
+
's': 'services', '9': 'services',
|
|
3409
3409
|
'f': 'findings', '10': 'findings',
|
|
3410
3410
|
'c': 'credentials', '11': 'credentials',
|
|
3411
3411
|
'b': 'web_paths', '12': 'web_paths',
|
|
@@ -3425,6 +3425,11 @@ def _show_dashboard_menu(engagement_id: int) -> str:
|
|
|
3425
3425
|
|
|
3426
3426
|
# Intelligence Section (Consolidated - 3 items)
|
|
3427
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
|
|
3428
3433
|
# Unified Intelligence Hub (was Attack Correlation)
|
|
3429
3434
|
from souleyez.ui.attack_surface import view_attack_surface
|
|
3430
3435
|
view_attack_surface(engagement_id)
|
|
@@ -200,10 +200,11 @@ def _show_upgrade_prompt(feature_name: str):
|
|
|
200
200
|
f"Unlock all Pro features:\n"
|
|
201
201
|
f" • Intelligence Hub - Exploit suggestions & attack surface\n"
|
|
202
202
|
f" • Auto-Chaining - Automatic follow-up scans\n"
|
|
203
|
-
f" • AI
|
|
203
|
+
f" • AI Settings - Configure Ollama, Claude API providers\n"
|
|
204
|
+
f" • SIEM Integration - Wazuh, Splunk, Elastic, Sentinel\n"
|
|
204
205
|
f" • MSF Integration - Metasploit attack chains\n"
|
|
205
206
|
f" • Reports & Export - Professional deliverables\n"
|
|
206
|
-
f" • Team Dashboard - Collaboration &
|
|
207
|
+
f" • Team Dashboard - Collaboration & task assignment\n\n"
|
|
207
208
|
f"[cyan]Visit: https://www.cybersoulsecurity.com/souleyez[/cyan]",
|
|
208
209
|
title="🔒 Upgrade Required",
|
|
209
210
|
border_style="yellow"
|