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
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
souleyez.plugins.kerbrute - Kerberos username enumeration and password spraying
|
|
4
|
+
"""
|
|
5
|
+
import subprocess
|
|
6
|
+
import time
|
|
7
|
+
from typing import List
|
|
8
|
+
|
|
9
|
+
from .plugin_base import PluginBase
|
|
10
|
+
|
|
11
|
+
HELP = {
|
|
12
|
+
"name": "Kerbrute - Kerberos User Enumeration",
|
|
13
|
+
"description": (
|
|
14
|
+
"Need to enumerate Active Directory usernames?\n\n"
|
|
15
|
+
"Kerbrute uses Kerberos pre-authentication to enumerate valid usernames "
|
|
16
|
+
"and perform password spraying attacks. Unlike LDAP enumeration, it works "
|
|
17
|
+
"even when anonymous binds are disabled.\n\n"
|
|
18
|
+
"Use Kerbrute when:\n"
|
|
19
|
+
"- Anonymous LDAP enumeration is blocked\n"
|
|
20
|
+
"- You need to find valid AD usernames\n"
|
|
21
|
+
"- You want to password spray without lockouts\n"
|
|
22
|
+
"- enum4linux/RID cycling fails with ACCESS_DENIED\n\n"
|
|
23
|
+
"Quick tips:\n"
|
|
24
|
+
"- Uses Kerberos pre-auth responses to identify valid users\n"
|
|
25
|
+
"- Faster than LDAP enumeration\n"
|
|
26
|
+
"- Works without any credentials\n"
|
|
27
|
+
"- Can also perform password spraying\n"
|
|
28
|
+
),
|
|
29
|
+
"usage": 'souleyez jobs enqueue kerbrute <target> --args "userenum -d <domain> --dc <dc_ip> <userlist>"',
|
|
30
|
+
"examples": [
|
|
31
|
+
'souleyez jobs enqueue kerbrute 10.0.0.82 --args "userenum -d CONTOSO.LOCAL --dc 10.0.0.82 users.txt"',
|
|
32
|
+
'souleyez jobs enqueue kerbrute 10.0.0.82 --args "passwordspray -d CONTOSO.LOCAL --dc 10.0.0.82 users.txt Password123"',
|
|
33
|
+
'souleyez jobs enqueue kerbrute 10.0.0.82 --args "userenum -d CONTOSO.LOCAL users.txt"',
|
|
34
|
+
],
|
|
35
|
+
"flags": [
|
|
36
|
+
["userenum", "Enumerate valid usernames via Kerberos"],
|
|
37
|
+
["passwordspray", "Spray a password against user list"],
|
|
38
|
+
["bruteuser", "Brute force a single user's password"],
|
|
39
|
+
["-d <domain>", "Domain name (e.g., CONTOSO.LOCAL)"],
|
|
40
|
+
["--dc <ip>", "Domain Controller IP address"],
|
|
41
|
+
["-t <threads>", "Number of threads (default: 10)"],
|
|
42
|
+
["-o <file>", "Output file for valid users"],
|
|
43
|
+
],
|
|
44
|
+
"preset_categories": {
|
|
45
|
+
"enumeration": [
|
|
46
|
+
{
|
|
47
|
+
"name": "Username Enumeration",
|
|
48
|
+
"args": [
|
|
49
|
+
"userenum",
|
|
50
|
+
"-d",
|
|
51
|
+
"<domain>",
|
|
52
|
+
"--dc",
|
|
53
|
+
"<target>",
|
|
54
|
+
"data/wordlists/ad_users.txt",
|
|
55
|
+
],
|
|
56
|
+
"desc": "Enumerate valid AD usernames via Kerberos",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "Fast Username Enum",
|
|
60
|
+
"args": [
|
|
61
|
+
"userenum",
|
|
62
|
+
"-d",
|
|
63
|
+
"<domain>",
|
|
64
|
+
"--dc",
|
|
65
|
+
"<target>",
|
|
66
|
+
"-t",
|
|
67
|
+
"50",
|
|
68
|
+
"data/wordlists/ad_users.txt",
|
|
69
|
+
],
|
|
70
|
+
"desc": "Fast enumeration with 50 threads",
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
"spraying": [
|
|
74
|
+
{
|
|
75
|
+
"name": "Password Spray",
|
|
76
|
+
"args": [
|
|
77
|
+
"passwordspray",
|
|
78
|
+
"-d",
|
|
79
|
+
"<domain>",
|
|
80
|
+
"--dc",
|
|
81
|
+
"<target>",
|
|
82
|
+
"users.txt",
|
|
83
|
+
"<password>",
|
|
84
|
+
],
|
|
85
|
+
"desc": "Spray single password against user list",
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
"presets": [],
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# Flatten presets
|
|
93
|
+
for category_presets in HELP["preset_categories"].values():
|
|
94
|
+
HELP["presets"].extend(category_presets)
|
|
95
|
+
|
|
96
|
+
HELP["help_sections"] = [
|
|
97
|
+
{
|
|
98
|
+
"title": "What is Kerbrute?",
|
|
99
|
+
"color": "cyan",
|
|
100
|
+
"content": [
|
|
101
|
+
{
|
|
102
|
+
"title": "Overview",
|
|
103
|
+
"desc": "Kerbrute uses Kerberos pre-authentication to enumerate valid usernames and perform password attacks without triggering account lockouts.",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"title": "Use Cases",
|
|
107
|
+
"desc": "Enumerate AD users when LDAP is restricted",
|
|
108
|
+
"tips": [
|
|
109
|
+
"Find valid usernames when anonymous LDAP is blocked",
|
|
110
|
+
"Faster than RID cycling or LDAP enumeration",
|
|
111
|
+
"Password spray without lockouts (by default)",
|
|
112
|
+
"Works without any credentials",
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"title": "How to Use",
|
|
119
|
+
"color": "green",
|
|
120
|
+
"content": [
|
|
121
|
+
{
|
|
122
|
+
"title": "Basic Workflow",
|
|
123
|
+
"desc": "1. Run userenum with username wordlist\n 2. Collect valid usernames\n 3. Optionally password spray\n 4. Use valid credentials for access",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"title": "Key Commands",
|
|
127
|
+
"desc": "Essential Kerbrute modes",
|
|
128
|
+
"tips": [
|
|
129
|
+
"userenum: Find valid usernames",
|
|
130
|
+
"passwordspray: Test one password against many users",
|
|
131
|
+
"bruteuser: Brute force single user",
|
|
132
|
+
"-d: Specify domain name",
|
|
133
|
+
"--dc: Domain Controller IP",
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
]
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class KerbrutePlugin(PluginBase):
|
|
142
|
+
name = "Kerbrute"
|
|
143
|
+
tool = "kerbrute"
|
|
144
|
+
category = "credential_access"
|
|
145
|
+
HELP = HELP
|
|
146
|
+
|
|
147
|
+
def build_command(
|
|
148
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
149
|
+
):
|
|
150
|
+
"""Build command for background execution with PID tracking."""
|
|
151
|
+
args = args or []
|
|
152
|
+
|
|
153
|
+
# Replace placeholders
|
|
154
|
+
args = [arg.replace("<target>", target) for arg in args]
|
|
155
|
+
|
|
156
|
+
# Build command
|
|
157
|
+
cmd = ["kerbrute"]
|
|
158
|
+
cmd.extend(args)
|
|
159
|
+
|
|
160
|
+
return {"cmd": cmd, "timeout": 1800}
|
|
161
|
+
|
|
162
|
+
def run(
|
|
163
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
164
|
+
) -> int:
|
|
165
|
+
"""Execute kerbrute and write output to log_path."""
|
|
166
|
+
|
|
167
|
+
args = args or []
|
|
168
|
+
|
|
169
|
+
# Replace placeholders
|
|
170
|
+
args = [arg.replace("<target>", target) for arg in args]
|
|
171
|
+
|
|
172
|
+
# Build command
|
|
173
|
+
cmd = ["kerbrute"]
|
|
174
|
+
cmd.extend(args)
|
|
175
|
+
|
|
176
|
+
if not log_path:
|
|
177
|
+
try:
|
|
178
|
+
proc = subprocess.run(
|
|
179
|
+
cmd, capture_output=True, timeout=600, check=False
|
|
180
|
+
)
|
|
181
|
+
return proc.returncode
|
|
182
|
+
except Exception:
|
|
183
|
+
return 1
|
|
184
|
+
|
|
185
|
+
try:
|
|
186
|
+
# Create metadata header
|
|
187
|
+
with open(log_path, "w", encoding="utf-8", errors="replace") as fh:
|
|
188
|
+
fh.write(f"=== Plugin: Kerbrute ===\n")
|
|
189
|
+
fh.write(f"Target: {target}\n")
|
|
190
|
+
fh.write(f"Args: {args}\n")
|
|
191
|
+
fh.write(f"Label: {label}\n")
|
|
192
|
+
fh.write(
|
|
193
|
+
f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
|
|
194
|
+
)
|
|
195
|
+
fh.write(f"Command: {' '.join(cmd)}\n\n")
|
|
196
|
+
|
|
197
|
+
# Run kerbrute
|
|
198
|
+
proc = subprocess.run(
|
|
199
|
+
cmd, capture_output=True, timeout=600, check=False, text=True
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# Write output
|
|
203
|
+
with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
|
|
204
|
+
if proc.stdout:
|
|
205
|
+
fh.write(proc.stdout)
|
|
206
|
+
|
|
207
|
+
if proc.stderr:
|
|
208
|
+
fh.write(f"\n{proc.stderr}")
|
|
209
|
+
|
|
210
|
+
fh.write(
|
|
211
|
+
f"\n\n=== Completed: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())} ===\n"
|
|
212
|
+
)
|
|
213
|
+
fh.write(f"Exit Code: {proc.returncode}\n")
|
|
214
|
+
|
|
215
|
+
return proc.returncode
|
|
216
|
+
|
|
217
|
+
except subprocess.TimeoutExpired:
|
|
218
|
+
with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
|
|
219
|
+
fh.write("\n\nERROR: Kerbrute timed out after 600 seconds\n")
|
|
220
|
+
return 124
|
|
221
|
+
|
|
222
|
+
except FileNotFoundError:
|
|
223
|
+
with open(log_path, "w", encoding="utf-8", errors="replace") as fh:
|
|
224
|
+
fh.write("ERROR: kerbrute not found in PATH\n")
|
|
225
|
+
fh.write("Install: go install github.com/ropnop/kerbrute@latest\n")
|
|
226
|
+
fh.write(
|
|
227
|
+
"Or download from: https://github.com/ropnop/kerbrute/releases\n"
|
|
228
|
+
)
|
|
229
|
+
return 127
|
|
230
|
+
|
|
231
|
+
except Exception as e:
|
|
232
|
+
with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
|
|
233
|
+
fh.write(f"\n\nERROR: {type(e).__name__}: {e}\n")
|
|
234
|
+
return 1
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
plugin = KerbrutePlugin()
|