souleyez 2.43.29__py3-none-any.whl → 3.0.0__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 +9564 -2881
- 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 +564 -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 +409 -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 +417 -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 +913 -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 +219 -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 +237 -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 +23034 -10679
- 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-3.0.0.dist-info}/METADATA +2 -2
- souleyez-3.0.0.dist-info/RECORD +443 -0
- {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/WHEEL +1 -1
- souleyez-2.43.29.dist-info/RECORD +0 -379
- {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/entry_points.txt +0 -0
- {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/licenses/LICENSE +0 -0
- {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/top_level.txt +0 -0
souleyez/plugins/theharvester.py
CHANGED
|
@@ -29,15 +29,18 @@ HELP = {
|
|
|
29
29
|
"- Respect rate limits and API terms for the public sources you query.\n"
|
|
30
30
|
"- Use findings from theHarvester to feed targeted scans (subdomain -> Nmap -> service checks) or social-engineering risk assessments.\n"
|
|
31
31
|
),
|
|
32
|
-
"usage":
|
|
32
|
+
"usage": 'souleyez jobs enqueue theharvester <domain> --args "-b bing"',
|
|
33
33
|
"examples": [
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
'souleyez jobs enqueue theharvester example.com --args "-b bing"',
|
|
35
|
+
'souleyez jobs enqueue theharvester example.com --args "-b certspotter,crtsh"',
|
|
36
|
+
'souleyez jobs enqueue theharvester example.com --args "-b duckduckgo -l 200"',
|
|
37
|
+
'souleyez jobs enqueue theharvester example.com --args "-b hackertarget,virustotal"',
|
|
38
38
|
],
|
|
39
39
|
"flags": [
|
|
40
|
-
[
|
|
40
|
+
[
|
|
41
|
+
"-b <source>",
|
|
42
|
+
"Data source (bing, duckduckgo, yahoo, certspotter, crtsh, dnsdumpster, hackertarget, etc.)",
|
|
43
|
+
],
|
|
41
44
|
["-l <limit>", "Limit results (default 500)"],
|
|
42
45
|
["-s <start>", "Start at result number X"],
|
|
43
46
|
["-f <file>", "Save results to HTML/XML file"],
|
|
@@ -47,93 +50,140 @@ HELP = {
|
|
|
47
50
|
{
|
|
48
51
|
"name": "Bing Search",
|
|
49
52
|
"args": ["-b", "bing", "-l", "500"],
|
|
50
|
-
"desc": "Search Bing for emails/subdomains/hosts"
|
|
53
|
+
"desc": "Search Bing for emails/subdomains/hosts",
|
|
51
54
|
},
|
|
52
55
|
{
|
|
53
56
|
"name": "DuckDuckGo Search",
|
|
54
57
|
"args": ["-b", "duckduckgo", "-l", "500"],
|
|
55
|
-
"desc": "Search DuckDuckGo for emails/subdomains/hosts"
|
|
58
|
+
"desc": "Search DuckDuckGo for emails/subdomains/hosts",
|
|
56
59
|
},
|
|
57
60
|
{
|
|
58
61
|
"name": "URLScan Search",
|
|
59
62
|
"args": ["-b", "urlscan", "-l", "500"],
|
|
60
|
-
"desc": "Search URLScan.io for URLs/subdomains/hosts"
|
|
63
|
+
"desc": "Search URLScan.io for URLs/subdomains/hosts",
|
|
61
64
|
},
|
|
62
65
|
{
|
|
63
66
|
"name": "Quick Search",
|
|
64
67
|
"args": ["-b", "bing,yahoo", "-l", "100"],
|
|
65
|
-
"desc": "Quick search engine scan (100 results)"
|
|
66
|
-
}
|
|
68
|
+
"desc": "Quick search engine scan (100 results)",
|
|
69
|
+
},
|
|
67
70
|
],
|
|
68
71
|
"passive_sources": [
|
|
69
72
|
{
|
|
70
73
|
"name": "Certificate Logs",
|
|
71
74
|
"args": ["-b", "certspotter,crtsh"],
|
|
72
|
-
"desc": "Certificate transparency logs (subdomains)"
|
|
75
|
+
"desc": "Certificate transparency logs (subdomains)",
|
|
73
76
|
},
|
|
74
77
|
{
|
|
75
78
|
"name": "Comprehensive Passive",
|
|
76
|
-
"args": [
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
79
|
+
"args": [
|
|
80
|
+
"-b",
|
|
81
|
+
"certspotter,crtsh,dnsdumpster,hackertarget,otx,virustotal",
|
|
82
|
+
],
|
|
83
|
+
"desc": "All passive sources (no active queries)",
|
|
84
|
+
},
|
|
85
|
+
],
|
|
80
86
|
},
|
|
81
87
|
"presets": [
|
|
82
88
|
# Flattened list for backward compatibility
|
|
83
|
-
{
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
{
|
|
89
|
+
{
|
|
90
|
+
"name": "Bing Search",
|
|
91
|
+
"args": ["-b", "bing", "-l", "500"],
|
|
92
|
+
"desc": "Search Bing for emails/subdomains/hosts",
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "DuckDuckGo Search",
|
|
96
|
+
"args": ["-b", "duckduckgo", "-l", "500"],
|
|
97
|
+
"desc": "Search DuckDuckGo for emails/subdomains/hosts",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "URLScan Search",
|
|
101
|
+
"args": ["-b", "urlscan", "-l", "500"],
|
|
102
|
+
"desc": "Search URLScan.io for URLs/subdomains/hosts",
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"name": "Quick Search",
|
|
106
|
+
"args": ["-b", "bing,yahoo", "-l", "100"],
|
|
107
|
+
"desc": "Quick search engine scan (100 results)",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "Certificate Logs",
|
|
111
|
+
"args": ["-b", "certspotter,crtsh"],
|
|
112
|
+
"desc": "Certificate transparency logs (subdomains)",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"name": "Comprehensive Passive",
|
|
116
|
+
"args": ["-b", "certspotter,crtsh,dnsdumpster,hackertarget,otx,virustotal"],
|
|
117
|
+
"desc": "All passive sources (no active queries)",
|
|
118
|
+
},
|
|
89
119
|
],
|
|
90
120
|
"help_sections": [
|
|
91
121
|
{
|
|
92
122
|
"title": "What is theHarvester?",
|
|
93
123
|
"color": "cyan",
|
|
94
124
|
"content": [
|
|
95
|
-
{
|
|
96
|
-
|
|
97
|
-
"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
|
|
104
|
-
|
|
125
|
+
{
|
|
126
|
+
"title": "Overview",
|
|
127
|
+
"desc": "theHarvester aggregates email addresses, subdomains, hostnames, and employee names from public sources to build reconnaissance snapshots for external attack surface mapping.",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"title": "Use Cases",
|
|
131
|
+
"desc": "Perfect for initial OSINT reconnaissance and collecting leads before deeper testing.",
|
|
132
|
+
"tips": [
|
|
133
|
+
"Email harvesting and subdomain discovery",
|
|
134
|
+
"Hostname collection and employee name gathering",
|
|
135
|
+
"Combine output with DNS, CT logs, and certificate data for better coverage",
|
|
136
|
+
"Save results (CSV/JSON) to job log for importing into Findings or follow-up scans",
|
|
137
|
+
"Feed targeted scans (subdomain → Nmap → service checks) or social-engineering assessments",
|
|
138
|
+
"Respect rate limits and API terms for public sources you query",
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
],
|
|
105
142
|
},
|
|
106
143
|
{
|
|
107
144
|
"title": "How to Use",
|
|
108
145
|
"color": "green",
|
|
109
146
|
"content": [
|
|
110
|
-
{
|
|
111
|
-
|
|
112
|
-
"
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
147
|
+
{
|
|
148
|
+
"title": "Basic Workflow",
|
|
149
|
+
"desc": "1. Select a domain to investigate\n 2. Choose a data source (active or passive)\n 3. Review results and add to job log\n 4. Import findings into engagement",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"title": "Data Sources",
|
|
153
|
+
"desc": "Active sources query search engines directly, passive sources use archived data",
|
|
154
|
+
"tips": [
|
|
155
|
+
"Bing/DuckDuckGo: Good for email addresses",
|
|
156
|
+
"Certificate Logs: Best for subdomain discovery",
|
|
157
|
+
"Comprehensive Passive: Broadest coverage without active queries",
|
|
158
|
+
],
|
|
159
|
+
},
|
|
160
|
+
],
|
|
117
161
|
},
|
|
118
162
|
{
|
|
119
163
|
"title": "Tips & Best Practices",
|
|
120
164
|
"color": "yellow",
|
|
121
165
|
"content": [
|
|
122
|
-
(
|
|
123
|
-
"
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
166
|
+
(
|
|
167
|
+
"Best Practices:",
|
|
168
|
+
[
|
|
169
|
+
"Start with passive sources to avoid detection",
|
|
170
|
+
"Use comprehensive passive for maximum subdomain coverage",
|
|
171
|
+
"Save results to job log for later analysis",
|
|
172
|
+
"Respect rate limits and API terms",
|
|
173
|
+
"Combine with DNS enumeration for complete coverage",
|
|
174
|
+
],
|
|
175
|
+
),
|
|
176
|
+
(
|
|
177
|
+
"Common Issues:",
|
|
178
|
+
[
|
|
179
|
+
"Rate limiting: Switch to passive sources or reduce query frequency",
|
|
180
|
+
"No results: Try different data sources or verify domain is valid",
|
|
181
|
+
"API errors: Check internet connectivity and source availability",
|
|
182
|
+
],
|
|
183
|
+
),
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
],
|
|
137
187
|
}
|
|
138
188
|
|
|
139
189
|
|
|
@@ -143,29 +193,29 @@ class TheHarvesterPlugin(PluginBase):
|
|
|
143
193
|
category = "reconnaissance"
|
|
144
194
|
HELP = HELP
|
|
145
195
|
|
|
146
|
-
|
|
147
|
-
|
|
196
|
+
def build_command(
|
|
197
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
198
|
+
):
|
|
148
199
|
"""Build command for background execution with PID tracking."""
|
|
149
200
|
args = args or []
|
|
150
|
-
|
|
201
|
+
|
|
151
202
|
# Validate hostname
|
|
152
203
|
try:
|
|
153
204
|
target = validate_hostname(target)
|
|
154
205
|
except ValidationError as e:
|
|
155
206
|
if log_path:
|
|
156
|
-
with open(log_path,
|
|
207
|
+
with open(log_path, "w") as f:
|
|
157
208
|
f.write(f"ERROR: Invalid domain: {e}\n")
|
|
158
209
|
return None
|
|
159
|
-
|
|
210
|
+
|
|
160
211
|
# theHarvester uses -d for domain
|
|
161
212
|
cmd = ["theHarvester", "-d", target] + args
|
|
162
|
-
|
|
163
|
-
return {
|
|
164
|
-
'cmd': cmd,
|
|
165
|
-
'timeout': 1800
|
|
166
|
-
}
|
|
167
213
|
|
|
168
|
-
|
|
214
|
+
return {"cmd": cmd, "timeout": 1800}
|
|
215
|
+
|
|
216
|
+
def run(
|
|
217
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
218
|
+
) -> int:
|
|
169
219
|
"""
|
|
170
220
|
Execute theHarvester scan and write output to log_path.
|
|
171
221
|
|
|
@@ -183,11 +233,11 @@ class TheHarvesterPlugin(PluginBase):
|
|
|
183
233
|
target = validate_hostname(target)
|
|
184
234
|
except ValidationError as e:
|
|
185
235
|
if log_path:
|
|
186
|
-
with open(log_path,
|
|
236
|
+
with open(log_path, "w") as f:
|
|
187
237
|
f.write(f"ERROR: Invalid domain: {e}\n")
|
|
188
238
|
return 1
|
|
189
239
|
raise ValueError(f"Invalid domain: {e}")
|
|
190
|
-
|
|
240
|
+
|
|
191
241
|
args = args or []
|
|
192
242
|
|
|
193
243
|
# Build theHarvester command
|
|
@@ -197,7 +247,9 @@ class TheHarvesterPlugin(PluginBase):
|
|
|
197
247
|
if not log_path:
|
|
198
248
|
# Fallback for direct calls
|
|
199
249
|
try:
|
|
200
|
-
proc = subprocess.run(
|
|
250
|
+
proc = subprocess.run(
|
|
251
|
+
cmd, capture_output=True, timeout=300, check=False
|
|
252
|
+
)
|
|
201
253
|
return proc.returncode
|
|
202
254
|
except Exception:
|
|
203
255
|
return 1
|
|
@@ -206,18 +258,18 @@ class TheHarvesterPlugin(PluginBase):
|
|
|
206
258
|
try:
|
|
207
259
|
with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
|
|
208
260
|
fh.write(f"Command: {' '.join(cmd)}\n")
|
|
209
|
-
fh.write(
|
|
261
|
+
fh.write(
|
|
262
|
+
f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n\n"
|
|
263
|
+
)
|
|
210
264
|
fh.flush()
|
|
211
265
|
|
|
212
266
|
proc = subprocess.run(
|
|
213
|
-
cmd,
|
|
214
|
-
stdout=fh,
|
|
215
|
-
stderr=subprocess.STDOUT,
|
|
216
|
-
timeout=300,
|
|
217
|
-
check=False
|
|
267
|
+
cmd, stdout=fh, stderr=subprocess.STDOUT, timeout=300, check=False
|
|
218
268
|
)
|
|
219
269
|
|
|
220
|
-
fh.write(
|
|
270
|
+
fh.write(
|
|
271
|
+
f"\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
|
|
272
|
+
)
|
|
221
273
|
fh.write(f"Exit Code: {proc.returncode}\n")
|
|
222
274
|
|
|
223
275
|
return proc.returncode
|
souleyez/plugins/tr069.py
CHANGED
|
@@ -33,7 +33,7 @@ HELP = {
|
|
|
33
33
|
"examples": [
|
|
34
34
|
"souleyez jobs enqueue tr069 192.168.1.1",
|
|
35
35
|
"souleyez jobs enqueue tr069 192.168.1.0/24",
|
|
36
|
-
|
|
36
|
+
'souleyez jobs enqueue tr069 10.0.0.1 --args "--deep"',
|
|
37
37
|
],
|
|
38
38
|
"flags": [
|
|
39
39
|
["--deep", "Extended enumeration with HTTP probing"],
|
|
@@ -41,37 +41,52 @@ HELP = {
|
|
|
41
41
|
],
|
|
42
42
|
"presets": [
|
|
43
43
|
{"name": "Quick Detection", "args": [], "desc": "Fast TR-069 port detection"},
|
|
44
|
-
{
|
|
44
|
+
{
|
|
45
|
+
"name": "Deep Enumeration",
|
|
46
|
+
"args": ["--deep"],
|
|
47
|
+
"desc": "Full HTTP enumeration of TR-069",
|
|
48
|
+
},
|
|
45
49
|
],
|
|
46
50
|
"help_sections": [
|
|
47
51
|
{
|
|
48
52
|
"title": "What is TR-069?",
|
|
49
53
|
"color": "cyan",
|
|
50
54
|
"content": [
|
|
51
|
-
{
|
|
52
|
-
|
|
53
|
-
"
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
{
|
|
56
|
+
"title": "Overview",
|
|
57
|
+
"desc": "TR-069 lets ISPs remotely manage your router. It's how they push firmware updates and change settings without physical access.",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"title": "Security Risks",
|
|
61
|
+
"desc": "Why TR-069 can be dangerous",
|
|
62
|
+
"tips": [
|
|
63
|
+
"Often runs as root/admin on the device",
|
|
64
|
+
"May have hardcoded credentials",
|
|
65
|
+
"ACS server URL can be hijacked",
|
|
66
|
+
"Known RCE vulnerabilities in implementations",
|
|
67
|
+
"Can be used to exfiltrate data or install backdoors",
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
],
|
|
60
71
|
},
|
|
61
72
|
{
|
|
62
73
|
"title": "Attack Scenarios",
|
|
63
74
|
"color": "red",
|
|
64
75
|
"content": [
|
|
65
|
-
{
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
{
|
|
77
|
+
"title": "Common Attacks",
|
|
78
|
+
"desc": "How TR-069 gets exploited",
|
|
79
|
+
"tips": [
|
|
80
|
+
"MITM attacks on ACS communication",
|
|
81
|
+
"Exploit known CVEs (Misfortune Cookie, etc.)",
|
|
82
|
+
"Credential bruteforce if auth is weak",
|
|
83
|
+
"DNS hijacking via TR-069 config changes",
|
|
84
|
+
"Firmware downgrade to vulnerable version",
|
|
85
|
+
],
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
],
|
|
75
90
|
}
|
|
76
91
|
|
|
77
92
|
|
|
@@ -81,7 +96,9 @@ class TR069Plugin(PluginBase):
|
|
|
81
96
|
category = "scanning"
|
|
82
97
|
HELP = HELP
|
|
83
98
|
|
|
84
|
-
def build_command(
|
|
99
|
+
def build_command(
|
|
100
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
101
|
+
):
|
|
85
102
|
"""Build nmap command for TR-069 detection."""
|
|
86
103
|
args = args or []
|
|
87
104
|
|
|
@@ -90,79 +107,84 @@ class TR069Plugin(PluginBase):
|
|
|
90
107
|
target = validate_target(target)
|
|
91
108
|
except ValidationError as e:
|
|
92
109
|
if log_path:
|
|
93
|
-
with open(log_path,
|
|
110
|
+
with open(log_path, "w") as f:
|
|
94
111
|
f.write(f"ERROR: Invalid target: {e}\n")
|
|
95
112
|
return None
|
|
96
113
|
|
|
97
114
|
# Base TR-069 ports
|
|
98
|
-
ports =
|
|
115
|
+
ports = "7547,4567,5555,8089" # Common CWMP/TR-069 ports
|
|
99
116
|
|
|
100
117
|
# Determine scan depth
|
|
101
|
-
if
|
|
118
|
+
if "--deep" in args:
|
|
102
119
|
# Deep scan with HTTP enumeration
|
|
103
|
-
scripts =
|
|
120
|
+
scripts = "http-title,http-headers,http-methods,http-server-header"
|
|
104
121
|
cmd = [
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
122
|
+
"nmap",
|
|
123
|
+
"-sV",
|
|
124
|
+
"-p",
|
|
125
|
+
ports,
|
|
126
|
+
"--script",
|
|
127
|
+
scripts,
|
|
128
|
+
"--script-args",
|
|
129
|
+
"http.useragent=CWMP Client",
|
|
130
|
+
"-oN",
|
|
131
|
+
"-",
|
|
132
|
+
"--open",
|
|
133
|
+
"-T4",
|
|
134
|
+
target,
|
|
114
135
|
]
|
|
115
136
|
else:
|
|
116
137
|
# Quick detection
|
|
117
138
|
cmd = [
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
139
|
+
"nmap",
|
|
140
|
+
"-sS",
|
|
141
|
+
"-sV",
|
|
142
|
+
"-p",
|
|
143
|
+
ports,
|
|
144
|
+
"-oN",
|
|
145
|
+
"-",
|
|
146
|
+
"--open",
|
|
147
|
+
"-T4",
|
|
148
|
+
target,
|
|
125
149
|
]
|
|
126
150
|
|
|
127
|
-
return {
|
|
128
|
-
'cmd': cmd,
|
|
129
|
-
'timeout': 600 # 10 minute timeout
|
|
130
|
-
}
|
|
151
|
+
return {"cmd": cmd, "timeout": 600} # 10 minute timeout
|
|
131
152
|
|
|
132
|
-
def run(
|
|
153
|
+
def run(
|
|
154
|
+
self, target: str, args: List[str] = None, label: str = "", log_path: str = None
|
|
155
|
+
) -> int:
|
|
133
156
|
"""Execute TR-069 detection."""
|
|
134
157
|
cmd_spec = self.build_command(target, args, label, log_path)
|
|
135
158
|
if cmd_spec is None:
|
|
136
159
|
return 1
|
|
137
160
|
|
|
138
|
-
cmd = cmd_spec[
|
|
161
|
+
cmd = cmd_spec["cmd"]
|
|
139
162
|
|
|
140
163
|
if log_path:
|
|
141
|
-
with open(log_path,
|
|
164
|
+
with open(log_path, "w") as f:
|
|
142
165
|
f.write(f"# TR-069/CWMP Detection on {target}\n")
|
|
143
166
|
f.write(f"# Command: {' '.join(cmd)}\n")
|
|
144
167
|
f.write(f"# Started: {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n")
|
|
145
|
-
f.write(
|
|
168
|
+
f.write(
|
|
169
|
+
"# TR-069 (Technical Report 069) is used by ISPs for remote router management\n"
|
|
170
|
+
)
|
|
146
171
|
f.write("# Common ports: 7547 (primary), 4567, 5555, 8089\n\n")
|
|
147
172
|
|
|
148
173
|
try:
|
|
149
|
-
with open(log_path,
|
|
174
|
+
with open(log_path, "a") as f:
|
|
150
175
|
result = subprocess.run(
|
|
151
|
-
cmd,
|
|
152
|
-
stdout=f,
|
|
153
|
-
stderr=subprocess.STDOUT,
|
|
154
|
-
timeout=cmd_spec['timeout']
|
|
176
|
+
cmd, stdout=f, stderr=subprocess.STDOUT, timeout=cmd_spec["timeout"]
|
|
155
177
|
)
|
|
156
178
|
return result.returncode
|
|
157
179
|
|
|
158
180
|
except subprocess.TimeoutExpired:
|
|
159
181
|
if log_path:
|
|
160
|
-
with open(log_path,
|
|
182
|
+
with open(log_path, "a") as f:
|
|
161
183
|
f.write("\n\n# ERROR: Scan timed out\n")
|
|
162
184
|
return 124
|
|
163
185
|
except Exception as e:
|
|
164
186
|
if log_path:
|
|
165
|
-
with open(log_path,
|
|
187
|
+
with open(log_path, "a") as f:
|
|
166
188
|
f.write(f"\n\n# ERROR: {e}\n")
|
|
167
189
|
return 1
|
|
168
190
|
|