souleyez 2.43.29__py3-none-any.whl → 2.43.34__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +9526 -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 +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 +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 +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 +854 -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 +173 -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 +223 -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 +22827 -10678
  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-2.43.34.dist-info}/METADATA +1 -1
  353. souleyez-2.43.34.dist-info/RECORD +443 -0
  354. {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/WHEEL +1 -1
  355. souleyez-2.43.29.dist-info/RECORD +0 -379
  356. {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/entry_points.txt +0 -0
  357. {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/licenses/LICENSE +0 -0
  358. {souleyez-2.43.29.dist-info → souleyez-2.43.34.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