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.
Potentially problematic release.
This version of souleyez might be problematic. Click here for more details.
- 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/plugins/smbmap.py
CHANGED
|
@@ -29,108 +29,156 @@ HELP = {
|
|
|
29
29
|
"usage": "souleyez jobs enqueue smbmap <target>",
|
|
30
30
|
"examples": [
|
|
31
31
|
"souleyez jobs enqueue smbmap 10.0.0.82",
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
'souleyez jobs enqueue smbmap 10.0.0.82 --args "-u admin -p password"',
|
|
33
|
+
'souleyez jobs enqueue smbmap 10.0.0.82 --args "-u admin -p password -r"',
|
|
34
|
+
'souleyez jobs enqueue smbmap 10.0.0.82 --args "--depth 3"',
|
|
35
35
|
],
|
|
36
36
|
"preset_categories": {
|
|
37
37
|
"unauthenticated": [
|
|
38
38
|
{
|
|
39
39
|
"name": "Anonymous Scan",
|
|
40
40
|
"args": [],
|
|
41
|
-
"desc": "Basic share enumeration (no credentials)"
|
|
41
|
+
"desc": "Basic share enumeration (no credentials)",
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
"name": "List Share Contents",
|
|
45
45
|
"args": ["-r"],
|
|
46
|
-
"desc": "Recursively list all accessible files"
|
|
47
|
-
}
|
|
46
|
+
"desc": "Recursively list all accessible files",
|
|
47
|
+
},
|
|
48
48
|
],
|
|
49
49
|
"authenticated": [
|
|
50
50
|
{
|
|
51
51
|
"name": "With Credentials",
|
|
52
52
|
"args": ["-u", "<username>", "-p", "<password>"],
|
|
53
|
-
"desc": "Authenticated scan (replace username/password)"
|
|
53
|
+
"desc": "Authenticated scan (replace username/password)",
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
"name": "Domain Credentials",
|
|
57
57
|
"args": ["-u", "<username>", "-p", "<password>", "-d", "<domain>"],
|
|
58
|
-
"desc": "Domain authentication"
|
|
59
|
-
}
|
|
58
|
+
"desc": "Domain authentication",
|
|
59
|
+
},
|
|
60
60
|
],
|
|
61
61
|
"advanced": [
|
|
62
62
|
{
|
|
63
63
|
"name": "Deep Recursive Scan",
|
|
64
64
|
"args": ["-r", "--depth", "5"],
|
|
65
|
-
"desc": "Recursively list files (5 levels deep)"
|
|
65
|
+
"desc": "Recursively list files (5 levels deep)",
|
|
66
66
|
},
|
|
67
67
|
{
|
|
68
68
|
"name": "Download Interesting Files",
|
|
69
69
|
"args": ["-A", "password", "-r"],
|
|
70
|
-
"desc": "Auto-download files matching pattern"
|
|
70
|
+
"desc": "Auto-download files matching pattern",
|
|
71
71
|
},
|
|
72
72
|
{
|
|
73
73
|
"name": "Execute Command",
|
|
74
74
|
"args": ["-u", "<username>", "-p", "<password>", "-x", "whoami"],
|
|
75
|
-
"desc": "Execute command on target (requires admin)"
|
|
76
|
-
}
|
|
77
|
-
]
|
|
75
|
+
"desc": "Execute command on target (requires admin)",
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
78
|
},
|
|
79
79
|
"presets": [
|
|
80
|
-
{
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
{
|
|
86
|
-
|
|
80
|
+
{
|
|
81
|
+
"name": "Anonymous Scan",
|
|
82
|
+
"args": [],
|
|
83
|
+
"desc": "Basic share enumeration (no credentials)",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "List Share Contents",
|
|
87
|
+
"args": ["-r"],
|
|
88
|
+
"desc": "Recursively list all accessible files",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"name": "With Credentials",
|
|
92
|
+
"args": ["-u", "<username>", "-p", "<password>"],
|
|
93
|
+
"desc": "Authenticated scan (replace username/password)",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "Domain Credentials",
|
|
97
|
+
"args": ["-u", "<username>", "-p", "<password>", "-d", "<domain>"],
|
|
98
|
+
"desc": "Domain authentication",
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"name": "Deep Recursive Scan",
|
|
102
|
+
"args": ["-r", "--depth", "5"],
|
|
103
|
+
"desc": "Recursively list files (5 levels deep)",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"name": "Download Interesting Files",
|
|
107
|
+
"args": ["-A", "password", "-r"],
|
|
108
|
+
"desc": "Auto-download files matching pattern",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"name": "Execute Command",
|
|
112
|
+
"args": ["-u", "<username>", "-p", "<password>", "-x", "whoami"],
|
|
113
|
+
"desc": "Execute command on target (requires admin)",
|
|
114
|
+
},
|
|
87
115
|
],
|
|
88
116
|
"help_sections": [
|
|
89
117
|
{
|
|
90
118
|
"title": "What is SMBMap?",
|
|
91
119
|
"color": "cyan",
|
|
92
120
|
"content": [
|
|
93
|
-
{
|
|
94
|
-
|
|
95
|
-
"
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
"
|
|
99
|
-
|
|
100
|
-
|
|
121
|
+
{
|
|
122
|
+
"title": "Overview",
|
|
123
|
+
"desc": "SMBMap enumerates SMB shares and maps permissions (READ, WRITE, etc.) to quickly identify accessible and writable shares.",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"title": "Use Cases",
|
|
127
|
+
"desc": "Perfect for identifying SMB security risks",
|
|
128
|
+
"tips": [
|
|
129
|
+
"Find publicly accessible shares",
|
|
130
|
+
"Identify writable shares (high-risk)",
|
|
131
|
+
"Map file-level permissions quickly",
|
|
132
|
+
"Works with legacy SMB/Samba versions",
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
],
|
|
101
136
|
},
|
|
102
137
|
{
|
|
103
138
|
"title": "How to Use",
|
|
104
139
|
"color": "green",
|
|
105
140
|
"content": [
|
|
106
|
-
{
|
|
107
|
-
|
|
108
|
-
"
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
"
|
|
112
|
-
|
|
113
|
-
|
|
141
|
+
{
|
|
142
|
+
"title": "Basic Workflow",
|
|
143
|
+
"desc": "1. Start with anonymous scan (no credentials)\n 2. Check for publicly accessible shares\n 3. Use credentials if available for deeper enumeration\n 4. Flag writable shares as high-risk findings",
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"title": "Key Features",
|
|
147
|
+
"desc": "Share enumeration and file operations",
|
|
148
|
+
"tips": [
|
|
149
|
+
"Basic scan: smbmap -H <target>",
|
|
150
|
+
"Recursive listing: smbmap -H <target> -r",
|
|
151
|
+
"With credentials: smbmap -H <target> -u user -p pass",
|
|
152
|
+
"Download files: smbmap -H <target> --download 'share/file.txt'",
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
],
|
|
114
156
|
},
|
|
115
157
|
{
|
|
116
158
|
"title": "Tips & Best Practices",
|
|
117
159
|
"color": "yellow",
|
|
118
160
|
"content": [
|
|
119
|
-
(
|
|
120
|
-
"
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
"
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
161
|
+
(
|
|
162
|
+
"Best Practices:",
|
|
163
|
+
[
|
|
164
|
+
"Start anonymous, then try credentials",
|
|
165
|
+
"Use -r carefully on large shares (generates traffic)",
|
|
166
|
+
"Flag writable shares as security findings",
|
|
167
|
+
"Combine with enum4linux for complete SMB assessment",
|
|
168
|
+
"Capture share permissions to job log",
|
|
169
|
+
],
|
|
170
|
+
),
|
|
171
|
+
(
|
|
172
|
+
"Common Issues:",
|
|
173
|
+
[
|
|
174
|
+
"No shares found: Try guest account or null session",
|
|
175
|
+
"Access denied: Verify credentials and domain format",
|
|
176
|
+
"Timeout errors: Increase timeout or reduce recursion depth",
|
|
177
|
+
"Connection refused: Check if SMB port 445 is open",
|
|
178
|
+
],
|
|
179
|
+
),
|
|
180
|
+
],
|
|
181
|
+
},
|
|
134
182
|
],
|
|
135
183
|
"common_options": {
|
|
136
184
|
"-H": "Target host (automatically set)",
|
|
@@ -142,8 +190,8 @@ HELP = {
|
|
|
142
190
|
"-A": "Auto-download files matching pattern",
|
|
143
191
|
"-x": "Execute command",
|
|
144
192
|
"--download": "Download file path",
|
|
145
|
-
"-q": "Quiet mode"
|
|
146
|
-
}
|
|
193
|
+
"-q": "Quiet mode",
|
|
194
|
+
},
|
|
147
195
|
}
|
|
148
196
|
|
|
149
197
|
|
|
@@ -153,8 +201,9 @@ class SmbmapPlugin(PluginBase):
|
|
|
153
201
|
category = "scanning"
|
|
154
202
|
HELP = HELP
|
|
155
203
|
|
|
156
|
-
|
|
157
|
-
|
|
204
|
+
def build_command(
|
|
205
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
206
|
+
):
|
|
158
207
|
"""Build command for background execution with PID tracking."""
|
|
159
208
|
args = args or []
|
|
160
209
|
|
|
@@ -166,21 +215,20 @@ class SmbmapPlugin(PluginBase):
|
|
|
166
215
|
if "-H" not in args and "--host" not in args:
|
|
167
216
|
cmd.extend(["-H", target])
|
|
168
217
|
cmd.extend(args)
|
|
169
|
-
|
|
170
|
-
return {
|
|
171
|
-
'cmd': cmd,
|
|
172
|
-
'timeout': 1800
|
|
173
|
-
}
|
|
174
218
|
|
|
175
|
-
|
|
219
|
+
return {"cmd": cmd, "timeout": 1800}
|
|
220
|
+
|
|
221
|
+
def run(
|
|
222
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
223
|
+
) -> int:
|
|
176
224
|
"""Execute smbmap scan and write output to log_path."""
|
|
177
|
-
|
|
225
|
+
|
|
178
226
|
# Validate target
|
|
179
227
|
try:
|
|
180
228
|
target = validate_target(target)
|
|
181
229
|
except ValidationError as e:
|
|
182
230
|
if log_path:
|
|
183
|
-
with open(log_path,
|
|
231
|
+
with open(log_path, "w") as f:
|
|
184
232
|
f.write(f"ERROR: Invalid target: {e}\n")
|
|
185
233
|
return 1
|
|
186
234
|
raise ValueError(f"Invalid target: {e}")
|
|
@@ -199,7 +247,9 @@ class SmbmapPlugin(PluginBase):
|
|
|
199
247
|
|
|
200
248
|
if not log_path:
|
|
201
249
|
try:
|
|
202
|
-
proc = subprocess.run(
|
|
250
|
+
proc = subprocess.run(
|
|
251
|
+
cmd, capture_output=True, timeout=120, check=False
|
|
252
|
+
)
|
|
203
253
|
return proc.returncode
|
|
204
254
|
except Exception:
|
|
205
255
|
return 1
|
|
@@ -209,18 +259,18 @@ class SmbmapPlugin(PluginBase):
|
|
|
209
259
|
fh.write("=== SMBMap Scan ===\n")
|
|
210
260
|
fh.write(f"Target: {target}\n")
|
|
211
261
|
fh.write(f"Command: {' '.join(cmd)}\n")
|
|
212
|
-
fh.write(
|
|
262
|
+
fh.write(
|
|
263
|
+
f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n\n"
|
|
264
|
+
)
|
|
213
265
|
fh.flush()
|
|
214
266
|
|
|
215
267
|
proc = subprocess.run(
|
|
216
|
-
cmd,
|
|
217
|
-
stdout=fh,
|
|
218
|
-
stderr=subprocess.STDOUT,
|
|
219
|
-
timeout=120,
|
|
220
|
-
check=False
|
|
268
|
+
cmd, stdout=fh, stderr=subprocess.STDOUT, timeout=120, check=False
|
|
221
269
|
)
|
|
222
270
|
|
|
223
|
-
fh.write(
|
|
271
|
+
fh.write(
|
|
272
|
+
f"\n\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
|
|
273
|
+
)
|
|
224
274
|
fh.write(f"Exit Code: {proc.returncode}\n")
|
|
225
275
|
|
|
226
276
|
return proc.returncode
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
souleyez.plugins.smbpasswd
|
|
4
|
+
|
|
5
|
+
SMB Password Change plugin - changes passwords for users with STATUS_PASSWORD_MUST_CHANGE.
|
|
6
|
+
"""
|
|
7
|
+
import subprocess
|
|
8
|
+
import time
|
|
9
|
+
from typing import List
|
|
10
|
+
|
|
11
|
+
from .plugin_base import PluginBase
|
|
12
|
+
|
|
13
|
+
HELP = {
|
|
14
|
+
"name": "smbpasswd - SMB Password Change",
|
|
15
|
+
"description": (
|
|
16
|
+
"Change SMB/AD passwords over the network.\n\n"
|
|
17
|
+
"Used when a user account has STATUS_PASSWORD_MUST_CHANGE - the password "
|
|
18
|
+
"is known but must be changed before the account can be used.\n\n"
|
|
19
|
+
"This is common in AD environments where initial passwords are set "
|
|
20
|
+
"and users are required to change them on first login.\n\n"
|
|
21
|
+
"The plugin uses smbpasswd with -s flag for non-interactive operation.\n"
|
|
22
|
+
),
|
|
23
|
+
"usage": 'souleyez jobs enqueue smbpasswd <target> --args "-U <user> --old-pass <old> --new-pass <new>"',
|
|
24
|
+
"examples": [
|
|
25
|
+
'souleyez jobs enqueue smbpasswd 192.168.1.10 --args "-U Caroline.Robinson --old-pass BabyStart123! --new-pass NewP@ss123!"',
|
|
26
|
+
],
|
|
27
|
+
"flags": [
|
|
28
|
+
["-r, --remote <TARGET>", "Remote SMB server (auto-set from target)"],
|
|
29
|
+
["-U, --user <USER>", "Username to change password for"],
|
|
30
|
+
["--old-pass <PASS>", "Current/old password"],
|
|
31
|
+
["--new-pass <PASS>", "New password to set"],
|
|
32
|
+
],
|
|
33
|
+
"presets": [],
|
|
34
|
+
"notes": [
|
|
35
|
+
"Requires smbpasswd (part of samba-common-bin package)",
|
|
36
|
+
"Use when crackmapexec shows STATUS_PASSWORD_MUST_CHANGE",
|
|
37
|
+
"New password must meet domain password policy requirements",
|
|
38
|
+
"After changing, use evil-winrm or other tools with new credentials",
|
|
39
|
+
],
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class SmbpasswdPlugin(PluginBase):
|
|
44
|
+
name = "smbpasswd"
|
|
45
|
+
tool = "smbpasswd"
|
|
46
|
+
category = "credential_attack"
|
|
47
|
+
HELP = HELP
|
|
48
|
+
|
|
49
|
+
def build_command(
|
|
50
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
51
|
+
):
|
|
52
|
+
"""Build command for execution."""
|
|
53
|
+
args = args or []
|
|
54
|
+
|
|
55
|
+
# Parse custom args to extract username and passwords
|
|
56
|
+
username = None
|
|
57
|
+
old_pass = None
|
|
58
|
+
new_pass = None
|
|
59
|
+
|
|
60
|
+
i = 0
|
|
61
|
+
filtered_args = []
|
|
62
|
+
while i < len(args):
|
|
63
|
+
if args[i] in ["-U", "--user"]:
|
|
64
|
+
username = args[i + 1] if i + 1 < len(args) else None
|
|
65
|
+
i += 2
|
|
66
|
+
elif args[i] == "--old-pass":
|
|
67
|
+
old_pass = args[i + 1] if i + 1 < len(args) else None
|
|
68
|
+
i += 2
|
|
69
|
+
elif args[i] == "--new-pass":
|
|
70
|
+
new_pass = args[i + 1] if i + 1 < len(args) else None
|
|
71
|
+
i += 2
|
|
72
|
+
else:
|
|
73
|
+
filtered_args.append(args[i])
|
|
74
|
+
i += 1
|
|
75
|
+
|
|
76
|
+
# Build command with shell piping to pass passwords via stdin
|
|
77
|
+
# Format: (echo 'oldpass'; echo 'newpass'; echo 'newpass') | smbpasswd -r target -U user -s
|
|
78
|
+
if old_pass and new_pass and username:
|
|
79
|
+
# Escape single quotes in passwords
|
|
80
|
+
old_pass_escaped = old_pass.replace("'", "'\\''")
|
|
81
|
+
new_pass_escaped = new_pass.replace("'", "'\\''")
|
|
82
|
+
|
|
83
|
+
shell_cmd = (
|
|
84
|
+
f"(echo '{old_pass_escaped}'; echo '{new_pass_escaped}'; echo '{new_pass_escaped}') | "
|
|
85
|
+
f"smbpasswd -r {target} -U {username} -s"
|
|
86
|
+
)
|
|
87
|
+
cmd = ["bash", "-c", shell_cmd]
|
|
88
|
+
else:
|
|
89
|
+
# Fallback to basic command (will fail without passwords)
|
|
90
|
+
cmd = ["smbpasswd", "-r", target, "-s"]
|
|
91
|
+
if username:
|
|
92
|
+
cmd.extend(["-U", username])
|
|
93
|
+
cmd.extend(filtered_args)
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
"cmd": cmd,
|
|
97
|
+
"timeout": 120, # Increased for slow SAMR connections
|
|
98
|
+
"old_pass": old_pass,
|
|
99
|
+
"new_pass": new_pass,
|
|
100
|
+
"username": username,
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
def run(
|
|
104
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
105
|
+
) -> int:
|
|
106
|
+
"""Execute smbpasswd."""
|
|
107
|
+
args = args or []
|
|
108
|
+
|
|
109
|
+
# Parse args
|
|
110
|
+
cmd_info = self.build_command(target, args, label, log_path)
|
|
111
|
+
cmd = cmd_info["cmd"]
|
|
112
|
+
username = cmd_info.get("username", "unknown")
|
|
113
|
+
new_pass = cmd_info.get("new_pass", "")
|
|
114
|
+
|
|
115
|
+
try:
|
|
116
|
+
if log_path:
|
|
117
|
+
with open(log_path, "w", encoding="utf-8", errors="replace") as fh:
|
|
118
|
+
fh.write("=== SMB Password Change ===\n")
|
|
119
|
+
fh.write(f"Target: {target}\n")
|
|
120
|
+
fh.write(f"Username: {username}\n")
|
|
121
|
+
fh.write(
|
|
122
|
+
f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n\n"
|
|
123
|
+
)
|
|
124
|
+
fh.write(f"Command: {' '.join(cmd)}\n")
|
|
125
|
+
fh.write("(passwords piped via shell)\n\n")
|
|
126
|
+
fh.flush()
|
|
127
|
+
|
|
128
|
+
# Run smbpasswd with password piping via bash
|
|
129
|
+
proc = subprocess.run(
|
|
130
|
+
cmd,
|
|
131
|
+
capture_output=True,
|
|
132
|
+
text=True,
|
|
133
|
+
timeout=120, # Increased for slow SAMR connections
|
|
134
|
+
check=False,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
fh.write(f"STDOUT:\n{proc.stdout}\n")
|
|
138
|
+
fh.write(f"STDERR:\n{proc.stderr}\n")
|
|
139
|
+
|
|
140
|
+
# Check for success - either exit code 0 OR "Password changed" in output
|
|
141
|
+
# SAMR connection may timeout AFTER password was changed successfully
|
|
142
|
+
output_combined = (proc.stdout or "") + (proc.stderr or "")
|
|
143
|
+
password_changed = (
|
|
144
|
+
proc.returncode == 0
|
|
145
|
+
or "Password changed" in output_combined
|
|
146
|
+
or "password changed" in output_combined.lower()
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# Also check for timeout that happened AFTER password change
|
|
150
|
+
# If we see IO_TIMEOUT but no "password is not correct", it likely worked
|
|
151
|
+
if (
|
|
152
|
+
"NT_STATUS_IO_TIMEOUT" in output_combined
|
|
153
|
+
and "not correct" not in output_combined
|
|
154
|
+
):
|
|
155
|
+
password_changed = True
|
|
156
|
+
fh.write(
|
|
157
|
+
"\n[NOTE] SAMR timeout occurred but password may have changed\n"
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
if password_changed:
|
|
161
|
+
fh.write("\n" + "=" * 50 + "\n")
|
|
162
|
+
fh.write("PASSWORD CHANGED SUCCESSFULLY!\n")
|
|
163
|
+
fh.write("=" * 50 + "\n")
|
|
164
|
+
fh.write(f"Username: {username}\n")
|
|
165
|
+
fh.write(f"New Password: {new_pass}\n")
|
|
166
|
+
fh.write("\nNext step: Connect with evil-winrm or other tool\n")
|
|
167
|
+
fh.write(
|
|
168
|
+
f"Example: evil-winrm -i {target} -u {username} -p '{new_pass}'\n"
|
|
169
|
+
)
|
|
170
|
+
# Return 0 to indicate success for chaining
|
|
171
|
+
return 0
|
|
172
|
+
else:
|
|
173
|
+
fh.write("\nPassword change FAILED - check error above\n")
|
|
174
|
+
|
|
175
|
+
fh.write(
|
|
176
|
+
f"\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
|
|
177
|
+
)
|
|
178
|
+
fh.write(f"Exit Code: {proc.returncode}\n")
|
|
179
|
+
|
|
180
|
+
return proc.returncode
|
|
181
|
+
else:
|
|
182
|
+
# No log path - run directly
|
|
183
|
+
proc = subprocess.run(
|
|
184
|
+
cmd, capture_output=True, text=True, timeout=120, check=False
|
|
185
|
+
)
|
|
186
|
+
# Check for success patterns even without log
|
|
187
|
+
output_combined = (proc.stdout or "") + (proc.stderr or "")
|
|
188
|
+
if (
|
|
189
|
+
"Password changed" in output_combined
|
|
190
|
+
or "NT_STATUS_IO_TIMEOUT" in output_combined
|
|
191
|
+
):
|
|
192
|
+
return 0
|
|
193
|
+
return proc.returncode
|
|
194
|
+
|
|
195
|
+
except subprocess.TimeoutExpired:
|
|
196
|
+
if log_path:
|
|
197
|
+
with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
|
|
198
|
+
fh.write("\nERROR: smbpasswd command timed out after 120 seconds\n")
|
|
199
|
+
return 124
|
|
200
|
+
|
|
201
|
+
except FileNotFoundError:
|
|
202
|
+
if log_path:
|
|
203
|
+
with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
|
|
204
|
+
fh.write("\nERROR: smbpasswd not found in PATH\n")
|
|
205
|
+
fh.write("Install with: apt install samba-common-bin\n")
|
|
206
|
+
return 127
|
|
207
|
+
|
|
208
|
+
except Exception as e:
|
|
209
|
+
if log_path:
|
|
210
|
+
with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
|
|
211
|
+
fh.write(f"\nERROR: {type(e).__name__}: {e}\n")
|
|
212
|
+
return 1
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
plugin = SmbpasswdPlugin()
|