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
@@ -27,11 +27,11 @@ HELP = {
27
27
  "- WPAD poisoning is aggressive - use with caution\n\n"
28
28
  "⚠️ Warning: This is an active network attack. Use only with permission!\n"
29
29
  ),
30
- "usage": "souleyez jobs enqueue responder <interface> --args \"[options]\"",
30
+ "usage": 'souleyez jobs enqueue responder <interface> --args "[options]"',
31
31
  "examples": [
32
- "souleyez jobs enqueue responder eth0 --args \"-v\"",
33
- "souleyez jobs enqueue responder tun0 --args \"-w -v\" # WPAD poisoning",
34
- "souleyez jobs enqueue responder wlan0 --args \"-f -v\" # Fingerprint only",
32
+ 'souleyez jobs enqueue responder eth0 --args "-v"',
33
+ 'souleyez jobs enqueue responder tun0 --args "-w -v" # WPAD poisoning',
34
+ 'souleyez jobs enqueue responder wlan0 --args "-f -v" # Fingerprint only',
35
35
  ],
36
36
  "flags": [
37
37
  ["-I <interface>", "Network interface to bind to (required)"],
@@ -56,58 +56,94 @@ HELP = {
56
56
  " - SMB+HTTP Only: Reduced attack surface",
57
57
  ],
58
58
  "presets": [
59
- {"name": "Standard Poisoning", "args": ["-v"], "desc": "LLMNR/NBT-NS poisoning (default)"},
60
- {"name": "WPAD Poisoning", "args": ["-w", "-v"], "desc": "Add WPAD rogue proxy (aggressive)"},
61
- {"name": "Fingerprint Mode", "args": ["-f", "-v"], "desc": "Passive mode (no poisoning, just fingerprint)"},
62
- {"name": "SMB + HTTP Only", "args": ["-v", "--lm", "--disable-ess"], "desc": "Capture SMB and HTTP only"}
59
+ {
60
+ "name": "Standard Poisoning",
61
+ "args": ["-v"],
62
+ "desc": "LLMNR/NBT-NS poisoning (default)",
63
+ },
64
+ {
65
+ "name": "WPAD Poisoning",
66
+ "args": ["-w", "-v"],
67
+ "desc": "Add WPAD rogue proxy (aggressive)",
68
+ },
69
+ {
70
+ "name": "Fingerprint Mode",
71
+ "args": ["-f", "-v"],
72
+ "desc": "Passive mode (no poisoning, just fingerprint)",
73
+ },
74
+ {
75
+ "name": "SMB + HTTP Only",
76
+ "args": ["-v", "--lm", "--disable-ess"],
77
+ "desc": "Capture SMB and HTTP only",
78
+ },
63
79
  ],
64
80
  "help_sections": [
65
81
  {
66
82
  "title": "What is Responder?",
67
83
  "color": "cyan",
68
84
  "content": [
69
- {"title": "Overview", "desc": "Responder performs LLMNR/NBT-NS/MDNS poisoning to passively capture Windows credentials (NTLMv2 hashes) when clients broadcast authentication requests."},
70
- {"title": "Use Cases", "desc": "Passive credential capture on Windows networks", "tips": [
71
- "Capture NetNTLMv2 hashes without touching hosts",
72
- "Intercept Windows authentication attempts",
73
- "Identify active users and services",
74
- "Get initial foothold credentials"
75
- ]}
76
- ]
85
+ {
86
+ "title": "Overview",
87
+ "desc": "Responder performs LLMNR/NBT-NS/MDNS poisoning to passively capture Windows credentials (NTLMv2 hashes) when clients broadcast authentication requests.",
88
+ },
89
+ {
90
+ "title": "Use Cases",
91
+ "desc": "Passive credential capture on Windows networks",
92
+ "tips": [
93
+ "Capture NetNTLMv2 hashes without touching hosts",
94
+ "Intercept Windows authentication attempts",
95
+ "Identify active users and services",
96
+ "Get initial foothold credentials",
97
+ ],
98
+ },
99
+ ],
77
100
  },
78
101
  {
79
102
  "title": "How to Use",
80
103
  "color": "green",
81
104
  "content": [
82
- {"title": "Basic Workflow", "desc": "1. Select network interface to monitor\n 2. Choose poisoning mode (standard or WPAD)\n 3. Run for 15-30 minutes to capture hashes\n 4. Crack captured hashes with hashcat mode 5600"},
83
- {"title": "Key Modes", "desc": "Different levels of aggressiveness", "tips": [
84
- "Standard: LLMNR/NBT-NS poisoning only (default)",
85
- "WPAD: Add rogue proxy (very aggressive)",
86
- "Fingerprint: Passive mode (no poisoning)",
87
- "SMB+HTTP Only: Reduced attack surface"
88
- ]}
89
- ]
105
+ {
106
+ "title": "Basic Workflow",
107
+ "desc": "1. Select network interface to monitor\n 2. Choose poisoning mode (standard or WPAD)\n 3. Run for 15-30 minutes to capture hashes\n 4. Crack captured hashes with hashcat mode 5600",
108
+ },
109
+ {
110
+ "title": "Key Modes",
111
+ "desc": "Different levels of aggressiveness",
112
+ "tips": [
113
+ "Standard: LLMNR/NBT-NS poisoning only (default)",
114
+ "WPAD: Add rogue proxy (very aggressive)",
115
+ "Fingerprint: Passive mode (no poisoning)",
116
+ "SMB+HTTP Only: Reduced attack surface",
117
+ ],
118
+ },
119
+ ],
90
120
  },
91
121
  {
92
122
  "title": "Tips & Best Practices",
93
123
  "color": "yellow",
94
124
  "content": [
95
- ("Best Practices:", [
96
- "Requires root/sudo for port binding",
97
- "Run for 15-30 minutes for best results",
98
- "Works best on switched networks (same subnet)",
99
- "Captured hashes: hashcat -m 5600 hashes.txt wordlist.txt",
100
- "Check ~/.souleyez/responder_logs/ for results"
101
- ]),
102
- ("Common Issues:", [
103
- "Permission denied: Run with sudo",
104
- "No hashes captured: May need WPAD mode or longer runtime",
105
- "Interface not found: Verify interface name (eth0, wlan0)",
106
- "Too aggressive: Use fingerprint mode (-f) if concerned"
107
- ])
108
- ]
109
- }
110
- ]
125
+ (
126
+ "Best Practices:",
127
+ [
128
+ "Requires root/sudo for port binding",
129
+ "Run for 15-30 minutes for best results",
130
+ "Works best on switched networks (same subnet)",
131
+ "Captured hashes: hashcat -m 5600 hashes.txt wordlist.txt",
132
+ "Check ~/.souleyez/responder_logs/ for results",
133
+ ],
134
+ ),
135
+ (
136
+ "Common Issues:",
137
+ [
138
+ "Permission denied: Run with sudo",
139
+ "No hashes captured: May need WPAD mode or longer runtime",
140
+ "Interface not found: Verify interface name (eth0, wlan0)",
141
+ "Too aggressive: Use fingerprint mode (-f) if concerned",
142
+ ],
143
+ ),
144
+ ],
145
+ },
146
+ ],
111
147
  }
112
148
 
113
149
 
@@ -130,7 +166,7 @@ class ResponderPlugin:
130
166
  paths = [
131
167
  "/usr/share/responder/Responder.py",
132
168
  "/opt/Responder/Responder.py",
133
- Path.home() / "tools/Responder/Responder.py"
169
+ Path.home() / "tools/Responder/Responder.py",
134
170
  ]
135
171
 
136
172
  for path in paths:
@@ -159,14 +195,15 @@ class ResponderPlugin:
159
195
  ["ip", "route", "get", target_ip],
160
196
  capture_output=True,
161
197
  text=True,
162
- timeout=5
198
+ timeout=5,
163
199
  )
164
200
 
165
201
  if result.returncode == 0:
166
202
  # Parse output: "10.0.0.73 dev eth0 src 10.0.0.1 uid 1000"
167
203
  # Look for "dev <interface>"
168
204
  import re
169
- match = re.search(r'dev\s+(\S+)', result.stdout)
205
+
206
+ match = re.search(r"dev\s+(\S+)", result.stdout)
170
207
  if match:
171
208
  return match.group(1)
172
209
 
@@ -175,12 +212,13 @@ class ResponderPlugin:
175
212
  ["ip", "route", "show", "default"],
176
213
  capture_output=True,
177
214
  text=True,
178
- timeout=5
215
+ timeout=5,
179
216
  )
180
217
 
181
218
  if result.returncode == 0:
182
219
  import re
183
- match = re.search(r'dev\s+(\S+)', result.stdout)
220
+
221
+ match = re.search(r"dev\s+(\S+)", result.stdout)
184
222
  if match:
185
223
  return match.group(1)
186
224
 
@@ -188,13 +226,13 @@ class ResponderPlugin:
188
226
  pass
189
227
 
190
228
  # Last resort: return common default interfaces
191
- for iface in ['eth0', 'ens33', 'enp0s3', 'wlan0']:
229
+ for iface in ["eth0", "ens33", "enp0s3", "wlan0"]:
192
230
  try:
193
231
  result = subprocess.run(
194
232
  ["ip", "link", "show", iface],
195
233
  capture_output=True,
196
234
  text=True,
197
- timeout=2
235
+ timeout=2,
198
236
  )
199
237
  if result.returncode == 0:
200
238
  return iface
@@ -207,10 +245,7 @@ class ResponderPlugin:
207
245
  """Check if the given name is a valid network interface."""
208
246
  try:
209
247
  result = subprocess.run(
210
- ["ip", "link", "show", name],
211
- capture_output=True,
212
- text=True,
213
- timeout=2
248
+ ["ip", "link", "show", name], capture_output=True, text=True, timeout=2
214
249
  )
215
250
  return result.returncode == 0
216
251
  except Exception:
@@ -235,7 +270,7 @@ class ResponderPlugin:
235
270
  Command spec dict or None if validation fails
236
271
  """
237
272
  if not self.responder_path:
238
- with open(log_path, 'w') as f:
273
+ with open(log_path, "w") as f:
239
274
  f.write("ERROR: Responder not found. Install with:\n")
240
275
  f.write("git clone https://github.com/lgandx/Responder\n")
241
276
  f.write("cd Responder\n")
@@ -252,14 +287,20 @@ class ResponderPlugin:
252
287
  # Target is likely an IP address - auto-detect interface
253
288
  interface = self._get_interface_for_target(target)
254
289
  if not interface:
255
- with open(log_path, 'w') as f:
256
- f.write(f"ERROR: Could not determine network interface for target {target}\n")
257
- f.write("Please specify a valid network interface (e.g., eth0, wlan0, tun0)\n")
290
+ with open(log_path, "w") as f:
291
+ f.write(
292
+ f"ERROR: Could not determine network interface for target {target}\n"
293
+ )
294
+ f.write(
295
+ "Please specify a valid network interface (e.g., eth0, wlan0, tun0)\n"
296
+ )
258
297
  f.write("\nAvailable interfaces:\n")
259
298
  try:
260
- result = subprocess.run(["ip", "-o", "link", "show"], capture_output=True, text=True)
261
- for line in result.stdout.strip().split('\n'):
262
- parts = line.split(':')
299
+ result = subprocess.run(
300
+ ["ip", "-o", "link", "show"], capture_output=True, text=True
301
+ )
302
+ for line in result.stdout.strip().split("\n"):
303
+ parts = line.split(":")
263
304
  if len(parts) >= 2:
264
305
  iface = parts[1].strip()
265
306
  f.write(f" - {iface}\n")
@@ -282,7 +323,7 @@ class ResponderPlugin:
282
323
  env = {"RESPONDER_LOG_DIR": str(self.log_dir)}
283
324
 
284
325
  # Write initial log content
285
- with open(log_path, 'w') as f:
326
+ with open(log_path, "w") as f:
286
327
  f.write(f"Starting Responder...\n")
287
328
  f.write(f"Target: {target}\n")
288
329
  f.write(f"Interface: {interface}\n")
@@ -291,34 +332,34 @@ class ResponderPlugin:
291
332
  f.write("NOTE: Responder requires root/sudo. If this fails, either:\n")
292
333
  f.write(" - Run souleyez as root, or\n")
293
334
  f.write(" - Configure passwordless sudo for responder\n\n")
294
- f.write("NOTE: Responder runs indefinitely. Kill job when done capturing.\n")
295
- f.write("Captured hashes are automatically stored in credentials database.\n\n")
335
+ f.write(
336
+ "NOTE: Responder runs indefinitely. Kill job when done capturing.\n"
337
+ )
338
+ f.write(
339
+ "Captured hashes are automatically stored in credentials database.\n\n"
340
+ )
296
341
 
297
- return {
298
- 'cmd': cmd,
299
- 'timeout': 3600, # 1 hour
300
- 'env': env
301
- }
342
+ return {"cmd": cmd, "timeout": 3600, "env": env} # 1 hour
302
343
 
303
344
  def get_presets(self):
304
345
  """Return Responder presets."""
305
346
  return {
306
347
  "Standard Poisoning": {
307
348
  "description": "LLMNR/NBT-NS poisoning (default)",
308
- "args": "-v"
349
+ "args": "-v",
309
350
  },
310
351
  "WPAD Poisoning": {
311
352
  "description": "Add WPAD rogue proxy (aggressive)",
312
- "args": "-w -v"
353
+ "args": "-w -v",
313
354
  },
314
355
  "Fingerprint Mode": {
315
356
  "description": "Passive mode (no poisoning, just fingerprint)",
316
- "args": "-f -v"
357
+ "args": "-f -v",
317
358
  },
318
359
  "SMB + HTTP Only": {
319
360
  "description": "Capture SMB and HTTP only",
320
- "args": "-v --lm --disable-ess"
321
- }
361
+ "args": "-v --lm --disable-ess",
362
+ },
322
363
  }
323
364
 
324
365
 
@@ -30,8 +30,8 @@ HELP = {
30
30
  "usage": "souleyez jobs enqueue router_http_brute <target>",
31
31
  "examples": [
32
32
  "souleyez jobs enqueue router_http_brute 192.168.1.1",
33
- "souleyez jobs enqueue router_http_brute 192.168.1.1 --args \"--port 8080\"",
34
- "souleyez jobs enqueue router_http_brute 192.168.1.1 --args \"--basic\"",
33
+ 'souleyez jobs enqueue router_http_brute 192.168.1.1 --args "--port 8080"',
34
+ 'souleyez jobs enqueue router_http_brute 192.168.1.1 --args "--basic"',
35
35
  ],
36
36
  "flags": [
37
37
  ["--port PORT", "Target port (default: 80)"],
@@ -40,9 +40,21 @@ HELP = {
40
40
  ["--ssl", "Use HTTPS"],
41
41
  ],
42
42
  "presets": [
43
- {"name": "Basic Auth", "args": ["--basic"], "desc": "HTTP Basic Authentication"},
44
- {"name": "HTTPS Basic", "args": ["--basic", "--ssl"], "desc": "HTTPS Basic Auth"},
45
- {"name": "Port 8080", "args": ["--port", "8080"], "desc": "Alternate port 8080"},
43
+ {
44
+ "name": "Basic Auth",
45
+ "args": ["--basic"],
46
+ "desc": "HTTP Basic Authentication",
47
+ },
48
+ {
49
+ "name": "HTTPS Basic",
50
+ "args": ["--basic", "--ssl"],
51
+ "desc": "HTTPS Basic Auth",
52
+ },
53
+ {
54
+ "name": "Port 8080",
55
+ "args": ["--port", "8080"],
56
+ "desc": "Alternate port 8080",
57
+ },
46
58
  ],
47
59
  "help_sections": [
48
60
  {
@@ -54,9 +66,9 @@ HELP = {
54
66
  {"title": "D-Link", "desc": "admin / (blank) or admin"},
55
67
  {"title": "TP-Link", "desc": "admin / admin"},
56
68
  {"title": "ASUS", "desc": "admin / admin"},
57
- ]
69
+ ],
58
70
  }
59
- ]
71
+ ],
60
72
  }
61
73
 
62
74
 
@@ -68,20 +80,13 @@ class RouterHTTPBrutePlugin(PluginBase):
68
80
 
69
81
  def _get_wordlist_path(self, filename: str) -> str:
70
82
  """Get path to wordlist file."""
71
- import os
72
- # Check multiple locations
73
- locations = [
74
- os.path.join(os.path.dirname(__file__), '..', 'data', 'wordlists', filename),
75
- os.path.expanduser(f'~/.souleyez/wordlists/{filename}'),
76
- f'/usr/share/seclists/Passwords/{filename}',
77
- f'/usr/share/wordlists/{filename}',
78
- ]
79
- for loc in locations:
80
- if os.path.exists(loc):
81
- return os.path.abspath(loc)
82
- return filename # Return as-is, let hydra fail if not found
83
-
84
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
83
+ from souleyez.wordlists import resolve_wordlist_path
84
+
85
+ return resolve_wordlist_path(f"data/wordlists/{filename}")
86
+
87
+ def build_command(
88
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
89
+ ):
85
90
  """Build Hydra command for router HTTP brute force."""
86
91
  args = args or []
87
92
 
@@ -90,114 +95,120 @@ class RouterHTTPBrutePlugin(PluginBase):
90
95
  target = validate_target(target)
91
96
  except ValidationError as e:
92
97
  if log_path:
93
- with open(log_path, 'w') as f:
98
+ with open(log_path, "w") as f:
94
99
  f.write(f"ERROR: Invalid target: {e}\n")
95
100
  return None
96
101
 
97
102
  # Parse arguments
98
- port = '80'
103
+ port = "80"
99
104
  use_ssl = False
100
105
  use_form = False
101
- form_path = '/login'
106
+ form_path = "/login"
102
107
 
103
108
  i = 0
104
109
  while i < len(args):
105
- if args[i] == '--port' and i + 1 < len(args):
110
+ if args[i] == "--port" and i + 1 < len(args):
106
111
  port = args[i + 1]
107
112
  i += 2
108
- elif args[i] == '--ssl':
113
+ elif args[i] == "--ssl":
109
114
  use_ssl = True
110
- port = '443' if port == '80' else port
115
+ port = "443" if port == "80" else port
111
116
  i += 1
112
- elif args[i] == '--form' and i + 1 < len(args):
117
+ elif args[i] == "--form" and i + 1 < len(args):
113
118
  use_form = True
114
119
  form_path = args[i + 1]
115
120
  i += 2
116
- elif args[i] == '--basic':
121
+ elif args[i] == "--basic":
117
122
  use_form = False
118
123
  i += 1
119
124
  else:
120
125
  i += 1
121
126
 
122
127
  # Common router credentials
123
- users = self._get_wordlist_path('router_users.txt')
124
- passwords = self._get_wordlist_path('router_passwords.txt')
128
+ users = self._get_wordlist_path("router_users.txt")
129
+ passwords = self._get_wordlist_path("router_passwords.txt")
125
130
 
126
131
  # Build Hydra command
127
132
  if use_form:
128
- service = 'https-post-form' if use_ssl else 'http-post-form'
133
+ service = "https-post-form" if use_ssl else "http-post-form"
129
134
  # Generic form attack - adjust for specific routers
130
135
  form_string = f"{form_path}:username=^USER^&password=^PASS^:F=incorrect"
131
136
  cmd = [
132
- 'hydra',
133
- '-L', users,
134
- '-P', passwords,
135
- '-s', port,
136
- '-t', '2', # Low threads
137
- '-w', '3', # Wait 3 seconds between attempts
138
- '-vV',
137
+ "hydra",
138
+ "-L",
139
+ users,
140
+ "-P",
141
+ passwords,
142
+ "-s",
143
+ port,
144
+ "-t",
145
+ "2", # Low threads
146
+ "-w",
147
+ "3", # Wait 3 seconds between attempts
148
+ "-vV",
139
149
  target,
140
150
  service,
141
- form_string
151
+ form_string,
142
152
  ]
143
153
  else:
144
- service = 'https-get' if use_ssl else 'http-get'
154
+ service = "https-get" if use_ssl else "http-get"
145
155
  cmd = [
146
- 'hydra',
147
- '-L', users,
148
- '-P', passwords,
149
- '-s', port,
150
- '-t', '2',
151
- '-w', '3',
152
- '-vV',
153
- '-f', # Stop on first success
156
+ "hydra",
157
+ "-L",
158
+ users,
159
+ "-P",
160
+ passwords,
161
+ "-s",
162
+ port,
163
+ "-t",
164
+ "2",
165
+ "-w",
166
+ "3",
167
+ "-vV",
168
+ "-f", # Stop on first success
154
169
  target,
155
170
  service,
156
- '/'
171
+ "/",
157
172
  ]
158
173
 
159
- return {
160
- 'cmd': cmd,
161
- 'timeout': 1800 # 30 minute timeout
162
- }
174
+ return {"cmd": cmd, "timeout": 1800} # 30 minute timeout
163
175
 
164
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
176
+ def run(
177
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
178
+ ) -> int:
165
179
  """Execute router HTTP brute force."""
166
180
  cmd_spec = self.build_command(target, args, label, log_path)
167
181
  if cmd_spec is None:
168
182
  return 1
169
183
 
170
- cmd = cmd_spec['cmd']
184
+ cmd = cmd_spec["cmd"]
171
185
 
172
186
  if log_path:
173
- with open(log_path, 'w') as f:
187
+ with open(log_path, "w") as f:
174
188
  f.write(f"# Router HTTP Brute Force on {target}\n")
175
189
  f.write(f"# Command: {' '.join(cmd)}\n")
176
190
  f.write(f"# Started: {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n")
177
191
 
178
192
  try:
179
- with open(log_path, 'a') as f:
193
+ with open(log_path, "a") as f:
180
194
  result = subprocess.run(
181
- cmd,
182
- stdout=f,
183
- stderr=subprocess.STDOUT,
184
- timeout=cmd_spec['timeout']
195
+ cmd, stdout=f, stderr=subprocess.STDOUT, timeout=cmd_spec["timeout"]
185
196
  )
186
197
  return result.returncode
187
198
 
188
199
  except subprocess.TimeoutExpired:
189
200
  if log_path:
190
- with open(log_path, 'a') as f:
201
+ with open(log_path, "a") as f:
191
202
  f.write("\n\n# ERROR: Brute force timed out\n")
192
203
  return 124
193
204
  except FileNotFoundError:
194
205
  if log_path:
195
- with open(log_path, 'a') as f:
206
+ with open(log_path, "a") as f:
196
207
  f.write("\n\n# ERROR: Hydra not found\n")
197
208
  return 127
198
209
  except Exception as e:
199
210
  if log_path:
200
- with open(log_path, 'a') as f:
211
+ with open(log_path, "a") as f:
201
212
  f.write(f"\n\n# ERROR: {e}\n")
202
213
  return 1
203
214