souleyez 2.43.29__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 +22827 -10678
- 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.29.dist-info → souleyez-2.43.34.dist-info}/METADATA +1 -1
- souleyez-2.43.34.dist-info/RECORD +443 -0
- {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/WHEEL +1 -1
- souleyez-2.43.29.dist-info/RECORD +0 -379
- {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/entry_points.txt +0 -0
- {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/licenses/LICENSE +0 -0
- {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/top_level.txt +0 -0
|
@@ -26,11 +26,11 @@ HELP = {
|
|
|
26
26
|
"- Use with username list for better results\n"
|
|
27
27
|
"- Check for accounts with SPN and no pre-auth\n"
|
|
28
28
|
),
|
|
29
|
-
"usage":
|
|
29
|
+
"usage": 'souleyez jobs enqueue impacket-getnpusers <domain>/<username> --args "-dc-ip <dc_ip>"',
|
|
30
30
|
"examples": [
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
'souleyez jobs enqueue impacket-getnpusers CONTOSO.LOCAL/ --args "-dc-ip 10.0.0.82 -usersfile users.txt"',
|
|
32
|
+
'souleyez jobs enqueue impacket-getnpusers CONTOSO.LOCAL/ --args "-dc-ip 10.0.0.82 -no-pass"',
|
|
33
|
+
'souleyez jobs enqueue impacket-getnpusers CONTOSO.LOCAL/user --args "-dc-ip 10.0.0.82 -format hashcat"',
|
|
34
34
|
],
|
|
35
35
|
"flags": [
|
|
36
36
|
["-dc-ip <ip>", "Domain Controller IP address"],
|
|
@@ -44,80 +44,108 @@ HELP = {
|
|
|
44
44
|
{
|
|
45
45
|
"name": "Anonymous AS-REP Roast",
|
|
46
46
|
"args": ["-dc-ip", "<target>", "-no-pass", "-format", "hashcat"],
|
|
47
|
-
"desc": "Extract AS-REP hashes without authentication (anonymous)"
|
|
47
|
+
"desc": "Extract AS-REP hashes without authentication (anonymous)",
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
"name": "With Username List",
|
|
51
|
-
"args": [
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
"args": [
|
|
52
|
+
"-dc-ip",
|
|
53
|
+
"<target>",
|
|
54
|
+
"-usersfile",
|
|
55
|
+
"users.txt",
|
|
56
|
+
"-format",
|
|
57
|
+
"hashcat",
|
|
58
|
+
"-no-pass",
|
|
59
|
+
],
|
|
60
|
+
"desc": "Test list of usernames for AS-REP roasting",
|
|
61
|
+
},
|
|
54
62
|
],
|
|
55
63
|
"authenticated": [
|
|
56
64
|
{
|
|
57
65
|
"name": "AS-REP Roast (Authenticated)",
|
|
58
66
|
"args": ["-dc-ip", "<target>", "-format", "hashcat"],
|
|
59
|
-
"desc": "Extract AS-REP hashes with valid domain account"
|
|
67
|
+
"desc": "Extract AS-REP hashes with valid domain account",
|
|
60
68
|
},
|
|
61
69
|
{
|
|
62
70
|
"name": "Request All Vulnerable Accounts",
|
|
63
71
|
"args": ["-dc-ip", "<target>", "-request", "-format", "hashcat"],
|
|
64
|
-
"desc": "Find and extract all AS-REP roastable accounts"
|
|
65
|
-
}
|
|
66
|
-
]
|
|
72
|
+
"desc": "Find and extract all AS-REP roastable accounts",
|
|
73
|
+
},
|
|
74
|
+
],
|
|
67
75
|
},
|
|
68
|
-
"presets": []
|
|
76
|
+
"presets": [],
|
|
69
77
|
}
|
|
70
78
|
|
|
71
79
|
# Flatten presets
|
|
72
|
-
for category_presets in HELP[
|
|
73
|
-
HELP[
|
|
80
|
+
for category_presets in HELP["preset_categories"].values():
|
|
81
|
+
HELP["presets"].extend(category_presets)
|
|
74
82
|
|
|
75
83
|
HELP["help_sections"] = [
|
|
76
84
|
{
|
|
77
85
|
"title": "What is GetNPUsers (AS-REP Roasting)?",
|
|
78
86
|
"color": "cyan",
|
|
79
87
|
"content": [
|
|
80
|
-
{
|
|
81
|
-
|
|
82
|
-
"
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
{
|
|
89
|
+
"title": "Overview",
|
|
90
|
+
"desc": "GetNPUsers performs AS-REP Roasting to extract Kerberos hashes for accounts that don't require Kerberos pre-authentication, which can be cracked offline.",
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"title": "Use Cases",
|
|
94
|
+
"desc": "Extract crackable hashes without credentials",
|
|
95
|
+
"tips": [
|
|
96
|
+
"Find accounts with 'Do not require Kerberos preauthentication' set",
|
|
97
|
+
"Extract AS-REP hashes without valid credentials",
|
|
98
|
+
"Identify weak passwords in Active Directory",
|
|
99
|
+
"Get initial access foothold",
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
],
|
|
88
103
|
},
|
|
89
104
|
{
|
|
90
105
|
"title": "How to Use",
|
|
91
106
|
"color": "green",
|
|
92
107
|
"content": [
|
|
93
|
-
{
|
|
94
|
-
|
|
95
|
-
"-no-pass
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
"
|
|
99
|
-
|
|
100
|
-
|
|
108
|
+
{
|
|
109
|
+
"title": "Basic Workflow",
|
|
110
|
+
"desc": "1. Run anonymously (-no-pass) with username list\n 2. Extract AS-REP hashes for vulnerable accounts\n 3. Crack hashes with hashcat mode 18200\n 4. Use cracked credentials for access",
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"title": "Key Options",
|
|
114
|
+
"desc": "Essential GetNPUsers parameters",
|
|
115
|
+
"tips": [
|
|
116
|
+
"-no-pass: Anonymous enumeration",
|
|
117
|
+
"-usersfile: Test multiple usernames",
|
|
118
|
+
"-format hashcat: Output for hashcat cracking",
|
|
119
|
+
"-dc-ip: Domain Controller IP address",
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
],
|
|
101
123
|
},
|
|
102
124
|
{
|
|
103
125
|
"title": "Tips & Best Practices",
|
|
104
126
|
"color": "yellow",
|
|
105
127
|
"content": [
|
|
106
|
-
(
|
|
107
|
-
"
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
"
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
128
|
+
(
|
|
129
|
+
"Best Practices:",
|
|
130
|
+
[
|
|
131
|
+
"Use -usersfile with common username lists",
|
|
132
|
+
"Output in hashcat format (-format hashcat)",
|
|
133
|
+
"Works without any authentication (anonymous)",
|
|
134
|
+
"Crack hashes with: hashcat -m 18200 hashes.txt wordlist.txt",
|
|
135
|
+
"Check for SPN accounts without pre-auth",
|
|
136
|
+
],
|
|
137
|
+
),
|
|
138
|
+
(
|
|
139
|
+
"Common Issues:",
|
|
140
|
+
[
|
|
141
|
+
"No hashes found: Pre-auth may be required for all accounts",
|
|
142
|
+
"DC unreachable: Verify -dc-ip is correct",
|
|
143
|
+
"Format errors: Use -format hashcat or john",
|
|
144
|
+
"Empty results: Try authenticated scan with valid credentials",
|
|
145
|
+
],
|
|
146
|
+
),
|
|
147
|
+
],
|
|
148
|
+
},
|
|
121
149
|
]
|
|
122
150
|
|
|
123
151
|
|
|
@@ -127,23 +155,35 @@ class ImpacketGetNPUsersPlugin(PluginBase):
|
|
|
127
155
|
category = "credential_access"
|
|
128
156
|
HELP = HELP
|
|
129
157
|
|
|
130
|
-
|
|
131
|
-
|
|
158
|
+
def build_command(
|
|
159
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
160
|
+
):
|
|
132
161
|
"""Build command for background execution with PID tracking."""
|
|
133
162
|
args = args or []
|
|
134
|
-
|
|
163
|
+
|
|
135
164
|
# Replace <target> placeholder
|
|
136
165
|
args = [arg.replace("<target>", target) for arg in args]
|
|
137
166
|
|
|
138
|
-
# Build command
|
|
139
|
-
|
|
167
|
+
# Build command - GetNPUsers expects: domain/ -dc-ip <ip> [options]
|
|
168
|
+
# Check if first arg is a domain (contains / or looks like domain.tld)
|
|
169
|
+
cmd = ["impacket-GetNPUsers"]
|
|
170
|
+
|
|
171
|
+
# If args starts with domain/, use that as positional arg (not target IP)
|
|
172
|
+
if args and ("/" in args[0] or args[0].count(".") >= 1):
|
|
173
|
+
# First arg is the domain, use it as positional
|
|
174
|
+
cmd.append(args[0])
|
|
175
|
+
args = args[1:]
|
|
176
|
+
else:
|
|
177
|
+
# Target is the domain
|
|
178
|
+
cmd.append(target)
|
|
179
|
+
|
|
180
|
+
cmd.extend(args)
|
|
140
181
|
|
|
141
|
-
return {
|
|
142
|
-
'cmd': cmd,
|
|
143
|
-
'timeout': 1800
|
|
144
|
-
}
|
|
182
|
+
return {"cmd": cmd, "timeout": 1800}
|
|
145
183
|
|
|
146
|
-
def run(
|
|
184
|
+
def run(
|
|
185
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
186
|
+
) -> int:
|
|
147
187
|
"""Execute impacket-GetNPUsers and write output to log_path."""
|
|
148
188
|
|
|
149
189
|
args = args or []
|
|
@@ -151,18 +191,26 @@ class ImpacketGetNPUsersPlugin(PluginBase):
|
|
|
151
191
|
# Replace <target> placeholder
|
|
152
192
|
args = [arg.replace("<target>", target) for arg in args]
|
|
153
193
|
|
|
154
|
-
# Build command
|
|
155
|
-
cmd = ["impacket-
|
|
194
|
+
# Build command - GetNPUsers expects: domain/ -dc-ip <ip> [options]
|
|
195
|
+
cmd = ["impacket-GetNPUsers"]
|
|
156
196
|
|
|
157
|
-
#
|
|
158
|
-
|
|
197
|
+
# If args starts with domain/, use that as positional arg (not target IP)
|
|
198
|
+
if args and ("/" in args[0] or args[0].count(".") >= 1):
|
|
199
|
+
# First arg is the domain, use it as positional
|
|
200
|
+
cmd.append(args[0])
|
|
201
|
+
args = args[1:]
|
|
202
|
+
else:
|
|
203
|
+
# Target is the domain
|
|
204
|
+
cmd.append(target)
|
|
159
205
|
|
|
160
|
-
# Add args
|
|
206
|
+
# Add remaining args
|
|
161
207
|
cmd.extend(args)
|
|
162
208
|
|
|
163
209
|
if not log_path:
|
|
164
210
|
try:
|
|
165
|
-
proc = subprocess.run(
|
|
211
|
+
proc = subprocess.run(
|
|
212
|
+
cmd, capture_output=True, timeout=120, check=False
|
|
213
|
+
)
|
|
166
214
|
return proc.returncode
|
|
167
215
|
except Exception:
|
|
168
216
|
return 1
|
|
@@ -174,16 +222,14 @@ class ImpacketGetNPUsersPlugin(PluginBase):
|
|
|
174
222
|
fh.write(f"Target: {target}\n")
|
|
175
223
|
fh.write(f"Args: {args}\n")
|
|
176
224
|
fh.write(f"Label: {label}\n")
|
|
177
|
-
fh.write(
|
|
225
|
+
fh.write(
|
|
226
|
+
f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
|
|
227
|
+
)
|
|
178
228
|
fh.write(f"Command: {' '.join(cmd)}\n\n")
|
|
179
229
|
|
|
180
230
|
# Run GetNPUsers
|
|
181
231
|
proc = subprocess.run(
|
|
182
|
-
cmd,
|
|
183
|
-
capture_output=True,
|
|
184
|
-
timeout=120,
|
|
185
|
-
check=False,
|
|
186
|
-
text=True
|
|
232
|
+
cmd, capture_output=True, timeout=120, check=False, text=True
|
|
187
233
|
)
|
|
188
234
|
|
|
189
235
|
# Write output
|
|
@@ -194,7 +240,9 @@ class ImpacketGetNPUsersPlugin(PluginBase):
|
|
|
194
240
|
if proc.stderr:
|
|
195
241
|
fh.write(f"\n\n# Error output:\n{proc.stderr}\n")
|
|
196
242
|
|
|
197
|
-
fh.write(
|
|
243
|
+
fh.write(
|
|
244
|
+
f"\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
|
|
245
|
+
)
|
|
198
246
|
fh.write(f"Exit Code: {proc.returncode}\n")
|
|
199
247
|
|
|
200
248
|
return proc.returncode
|
|
@@ -26,11 +26,11 @@ HELP = {
|
|
|
26
26
|
"- Works even if PowerShell is disabled\n"
|
|
27
27
|
"- Can use pass-the-hash with -hashes\n"
|
|
28
28
|
),
|
|
29
|
-
"usage":
|
|
29
|
+
"usage": 'souleyez jobs enqueue impacket-psexec <target> --args "DOMAIN/user:pass@host"',
|
|
30
30
|
"examples": [
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
'souleyez jobs enqueue impacket-psexec 10.0.0.82 --args "Administrator:Password123@10.0.0.82"',
|
|
32
|
+
'souleyez jobs enqueue impacket-psexec 10.0.0.82 --args "CONTOSO/Administrator@10.0.0.82 -hashes :8846f7eaee8fb117ad06bdd830b7586c"',
|
|
33
|
+
'souleyez jobs enqueue impacket-psexec 10.0.0.82 --args "Administrator:Password123@10.0.0.82 whoami"',
|
|
34
34
|
],
|
|
35
35
|
"flags": [
|
|
36
36
|
["-hashes <LM:NT>", "Pass-the-hash authentication"],
|
|
@@ -44,90 +44,110 @@ HELP = {
|
|
|
44
44
|
{
|
|
45
45
|
"name": "Interactive Shell",
|
|
46
46
|
"args": [],
|
|
47
|
-
"desc": "Get interactive SYSTEM shell (default behavior)"
|
|
47
|
+
"desc": "Get interactive SYSTEM shell (default behavior)",
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
"name": "Execute Single Command",
|
|
51
51
|
"args": ["whoami"],
|
|
52
|
-
"desc": "Execute single command and exit (replace 'whoami' with your command)"
|
|
52
|
+
"desc": "Execute single command and exit (replace 'whoami' with your command)",
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"name": "Execute and Save Output",
|
|
56
56
|
"args": ["cmd.exe", "/c", "dir C:\\ > C:\\output.txt"],
|
|
57
|
-
"desc": "Run command and save output to file"
|
|
58
|
-
}
|
|
57
|
+
"desc": "Run command and save output to file",
|
|
58
|
+
},
|
|
59
59
|
],
|
|
60
60
|
"authentication": [
|
|
61
61
|
{
|
|
62
62
|
"name": "Pass-the-Hash (NTLM)",
|
|
63
63
|
"args": ["-hashes", ":<ntlm_hash>"],
|
|
64
|
-
"desc": "Authenticate with NTLM hash instead of password"
|
|
64
|
+
"desc": "Authenticate with NTLM hash instead of password",
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
"name": "Pass-the-Hash + Execute Command",
|
|
68
68
|
"args": ["-hashes", ":<ntlm_hash>", "whoami"],
|
|
69
|
-
"desc": "Use hash authentication and run command"
|
|
69
|
+
"desc": "Use hash authentication and run command",
|
|
70
70
|
},
|
|
71
71
|
{
|
|
72
72
|
"name": "Kerberos Authentication",
|
|
73
73
|
"args": ["-k", "-no-pass"],
|
|
74
|
-
"desc": "Use Kerberos ticket for authentication"
|
|
75
|
-
}
|
|
76
|
-
]
|
|
74
|
+
"desc": "Use Kerberos ticket for authentication",
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
77
|
},
|
|
78
|
-
"presets": []
|
|
78
|
+
"presets": [],
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
# Flatten presets
|
|
82
|
-
for category_presets in HELP[
|
|
83
|
-
HELP[
|
|
82
|
+
for category_presets in HELP["preset_categories"].values():
|
|
83
|
+
HELP["presets"].extend(category_presets)
|
|
84
84
|
|
|
85
85
|
HELP["help_sections"] = [
|
|
86
86
|
{
|
|
87
87
|
"title": "What is psexec?",
|
|
88
88
|
"color": "cyan",
|
|
89
89
|
"content": [
|
|
90
|
-
{
|
|
91
|
-
|
|
92
|
-
"
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
"
|
|
96
|
-
|
|
97
|
-
|
|
90
|
+
{
|
|
91
|
+
"title": "Overview",
|
|
92
|
+
"desc": "psexec provides remote command execution on Windows systems using SMB and named pipes, similar to Sysinternals PsExec, executing commands with SYSTEM privileges.",
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"title": "Use Cases",
|
|
96
|
+
"desc": "Remote command execution and lateral movement",
|
|
97
|
+
"tips": [
|
|
98
|
+
"Execute commands with SYSTEM privileges",
|
|
99
|
+
"Get interactive shells on Windows hosts",
|
|
100
|
+
"Run post-exploitation scripts remotely",
|
|
101
|
+
"Pivot through compromised systems",
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
],
|
|
98
105
|
},
|
|
99
106
|
{
|
|
100
107
|
"title": "How to Use",
|
|
101
108
|
"color": "green",
|
|
102
109
|
"content": [
|
|
103
|
-
{
|
|
104
|
-
|
|
105
|
-
"
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
"
|
|
109
|
-
|
|
110
|
-
|
|
110
|
+
{
|
|
111
|
+
"title": "Basic Workflow",
|
|
112
|
+
"desc": "1. Obtain admin credentials or hashes\n 2. Connect to target with psexec\n 3. Execute commands or get interactive shell\n 4. Run post-exploitation tasks",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"title": "Key Options",
|
|
116
|
+
"desc": "Essential psexec parameters",
|
|
117
|
+
"tips": [
|
|
118
|
+
"Basic: psexec user:pass@host",
|
|
119
|
+
"Pass-the-hash: psexec -hashes :ntlm_hash user@host",
|
|
120
|
+
"Execute command: psexec user:pass@host whoami",
|
|
121
|
+
"Interactive shell: psexec user:pass@host (default)",
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
],
|
|
111
125
|
},
|
|
112
126
|
{
|
|
113
127
|
"title": "Tips & Best Practices",
|
|
114
128
|
"color": "yellow",
|
|
115
129
|
"content": [
|
|
116
|
-
(
|
|
117
|
-
"
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
"
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
130
|
+
(
|
|
131
|
+
"Best Practices:",
|
|
132
|
+
[
|
|
133
|
+
"Requires admin credentials or hashes",
|
|
134
|
+
"Less stealthy (creates service on target)",
|
|
135
|
+
"Works even if PowerShell is disabled",
|
|
136
|
+
"Can use pass-the-hash with -hashes",
|
|
137
|
+
"SYSTEM-level access by default",
|
|
138
|
+
],
|
|
139
|
+
),
|
|
140
|
+
(
|
|
141
|
+
"Common Issues:",
|
|
142
|
+
[
|
|
143
|
+
"Access denied: Verify admin credentials",
|
|
144
|
+
"Service creation failed: Check admin rights",
|
|
145
|
+
"Connection timeout: Verify SMB (445) is open",
|
|
146
|
+
"Antivirus blocks: Use alternative exec methods (wmiexec, smbexec)",
|
|
147
|
+
],
|
|
148
|
+
),
|
|
149
|
+
],
|
|
150
|
+
},
|
|
131
151
|
]
|
|
132
152
|
|
|
133
153
|
|
|
@@ -137,23 +157,23 @@ class ImpacketPsexecPlugin(PluginBase):
|
|
|
137
157
|
category = "lateral_movement"
|
|
138
158
|
HELP = HELP
|
|
139
159
|
|
|
140
|
-
|
|
141
|
-
|
|
160
|
+
def build_command(
|
|
161
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
162
|
+
):
|
|
142
163
|
"""Build command for background execution with PID tracking."""
|
|
143
164
|
args = args or []
|
|
144
|
-
|
|
165
|
+
|
|
145
166
|
# Replace <target> placeholder
|
|
146
167
|
args = [arg.replace("<target>", target) for arg in args]
|
|
147
|
-
|
|
168
|
+
|
|
148
169
|
# Build command (args should include credentials)
|
|
149
170
|
cmd = ["impacket-psexec"] + args
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
'cmd': cmd,
|
|
153
|
-
'timeout': 1800
|
|
154
|
-
}
|
|
155
171
|
|
|
156
|
-
|
|
172
|
+
return {"cmd": cmd, "timeout": 1800}
|
|
173
|
+
|
|
174
|
+
def run(
|
|
175
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
176
|
+
) -> int:
|
|
157
177
|
"""Execute impacket-psexec and write output to log_path."""
|
|
158
178
|
|
|
159
179
|
args = args or []
|
|
@@ -181,17 +201,15 @@ class ImpacketPsexecPlugin(PluginBase):
|
|
|
181
201
|
fh.write(f"Target: {target}\n")
|
|
182
202
|
fh.write(f"Args: {args}\n")
|
|
183
203
|
fh.write(f"Label: {label}\n")
|
|
184
|
-
fh.write(
|
|
204
|
+
fh.write(
|
|
205
|
+
f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
|
|
206
|
+
)
|
|
185
207
|
fh.write(f"Command: {' '.join(cmd)}\n\n")
|
|
186
208
|
|
|
187
209
|
# Run psexec (non-interactive)
|
|
188
210
|
# Note: For interactive shells, this would need special handling
|
|
189
211
|
proc = subprocess.run(
|
|
190
|
-
cmd,
|
|
191
|
-
capture_output=True,
|
|
192
|
-
timeout=60,
|
|
193
|
-
check=False,
|
|
194
|
-
text=True
|
|
212
|
+
cmd, capture_output=True, timeout=60, check=False, text=True
|
|
195
213
|
)
|
|
196
214
|
|
|
197
215
|
# Write output
|
|
@@ -202,7 +220,9 @@ class ImpacketPsexecPlugin(PluginBase):
|
|
|
202
220
|
if proc.stderr:
|
|
203
221
|
fh.write(f"\n\n# Error output:\n{proc.stderr}\n")
|
|
204
222
|
|
|
205
|
-
fh.write(
|
|
223
|
+
fh.write(
|
|
224
|
+
f"\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
|
|
225
|
+
)
|
|
206
226
|
fh.write(f"Exit Code: {proc.returncode}\n")
|
|
207
227
|
|
|
208
228
|
return proc.returncode
|