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