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
@@ -29,108 +29,156 @@ HELP = {
29
29
  "usage": "souleyez jobs enqueue smbmap <target>",
30
30
  "examples": [
31
31
  "souleyez jobs enqueue smbmap 10.0.0.82",
32
- "souleyez jobs enqueue smbmap 10.0.0.82 --args \"-u admin -p password\"",
33
- "souleyez jobs enqueue smbmap 10.0.0.82 --args \"-u admin -p password -r\"",
34
- "souleyez jobs enqueue smbmap 10.0.0.82 --args \"--depth 3\"",
32
+ 'souleyez jobs enqueue smbmap 10.0.0.82 --args "-u admin -p password"',
33
+ 'souleyez jobs enqueue smbmap 10.0.0.82 --args "-u admin -p password -r"',
34
+ 'souleyez jobs enqueue smbmap 10.0.0.82 --args "--depth 3"',
35
35
  ],
36
36
  "preset_categories": {
37
37
  "unauthenticated": [
38
38
  {
39
39
  "name": "Anonymous Scan",
40
40
  "args": [],
41
- "desc": "Basic share enumeration (no credentials)"
41
+ "desc": "Basic share enumeration (no credentials)",
42
42
  },
43
43
  {
44
44
  "name": "List Share Contents",
45
45
  "args": ["-r"],
46
- "desc": "Recursively list all accessible files"
47
- }
46
+ "desc": "Recursively list all accessible files",
47
+ },
48
48
  ],
49
49
  "authenticated": [
50
50
  {
51
51
  "name": "With Credentials",
52
52
  "args": ["-u", "<username>", "-p", "<password>"],
53
- "desc": "Authenticated scan (replace username/password)"
53
+ "desc": "Authenticated scan (replace username/password)",
54
54
  },
55
55
  {
56
56
  "name": "Domain Credentials",
57
57
  "args": ["-u", "<username>", "-p", "<password>", "-d", "<domain>"],
58
- "desc": "Domain authentication"
59
- }
58
+ "desc": "Domain authentication",
59
+ },
60
60
  ],
61
61
  "advanced": [
62
62
  {
63
63
  "name": "Deep Recursive Scan",
64
64
  "args": ["-r", "--depth", "5"],
65
- "desc": "Recursively list files (5 levels deep)"
65
+ "desc": "Recursively list files (5 levels deep)",
66
66
  },
67
67
  {
68
68
  "name": "Download Interesting Files",
69
69
  "args": ["-A", "password", "-r"],
70
- "desc": "Auto-download files matching pattern"
70
+ "desc": "Auto-download files matching pattern",
71
71
  },
72
72
  {
73
73
  "name": "Execute Command",
74
74
  "args": ["-u", "<username>", "-p", "<password>", "-x", "whoami"],
75
- "desc": "Execute command on target (requires admin)"
76
- }
77
- ]
75
+ "desc": "Execute command on target (requires admin)",
76
+ },
77
+ ],
78
78
  },
79
79
  "presets": [
80
- {"name": "Anonymous Scan", "args": [], "desc": "Basic share enumeration (no credentials)"},
81
- {"name": "List Share Contents", "args": ["-r"], "desc": "Recursively list all accessible files"},
82
- {"name": "With Credentials", "args": ["-u", "<username>", "-p", "<password>"], "desc": "Authenticated scan (replace username/password)"},
83
- {"name": "Domain Credentials", "args": ["-u", "<username>", "-p", "<password>", "-d", "<domain>"], "desc": "Domain authentication"},
84
- {"name": "Deep Recursive Scan", "args": ["-r", "--depth", "5"], "desc": "Recursively list files (5 levels deep)"},
85
- {"name": "Download Interesting Files", "args": ["-A", "password", "-r"], "desc": "Auto-download files matching pattern"},
86
- {"name": "Execute Command", "args": ["-u", "<username>", "-p", "<password>", "-x", "whoami"], "desc": "Execute command on target (requires admin)"}
80
+ {
81
+ "name": "Anonymous Scan",
82
+ "args": [],
83
+ "desc": "Basic share enumeration (no credentials)",
84
+ },
85
+ {
86
+ "name": "List Share Contents",
87
+ "args": ["-r"],
88
+ "desc": "Recursively list all accessible files",
89
+ },
90
+ {
91
+ "name": "With Credentials",
92
+ "args": ["-u", "<username>", "-p", "<password>"],
93
+ "desc": "Authenticated scan (replace username/password)",
94
+ },
95
+ {
96
+ "name": "Domain Credentials",
97
+ "args": ["-u", "<username>", "-p", "<password>", "-d", "<domain>"],
98
+ "desc": "Domain authentication",
99
+ },
100
+ {
101
+ "name": "Deep Recursive Scan",
102
+ "args": ["-r", "--depth", "5"],
103
+ "desc": "Recursively list files (5 levels deep)",
104
+ },
105
+ {
106
+ "name": "Download Interesting Files",
107
+ "args": ["-A", "password", "-r"],
108
+ "desc": "Auto-download files matching pattern",
109
+ },
110
+ {
111
+ "name": "Execute Command",
112
+ "args": ["-u", "<username>", "-p", "<password>", "-x", "whoami"],
113
+ "desc": "Execute command on target (requires admin)",
114
+ },
87
115
  ],
88
116
  "help_sections": [
89
117
  {
90
118
  "title": "What is SMBMap?",
91
119
  "color": "cyan",
92
120
  "content": [
93
- {"title": "Overview", "desc": "SMBMap enumerates SMB shares and maps permissions (READ, WRITE, etc.) to quickly identify accessible and writable shares."},
94
- {"title": "Use Cases", "desc": "Perfect for identifying SMB security risks", "tips": [
95
- "Find publicly accessible shares",
96
- "Identify writable shares (high-risk)",
97
- "Map file-level permissions quickly",
98
- "Works with legacy SMB/Samba versions"
99
- ]}
100
- ]
121
+ {
122
+ "title": "Overview",
123
+ "desc": "SMBMap enumerates SMB shares and maps permissions (READ, WRITE, etc.) to quickly identify accessible and writable shares.",
124
+ },
125
+ {
126
+ "title": "Use Cases",
127
+ "desc": "Perfect for identifying SMB security risks",
128
+ "tips": [
129
+ "Find publicly accessible shares",
130
+ "Identify writable shares (high-risk)",
131
+ "Map file-level permissions quickly",
132
+ "Works with legacy SMB/Samba versions",
133
+ ],
134
+ },
135
+ ],
101
136
  },
102
137
  {
103
138
  "title": "How to Use",
104
139
  "color": "green",
105
140
  "content": [
106
- {"title": "Basic Workflow", "desc": "1. Start with anonymous scan (no credentials)\n 2. Check for publicly accessible shares\n 3. Use credentials if available for deeper enumeration\n 4. Flag writable shares as high-risk findings"},
107
- {"title": "Key Features", "desc": "Share enumeration and file operations", "tips": [
108
- "Basic scan: smbmap -H <target>",
109
- "Recursive listing: smbmap -H <target> -r",
110
- "With credentials: smbmap -H <target> -u user -p pass",
111
- "Download files: smbmap -H <target> --download 'share/file.txt'"
112
- ]}
113
- ]
141
+ {
142
+ "title": "Basic Workflow",
143
+ "desc": "1. Start with anonymous scan (no credentials)\n 2. Check for publicly accessible shares\n 3. Use credentials if available for deeper enumeration\n 4. Flag writable shares as high-risk findings",
144
+ },
145
+ {
146
+ "title": "Key Features",
147
+ "desc": "Share enumeration and file operations",
148
+ "tips": [
149
+ "Basic scan: smbmap -H <target>",
150
+ "Recursive listing: smbmap -H <target> -r",
151
+ "With credentials: smbmap -H <target> -u user -p pass",
152
+ "Download files: smbmap -H <target> --download 'share/file.txt'",
153
+ ],
154
+ },
155
+ ],
114
156
  },
115
157
  {
116
158
  "title": "Tips & Best Practices",
117
159
  "color": "yellow",
118
160
  "content": [
119
- ("Best Practices:", [
120
- "Start anonymous, then try credentials",
121
- "Use -r carefully on large shares (generates traffic)",
122
- "Flag writable shares as security findings",
123
- "Combine with enum4linux for complete SMB assessment",
124
- "Capture share permissions to job log"
125
- ]),
126
- ("Common Issues:", [
127
- "No shares found: Try guest account or null session",
128
- "Access denied: Verify credentials and domain format",
129
- "Timeout errors: Increase timeout or reduce recursion depth",
130
- "Connection refused: Check if SMB port 445 is open"
131
- ])
132
- ]
133
- }
161
+ (
162
+ "Best Practices:",
163
+ [
164
+ "Start anonymous, then try credentials",
165
+ "Use -r carefully on large shares (generates traffic)",
166
+ "Flag writable shares as security findings",
167
+ "Combine with enum4linux for complete SMB assessment",
168
+ "Capture share permissions to job log",
169
+ ],
170
+ ),
171
+ (
172
+ "Common Issues:",
173
+ [
174
+ "No shares found: Try guest account or null session",
175
+ "Access denied: Verify credentials and domain format",
176
+ "Timeout errors: Increase timeout or reduce recursion depth",
177
+ "Connection refused: Check if SMB port 445 is open",
178
+ ],
179
+ ),
180
+ ],
181
+ },
134
182
  ],
135
183
  "common_options": {
136
184
  "-H": "Target host (automatically set)",
@@ -142,8 +190,8 @@ HELP = {
142
190
  "-A": "Auto-download files matching pattern",
143
191
  "-x": "Execute command",
144
192
  "--download": "Download file path",
145
- "-q": "Quiet mode"
146
- }
193
+ "-q": "Quiet mode",
194
+ },
147
195
  }
148
196
 
149
197
 
@@ -153,8 +201,9 @@ class SmbmapPlugin(PluginBase):
153
201
  category = "scanning"
154
202
  HELP = HELP
155
203
 
156
-
157
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
204
+ def build_command(
205
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
206
+ ):
158
207
  """Build command for background execution with PID tracking."""
159
208
  args = args or []
160
209
 
@@ -166,21 +215,20 @@ class SmbmapPlugin(PluginBase):
166
215
  if "-H" not in args and "--host" not in args:
167
216
  cmd.extend(["-H", target])
168
217
  cmd.extend(args)
169
-
170
- return {
171
- 'cmd': cmd,
172
- 'timeout': 1800
173
- }
174
218
 
175
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
219
+ return {"cmd": cmd, "timeout": 1800}
220
+
221
+ def run(
222
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
223
+ ) -> int:
176
224
  """Execute smbmap scan and write output to log_path."""
177
-
225
+
178
226
  # Validate target
179
227
  try:
180
228
  target = validate_target(target)
181
229
  except ValidationError as e:
182
230
  if log_path:
183
- with open(log_path, 'w') as f:
231
+ with open(log_path, "w") as f:
184
232
  f.write(f"ERROR: Invalid target: {e}\n")
185
233
  return 1
186
234
  raise ValueError(f"Invalid target: {e}")
@@ -199,7 +247,9 @@ class SmbmapPlugin(PluginBase):
199
247
 
200
248
  if not log_path:
201
249
  try:
202
- proc = subprocess.run(cmd, capture_output=True, timeout=120, check=False)
250
+ proc = subprocess.run(
251
+ cmd, capture_output=True, timeout=120, check=False
252
+ )
203
253
  return proc.returncode
204
254
  except Exception:
205
255
  return 1
@@ -209,18 +259,18 @@ class SmbmapPlugin(PluginBase):
209
259
  fh.write("=== SMBMap Scan ===\n")
210
260
  fh.write(f"Target: {target}\n")
211
261
  fh.write(f"Command: {' '.join(cmd)}\n")
212
- fh.write(f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n\n")
262
+ fh.write(
263
+ f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n\n"
264
+ )
213
265
  fh.flush()
214
266
 
215
267
  proc = subprocess.run(
216
- cmd,
217
- stdout=fh,
218
- stderr=subprocess.STDOUT,
219
- timeout=120,
220
- check=False
268
+ cmd, stdout=fh, stderr=subprocess.STDOUT, timeout=120, check=False
221
269
  )
222
270
 
223
- fh.write(f"\n\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n")
271
+ fh.write(
272
+ f"\n\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
273
+ )
224
274
  fh.write(f"Exit Code: {proc.returncode}\n")
225
275
 
226
276
  return proc.returncode
@@ -0,0 +1,215 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ souleyez.plugins.smbpasswd
4
+
5
+ SMB Password Change plugin - changes passwords for users with STATUS_PASSWORD_MUST_CHANGE.
6
+ """
7
+ import subprocess
8
+ import time
9
+ from typing import List
10
+
11
+ from .plugin_base import PluginBase
12
+
13
+ HELP = {
14
+ "name": "smbpasswd - SMB Password Change",
15
+ "description": (
16
+ "Change SMB/AD passwords over the network.\n\n"
17
+ "Used when a user account has STATUS_PASSWORD_MUST_CHANGE - the password "
18
+ "is known but must be changed before the account can be used.\n\n"
19
+ "This is common in AD environments where initial passwords are set "
20
+ "and users are required to change them on first login.\n\n"
21
+ "The plugin uses smbpasswd with -s flag for non-interactive operation.\n"
22
+ ),
23
+ "usage": 'souleyez jobs enqueue smbpasswd <target> --args "-U <user> --old-pass <old> --new-pass <new>"',
24
+ "examples": [
25
+ 'souleyez jobs enqueue smbpasswd 192.168.1.10 --args "-U Caroline.Robinson --old-pass BabyStart123! --new-pass NewP@ss123!"',
26
+ ],
27
+ "flags": [
28
+ ["-r, --remote <TARGET>", "Remote SMB server (auto-set from target)"],
29
+ ["-U, --user <USER>", "Username to change password for"],
30
+ ["--old-pass <PASS>", "Current/old password"],
31
+ ["--new-pass <PASS>", "New password to set"],
32
+ ],
33
+ "presets": [],
34
+ "notes": [
35
+ "Requires smbpasswd (part of samba-common-bin package)",
36
+ "Use when crackmapexec shows STATUS_PASSWORD_MUST_CHANGE",
37
+ "New password must meet domain password policy requirements",
38
+ "After changing, use evil-winrm or other tools with new credentials",
39
+ ],
40
+ }
41
+
42
+
43
+ class SmbpasswdPlugin(PluginBase):
44
+ name = "smbpasswd"
45
+ tool = "smbpasswd"
46
+ category = "credential_attack"
47
+ HELP = HELP
48
+
49
+ def build_command(
50
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
51
+ ):
52
+ """Build command for execution."""
53
+ args = args or []
54
+
55
+ # Parse custom args to extract username and passwords
56
+ username = None
57
+ old_pass = None
58
+ new_pass = None
59
+
60
+ i = 0
61
+ filtered_args = []
62
+ while i < len(args):
63
+ if args[i] in ["-U", "--user"]:
64
+ username = args[i + 1] if i + 1 < len(args) else None
65
+ i += 2
66
+ elif args[i] == "--old-pass":
67
+ old_pass = args[i + 1] if i + 1 < len(args) else None
68
+ i += 2
69
+ elif args[i] == "--new-pass":
70
+ new_pass = args[i + 1] if i + 1 < len(args) else None
71
+ i += 2
72
+ else:
73
+ filtered_args.append(args[i])
74
+ i += 1
75
+
76
+ # Build command with shell piping to pass passwords via stdin
77
+ # Format: (echo 'oldpass'; echo 'newpass'; echo 'newpass') | smbpasswd -r target -U user -s
78
+ if old_pass and new_pass and username:
79
+ # Escape single quotes in passwords
80
+ old_pass_escaped = old_pass.replace("'", "'\\''")
81
+ new_pass_escaped = new_pass.replace("'", "'\\''")
82
+
83
+ shell_cmd = (
84
+ f"(echo '{old_pass_escaped}'; echo '{new_pass_escaped}'; echo '{new_pass_escaped}') | "
85
+ f"smbpasswd -r {target} -U {username} -s"
86
+ )
87
+ cmd = ["bash", "-c", shell_cmd]
88
+ else:
89
+ # Fallback to basic command (will fail without passwords)
90
+ cmd = ["smbpasswd", "-r", target, "-s"]
91
+ if username:
92
+ cmd.extend(["-U", username])
93
+ cmd.extend(filtered_args)
94
+
95
+ return {
96
+ "cmd": cmd,
97
+ "timeout": 120, # Increased for slow SAMR connections
98
+ "old_pass": old_pass,
99
+ "new_pass": new_pass,
100
+ "username": username,
101
+ }
102
+
103
+ def run(
104
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
105
+ ) -> int:
106
+ """Execute smbpasswd."""
107
+ args = args or []
108
+
109
+ # Parse args
110
+ cmd_info = self.build_command(target, args, label, log_path)
111
+ cmd = cmd_info["cmd"]
112
+ username = cmd_info.get("username", "unknown")
113
+ new_pass = cmd_info.get("new_pass", "")
114
+
115
+ try:
116
+ if log_path:
117
+ with open(log_path, "w", encoding="utf-8", errors="replace") as fh:
118
+ fh.write("=== SMB Password Change ===\n")
119
+ fh.write(f"Target: {target}\n")
120
+ fh.write(f"Username: {username}\n")
121
+ fh.write(
122
+ f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n\n"
123
+ )
124
+ fh.write(f"Command: {' '.join(cmd)}\n")
125
+ fh.write("(passwords piped via shell)\n\n")
126
+ fh.flush()
127
+
128
+ # Run smbpasswd with password piping via bash
129
+ proc = subprocess.run(
130
+ cmd,
131
+ capture_output=True,
132
+ text=True,
133
+ timeout=120, # Increased for slow SAMR connections
134
+ check=False,
135
+ )
136
+
137
+ fh.write(f"STDOUT:\n{proc.stdout}\n")
138
+ fh.write(f"STDERR:\n{proc.stderr}\n")
139
+
140
+ # Check for success - either exit code 0 OR "Password changed" in output
141
+ # SAMR connection may timeout AFTER password was changed successfully
142
+ output_combined = (proc.stdout or "") + (proc.stderr or "")
143
+ password_changed = (
144
+ proc.returncode == 0
145
+ or "Password changed" in output_combined
146
+ or "password changed" in output_combined.lower()
147
+ )
148
+
149
+ # Also check for timeout that happened AFTER password change
150
+ # If we see IO_TIMEOUT but no "password is not correct", it likely worked
151
+ if (
152
+ "NT_STATUS_IO_TIMEOUT" in output_combined
153
+ and "not correct" not in output_combined
154
+ ):
155
+ password_changed = True
156
+ fh.write(
157
+ "\n[NOTE] SAMR timeout occurred but password may have changed\n"
158
+ )
159
+
160
+ if password_changed:
161
+ fh.write("\n" + "=" * 50 + "\n")
162
+ fh.write("PASSWORD CHANGED SUCCESSFULLY!\n")
163
+ fh.write("=" * 50 + "\n")
164
+ fh.write(f"Username: {username}\n")
165
+ fh.write(f"New Password: {new_pass}\n")
166
+ fh.write("\nNext step: Connect with evil-winrm or other tool\n")
167
+ fh.write(
168
+ f"Example: evil-winrm -i {target} -u {username} -p '{new_pass}'\n"
169
+ )
170
+ # Return 0 to indicate success for chaining
171
+ return 0
172
+ else:
173
+ fh.write("\nPassword change FAILED - check error above\n")
174
+
175
+ fh.write(
176
+ f"\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
177
+ )
178
+ fh.write(f"Exit Code: {proc.returncode}\n")
179
+
180
+ return proc.returncode
181
+ else:
182
+ # No log path - run directly
183
+ proc = subprocess.run(
184
+ cmd, capture_output=True, text=True, timeout=120, check=False
185
+ )
186
+ # Check for success patterns even without log
187
+ output_combined = (proc.stdout or "") + (proc.stderr or "")
188
+ if (
189
+ "Password changed" in output_combined
190
+ or "NT_STATUS_IO_TIMEOUT" in output_combined
191
+ ):
192
+ return 0
193
+ return proc.returncode
194
+
195
+ except subprocess.TimeoutExpired:
196
+ if log_path:
197
+ with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
198
+ fh.write("\nERROR: smbpasswd command timed out after 120 seconds\n")
199
+ return 124
200
+
201
+ except FileNotFoundError:
202
+ if log_path:
203
+ with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
204
+ fh.write("\nERROR: smbpasswd not found in PATH\n")
205
+ fh.write("Install with: apt install samba-common-bin\n")
206
+ return 127
207
+
208
+ except Exception as e:
209
+ if log_path:
210
+ with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
211
+ fh.write(f"\nERROR: {type(e).__name__}: {e}\n")
212
+ return 1
213
+
214
+
215
+ plugin = SmbpasswdPlugin()