souleyez 2.43.26__py3-none-any.whl → 2.43.34__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 -2
- souleyez/ai/__init__.py +21 -15
- souleyez/ai/action_mapper.py +249 -150
- souleyez/ai/chain_advisor.py +116 -100
- souleyez/ai/claude_provider.py +29 -28
- souleyez/ai/context_builder.py +80 -62
- souleyez/ai/executor.py +158 -117
- souleyez/ai/feedback_handler.py +136 -121
- souleyez/ai/llm_factory.py +27 -20
- souleyez/ai/llm_provider.py +4 -2
- souleyez/ai/ollama_provider.py +6 -9
- souleyez/ai/ollama_service.py +44 -37
- souleyez/ai/path_scorer.py +91 -76
- souleyez/ai/recommender.py +176 -144
- souleyez/ai/report_context.py +74 -73
- souleyez/ai/report_service.py +84 -66
- souleyez/ai/result_parser.py +222 -229
- souleyez/ai/safety.py +67 -44
- souleyez/auth/__init__.py +23 -22
- souleyez/auth/audit.py +36 -26
- souleyez/auth/engagement_access.py +65 -48
- souleyez/auth/permissions.py +14 -3
- souleyez/auth/session_manager.py +54 -37
- souleyez/auth/user_manager.py +109 -64
- souleyez/commands/audit.py +40 -43
- souleyez/commands/auth.py +35 -15
- souleyez/commands/deliverables.py +55 -50
- souleyez/commands/engagement.py +47 -28
- souleyez/commands/license.py +32 -23
- souleyez/commands/screenshots.py +36 -32
- souleyez/commands/user.py +82 -36
- souleyez/config.py +52 -44
- souleyez/core/credential_tester.py +87 -81
- souleyez/core/cve_mappings.py +179 -192
- souleyez/core/cve_matcher.py +162 -148
- souleyez/core/msf_auto_mapper.py +100 -83
- souleyez/core/msf_chain_engine.py +294 -256
- souleyez/core/msf_database.py +153 -70
- souleyez/core/msf_integration.py +679 -673
- souleyez/core/msf_rpc_client.py +40 -42
- souleyez/core/msf_rpc_manager.py +77 -79
- souleyez/core/msf_sync_manager.py +241 -181
- souleyez/core/network_utils.py +22 -15
- souleyez/core/parser_handler.py +34 -25
- souleyez/core/pending_chains.py +114 -63
- souleyez/core/templates.py +158 -107
- souleyez/core/tool_chaining.py +9526 -2879
- souleyez/core/version_utils.py +79 -94
- souleyez/core/vuln_correlation.py +136 -89
- souleyez/core/web_utils.py +33 -32
- souleyez/data/wordlists/ad_users.txt +378 -0
- souleyez/data/wordlists/api_endpoints_large.txt +769 -0
- souleyez/data/wordlists/home_dir_sensitive.txt +39 -0
- souleyez/data/wordlists/lfi_payloads.txt +82 -0
- souleyez/data/wordlists/passwords_brute.txt +1548 -0
- souleyez/data/wordlists/passwords_crack.txt +2479 -0
- souleyez/data/wordlists/passwords_spray.txt +386 -0
- souleyez/data/wordlists/subdomains_large.txt +5057 -0
- souleyez/data/wordlists/usernames_common.txt +694 -0
- souleyez/data/wordlists/web_dirs_large.txt +4769 -0
- souleyez/detection/__init__.py +1 -1
- souleyez/detection/attack_signatures.py +12 -17
- souleyez/detection/mitre_mappings.py +61 -55
- souleyez/detection/validator.py +97 -86
- souleyez/devtools.py +23 -10
- souleyez/docs/README.md +4 -4
- souleyez/docs/api-reference/cli-commands.md +2 -2
- souleyez/docs/developer-guide/adding-new-tools.md +562 -0
- souleyez/docs/user-guide/auto-chaining.md +30 -8
- souleyez/docs/user-guide/getting-started.md +1 -1
- souleyez/docs/user-guide/installation.md +26 -3
- souleyez/docs/user-guide/metasploit-integration.md +2 -2
- souleyez/docs/user-guide/rbac.md +1 -1
- souleyez/docs/user-guide/scope-management.md +1 -1
- souleyez/docs/user-guide/siem-integration.md +1 -1
- souleyez/docs/user-guide/tools-reference.md +1 -8
- souleyez/docs/user-guide/worker-management.md +1 -1
- souleyez/engine/background.py +1239 -535
- souleyez/engine/base.py +4 -1
- souleyez/engine/job_status.py +17 -49
- souleyez/engine/log_sanitizer.py +103 -77
- souleyez/engine/manager.py +38 -7
- souleyez/engine/result_handler.py +2200 -1550
- souleyez/engine/worker_manager.py +50 -41
- souleyez/export/evidence_bundle.py +72 -62
- souleyez/feature_flags/features.py +16 -20
- souleyez/feature_flags.py +5 -9
- souleyez/handlers/__init__.py +11 -0
- souleyez/handlers/base.py +188 -0
- souleyez/handlers/bash_handler.py +277 -0
- souleyez/handlers/bloodhound_handler.py +243 -0
- souleyez/handlers/certipy_handler.py +311 -0
- souleyez/handlers/crackmapexec_handler.py +486 -0
- souleyez/handlers/dnsrecon_handler.py +344 -0
- souleyez/handlers/enum4linux_handler.py +400 -0
- souleyez/handlers/evil_winrm_handler.py +493 -0
- souleyez/handlers/ffuf_handler.py +815 -0
- souleyez/handlers/gobuster_handler.py +1114 -0
- souleyez/handlers/gpp_extract_handler.py +334 -0
- souleyez/handlers/hashcat_handler.py +444 -0
- souleyez/handlers/hydra_handler.py +563 -0
- souleyez/handlers/impacket_getuserspns_handler.py +343 -0
- souleyez/handlers/impacket_psexec_handler.py +222 -0
- souleyez/handlers/impacket_secretsdump_handler.py +426 -0
- souleyez/handlers/john_handler.py +286 -0
- souleyez/handlers/katana_handler.py +425 -0
- souleyez/handlers/kerbrute_handler.py +298 -0
- souleyez/handlers/ldapsearch_handler.py +636 -0
- souleyez/handlers/lfi_extract_handler.py +464 -0
- souleyez/handlers/msf_auxiliary_handler.py +408 -0
- souleyez/handlers/msf_exploit_handler.py +380 -0
- souleyez/handlers/nikto_handler.py +413 -0
- souleyez/handlers/nmap_handler.py +821 -0
- souleyez/handlers/nuclei_handler.py +359 -0
- souleyez/handlers/nxc_handler.py +371 -0
- souleyez/handlers/rdp_sec_check_handler.py +353 -0
- souleyez/handlers/registry.py +292 -0
- souleyez/handlers/responder_handler.py +232 -0
- souleyez/handlers/service_explorer_handler.py +434 -0
- souleyez/handlers/smbclient_handler.py +344 -0
- souleyez/handlers/smbmap_handler.py +510 -0
- souleyez/handlers/smbpasswd_handler.py +296 -0
- souleyez/handlers/sqlmap_handler.py +1116 -0
- souleyez/handlers/theharvester_handler.py +601 -0
- souleyez/handlers/web_login_test_handler.py +327 -0
- souleyez/handlers/whois_handler.py +277 -0
- souleyez/handlers/wpscan_handler.py +554 -0
- souleyez/history.py +32 -16
- souleyez/importers/msf_importer.py +106 -75
- souleyez/importers/smart_importer.py +208 -147
- souleyez/integrations/siem/__init__.py +10 -10
- souleyez/integrations/siem/base.py +17 -18
- souleyez/integrations/siem/elastic.py +108 -122
- souleyez/integrations/siem/factory.py +207 -80
- souleyez/integrations/siem/googlesecops.py +146 -154
- souleyez/integrations/siem/rule_mappings/__init__.py +1 -1
- souleyez/integrations/siem/rule_mappings/wazuh_rules.py +8 -5
- souleyez/integrations/siem/sentinel.py +107 -109
- souleyez/integrations/siem/splunk.py +246 -212
- souleyez/integrations/siem/wazuh.py +65 -71
- souleyez/integrations/wazuh/__init__.py +5 -5
- souleyez/integrations/wazuh/client.py +70 -93
- souleyez/integrations/wazuh/config.py +85 -57
- souleyez/integrations/wazuh/host_mapper.py +28 -36
- souleyez/integrations/wazuh/sync.py +78 -68
- souleyez/intelligence/__init__.py +4 -5
- souleyez/intelligence/correlation_analyzer.py +309 -295
- souleyez/intelligence/exploit_knowledge.py +661 -623
- souleyez/intelligence/exploit_suggestions.py +159 -139
- souleyez/intelligence/gap_analyzer.py +132 -97
- souleyez/intelligence/gap_detector.py +251 -214
- souleyez/intelligence/sensitive_tables.py +266 -129
- souleyez/intelligence/service_parser.py +137 -123
- souleyez/intelligence/surface_analyzer.py +407 -268
- souleyez/intelligence/target_parser.py +159 -162
- souleyez/licensing/__init__.py +6 -6
- souleyez/licensing/validator.py +17 -19
- souleyez/log_config.py +79 -54
- souleyez/main.py +1505 -687
- souleyez/migrations/fix_job_counter.py +16 -14
- souleyez/parsers/bloodhound_parser.py +41 -39
- souleyez/parsers/crackmapexec_parser.py +178 -111
- souleyez/parsers/dalfox_parser.py +72 -77
- souleyez/parsers/dnsrecon_parser.py +103 -91
- souleyez/parsers/enum4linux_parser.py +183 -153
- souleyez/parsers/ffuf_parser.py +29 -25
- souleyez/parsers/gobuster_parser.py +301 -41
- souleyez/parsers/hashcat_parser.py +324 -79
- souleyez/parsers/http_fingerprint_parser.py +350 -103
- souleyez/parsers/hydra_parser.py +131 -111
- souleyez/parsers/impacket_parser.py +231 -178
- souleyez/parsers/john_parser.py +98 -86
- souleyez/parsers/katana_parser.py +316 -0
- souleyez/parsers/msf_parser.py +943 -498
- souleyez/parsers/nikto_parser.py +346 -65
- souleyez/parsers/nmap_parser.py +262 -174
- souleyez/parsers/nuclei_parser.py +40 -44
- souleyez/parsers/responder_parser.py +26 -26
- souleyez/parsers/searchsploit_parser.py +74 -74
- souleyez/parsers/service_explorer_parser.py +279 -0
- souleyez/parsers/smbmap_parser.py +180 -124
- souleyez/parsers/sqlmap_parser.py +434 -308
- souleyez/parsers/theharvester_parser.py +75 -57
- souleyez/parsers/whois_parser.py +135 -94
- souleyez/parsers/wpscan_parser.py +278 -190
- souleyez/plugins/afp.py +44 -36
- souleyez/plugins/afp_brute.py +114 -46
- souleyez/plugins/ard.py +48 -37
- souleyez/plugins/bloodhound.py +95 -61
- souleyez/plugins/certipy.py +303 -0
- souleyez/plugins/crackmapexec.py +186 -85
- souleyez/plugins/dalfox.py +120 -59
- souleyez/plugins/dns_hijack.py +146 -41
- souleyez/plugins/dnsrecon.py +97 -61
- souleyez/plugins/enum4linux.py +91 -66
- souleyez/plugins/evil_winrm.py +291 -0
- souleyez/plugins/ffuf.py +166 -90
- souleyez/plugins/firmware_extract.py +133 -29
- souleyez/plugins/gobuster.py +387 -190
- souleyez/plugins/gpp_extract.py +393 -0
- souleyez/plugins/hashcat.py +100 -73
- souleyez/plugins/http_fingerprint.py +854 -267
- souleyez/plugins/hydra.py +566 -200
- souleyez/plugins/impacket_getnpusers.py +117 -69
- souleyez/plugins/impacket_psexec.py +84 -64
- souleyez/plugins/impacket_secretsdump.py +103 -69
- souleyez/plugins/impacket_smbclient.py +89 -75
- souleyez/plugins/john.py +86 -69
- souleyez/plugins/katana.py +313 -0
- souleyez/plugins/kerbrute.py +237 -0
- souleyez/plugins/lfi_extract.py +541 -0
- souleyez/plugins/macos_ssh.py +117 -48
- souleyez/plugins/mdns.py +35 -30
- souleyez/plugins/msf_auxiliary.py +253 -130
- souleyez/plugins/msf_exploit.py +239 -161
- souleyez/plugins/nikto.py +134 -78
- souleyez/plugins/nmap.py +275 -91
- souleyez/plugins/nuclei.py +180 -89
- souleyez/plugins/nxc.py +285 -0
- souleyez/plugins/plugin_base.py +35 -36
- souleyez/plugins/plugin_template.py +13 -5
- souleyez/plugins/rdp_sec_check.py +130 -0
- souleyez/plugins/responder.py +112 -71
- souleyez/plugins/router_http_brute.py +76 -65
- souleyez/plugins/router_ssh_brute.py +118 -41
- souleyez/plugins/router_telnet_brute.py +124 -42
- souleyez/plugins/routersploit.py +91 -59
- souleyez/plugins/routersploit_exploit.py +77 -55
- souleyez/plugins/searchsploit.py +91 -77
- souleyez/plugins/service_explorer.py +1160 -0
- souleyez/plugins/smbmap.py +122 -72
- souleyez/plugins/smbpasswd.py +215 -0
- souleyez/plugins/sqlmap.py +301 -113
- souleyez/plugins/theharvester.py +127 -75
- souleyez/plugins/tr069.py +79 -57
- souleyez/plugins/upnp.py +65 -47
- souleyez/plugins/upnp_abuse.py +73 -55
- souleyez/plugins/vnc_access.py +129 -42
- souleyez/plugins/vnc_brute.py +109 -38
- souleyez/plugins/web_login_test.py +417 -0
- souleyez/plugins/whois.py +77 -58
- souleyez/plugins/wpscan.py +173 -69
- souleyez/reporting/__init__.py +2 -1
- souleyez/reporting/attack_chain.py +411 -346
- souleyez/reporting/charts.py +436 -501
- souleyez/reporting/compliance_mappings.py +334 -201
- souleyez/reporting/detection_report.py +126 -125
- souleyez/reporting/formatters.py +828 -591
- souleyez/reporting/generator.py +386 -302
- souleyez/reporting/metrics.py +72 -75
- souleyez/scanner.py +35 -29
- souleyez/security/__init__.py +37 -11
- souleyez/security/scope_validator.py +175 -106
- souleyez/security/validation.py +223 -149
- souleyez/security.py +22 -6
- souleyez/storage/credentials.py +247 -186
- souleyez/storage/crypto.py +296 -129
- souleyez/storage/database.py +73 -50
- souleyez/storage/db.py +58 -36
- souleyez/storage/deliverable_evidence.py +177 -128
- souleyez/storage/deliverable_exporter.py +282 -246
- souleyez/storage/deliverable_templates.py +134 -116
- souleyez/storage/deliverables.py +135 -130
- souleyez/storage/engagements.py +109 -56
- souleyez/storage/evidence.py +181 -152
- souleyez/storage/execution_log.py +31 -17
- souleyez/storage/exploit_attempts.py +93 -57
- souleyez/storage/exploits.py +67 -36
- souleyez/storage/findings.py +48 -61
- souleyez/storage/hosts.py +176 -144
- souleyez/storage/migrate_to_engagements.py +43 -19
- souleyez/storage/migrations/_001_add_credential_enhancements.py +22 -12
- souleyez/storage/migrations/_002_add_status_tracking.py +10 -7
- souleyez/storage/migrations/_003_add_execution_log.py +14 -8
- souleyez/storage/migrations/_005_screenshots.py +13 -5
- souleyez/storage/migrations/_006_deliverables.py +13 -5
- souleyez/storage/migrations/_007_deliverable_templates.py +12 -7
- souleyez/storage/migrations/_008_add_nuclei_table.py +10 -4
- souleyez/storage/migrations/_010_evidence_linking.py +17 -10
- souleyez/storage/migrations/_011_timeline_tracking.py +20 -13
- souleyez/storage/migrations/_012_team_collaboration.py +34 -21
- souleyez/storage/migrations/_013_add_host_tags.py +12 -6
- souleyez/storage/migrations/_014_exploit_attempts.py +22 -10
- souleyez/storage/migrations/_015_add_mac_os_fields.py +15 -7
- souleyez/storage/migrations/_016_add_domain_field.py +10 -4
- souleyez/storage/migrations/_017_msf_sessions.py +16 -8
- souleyez/storage/migrations/_018_add_osint_target.py +10 -6
- souleyez/storage/migrations/_019_add_engagement_type.py +10 -6
- souleyez/storage/migrations/_020_add_rbac.py +36 -15
- souleyez/storage/migrations/_021_wazuh_integration.py +20 -8
- souleyez/storage/migrations/_022_wazuh_indexer_columns.py +6 -4
- souleyez/storage/migrations/_023_fix_detection_results_fk.py +16 -6
- souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +26 -10
- souleyez/storage/migrations/_025_multi_siem_support.py +3 -5
- souleyez/storage/migrations/_026_add_engagement_scope.py +31 -12
- souleyez/storage/migrations/_027_multi_siem_persistence.py +32 -15
- souleyez/storage/migrations/__init__.py +26 -26
- souleyez/storage/migrations/migration_manager.py +19 -19
- souleyez/storage/msf_sessions.py +100 -65
- souleyez/storage/osint.py +17 -24
- souleyez/storage/recommendation_engine.py +269 -235
- souleyez/storage/screenshots.py +33 -32
- souleyez/storage/smb_shares.py +136 -92
- souleyez/storage/sqlmap_data.py +183 -128
- souleyez/storage/team_collaboration.py +135 -141
- souleyez/storage/timeline_tracker.py +122 -94
- souleyez/storage/wazuh_vulns.py +64 -66
- souleyez/storage/web_paths.py +33 -37
- souleyez/testing/credential_tester.py +221 -205
- souleyez/ui/__init__.py +1 -1
- souleyez/ui/ai_quotes.py +12 -12
- souleyez/ui/attack_surface.py +2439 -1516
- souleyez/ui/chain_rules_view.py +914 -382
- souleyez/ui/correlation_view.py +312 -230
- souleyez/ui/dashboard.py +2382 -1130
- souleyez/ui/deliverables_view.py +148 -62
- souleyez/ui/design_system.py +13 -13
- souleyez/ui/errors.py +49 -49
- souleyez/ui/evidence_linking_view.py +284 -179
- souleyez/ui/evidence_vault.py +393 -285
- souleyez/ui/exploit_suggestions_view.py +555 -349
- souleyez/ui/export_view.py +100 -66
- souleyez/ui/gap_analysis_view.py +315 -171
- souleyez/ui/help_system.py +105 -97
- souleyez/ui/intelligence_view.py +436 -293
- souleyez/ui/interactive.py +23434 -10286
- souleyez/ui/interactive_selector.py +75 -68
- souleyez/ui/log_formatter.py +47 -39
- souleyez/ui/menu_components.py +22 -13
- souleyez/ui/msf_auxiliary_menu.py +184 -133
- souleyez/ui/pending_chains_view.py +336 -172
- souleyez/ui/progress_indicators.py +5 -3
- souleyez/ui/recommendations_view.py +195 -137
- souleyez/ui/rule_builder.py +343 -225
- souleyez/ui/setup_wizard.py +678 -284
- souleyez/ui/shortcuts.py +217 -165
- souleyez/ui/splunk_gap_analysis_view.py +452 -270
- souleyez/ui/splunk_vulns_view.py +139 -86
- souleyez/ui/team_dashboard.py +498 -335
- souleyez/ui/template_selector.py +196 -105
- souleyez/ui/terminal.py +6 -6
- souleyez/ui/timeline_view.py +198 -127
- souleyez/ui/tool_setup.py +264 -164
- souleyez/ui/tutorial.py +202 -72
- souleyez/ui/tutorial_state.py +40 -40
- souleyez/ui/wazuh_vulns_view.py +235 -141
- souleyez/ui/wordlist_browser.py +260 -107
- souleyez/ui.py +464 -312
- souleyez/utils/tool_checker.py +427 -367
- souleyez/utils.py +33 -29
- souleyez/wordlists.py +134 -167
- {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/METADATA +1 -1
- souleyez-2.43.34.dist-info/RECORD +443 -0
- {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/WHEEL +1 -1
- souleyez-2.43.26.dist-info/RECORD +0 -379
- {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/entry_points.txt +0 -0
- {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/licenses/LICENSE +0 -0
- {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/top_level.txt +0 -0
souleyez/storage/findings.py
CHANGED
|
@@ -17,14 +17,14 @@ class FindingsManager:
|
|
|
17
17
|
engagement_id: int,
|
|
18
18
|
title: str,
|
|
19
19
|
finding_type: str,
|
|
20
|
-
severity: str =
|
|
20
|
+
severity: str = "info",
|
|
21
21
|
description: str = None,
|
|
22
22
|
host_id: int = None,
|
|
23
23
|
tool: str = None,
|
|
24
24
|
refs: str = None,
|
|
25
25
|
port: int = None,
|
|
26
26
|
path: str = None,
|
|
27
|
-
evidence: str = None
|
|
27
|
+
evidence: str = None,
|
|
28
28
|
) -> int:
|
|
29
29
|
"""
|
|
30
30
|
Add a finding to the database.
|
|
@@ -57,42 +57,35 @@ class FindingsManager:
|
|
|
57
57
|
"""
|
|
58
58
|
duplicate = self.db.execute_one(
|
|
59
59
|
duplicate_query,
|
|
60
|
-
(
|
|
61
|
-
engagement_id,
|
|
62
|
-
title,
|
|
63
|
-
tool or '',
|
|
64
|
-
host_id or 0,
|
|
65
|
-
port or 0,
|
|
66
|
-
path or ''
|
|
67
|
-
)
|
|
60
|
+
(engagement_id, title, tool or "", host_id or 0, port or 0, path or ""),
|
|
68
61
|
)
|
|
69
|
-
|
|
62
|
+
|
|
70
63
|
if duplicate:
|
|
71
|
-
return duplicate[
|
|
72
|
-
|
|
64
|
+
return duplicate["id"]
|
|
65
|
+
|
|
73
66
|
data = {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
67
|
+
"engagement_id": engagement_id,
|
|
68
|
+
"title": title,
|
|
69
|
+
"finding_type": finding_type,
|
|
70
|
+
"severity": severity,
|
|
78
71
|
}
|
|
79
72
|
|
|
80
73
|
if description:
|
|
81
|
-
data[
|
|
74
|
+
data["description"] = description
|
|
82
75
|
if host_id:
|
|
83
|
-
data[
|
|
76
|
+
data["host_id"] = host_id
|
|
84
77
|
if tool:
|
|
85
|
-
data[
|
|
78
|
+
data["tool"] = tool
|
|
86
79
|
if refs:
|
|
87
|
-
data[
|
|
80
|
+
data["refs"] = refs
|
|
88
81
|
if port:
|
|
89
|
-
data[
|
|
82
|
+
data["port"] = port
|
|
90
83
|
if path:
|
|
91
|
-
data[
|
|
84
|
+
data["path"] = path
|
|
92
85
|
if evidence:
|
|
93
|
-
data[
|
|
86
|
+
data["evidence"] = evidence
|
|
94
87
|
|
|
95
|
-
return self.db.insert(
|
|
88
|
+
return self.db.insert("findings", data)
|
|
96
89
|
|
|
97
90
|
def get_finding(self, finding_id: int) -> Optional[Dict[str, Any]]:
|
|
98
91
|
"""Get a finding by ID."""
|
|
@@ -108,7 +101,7 @@ class FindingsManager:
|
|
|
108
101
|
finding_type: str = None,
|
|
109
102
|
search: str = None,
|
|
110
103
|
ip_address: str = None,
|
|
111
|
-
limit: int = None
|
|
104
|
+
limit: int = None,
|
|
112
105
|
) -> List[Dict[str, Any]]:
|
|
113
106
|
"""
|
|
114
107
|
List findings with optional filters.
|
|
@@ -130,7 +123,8 @@ class FindingsManager:
|
|
|
130
123
|
SELECT
|
|
131
124
|
f.*,
|
|
132
125
|
h.ip_address,
|
|
133
|
-
h.hostname
|
|
126
|
+
h.hostname,
|
|
127
|
+
COALESCE(h.hostname, h.ip_address) as affected_target
|
|
134
128
|
FROM findings f
|
|
135
129
|
LEFT JOIN hosts h ON f.host_id = h.id
|
|
136
130
|
WHERE f.engagement_id = ?
|
|
@@ -164,7 +158,7 @@ class FindingsManager:
|
|
|
164
158
|
params.append(f"%{ip_address}%")
|
|
165
159
|
|
|
166
160
|
query += " ORDER BY f.created_at DESC"
|
|
167
|
-
|
|
161
|
+
|
|
168
162
|
if limit:
|
|
169
163
|
query += " LIMIT ?"
|
|
170
164
|
params.append(limit)
|
|
@@ -185,7 +179,7 @@ class FindingsManager:
|
|
|
185
179
|
if not kwargs:
|
|
186
180
|
return False
|
|
187
181
|
|
|
188
|
-
set_clause =
|
|
182
|
+
set_clause = ", ".join([f"{k} = ?" for k in kwargs.keys()])
|
|
189
183
|
query = f"UPDATE findings SET {set_clause} WHERE id = ?"
|
|
190
184
|
params = list(kwargs.values()) + [finding_id]
|
|
191
185
|
|
|
@@ -205,6 +199,7 @@ class FindingsManager:
|
|
|
205
199
|
# Check permission
|
|
206
200
|
from souleyez.auth import get_current_user
|
|
207
201
|
from souleyez.auth.permissions import Permission, PermissionChecker
|
|
202
|
+
|
|
208
203
|
user = get_current_user()
|
|
209
204
|
if user:
|
|
210
205
|
checker = PermissionChecker(user.role, user.tier)
|
|
@@ -232,17 +227,11 @@ class FindingsManager:
|
|
|
232
227
|
"""
|
|
233
228
|
results = self.db.execute(query, (engagement_id,))
|
|
234
229
|
|
|
235
|
-
summary = {
|
|
236
|
-
'critical': 0,
|
|
237
|
-
'high': 0,
|
|
238
|
-
'medium': 0,
|
|
239
|
-
'low': 0,
|
|
240
|
-
'info': 0
|
|
241
|
-
}
|
|
230
|
+
summary = {"critical": 0, "high": 0, "medium": 0, "low": 0, "info": 0}
|
|
242
231
|
|
|
243
232
|
for row in results:
|
|
244
|
-
severity = row.get(
|
|
245
|
-
count = row.get(
|
|
233
|
+
severity = row.get("severity", "info")
|
|
234
|
+
count = row.get("count", 0)
|
|
246
235
|
if severity in summary:
|
|
247
236
|
summary[severity] = count
|
|
248
237
|
|
|
@@ -257,7 +246,7 @@ class FindingsManager:
|
|
|
257
246
|
ORDER BY finding_type
|
|
258
247
|
"""
|
|
259
248
|
results = self.db.execute(query, (engagement_id,))
|
|
260
|
-
return [row[
|
|
249
|
+
return [row["finding_type"] for row in results if row.get("finding_type")]
|
|
261
250
|
|
|
262
251
|
def get_unique_tools(self, engagement_id: int) -> List[str]:
|
|
263
252
|
"""Get list of unique tools that generated findings in engagement."""
|
|
@@ -268,14 +257,14 @@ class FindingsManager:
|
|
|
268
257
|
ORDER BY tool
|
|
269
258
|
"""
|
|
270
259
|
results = self.db.execute(query, (engagement_id,))
|
|
271
|
-
return [row[
|
|
260
|
+
return [row["tool"] for row in results if row.get("tool")]
|
|
272
261
|
|
|
273
262
|
def calculate_risk_score(
|
|
274
263
|
self,
|
|
275
264
|
severity: str,
|
|
276
265
|
cvss_score: float = None,
|
|
277
266
|
has_exploit: bool = False,
|
|
278
|
-
is_authenticated: bool = False
|
|
267
|
+
is_authenticated: bool = False,
|
|
279
268
|
) -> int:
|
|
280
269
|
"""
|
|
281
270
|
Calculate risk score (0-100) based on severity, CVSS, and context.
|
|
@@ -291,11 +280,11 @@ class FindingsManager:
|
|
|
291
280
|
"""
|
|
292
281
|
# Base score from severity
|
|
293
282
|
severity_scores = {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
283
|
+
"critical": 90,
|
|
284
|
+
"high": 70,
|
|
285
|
+
"medium": 50,
|
|
286
|
+
"low": 30,
|
|
287
|
+
"info": 10,
|
|
299
288
|
}
|
|
300
289
|
base = severity_scores.get(severity.lower(), 50)
|
|
301
290
|
|
|
@@ -316,7 +305,7 @@ class FindingsManager:
|
|
|
316
305
|
cve_id: str = None,
|
|
317
306
|
cvss_score: float = None,
|
|
318
307
|
service: str = None,
|
|
319
|
-
port: int = None
|
|
308
|
+
port: int = None,
|
|
320
309
|
) -> str:
|
|
321
310
|
"""
|
|
322
311
|
Automatically classify severity based on available info.
|
|
@@ -333,23 +322,23 @@ class FindingsManager:
|
|
|
333
322
|
# Use CVSS score if available
|
|
334
323
|
if cvss_score is not None:
|
|
335
324
|
if cvss_score >= 9.0:
|
|
336
|
-
return
|
|
325
|
+
return "critical"
|
|
337
326
|
elif cvss_score >= 7.0:
|
|
338
|
-
return
|
|
327
|
+
return "high"
|
|
339
328
|
elif cvss_score >= 4.0:
|
|
340
|
-
return
|
|
329
|
+
return "medium"
|
|
341
330
|
elif cvss_score >= 0.1:
|
|
342
|
-
return
|
|
331
|
+
return "low"
|
|
343
332
|
else:
|
|
344
|
-
return
|
|
333
|
+
return "info"
|
|
345
334
|
|
|
346
335
|
# Check for critical services/ports
|
|
347
336
|
critical_ports = [22, 23, 3389, 445, 139] # SSH, Telnet, RDP, SMB
|
|
348
337
|
if port and port in critical_ports:
|
|
349
|
-
return
|
|
338
|
+
return "high"
|
|
350
339
|
|
|
351
340
|
# Default
|
|
352
|
-
return
|
|
341
|
+
return "medium"
|
|
353
342
|
|
|
354
343
|
def add_cve_finding(
|
|
355
344
|
self,
|
|
@@ -359,7 +348,7 @@ class FindingsManager:
|
|
|
359
348
|
service: str,
|
|
360
349
|
port: int,
|
|
361
350
|
cvss_score: float = None,
|
|
362
|
-
tool: str = None
|
|
351
|
+
tool: str = None,
|
|
363
352
|
) -> int:
|
|
364
353
|
"""
|
|
365
354
|
Add a CVE-based finding with auto-classification.
|
|
@@ -377,9 +366,7 @@ class FindingsManager:
|
|
|
377
366
|
Finding ID
|
|
378
367
|
"""
|
|
379
368
|
severity = self.auto_classify_severity(
|
|
380
|
-
cve_id=cve_id,
|
|
381
|
-
cvss_score=cvss_score,
|
|
382
|
-
port=port
|
|
369
|
+
cve_id=cve_id, cvss_score=cvss_score, port=port
|
|
383
370
|
)
|
|
384
371
|
|
|
385
372
|
title = f"{cve_id} - Vulnerable {service}"
|
|
@@ -391,7 +378,7 @@ class FindingsManager:
|
|
|
391
378
|
return self.add_finding(
|
|
392
379
|
engagement_id=engagement_id,
|
|
393
380
|
title=title,
|
|
394
|
-
finding_type=
|
|
381
|
+
finding_type="vulnerability",
|
|
395
382
|
severity=severity,
|
|
396
383
|
description=description,
|
|
397
384
|
host_id=host_id,
|
|
@@ -399,6 +386,6 @@ class FindingsManager:
|
|
|
399
386
|
cve_id=cve_id,
|
|
400
387
|
cvss_score=cvss_score,
|
|
401
388
|
tool=tool,
|
|
402
|
-
category=
|
|
403
|
-
refs=f"https://nvd.nist.gov/vuln/detail/{cve_id}"
|
|
389
|
+
category="cve",
|
|
390
|
+
refs=f"https://nvd.nist.gov/vuln/detail/{cve_id}",
|
|
404
391
|
)
|