souleyez 2.43.13__tar.gz → 2.43.15__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.
- {souleyez-2.43.13/souleyez.egg-info → souleyez-2.43.15}/PKG-INFO +1 -1
- {souleyez-2.43.13 → souleyez-2.43.15}/pyproject.toml +1 -1
- souleyez-2.43.15/souleyez/__init__.py +2 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/tool_chaining.py +103 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/README.md +1 -1
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/engine/result_handler.py +21 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/main.py +1 -1
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/gobuster.py +48 -1
- souleyez-2.43.15/souleyez/ui/wordlist_browser.py +481 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/wordlists.py +12 -0
- {souleyez-2.43.13 → souleyez-2.43.15/souleyez.egg-info}/PKG-INFO +1 -1
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez.egg-info/SOURCES.txt +1 -0
- souleyez-2.43.13/souleyez/__init__.py +0 -2
- {souleyez-2.43.13 → souleyez-2.43.15}/LICENSE +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/MANIFEST.in +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/README.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/setup.cfg +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/action_mapper.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/chain_advisor.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/claude_provider.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/context_builder.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/executor.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/feedback_handler.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/llm_factory.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/llm_provider.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/ollama_provider.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/ollama_service.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/path_scorer.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/recommender.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/report_context.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/report_prompts.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/report_service.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/result_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ai/safety.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/assets/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/assets/souleyez-icon.png +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/auth/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/auth/audit.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/auth/engagement_access.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/auth/permissions.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/auth/session_manager.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/auth/user_manager.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/commands/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/commands/audit.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/commands/auth.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/commands/deliverables.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/commands/engagement.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/commands/license.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/commands/screenshots.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/commands/user.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/config.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/credential_tester.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/cve_mappings.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/cve_matcher.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/msf_auto_mapper.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/msf_chain_engine.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/msf_database.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/msf_integration.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/msf_rpc_client.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/msf_rpc_manager.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/msf_sync_manager.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/network_utils.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/parser_handler.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/pending_chains.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/templates.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/version_utils.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/vuln_correlation.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/core/web_utils.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/README.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/active_directory.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/cis_controls_v8.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/cloud_security.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/cmmc_2.0.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/external_network.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/ffiec_cat.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/gdpr_article32.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/glba_safeguards.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/hipaa_security.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/hitrust_csf.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/internal_network.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/iso27001.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/nerc_cip.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/nist_csf.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/owasp_top10_2021.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/pci_dss_4.0.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/ptes_standard.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/red_team.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/soc2_type2.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/templates/webapp_advanced.json +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/README.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/all_users.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/api_endpoints.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/default_credentials.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/macos_users.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/router_passwords.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/router_users.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/soul_pass.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/soul_users.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/subdomains_common.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/top100.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/top20_quick.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/vnc_passwords.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/web_dirs_common.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/web_extensions.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/data/wordlists/web_files_common.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/detection/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/detection/attack_signatures.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/detection/mitre_mappings.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/detection/validator.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/devtools.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/api-reference/cli-commands.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/api-reference/engagement-api.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/api-reference/integration-guide.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/api-reference/parser-formats.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/architecture/decisions/000-template.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/architecture/decisions/001-local-llm-over-cloud.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/architecture/decisions/002-master-password-approach.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/architecture/decisions/003-database-schema-design.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/architecture/overview.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/database/MIGRATIONS.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/database/SCHEMA.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/database/SCHEMA_ERD.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/developer-guide/test_coverage_plan.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/developer-guide/ui-design-system.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/images/README.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/security/best-practices.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/security/credential-encryption.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/security/password-protected-commands.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/security/secure-defaults.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/security/threat-model.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/ai-integration.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/attack-surface.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/auto-chaining.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/configuration.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/deliverables-screenshots.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/dependencies.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/evidence-vault.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/exploit-suggestions.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/getting-started.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/installation.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/metasploit-integration.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/rbac.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/report-generation.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/scope-management.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/siem-integration.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/tools-reference.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/troubleshooting.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/uninstall.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/worker-management.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/docs/user-guide/workflows.md +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/engine/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/engine/background.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/engine/base.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/engine/job_status.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/engine/loader.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/engine/log_sanitizer.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/engine/manager.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/engine/worker_manager.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/export/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/export/evidence_bundle.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/feature_flags/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/feature_flags/features.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/feature_flags.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/history.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/importers/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/importers/msf_importer.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/importers/smart_importer.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/siem/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/siem/base.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/siem/elastic.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/siem/factory.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/siem/googlesecops.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/siem/rule_mappings/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/siem/rule_mappings/wazuh_rules.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/siem/sentinel.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/siem/splunk.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/siem/wazuh.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/wazuh/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/wazuh/client.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/wazuh/config.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/wazuh/host_mapper.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/integrations/wazuh/sync.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/intelligence/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/intelligence/correlation_analyzer.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/intelligence/exploit_knowledge.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/intelligence/exploit_suggestions.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/intelligence/gap_analyzer.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/intelligence/gap_detector.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/intelligence/sensitive_tables.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/intelligence/service_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/intelligence/surface_analyzer.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/intelligence/target_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/licensing/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/licensing/validator.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/log_config.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/migrations/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/migrations/fix_job_counter.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/bloodhound_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/crackmapexec_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/dalfox_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/dnsrecon_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/enum4linux_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/ffuf_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/gobuster_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/hashcat_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/http_fingerprint_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/hydra_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/impacket_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/john_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/msf_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/nikto_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/nmap_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/nuclei_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/responder_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/searchsploit_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/smbmap_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/sqlmap_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/theharvester_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/whois_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/parsers/wpscan_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/afp.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/afp_brute.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/ard.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/bloodhound.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/crackmapexec.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/dalfox.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/dns_hijack.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/dnsrecon.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/enum4linux.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/ffuf.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/firmware_extract.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/hashcat.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/http_fingerprint.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/hydra.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/impacket_getnpusers.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/impacket_psexec.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/impacket_secretsdump.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/impacket_smbclient.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/john.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/macos_ssh.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/mdns.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/msf_auxiliary.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/msf_exploit.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/nikto.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/nmap.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/nuclei.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/plugin_base.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/plugin_template.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/responder.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/router_http_brute.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/router_ssh_brute.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/router_telnet_brute.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/routersploit.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/routersploit_exploit.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/searchsploit.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/smbmap.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/sqlmap.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/theharvester.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/tr069.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/upnp.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/upnp_abuse.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/vnc_access.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/vnc_brute.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/whois.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/plugins/wpscan.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/reporting/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/reporting/attack_chain.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/reporting/charts.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/reporting/compliance_mappings.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/reporting/detection_report.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/reporting/formatters.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/reporting/generator.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/reporting/metrics.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/scanner.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/security/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/security/scope_validator.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/security/validation.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/security.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/credentials.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/crypto.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/database.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/db.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/deliverable_evidence.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/deliverable_exporter.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/deliverable_templates.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/deliverables.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/engagements.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/evidence.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/execution_log.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/exploit_attempts.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/exploits.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/findings.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/hosts.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrate_to_engagements.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_001_add_credential_enhancements.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_002_add_status_tracking.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_003_add_execution_log.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_005_screenshots.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_006_deliverables.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_007_deliverable_templates.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_008_add_nuclei_table.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_009_add_cme_tables.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_010_evidence_linking.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_011_timeline_tracking.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_012_team_collaboration.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_013_add_host_tags.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_014_exploit_attempts.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_015_add_mac_os_fields.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_016_add_domain_field.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_017_msf_sessions.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_018_add_osint_target.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_019_add_engagement_type.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_020_add_rbac.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_021_wazuh_integration.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_022_wazuh_indexer_columns.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_023_fix_detection_results_fk.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_025_multi_siem_support.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_026_add_engagement_scope.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/_027_multi_siem_persistence.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/migrations/migration_manager.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/msf_sessions.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/osint.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/recommendation_engine.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/schema.sql +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/screenshots.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/smb_shares.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/sqlmap_data.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/team_collaboration.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/timeline_tracker.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/wazuh_vulns.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/storage/web_paths.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/testing/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/testing/credential_tester.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/ai_quotes.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/attack_surface.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/chain_rules_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/correlation_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/dashboard.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/deliverables_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/design_system.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/errors.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/evidence_linking_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/evidence_vault.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/exploit_suggestions_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/export_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/gap_analysis_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/help_system.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/intelligence_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/interactive.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/interactive_selector.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/log_formatter.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/menu_components.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/msf_auxiliary_menu.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/pending_chains_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/progress_indicators.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/recommendations_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/rule_builder.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/setup_wizard.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/shortcuts.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/splunk_gap_analysis_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/splunk_vulns_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/team_dashboard.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/template_selector.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/terminal.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/timeline_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/tool_setup.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/tutorial.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/tutorial_state.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui/wazuh_vulns_view.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/ui.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/utils/__init__.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/utils/tool_checker.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez/utils.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez.egg-info/dependency_links.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez.egg-info/entry_points.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez.egg-info/requires.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/souleyez.egg-info/top_level.txt +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_config.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_config_enhanced.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_crypto.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_database_100_final.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_engagements.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_engagements_simple.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_job_status_tracking.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_logging.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_network_utils.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_ollama_service.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_plugin_base.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_recommender.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_result_handler_sqlmap.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_schema.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_scope_integration.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_scope_validator.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_security_hardening.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_security_validation.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_sqlmap_parser.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/tests/test_storage.py +0 -0
- {souleyez-2.43.13 → souleyez-2.43.15}/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.15
|
|
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>
|
|
@@ -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
|
|
@@ -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)}
|
|
@@ -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.15')
|
|
177
177
|
def cli():
|
|
178
178
|
"""SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
|
|
179
179
|
from souleyez.log_config import init_logging
|
|
@@ -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]:
|