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.

Files changed (358) 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 +9564 -2881
  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 +1239 -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 +2200 -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 +564 -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 +409 -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 +417 -0
  116. souleyez/handlers/rdp_sec_check_handler.py +353 -0
  117. souleyez/handlers/registry.py +292 -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/web_login_test_handler.py +327 -0
  126. souleyez/handlers/whois_handler.py +277 -0
  127. souleyez/handlers/wpscan_handler.py +554 -0
  128. souleyez/history.py +32 -16
  129. souleyez/importers/msf_importer.py +106 -75
  130. souleyez/importers/smart_importer.py +208 -147
  131. souleyez/integrations/siem/__init__.py +10 -10
  132. souleyez/integrations/siem/base.py +17 -18
  133. souleyez/integrations/siem/elastic.py +108 -122
  134. souleyez/integrations/siem/factory.py +207 -80
  135. souleyez/integrations/siem/googlesecops.py +146 -154
  136. souleyez/integrations/siem/rule_mappings/__init__.py +1 -1
  137. souleyez/integrations/siem/rule_mappings/wazuh_rules.py +8 -5
  138. souleyez/integrations/siem/sentinel.py +107 -109
  139. souleyez/integrations/siem/splunk.py +246 -212
  140. souleyez/integrations/siem/wazuh.py +65 -71
  141. souleyez/integrations/wazuh/__init__.py +5 -5
  142. souleyez/integrations/wazuh/client.py +70 -93
  143. souleyez/integrations/wazuh/config.py +85 -57
  144. souleyez/integrations/wazuh/host_mapper.py +28 -36
  145. souleyez/integrations/wazuh/sync.py +78 -68
  146. souleyez/intelligence/__init__.py +4 -5
  147. souleyez/intelligence/correlation_analyzer.py +309 -295
  148. souleyez/intelligence/exploit_knowledge.py +661 -623
  149. souleyez/intelligence/exploit_suggestions.py +159 -139
  150. souleyez/intelligence/gap_analyzer.py +132 -97
  151. souleyez/intelligence/gap_detector.py +251 -214
  152. souleyez/intelligence/sensitive_tables.py +266 -129
  153. souleyez/intelligence/service_parser.py +137 -123
  154. souleyez/intelligence/surface_analyzer.py +407 -268
  155. souleyez/intelligence/target_parser.py +159 -162
  156. souleyez/licensing/__init__.py +6 -6
  157. souleyez/licensing/validator.py +17 -19
  158. souleyez/log_config.py +79 -54
  159. souleyez/main.py +1505 -687
  160. souleyez/migrations/fix_job_counter.py +16 -14
  161. souleyez/parsers/bloodhound_parser.py +41 -39
  162. souleyez/parsers/crackmapexec_parser.py +178 -111
  163. souleyez/parsers/dalfox_parser.py +72 -77
  164. souleyez/parsers/dnsrecon_parser.py +103 -91
  165. souleyez/parsers/enum4linux_parser.py +183 -153
  166. souleyez/parsers/ffuf_parser.py +29 -25
  167. souleyez/parsers/gobuster_parser.py +301 -41
  168. souleyez/parsers/hashcat_parser.py +324 -79
  169. souleyez/parsers/http_fingerprint_parser.py +350 -103
  170. souleyez/parsers/hydra_parser.py +131 -111
  171. souleyez/parsers/impacket_parser.py +231 -178
  172. souleyez/parsers/john_parser.py +98 -86
  173. souleyez/parsers/katana_parser.py +316 -0
  174. souleyez/parsers/msf_parser.py +943 -498
  175. souleyez/parsers/nikto_parser.py +346 -65
  176. souleyez/parsers/nmap_parser.py +262 -174
  177. souleyez/parsers/nuclei_parser.py +40 -44
  178. souleyez/parsers/responder_parser.py +26 -26
  179. souleyez/parsers/searchsploit_parser.py +74 -74
  180. souleyez/parsers/service_explorer_parser.py +279 -0
  181. souleyez/parsers/smbmap_parser.py +180 -124
  182. souleyez/parsers/sqlmap_parser.py +434 -308
  183. souleyez/parsers/theharvester_parser.py +75 -57
  184. souleyez/parsers/whois_parser.py +135 -94
  185. souleyez/parsers/wpscan_parser.py +278 -190
  186. souleyez/plugins/afp.py +44 -36
  187. souleyez/plugins/afp_brute.py +114 -46
  188. souleyez/plugins/ard.py +48 -37
  189. souleyez/plugins/bloodhound.py +95 -61
  190. souleyez/plugins/certipy.py +303 -0
  191. souleyez/plugins/crackmapexec.py +186 -85
  192. souleyez/plugins/dalfox.py +120 -59
  193. souleyez/plugins/dns_hijack.py +146 -41
  194. souleyez/plugins/dnsrecon.py +97 -61
  195. souleyez/plugins/enum4linux.py +91 -66
  196. souleyez/plugins/evil_winrm.py +291 -0
  197. souleyez/plugins/ffuf.py +166 -90
  198. souleyez/plugins/firmware_extract.py +133 -29
  199. souleyez/plugins/gobuster.py +387 -190
  200. souleyez/plugins/gpp_extract.py +393 -0
  201. souleyez/plugins/hashcat.py +100 -73
  202. souleyez/plugins/http_fingerprint.py +913 -267
  203. souleyez/plugins/hydra.py +566 -200
  204. souleyez/plugins/impacket_getnpusers.py +117 -69
  205. souleyez/plugins/impacket_psexec.py +84 -64
  206. souleyez/plugins/impacket_secretsdump.py +103 -69
  207. souleyez/plugins/impacket_smbclient.py +89 -75
  208. souleyez/plugins/john.py +86 -69
  209. souleyez/plugins/katana.py +313 -0
  210. souleyez/plugins/kerbrute.py +237 -0
  211. souleyez/plugins/lfi_extract.py +541 -0
  212. souleyez/plugins/macos_ssh.py +117 -48
  213. souleyez/plugins/mdns.py +35 -30
  214. souleyez/plugins/msf_auxiliary.py +253 -130
  215. souleyez/plugins/msf_exploit.py +239 -161
  216. souleyez/plugins/nikto.py +134 -78
  217. souleyez/plugins/nmap.py +275 -91
  218. souleyez/plugins/nuclei.py +180 -89
  219. souleyez/plugins/nxc.py +285 -0
  220. souleyez/plugins/plugin_base.py +35 -36
  221. souleyez/plugins/plugin_template.py +13 -5
  222. souleyez/plugins/rdp_sec_check.py +130 -0
  223. souleyez/plugins/responder.py +112 -71
  224. souleyez/plugins/router_http_brute.py +76 -65
  225. souleyez/plugins/router_ssh_brute.py +118 -41
  226. souleyez/plugins/router_telnet_brute.py +124 -42
  227. souleyez/plugins/routersploit.py +91 -59
  228. souleyez/plugins/routersploit_exploit.py +77 -55
  229. souleyez/plugins/searchsploit.py +91 -77
  230. souleyez/plugins/service_explorer.py +1160 -0
  231. souleyez/plugins/smbmap.py +122 -72
  232. souleyez/plugins/smbpasswd.py +215 -0
  233. souleyez/plugins/sqlmap.py +301 -113
  234. souleyez/plugins/theharvester.py +127 -75
  235. souleyez/plugins/tr069.py +79 -57
  236. souleyez/plugins/upnp.py +65 -47
  237. souleyez/plugins/upnp_abuse.py +73 -55
  238. souleyez/plugins/vnc_access.py +129 -42
  239. souleyez/plugins/vnc_brute.py +109 -38
  240. souleyez/plugins/web_login_test.py +417 -0
  241. souleyez/plugins/whois.py +77 -58
  242. souleyez/plugins/wpscan.py +219 -69
  243. souleyez/reporting/__init__.py +2 -1
  244. souleyez/reporting/attack_chain.py +411 -346
  245. souleyez/reporting/charts.py +436 -501
  246. souleyez/reporting/compliance_mappings.py +334 -201
  247. souleyez/reporting/detection_report.py +126 -125
  248. souleyez/reporting/formatters.py +828 -591
  249. souleyez/reporting/generator.py +386 -302
  250. souleyez/reporting/metrics.py +72 -75
  251. souleyez/scanner.py +35 -29
  252. souleyez/security/__init__.py +37 -11
  253. souleyez/security/scope_validator.py +175 -106
  254. souleyez/security/validation.py +237 -149
  255. souleyez/security.py +22 -6
  256. souleyez/storage/credentials.py +247 -186
  257. souleyez/storage/crypto.py +296 -129
  258. souleyez/storage/database.py +73 -50
  259. souleyez/storage/db.py +58 -36
  260. souleyez/storage/deliverable_evidence.py +177 -128
  261. souleyez/storage/deliverable_exporter.py +282 -246
  262. souleyez/storage/deliverable_templates.py +134 -116
  263. souleyez/storage/deliverables.py +135 -130
  264. souleyez/storage/engagements.py +109 -56
  265. souleyez/storage/evidence.py +181 -152
  266. souleyez/storage/execution_log.py +31 -17
  267. souleyez/storage/exploit_attempts.py +93 -57
  268. souleyez/storage/exploits.py +67 -36
  269. souleyez/storage/findings.py +48 -61
  270. souleyez/storage/hosts.py +176 -144
  271. souleyez/storage/migrate_to_engagements.py +43 -19
  272. souleyez/storage/migrations/_001_add_credential_enhancements.py +22 -12
  273. souleyez/storage/migrations/_002_add_status_tracking.py +10 -7
  274. souleyez/storage/migrations/_003_add_execution_log.py +14 -8
  275. souleyez/storage/migrations/_005_screenshots.py +13 -5
  276. souleyez/storage/migrations/_006_deliverables.py +13 -5
  277. souleyez/storage/migrations/_007_deliverable_templates.py +12 -7
  278. souleyez/storage/migrations/_008_add_nuclei_table.py +10 -4
  279. souleyez/storage/migrations/_010_evidence_linking.py +17 -10
  280. souleyez/storage/migrations/_011_timeline_tracking.py +20 -13
  281. souleyez/storage/migrations/_012_team_collaboration.py +34 -21
  282. souleyez/storage/migrations/_013_add_host_tags.py +12 -6
  283. souleyez/storage/migrations/_014_exploit_attempts.py +22 -10
  284. souleyez/storage/migrations/_015_add_mac_os_fields.py +15 -7
  285. souleyez/storage/migrations/_016_add_domain_field.py +10 -4
  286. souleyez/storage/migrations/_017_msf_sessions.py +16 -8
  287. souleyez/storage/migrations/_018_add_osint_target.py +10 -6
  288. souleyez/storage/migrations/_019_add_engagement_type.py +10 -6
  289. souleyez/storage/migrations/_020_add_rbac.py +36 -15
  290. souleyez/storage/migrations/_021_wazuh_integration.py +20 -8
  291. souleyez/storage/migrations/_022_wazuh_indexer_columns.py +6 -4
  292. souleyez/storage/migrations/_023_fix_detection_results_fk.py +16 -6
  293. souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +26 -10
  294. souleyez/storage/migrations/_025_multi_siem_support.py +3 -5
  295. souleyez/storage/migrations/_026_add_engagement_scope.py +31 -12
  296. souleyez/storage/migrations/_027_multi_siem_persistence.py +32 -15
  297. souleyez/storage/migrations/__init__.py +26 -26
  298. souleyez/storage/migrations/migration_manager.py +19 -19
  299. souleyez/storage/msf_sessions.py +100 -65
  300. souleyez/storage/osint.py +17 -24
  301. souleyez/storage/recommendation_engine.py +269 -235
  302. souleyez/storage/screenshots.py +33 -32
  303. souleyez/storage/smb_shares.py +136 -92
  304. souleyez/storage/sqlmap_data.py +183 -128
  305. souleyez/storage/team_collaboration.py +135 -141
  306. souleyez/storage/timeline_tracker.py +122 -94
  307. souleyez/storage/wazuh_vulns.py +64 -66
  308. souleyez/storage/web_paths.py +33 -37
  309. souleyez/testing/credential_tester.py +221 -205
  310. souleyez/ui/__init__.py +1 -1
  311. souleyez/ui/ai_quotes.py +12 -12
  312. souleyez/ui/attack_surface.py +2439 -1516
  313. souleyez/ui/chain_rules_view.py +914 -382
  314. souleyez/ui/correlation_view.py +312 -230
  315. souleyez/ui/dashboard.py +2382 -1130
  316. souleyez/ui/deliverables_view.py +148 -62
  317. souleyez/ui/design_system.py +13 -13
  318. souleyez/ui/errors.py +49 -49
  319. souleyez/ui/evidence_linking_view.py +284 -179
  320. souleyez/ui/evidence_vault.py +393 -285
  321. souleyez/ui/exploit_suggestions_view.py +555 -349
  322. souleyez/ui/export_view.py +100 -66
  323. souleyez/ui/gap_analysis_view.py +315 -171
  324. souleyez/ui/help_system.py +105 -97
  325. souleyez/ui/intelligence_view.py +436 -293
  326. souleyez/ui/interactive.py +23034 -10679
  327. souleyez/ui/interactive_selector.py +75 -68
  328. souleyez/ui/log_formatter.py +47 -39
  329. souleyez/ui/menu_components.py +22 -13
  330. souleyez/ui/msf_auxiliary_menu.py +184 -133
  331. souleyez/ui/pending_chains_view.py +336 -172
  332. souleyez/ui/progress_indicators.py +5 -3
  333. souleyez/ui/recommendations_view.py +195 -137
  334. souleyez/ui/rule_builder.py +343 -225
  335. souleyez/ui/setup_wizard.py +678 -284
  336. souleyez/ui/shortcuts.py +217 -165
  337. souleyez/ui/splunk_gap_analysis_view.py +452 -270
  338. souleyez/ui/splunk_vulns_view.py +139 -86
  339. souleyez/ui/team_dashboard.py +498 -335
  340. souleyez/ui/template_selector.py +196 -105
  341. souleyez/ui/terminal.py +6 -6
  342. souleyez/ui/timeline_view.py +198 -127
  343. souleyez/ui/tool_setup.py +264 -164
  344. souleyez/ui/tutorial.py +202 -72
  345. souleyez/ui/tutorial_state.py +40 -40
  346. souleyez/ui/wazuh_vulns_view.py +235 -141
  347. souleyez/ui/wordlist_browser.py +260 -107
  348. souleyez/ui.py +464 -312
  349. souleyez/utils/tool_checker.py +427 -367
  350. souleyez/utils.py +33 -29
  351. souleyez/wordlists.py +134 -167
  352. {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/METADATA +2 -2
  353. souleyez-3.0.0.dist-info/RECORD +443 -0
  354. {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/WHEEL +1 -1
  355. souleyez-2.43.29.dist-info/RECORD +0 -379
  356. {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/entry_points.txt +0 -0
  357. {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/licenses/LICENSE +0 -0
  358. {souleyez-2.43.29.dist-info → souleyez-3.0.0.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