souleyez 2.43.28__py3-none-any.whl → 2.43.32__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.
Files changed (356) hide show
  1. souleyez/__init__.py +1 -2
  2. souleyez/ai/__init__.py +21 -15
  3. souleyez/ai/action_mapper.py +249 -150
  4. souleyez/ai/chain_advisor.py +116 -100
  5. souleyez/ai/claude_provider.py +29 -28
  6. souleyez/ai/context_builder.py +80 -62
  7. souleyez/ai/executor.py +158 -117
  8. souleyez/ai/feedback_handler.py +136 -121
  9. souleyez/ai/llm_factory.py +27 -20
  10. souleyez/ai/llm_provider.py +4 -2
  11. souleyez/ai/ollama_provider.py +6 -9
  12. souleyez/ai/ollama_service.py +44 -37
  13. souleyez/ai/path_scorer.py +91 -76
  14. souleyez/ai/recommender.py +176 -144
  15. souleyez/ai/report_context.py +74 -73
  16. souleyez/ai/report_service.py +84 -66
  17. souleyez/ai/result_parser.py +222 -229
  18. souleyez/ai/safety.py +67 -44
  19. souleyez/auth/__init__.py +23 -22
  20. souleyez/auth/audit.py +36 -26
  21. souleyez/auth/engagement_access.py +65 -48
  22. souleyez/auth/permissions.py +14 -3
  23. souleyez/auth/session_manager.py +54 -37
  24. souleyez/auth/user_manager.py +109 -64
  25. souleyez/commands/audit.py +40 -43
  26. souleyez/commands/auth.py +35 -15
  27. souleyez/commands/deliverables.py +55 -50
  28. souleyez/commands/engagement.py +47 -28
  29. souleyez/commands/license.py +32 -23
  30. souleyez/commands/screenshots.py +36 -32
  31. souleyez/commands/user.py +82 -36
  32. souleyez/config.py +52 -44
  33. souleyez/core/credential_tester.py +87 -81
  34. souleyez/core/cve_mappings.py +179 -192
  35. souleyez/core/cve_matcher.py +162 -148
  36. souleyez/core/msf_auto_mapper.py +100 -83
  37. souleyez/core/msf_chain_engine.py +294 -256
  38. souleyez/core/msf_database.py +153 -70
  39. souleyez/core/msf_integration.py +679 -673
  40. souleyez/core/msf_rpc_client.py +40 -42
  41. souleyez/core/msf_rpc_manager.py +77 -79
  42. souleyez/core/msf_sync_manager.py +241 -181
  43. souleyez/core/network_utils.py +22 -15
  44. souleyez/core/parser_handler.py +34 -25
  45. souleyez/core/pending_chains.py +114 -63
  46. souleyez/core/templates.py +158 -107
  47. souleyez/core/tool_chaining.py +9592 -2879
  48. souleyez/core/version_utils.py +79 -94
  49. souleyez/core/vuln_correlation.py +136 -89
  50. souleyez/core/web_utils.py +33 -32
  51. souleyez/data/wordlists/ad_users.txt +378 -0
  52. souleyez/data/wordlists/api_endpoints_large.txt +769 -0
  53. souleyez/data/wordlists/home_dir_sensitive.txt +39 -0
  54. souleyez/data/wordlists/lfi_payloads.txt +82 -0
  55. souleyez/data/wordlists/passwords_brute.txt +1548 -0
  56. souleyez/data/wordlists/passwords_crack.txt +2479 -0
  57. souleyez/data/wordlists/passwords_spray.txt +386 -0
  58. souleyez/data/wordlists/subdomains_large.txt +5057 -0
  59. souleyez/data/wordlists/usernames_common.txt +694 -0
  60. souleyez/data/wordlists/web_dirs_large.txt +4769 -0
  61. souleyez/detection/__init__.py +1 -1
  62. souleyez/detection/attack_signatures.py +12 -17
  63. souleyez/detection/mitre_mappings.py +61 -55
  64. souleyez/detection/validator.py +97 -86
  65. souleyez/devtools.py +23 -10
  66. souleyez/docs/README.md +4 -4
  67. souleyez/docs/api-reference/cli-commands.md +2 -2
  68. souleyez/docs/developer-guide/adding-new-tools.md +562 -0
  69. souleyez/docs/user-guide/auto-chaining.md +30 -8
  70. souleyez/docs/user-guide/getting-started.md +1 -1
  71. souleyez/docs/user-guide/installation.md +26 -3
  72. souleyez/docs/user-guide/metasploit-integration.md +2 -2
  73. souleyez/docs/user-guide/rbac.md +1 -1
  74. souleyez/docs/user-guide/scope-management.md +1 -1
  75. souleyez/docs/user-guide/siem-integration.md +1 -1
  76. souleyez/docs/user-guide/tools-reference.md +1 -8
  77. souleyez/docs/user-guide/worker-management.md +1 -1
  78. souleyez/engine/background.py +1238 -535
  79. souleyez/engine/base.py +4 -1
  80. souleyez/engine/job_status.py +17 -49
  81. souleyez/engine/log_sanitizer.py +103 -77
  82. souleyez/engine/manager.py +38 -7
  83. souleyez/engine/result_handler.py +2198 -1550
  84. souleyez/engine/worker_manager.py +50 -41
  85. souleyez/export/evidence_bundle.py +72 -62
  86. souleyez/feature_flags/features.py +16 -20
  87. souleyez/feature_flags.py +5 -9
  88. souleyez/handlers/__init__.py +11 -0
  89. souleyez/handlers/base.py +188 -0
  90. souleyez/handlers/bash_handler.py +277 -0
  91. souleyez/handlers/bloodhound_handler.py +243 -0
  92. souleyez/handlers/certipy_handler.py +311 -0
  93. souleyez/handlers/crackmapexec_handler.py +486 -0
  94. souleyez/handlers/dnsrecon_handler.py +344 -0
  95. souleyez/handlers/enum4linux_handler.py +400 -0
  96. souleyez/handlers/evil_winrm_handler.py +493 -0
  97. souleyez/handlers/ffuf_handler.py +815 -0
  98. souleyez/handlers/gobuster_handler.py +1114 -0
  99. souleyez/handlers/gpp_extract_handler.py +334 -0
  100. souleyez/handlers/hashcat_handler.py +444 -0
  101. souleyez/handlers/hydra_handler.py +563 -0
  102. souleyez/handlers/impacket_getuserspns_handler.py +343 -0
  103. souleyez/handlers/impacket_psexec_handler.py +222 -0
  104. souleyez/handlers/impacket_secretsdump_handler.py +426 -0
  105. souleyez/handlers/john_handler.py +286 -0
  106. souleyez/handlers/katana_handler.py +425 -0
  107. souleyez/handlers/kerbrute_handler.py +298 -0
  108. souleyez/handlers/ldapsearch_handler.py +636 -0
  109. souleyez/handlers/lfi_extract_handler.py +464 -0
  110. souleyez/handlers/msf_auxiliary_handler.py +408 -0
  111. souleyez/handlers/msf_exploit_handler.py +380 -0
  112. souleyez/handlers/nikto_handler.py +413 -0
  113. souleyez/handlers/nmap_handler.py +821 -0
  114. souleyez/handlers/nuclei_handler.py +359 -0
  115. souleyez/handlers/nxc_handler.py +371 -0
  116. souleyez/handlers/rdp_sec_check_handler.py +353 -0
  117. souleyez/handlers/registry.py +288 -0
  118. souleyez/handlers/responder_handler.py +232 -0
  119. souleyez/handlers/service_explorer_handler.py +434 -0
  120. souleyez/handlers/smbclient_handler.py +344 -0
  121. souleyez/handlers/smbmap_handler.py +510 -0
  122. souleyez/handlers/smbpasswd_handler.py +296 -0
  123. souleyez/handlers/sqlmap_handler.py +1116 -0
  124. souleyez/handlers/theharvester_handler.py +601 -0
  125. souleyez/handlers/whois_handler.py +277 -0
  126. souleyez/handlers/wpscan_handler.py +554 -0
  127. souleyez/history.py +32 -16
  128. souleyez/importers/msf_importer.py +106 -75
  129. souleyez/importers/smart_importer.py +208 -147
  130. souleyez/integrations/siem/__init__.py +10 -10
  131. souleyez/integrations/siem/base.py +17 -18
  132. souleyez/integrations/siem/elastic.py +108 -122
  133. souleyez/integrations/siem/factory.py +207 -80
  134. souleyez/integrations/siem/googlesecops.py +146 -154
  135. souleyez/integrations/siem/rule_mappings/__init__.py +1 -1
  136. souleyez/integrations/siem/rule_mappings/wazuh_rules.py +8 -5
  137. souleyez/integrations/siem/sentinel.py +107 -109
  138. souleyez/integrations/siem/splunk.py +246 -212
  139. souleyez/integrations/siem/wazuh.py +65 -71
  140. souleyez/integrations/wazuh/__init__.py +5 -5
  141. souleyez/integrations/wazuh/client.py +70 -93
  142. souleyez/integrations/wazuh/config.py +85 -57
  143. souleyez/integrations/wazuh/host_mapper.py +28 -36
  144. souleyez/integrations/wazuh/sync.py +78 -68
  145. souleyez/intelligence/__init__.py +4 -5
  146. souleyez/intelligence/correlation_analyzer.py +309 -295
  147. souleyez/intelligence/exploit_knowledge.py +661 -623
  148. souleyez/intelligence/exploit_suggestions.py +159 -139
  149. souleyez/intelligence/gap_analyzer.py +132 -97
  150. souleyez/intelligence/gap_detector.py +251 -214
  151. souleyez/intelligence/sensitive_tables.py +266 -129
  152. souleyez/intelligence/service_parser.py +137 -123
  153. souleyez/intelligence/surface_analyzer.py +407 -268
  154. souleyez/intelligence/target_parser.py +159 -162
  155. souleyez/licensing/__init__.py +6 -6
  156. souleyez/licensing/validator.py +17 -19
  157. souleyez/log_config.py +79 -54
  158. souleyez/main.py +1505 -687
  159. souleyez/migrations/fix_job_counter.py +16 -14
  160. souleyez/parsers/bloodhound_parser.py +41 -39
  161. souleyez/parsers/crackmapexec_parser.py +178 -111
  162. souleyez/parsers/dalfox_parser.py +72 -77
  163. souleyez/parsers/dnsrecon_parser.py +103 -91
  164. souleyez/parsers/enum4linux_parser.py +183 -153
  165. souleyez/parsers/ffuf_parser.py +29 -25
  166. souleyez/parsers/gobuster_parser.py +301 -41
  167. souleyez/parsers/hashcat_parser.py +324 -79
  168. souleyez/parsers/http_fingerprint_parser.py +350 -103
  169. souleyez/parsers/hydra_parser.py +131 -111
  170. souleyez/parsers/impacket_parser.py +231 -178
  171. souleyez/parsers/john_parser.py +98 -86
  172. souleyez/parsers/katana_parser.py +316 -0
  173. souleyez/parsers/msf_parser.py +943 -498
  174. souleyez/parsers/nikto_parser.py +346 -65
  175. souleyez/parsers/nmap_parser.py +262 -174
  176. souleyez/parsers/nuclei_parser.py +40 -44
  177. souleyez/parsers/responder_parser.py +26 -26
  178. souleyez/parsers/searchsploit_parser.py +74 -74
  179. souleyez/parsers/service_explorer_parser.py +279 -0
  180. souleyez/parsers/smbmap_parser.py +180 -124
  181. souleyez/parsers/sqlmap_parser.py +434 -308
  182. souleyez/parsers/theharvester_parser.py +75 -57
  183. souleyez/parsers/whois_parser.py +135 -94
  184. souleyez/parsers/wpscan_parser.py +278 -190
  185. souleyez/plugins/afp.py +44 -36
  186. souleyez/plugins/afp_brute.py +114 -46
  187. souleyez/plugins/ard.py +48 -37
  188. souleyez/plugins/bloodhound.py +95 -61
  189. souleyez/plugins/certipy.py +303 -0
  190. souleyez/plugins/crackmapexec.py +186 -85
  191. souleyez/plugins/dalfox.py +120 -59
  192. souleyez/plugins/dns_hijack.py +146 -41
  193. souleyez/plugins/dnsrecon.py +97 -61
  194. souleyez/plugins/enum4linux.py +91 -66
  195. souleyez/plugins/evil_winrm.py +291 -0
  196. souleyez/plugins/ffuf.py +166 -90
  197. souleyez/plugins/firmware_extract.py +133 -29
  198. souleyez/plugins/gobuster.py +387 -190
  199. souleyez/plugins/gpp_extract.py +393 -0
  200. souleyez/plugins/hashcat.py +100 -73
  201. souleyez/plugins/http_fingerprint.py +854 -267
  202. souleyez/plugins/hydra.py +566 -200
  203. souleyez/plugins/impacket_getnpusers.py +117 -69
  204. souleyez/plugins/impacket_psexec.py +84 -64
  205. souleyez/plugins/impacket_secretsdump.py +103 -69
  206. souleyez/plugins/impacket_smbclient.py +89 -75
  207. souleyez/plugins/john.py +86 -69
  208. souleyez/plugins/katana.py +313 -0
  209. souleyez/plugins/kerbrute.py +237 -0
  210. souleyez/plugins/lfi_extract.py +541 -0
  211. souleyez/plugins/macos_ssh.py +117 -48
  212. souleyez/plugins/mdns.py +35 -30
  213. souleyez/plugins/msf_auxiliary.py +253 -130
  214. souleyez/plugins/msf_exploit.py +239 -161
  215. souleyez/plugins/nikto.py +134 -78
  216. souleyez/plugins/nmap.py +275 -91
  217. souleyez/plugins/nuclei.py +180 -89
  218. souleyez/plugins/nxc.py +285 -0
  219. souleyez/plugins/plugin_base.py +35 -36
  220. souleyez/plugins/plugin_template.py +13 -5
  221. souleyez/plugins/rdp_sec_check.py +130 -0
  222. souleyez/plugins/responder.py +112 -71
  223. souleyez/plugins/router_http_brute.py +76 -65
  224. souleyez/plugins/router_ssh_brute.py +118 -41
  225. souleyez/plugins/router_telnet_brute.py +124 -42
  226. souleyez/plugins/routersploit.py +91 -59
  227. souleyez/plugins/routersploit_exploit.py +77 -55
  228. souleyez/plugins/searchsploit.py +91 -77
  229. souleyez/plugins/service_explorer.py +1160 -0
  230. souleyez/plugins/smbmap.py +122 -72
  231. souleyez/plugins/smbpasswd.py +215 -0
  232. souleyez/plugins/sqlmap.py +301 -113
  233. souleyez/plugins/theharvester.py +127 -75
  234. souleyez/plugins/tr069.py +79 -57
  235. souleyez/plugins/upnp.py +65 -47
  236. souleyez/plugins/upnp_abuse.py +73 -55
  237. souleyez/plugins/vnc_access.py +129 -42
  238. souleyez/plugins/vnc_brute.py +109 -38
  239. souleyez/plugins/whois.py +77 -58
  240. souleyez/plugins/wpscan.py +173 -69
  241. souleyez/reporting/__init__.py +2 -1
  242. souleyez/reporting/attack_chain.py +411 -346
  243. souleyez/reporting/charts.py +436 -501
  244. souleyez/reporting/compliance_mappings.py +334 -201
  245. souleyez/reporting/detection_report.py +126 -125
  246. souleyez/reporting/formatters.py +828 -591
  247. souleyez/reporting/generator.py +386 -302
  248. souleyez/reporting/metrics.py +72 -75
  249. souleyez/scanner.py +35 -29
  250. souleyez/security/__init__.py +37 -11
  251. souleyez/security/scope_validator.py +175 -106
  252. souleyez/security/validation.py +223 -149
  253. souleyez/security.py +22 -6
  254. souleyez/storage/credentials.py +247 -186
  255. souleyez/storage/crypto.py +296 -129
  256. souleyez/storage/database.py +73 -50
  257. souleyez/storage/db.py +58 -36
  258. souleyez/storage/deliverable_evidence.py +177 -128
  259. souleyez/storage/deliverable_exporter.py +282 -246
  260. souleyez/storage/deliverable_templates.py +134 -116
  261. souleyez/storage/deliverables.py +135 -130
  262. souleyez/storage/engagements.py +109 -56
  263. souleyez/storage/evidence.py +181 -152
  264. souleyez/storage/execution_log.py +31 -17
  265. souleyez/storage/exploit_attempts.py +93 -57
  266. souleyez/storage/exploits.py +67 -36
  267. souleyez/storage/findings.py +48 -61
  268. souleyez/storage/hosts.py +176 -144
  269. souleyez/storage/migrate_to_engagements.py +43 -19
  270. souleyez/storage/migrations/_001_add_credential_enhancements.py +22 -12
  271. souleyez/storage/migrations/_002_add_status_tracking.py +10 -7
  272. souleyez/storage/migrations/_003_add_execution_log.py +14 -8
  273. souleyez/storage/migrations/_005_screenshots.py +13 -5
  274. souleyez/storage/migrations/_006_deliverables.py +13 -5
  275. souleyez/storage/migrations/_007_deliverable_templates.py +12 -7
  276. souleyez/storage/migrations/_008_add_nuclei_table.py +10 -4
  277. souleyez/storage/migrations/_010_evidence_linking.py +17 -10
  278. souleyez/storage/migrations/_011_timeline_tracking.py +20 -13
  279. souleyez/storage/migrations/_012_team_collaboration.py +34 -21
  280. souleyez/storage/migrations/_013_add_host_tags.py +12 -6
  281. souleyez/storage/migrations/_014_exploit_attempts.py +22 -10
  282. souleyez/storage/migrations/_015_add_mac_os_fields.py +15 -7
  283. souleyez/storage/migrations/_016_add_domain_field.py +10 -4
  284. souleyez/storage/migrations/_017_msf_sessions.py +16 -8
  285. souleyez/storage/migrations/_018_add_osint_target.py +10 -6
  286. souleyez/storage/migrations/_019_add_engagement_type.py +10 -6
  287. souleyez/storage/migrations/_020_add_rbac.py +36 -15
  288. souleyez/storage/migrations/_021_wazuh_integration.py +20 -8
  289. souleyez/storage/migrations/_022_wazuh_indexer_columns.py +6 -4
  290. souleyez/storage/migrations/_023_fix_detection_results_fk.py +16 -6
  291. souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +26 -10
  292. souleyez/storage/migrations/_025_multi_siem_support.py +3 -5
  293. souleyez/storage/migrations/_026_add_engagement_scope.py +31 -12
  294. souleyez/storage/migrations/_027_multi_siem_persistence.py +32 -15
  295. souleyez/storage/migrations/__init__.py +26 -26
  296. souleyez/storage/migrations/migration_manager.py +19 -19
  297. souleyez/storage/msf_sessions.py +100 -65
  298. souleyez/storage/osint.py +17 -24
  299. souleyez/storage/recommendation_engine.py +269 -235
  300. souleyez/storage/screenshots.py +33 -32
  301. souleyez/storage/smb_shares.py +136 -92
  302. souleyez/storage/sqlmap_data.py +183 -128
  303. souleyez/storage/team_collaboration.py +135 -141
  304. souleyez/storage/timeline_tracker.py +122 -94
  305. souleyez/storage/wazuh_vulns.py +64 -66
  306. souleyez/storage/web_paths.py +33 -37
  307. souleyez/testing/credential_tester.py +221 -205
  308. souleyez/ui/__init__.py +1 -1
  309. souleyez/ui/ai_quotes.py +12 -12
  310. souleyez/ui/attack_surface.py +2439 -1516
  311. souleyez/ui/chain_rules_view.py +914 -382
  312. souleyez/ui/correlation_view.py +312 -230
  313. souleyez/ui/dashboard.py +2382 -1130
  314. souleyez/ui/deliverables_view.py +148 -62
  315. souleyez/ui/design_system.py +13 -13
  316. souleyez/ui/errors.py +49 -49
  317. souleyez/ui/evidence_linking_view.py +284 -179
  318. souleyez/ui/evidence_vault.py +393 -285
  319. souleyez/ui/exploit_suggestions_view.py +555 -349
  320. souleyez/ui/export_view.py +100 -66
  321. souleyez/ui/gap_analysis_view.py +315 -171
  322. souleyez/ui/help_system.py +105 -97
  323. souleyez/ui/intelligence_view.py +436 -293
  324. souleyez/ui/interactive.py +23142 -10430
  325. souleyez/ui/interactive_selector.py +75 -68
  326. souleyez/ui/log_formatter.py +47 -39
  327. souleyez/ui/menu_components.py +22 -13
  328. souleyez/ui/msf_auxiliary_menu.py +184 -133
  329. souleyez/ui/pending_chains_view.py +336 -172
  330. souleyez/ui/progress_indicators.py +5 -3
  331. souleyez/ui/recommendations_view.py +195 -137
  332. souleyez/ui/rule_builder.py +343 -225
  333. souleyez/ui/setup_wizard.py +678 -284
  334. souleyez/ui/shortcuts.py +217 -165
  335. souleyez/ui/splunk_gap_analysis_view.py +452 -270
  336. souleyez/ui/splunk_vulns_view.py +139 -86
  337. souleyez/ui/team_dashboard.py +498 -335
  338. souleyez/ui/template_selector.py +196 -105
  339. souleyez/ui/terminal.py +6 -6
  340. souleyez/ui/timeline_view.py +198 -127
  341. souleyez/ui/tool_setup.py +264 -164
  342. souleyez/ui/tutorial.py +202 -72
  343. souleyez/ui/tutorial_state.py +40 -40
  344. souleyez/ui/wazuh_vulns_view.py +235 -141
  345. souleyez/ui/wordlist_browser.py +260 -107
  346. souleyez/ui.py +464 -312
  347. souleyez/utils/tool_checker.py +427 -367
  348. souleyez/utils.py +33 -29
  349. souleyez/wordlists.py +134 -167
  350. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/METADATA +1 -1
  351. souleyez-2.43.32.dist-info/RECORD +441 -0
  352. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/WHEEL +1 -1
  353. souleyez-2.43.28.dist-info/RECORD +0 -379
  354. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/entry_points.txt +0 -0
  355. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/licenses/LICENSE +0 -0
  356. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/top_level.txt +0 -0
@@ -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": "souleyez jobs enqueue theharvester <domain> --args \"-b bing\"",
32
+ "usage": 'souleyez jobs enqueue theharvester <domain> --args "-b bing"',
33
33
  "examples": [
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\"",
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
- ["-b <source>", "Data source (bing, duckduckgo, yahoo, certspotter, crtsh, dnsdumpster, hackertarget, etc.)"],
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": ["-b", "certspotter,crtsh,dnsdumpster,hackertarget,otx,virustotal"],
77
- "desc": "All passive sources (no active queries)"
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
- {"name": "Bing Search", "args": ["-b", "bing", "-l", "500"], "desc": "Search Bing for emails/subdomains/hosts"},
84
- {"name": "DuckDuckGo Search", "args": ["-b", "duckduckgo", "-l", "500"], "desc": "Search DuckDuckGo for emails/subdomains/hosts"},
85
- {"name": "URLScan Search", "args": ["-b", "urlscan", "-l", "500"], "desc": "Search URLScan.io for URLs/subdomains/hosts"},
86
- {"name": "Quick Search", "args": ["-b", "bing,yahoo", "-l", "100"], "desc": "Quick search engine scan (100 results)"},
87
- {"name": "Certificate Logs", "args": ["-b", "certspotter,crtsh"], "desc": "Certificate transparency logs (subdomains)"},
88
- {"name": "Comprehensive Passive", "args": ["-b", "certspotter,crtsh,dnsdumpster,hackertarget,otx,virustotal"], "desc": "All passive sources (no active queries)"}
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
- {"title": "Overview", "desc": "theHarvester aggregates email addresses, subdomains, hostnames, and employee names from public sources to build reconnaissance snapshots for external attack surface mapping."},
96
- {"title": "Use Cases", "desc": "Perfect for initial OSINT reconnaissance and collecting leads before deeper testing.", "tips": [
97
- "Email harvesting and subdomain discovery",
98
- "Hostname collection and employee name gathering",
99
- "Combine output with DNS, CT logs, and certificate data for better coverage",
100
- "Save results (CSV/JSON) to job log for importing into Findings or follow-up scans",
101
- "Feed targeted scans (subdomain Nmap service checks) or social-engineering assessments",
102
- "Respect rate limits and API terms for public sources you query"
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
- {"title": "Basic Workflow", "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"},
111
- {"title": "Data Sources", "desc": "Active sources query search engines directly, passive sources use archived data", "tips": [
112
- "Bing/DuckDuckGo: Good for email addresses",
113
- "Certificate Logs: Best for subdomain discovery",
114
- "Comprehensive Passive: Broadest coverage without active queries"
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
- ("Best Practices:", [
123
- "Start with passive sources to avoid detection",
124
- "Use comprehensive passive for maximum subdomain coverage",
125
- "Save results to job log for later analysis",
126
- "Respect rate limits and API terms",
127
- "Combine with DNS enumeration for complete coverage"
128
- ]),
129
- ("Common Issues:", [
130
- "Rate limiting: Switch to passive sources or reduce query frequency",
131
- "No results: Try different data sources or verify domain is valid",
132
- "API errors: Check internet connectivity and source availability"
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
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
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, 'w') as f:
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
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
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, 'w') as f:
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(cmd, capture_output=True, timeout=300, check=False)
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(f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n\n")
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(f"\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n")
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
- "souleyez jobs enqueue tr069 10.0.0.1 --args \"--deep\"",
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
- {"name": "Deep Enumeration", "args": ["--deep"], "desc": "Full HTTP enumeration of TR-069"},
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
- {"title": "Overview", "desc": "TR-069 lets ISPs remotely manage your router. It's how they push firmware updates and change settings without physical access."},
52
- {"title": "Security Risks", "desc": "Why TR-069 can be dangerous", "tips": [
53
- "Often runs as root/admin on the device",
54
- "May have hardcoded credentials",
55
- "ACS server URL can be hijacked",
56
- "Known RCE vulnerabilities in implementations",
57
- "Can be used to exfiltrate data or install backdoors"
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
- {"title": "Common Attacks", "desc": "How TR-069 gets exploited", "tips": [
66
- "MITM attacks on ACS communication",
67
- "Exploit known CVEs (Misfortune Cookie, etc.)",
68
- "Credential bruteforce if auth is weak",
69
- "DNS hijacking via TR-069 config changes",
70
- "Firmware downgrade to vulnerable version"
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(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
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, 'w') as f:
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 = '7547,4567,5555,8089' # Common CWMP/TR-069 ports
115
+ ports = "7547,4567,5555,8089" # Common CWMP/TR-069 ports
99
116
 
100
117
  # Determine scan depth
101
- if '--deep' in args:
118
+ if "--deep" in args:
102
119
  # Deep scan with HTTP enumeration
103
- scripts = 'http-title,http-headers,http-methods,http-server-header'
120
+ scripts = "http-title,http-headers,http-methods,http-server-header"
104
121
  cmd = [
105
- 'nmap',
106
- '-sV',
107
- '-p', ports,
108
- '--script', scripts,
109
- '--script-args', 'http.useragent=CWMP Client',
110
- '-oN', '-',
111
- '--open',
112
- '-T4',
113
- target
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
- 'nmap',
119
- '-sS', '-sV',
120
- '-p', ports,
121
- '-oN', '-',
122
- '--open',
123
- '-T4',
124
- target
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(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
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['cmd']
161
+ cmd = cmd_spec["cmd"]
139
162
 
140
163
  if log_path:
141
- with open(log_path, 'w') as f:
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("# TR-069 (Technical Report 069) is used by ISPs for remote router management\n")
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, 'a') as f:
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, 'a') as f:
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, 'a') as f:
187
+ with open(log_path, "a") as f:
166
188
  f.write(f"\n\n# ERROR: {e}\n")
167
189
  return 1
168
190