souleyez 2.43.29__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 +22783 -10678
  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.29.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.29.dist-info → souleyez-2.43.32.dist-info}/WHEEL +1 -1
  353. souleyez-2.43.29.dist-info/RECORD +0 -379
  354. {souleyez-2.43.29.dist-info → souleyez-2.43.32.dist-info}/entry_points.txt +0 -0
  355. {souleyez-2.43.29.dist-info → souleyez-2.43.32.dist-info}/licenses/LICENSE +0 -0
  356. {souleyez-2.43.29.dist-info → souleyez-2.43.32.dist-info}/top_level.txt +0 -0
@@ -26,11 +26,11 @@ HELP = {
26
26
  "- Use with username list for better results\n"
27
27
  "- Check for accounts with SPN and no pre-auth\n"
28
28
  ),
29
- "usage": "souleyez jobs enqueue impacket-getnpusers <domain>/<username> --args \"-dc-ip <dc_ip>\"",
29
+ "usage": 'souleyez jobs enqueue impacket-getnpusers <domain>/<username> --args "-dc-ip <dc_ip>"',
30
30
  "examples": [
31
- "souleyez jobs enqueue impacket-getnpusers CONTOSO.LOCAL/ --args \"-dc-ip 10.0.0.82 -usersfile users.txt\"",
32
- "souleyez jobs enqueue impacket-getnpusers CONTOSO.LOCAL/ --args \"-dc-ip 10.0.0.82 -no-pass\"",
33
- "souleyez jobs enqueue impacket-getnpusers CONTOSO.LOCAL/user --args \"-dc-ip 10.0.0.82 -format hashcat\"",
31
+ 'souleyez jobs enqueue impacket-getnpusers CONTOSO.LOCAL/ --args "-dc-ip 10.0.0.82 -usersfile users.txt"',
32
+ 'souleyez jobs enqueue impacket-getnpusers CONTOSO.LOCAL/ --args "-dc-ip 10.0.0.82 -no-pass"',
33
+ 'souleyez jobs enqueue impacket-getnpusers CONTOSO.LOCAL/user --args "-dc-ip 10.0.0.82 -format hashcat"',
34
34
  ],
35
35
  "flags": [
36
36
  ["-dc-ip <ip>", "Domain Controller IP address"],
@@ -44,80 +44,108 @@ HELP = {
44
44
  {
45
45
  "name": "Anonymous AS-REP Roast",
46
46
  "args": ["-dc-ip", "<target>", "-no-pass", "-format", "hashcat"],
47
- "desc": "Extract AS-REP hashes without authentication (anonymous)"
47
+ "desc": "Extract AS-REP hashes without authentication (anonymous)",
48
48
  },
49
49
  {
50
50
  "name": "With Username List",
51
- "args": ["-dc-ip", "<target>", "-usersfile", "users.txt", "-format", "hashcat", "-no-pass"],
52
- "desc": "Test list of usernames for AS-REP roasting"
53
- }
51
+ "args": [
52
+ "-dc-ip",
53
+ "<target>",
54
+ "-usersfile",
55
+ "users.txt",
56
+ "-format",
57
+ "hashcat",
58
+ "-no-pass",
59
+ ],
60
+ "desc": "Test list of usernames for AS-REP roasting",
61
+ },
54
62
  ],
55
63
  "authenticated": [
56
64
  {
57
65
  "name": "AS-REP Roast (Authenticated)",
58
66
  "args": ["-dc-ip", "<target>", "-format", "hashcat"],
59
- "desc": "Extract AS-REP hashes with valid domain account"
67
+ "desc": "Extract AS-REP hashes with valid domain account",
60
68
  },
61
69
  {
62
70
  "name": "Request All Vulnerable Accounts",
63
71
  "args": ["-dc-ip", "<target>", "-request", "-format", "hashcat"],
64
- "desc": "Find and extract all AS-REP roastable accounts"
65
- }
66
- ]
72
+ "desc": "Find and extract all AS-REP roastable accounts",
73
+ },
74
+ ],
67
75
  },
68
- "presets": []
76
+ "presets": [],
69
77
  }
70
78
 
71
79
  # Flatten presets
72
- for category_presets in HELP['preset_categories'].values():
73
- HELP['presets'].extend(category_presets)
80
+ for category_presets in HELP["preset_categories"].values():
81
+ HELP["presets"].extend(category_presets)
74
82
 
75
83
  HELP["help_sections"] = [
76
84
  {
77
85
  "title": "What is GetNPUsers (AS-REP Roasting)?",
78
86
  "color": "cyan",
79
87
  "content": [
80
- {"title": "Overview", "desc": "GetNPUsers performs AS-REP Roasting to extract Kerberos hashes for accounts that don't require Kerberos pre-authentication, which can be cracked offline."},
81
- {"title": "Use Cases", "desc": "Extract crackable hashes without credentials", "tips": [
82
- "Find accounts with 'Do not require Kerberos preauthentication' set",
83
- "Extract AS-REP hashes without valid credentials",
84
- "Identify weak passwords in Active Directory",
85
- "Get initial access foothold"
86
- ]}
87
- ]
88
+ {
89
+ "title": "Overview",
90
+ "desc": "GetNPUsers performs AS-REP Roasting to extract Kerberos hashes for accounts that don't require Kerberos pre-authentication, which can be cracked offline.",
91
+ },
92
+ {
93
+ "title": "Use Cases",
94
+ "desc": "Extract crackable hashes without credentials",
95
+ "tips": [
96
+ "Find accounts with 'Do not require Kerberos preauthentication' set",
97
+ "Extract AS-REP hashes without valid credentials",
98
+ "Identify weak passwords in Active Directory",
99
+ "Get initial access foothold",
100
+ ],
101
+ },
102
+ ],
88
103
  },
89
104
  {
90
105
  "title": "How to Use",
91
106
  "color": "green",
92
107
  "content": [
93
- {"title": "Basic Workflow", "desc": "1. Run anonymously (-no-pass) with username list\n 2. Extract AS-REP hashes for vulnerable accounts\n 3. Crack hashes with hashcat mode 18200\n 4. Use cracked credentials for access"},
94
- {"title": "Key Options", "desc": "Essential GetNPUsers parameters", "tips": [
95
- "-no-pass: Anonymous enumeration",
96
- "-usersfile: Test multiple usernames",
97
- "-format hashcat: Output for hashcat cracking",
98
- "-dc-ip: Domain Controller IP address"
99
- ]}
100
- ]
108
+ {
109
+ "title": "Basic Workflow",
110
+ "desc": "1. Run anonymously (-no-pass) with username list\n 2. Extract AS-REP hashes for vulnerable accounts\n 3. Crack hashes with hashcat mode 18200\n 4. Use cracked credentials for access",
111
+ },
112
+ {
113
+ "title": "Key Options",
114
+ "desc": "Essential GetNPUsers parameters",
115
+ "tips": [
116
+ "-no-pass: Anonymous enumeration",
117
+ "-usersfile: Test multiple usernames",
118
+ "-format hashcat: Output for hashcat cracking",
119
+ "-dc-ip: Domain Controller IP address",
120
+ ],
121
+ },
122
+ ],
101
123
  },
102
124
  {
103
125
  "title": "Tips & Best Practices",
104
126
  "color": "yellow",
105
127
  "content": [
106
- ("Best Practices:", [
107
- "Use -usersfile with common username lists",
108
- "Output in hashcat format (-format hashcat)",
109
- "Works without any authentication (anonymous)",
110
- "Crack hashes with: hashcat -m 18200 hashes.txt wordlist.txt",
111
- "Check for SPN accounts without pre-auth"
112
- ]),
113
- ("Common Issues:", [
114
- "No hashes found: Pre-auth may be required for all accounts",
115
- "DC unreachable: Verify -dc-ip is correct",
116
- "Format errors: Use -format hashcat or john",
117
- "Empty results: Try authenticated scan with valid credentials"
118
- ])
119
- ]
120
- }
128
+ (
129
+ "Best Practices:",
130
+ [
131
+ "Use -usersfile with common username lists",
132
+ "Output in hashcat format (-format hashcat)",
133
+ "Works without any authentication (anonymous)",
134
+ "Crack hashes with: hashcat -m 18200 hashes.txt wordlist.txt",
135
+ "Check for SPN accounts without pre-auth",
136
+ ],
137
+ ),
138
+ (
139
+ "Common Issues:",
140
+ [
141
+ "No hashes found: Pre-auth may be required for all accounts",
142
+ "DC unreachable: Verify -dc-ip is correct",
143
+ "Format errors: Use -format hashcat or john",
144
+ "Empty results: Try authenticated scan with valid credentials",
145
+ ],
146
+ ),
147
+ ],
148
+ },
121
149
  ]
122
150
 
123
151
 
@@ -127,23 +155,35 @@ class ImpacketGetNPUsersPlugin(PluginBase):
127
155
  category = "credential_access"
128
156
  HELP = HELP
129
157
 
130
-
131
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
158
+ def build_command(
159
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
160
+ ):
132
161
  """Build command for background execution with PID tracking."""
133
162
  args = args or []
134
-
163
+
135
164
  # Replace <target> placeholder
136
165
  args = [arg.replace("<target>", target) for arg in args]
137
166
 
138
- # Build command
139
- cmd = ["impacket-GetNPUsers", target] + args
167
+ # Build command - GetNPUsers expects: domain/ -dc-ip <ip> [options]
168
+ # Check if first arg is a domain (contains / or looks like domain.tld)
169
+ cmd = ["impacket-GetNPUsers"]
170
+
171
+ # If args starts with domain/, use that as positional arg (not target IP)
172
+ if args and ("/" in args[0] or args[0].count(".") >= 1):
173
+ # First arg is the domain, use it as positional
174
+ cmd.append(args[0])
175
+ args = args[1:]
176
+ else:
177
+ # Target is the domain
178
+ cmd.append(target)
179
+
180
+ cmd.extend(args)
140
181
 
141
- return {
142
- 'cmd': cmd,
143
- 'timeout': 1800
144
- }
182
+ return {"cmd": cmd, "timeout": 1800}
145
183
 
146
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
184
+ def run(
185
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
186
+ ) -> int:
147
187
  """Execute impacket-GetNPUsers and write output to log_path."""
148
188
 
149
189
  args = args or []
@@ -151,18 +191,26 @@ class ImpacketGetNPUsersPlugin(PluginBase):
151
191
  # Replace <target> placeholder
152
192
  args = [arg.replace("<target>", target) for arg in args]
153
193
 
154
- # Build command
155
- cmd = ["impacket-getnpusers"]
194
+ # Build command - GetNPUsers expects: domain/ -dc-ip <ip> [options]
195
+ cmd = ["impacket-GetNPUsers"]
156
196
 
157
- # Add target (domain/username or just domain/)
158
- cmd.append(target)
197
+ # If args starts with domain/, use that as positional arg (not target IP)
198
+ if args and ("/" in args[0] or args[0].count(".") >= 1):
199
+ # First arg is the domain, use it as positional
200
+ cmd.append(args[0])
201
+ args = args[1:]
202
+ else:
203
+ # Target is the domain
204
+ cmd.append(target)
159
205
 
160
- # Add args
206
+ # Add remaining args
161
207
  cmd.extend(args)
162
208
 
163
209
  if not log_path:
164
210
  try:
165
- proc = subprocess.run(cmd, capture_output=True, timeout=120, check=False)
211
+ proc = subprocess.run(
212
+ cmd, capture_output=True, timeout=120, check=False
213
+ )
166
214
  return proc.returncode
167
215
  except Exception:
168
216
  return 1
@@ -174,16 +222,14 @@ class ImpacketGetNPUsersPlugin(PluginBase):
174
222
  fh.write(f"Target: {target}\n")
175
223
  fh.write(f"Args: {args}\n")
176
224
  fh.write(f"Label: {label}\n")
177
- fh.write(f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n")
225
+ fh.write(
226
+ f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
227
+ )
178
228
  fh.write(f"Command: {' '.join(cmd)}\n\n")
179
229
 
180
230
  # Run GetNPUsers
181
231
  proc = subprocess.run(
182
- cmd,
183
- capture_output=True,
184
- timeout=120,
185
- check=False,
186
- text=True
232
+ cmd, capture_output=True, timeout=120, check=False, text=True
187
233
  )
188
234
 
189
235
  # Write output
@@ -194,7 +240,9 @@ class ImpacketGetNPUsersPlugin(PluginBase):
194
240
  if proc.stderr:
195
241
  fh.write(f"\n\n# Error output:\n{proc.stderr}\n")
196
242
 
197
- fh.write(f"\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n")
243
+ fh.write(
244
+ f"\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
245
+ )
198
246
  fh.write(f"Exit Code: {proc.returncode}\n")
199
247
 
200
248
  return proc.returncode
@@ -26,11 +26,11 @@ HELP = {
26
26
  "- Works even if PowerShell is disabled\n"
27
27
  "- Can use pass-the-hash with -hashes\n"
28
28
  ),
29
- "usage": "souleyez jobs enqueue impacket-psexec <target> --args \"DOMAIN/user:pass@host\"",
29
+ "usage": 'souleyez jobs enqueue impacket-psexec <target> --args "DOMAIN/user:pass@host"',
30
30
  "examples": [
31
- "souleyez jobs enqueue impacket-psexec 10.0.0.82 --args \"Administrator:Password123@10.0.0.82\"",
32
- "souleyez jobs enqueue impacket-psexec 10.0.0.82 --args \"CONTOSO/Administrator@10.0.0.82 -hashes :8846f7eaee8fb117ad06bdd830b7586c\"",
33
- "souleyez jobs enqueue impacket-psexec 10.0.0.82 --args \"Administrator:Password123@10.0.0.82 whoami\"",
31
+ 'souleyez jobs enqueue impacket-psexec 10.0.0.82 --args "Administrator:Password123@10.0.0.82"',
32
+ 'souleyez jobs enqueue impacket-psexec 10.0.0.82 --args "CONTOSO/Administrator@10.0.0.82 -hashes :8846f7eaee8fb117ad06bdd830b7586c"',
33
+ 'souleyez jobs enqueue impacket-psexec 10.0.0.82 --args "Administrator:Password123@10.0.0.82 whoami"',
34
34
  ],
35
35
  "flags": [
36
36
  ["-hashes <LM:NT>", "Pass-the-hash authentication"],
@@ -44,90 +44,110 @@ HELP = {
44
44
  {
45
45
  "name": "Interactive Shell",
46
46
  "args": [],
47
- "desc": "Get interactive SYSTEM shell (default behavior)"
47
+ "desc": "Get interactive SYSTEM shell (default behavior)",
48
48
  },
49
49
  {
50
50
  "name": "Execute Single Command",
51
51
  "args": ["whoami"],
52
- "desc": "Execute single command and exit (replace 'whoami' with your command)"
52
+ "desc": "Execute single command and exit (replace 'whoami' with your command)",
53
53
  },
54
54
  {
55
55
  "name": "Execute and Save Output",
56
56
  "args": ["cmd.exe", "/c", "dir C:\\ > C:\\output.txt"],
57
- "desc": "Run command and save output to file"
58
- }
57
+ "desc": "Run command and save output to file",
58
+ },
59
59
  ],
60
60
  "authentication": [
61
61
  {
62
62
  "name": "Pass-the-Hash (NTLM)",
63
63
  "args": ["-hashes", ":<ntlm_hash>"],
64
- "desc": "Authenticate with NTLM hash instead of password"
64
+ "desc": "Authenticate with NTLM hash instead of password",
65
65
  },
66
66
  {
67
67
  "name": "Pass-the-Hash + Execute Command",
68
68
  "args": ["-hashes", ":<ntlm_hash>", "whoami"],
69
- "desc": "Use hash authentication and run command"
69
+ "desc": "Use hash authentication and run command",
70
70
  },
71
71
  {
72
72
  "name": "Kerberos Authentication",
73
73
  "args": ["-k", "-no-pass"],
74
- "desc": "Use Kerberos ticket for authentication"
75
- }
76
- ]
74
+ "desc": "Use Kerberos ticket for authentication",
75
+ },
76
+ ],
77
77
  },
78
- "presets": []
78
+ "presets": [],
79
79
  }
80
80
 
81
81
  # Flatten presets
82
- for category_presets in HELP['preset_categories'].values():
83
- HELP['presets'].extend(category_presets)
82
+ for category_presets in HELP["preset_categories"].values():
83
+ HELP["presets"].extend(category_presets)
84
84
 
85
85
  HELP["help_sections"] = [
86
86
  {
87
87
  "title": "What is psexec?",
88
88
  "color": "cyan",
89
89
  "content": [
90
- {"title": "Overview", "desc": "psexec provides remote command execution on Windows systems using SMB and named pipes, similar to Sysinternals PsExec, executing commands with SYSTEM privileges."},
91
- {"title": "Use Cases", "desc": "Remote command execution and lateral movement", "tips": [
92
- "Execute commands with SYSTEM privileges",
93
- "Get interactive shells on Windows hosts",
94
- "Run post-exploitation scripts remotely",
95
- "Pivot through compromised systems"
96
- ]}
97
- ]
90
+ {
91
+ "title": "Overview",
92
+ "desc": "psexec provides remote command execution on Windows systems using SMB and named pipes, similar to Sysinternals PsExec, executing commands with SYSTEM privileges.",
93
+ },
94
+ {
95
+ "title": "Use Cases",
96
+ "desc": "Remote command execution and lateral movement",
97
+ "tips": [
98
+ "Execute commands with SYSTEM privileges",
99
+ "Get interactive shells on Windows hosts",
100
+ "Run post-exploitation scripts remotely",
101
+ "Pivot through compromised systems",
102
+ ],
103
+ },
104
+ ],
98
105
  },
99
106
  {
100
107
  "title": "How to Use",
101
108
  "color": "green",
102
109
  "content": [
103
- {"title": "Basic Workflow", "desc": "1. Obtain admin credentials or hashes\n 2. Connect to target with psexec\n 3. Execute commands or get interactive shell\n 4. Run post-exploitation tasks"},
104
- {"title": "Key Options", "desc": "Essential psexec parameters", "tips": [
105
- "Basic: psexec user:pass@host",
106
- "Pass-the-hash: psexec -hashes :ntlm_hash user@host",
107
- "Execute command: psexec user:pass@host whoami",
108
- "Interactive shell: psexec user:pass@host (default)"
109
- ]}
110
- ]
110
+ {
111
+ "title": "Basic Workflow",
112
+ "desc": "1. Obtain admin credentials or hashes\n 2. Connect to target with psexec\n 3. Execute commands or get interactive shell\n 4. Run post-exploitation tasks",
113
+ },
114
+ {
115
+ "title": "Key Options",
116
+ "desc": "Essential psexec parameters",
117
+ "tips": [
118
+ "Basic: psexec user:pass@host",
119
+ "Pass-the-hash: psexec -hashes :ntlm_hash user@host",
120
+ "Execute command: psexec user:pass@host whoami",
121
+ "Interactive shell: psexec user:pass@host (default)",
122
+ ],
123
+ },
124
+ ],
111
125
  },
112
126
  {
113
127
  "title": "Tips & Best Practices",
114
128
  "color": "yellow",
115
129
  "content": [
116
- ("Best Practices:", [
117
- "Requires admin credentials or hashes",
118
- "Less stealthy (creates service on target)",
119
- "Works even if PowerShell is disabled",
120
- "Can use pass-the-hash with -hashes",
121
- "SYSTEM-level access by default"
122
- ]),
123
- ("Common Issues:", [
124
- "Access denied: Verify admin credentials",
125
- "Service creation failed: Check admin rights",
126
- "Connection timeout: Verify SMB (445) is open",
127
- "Antivirus blocks: Use alternative exec methods (wmiexec, smbexec)"
128
- ])
129
- ]
130
- }
130
+ (
131
+ "Best Practices:",
132
+ [
133
+ "Requires admin credentials or hashes",
134
+ "Less stealthy (creates service on target)",
135
+ "Works even if PowerShell is disabled",
136
+ "Can use pass-the-hash with -hashes",
137
+ "SYSTEM-level access by default",
138
+ ],
139
+ ),
140
+ (
141
+ "Common Issues:",
142
+ [
143
+ "Access denied: Verify admin credentials",
144
+ "Service creation failed: Check admin rights",
145
+ "Connection timeout: Verify SMB (445) is open",
146
+ "Antivirus blocks: Use alternative exec methods (wmiexec, smbexec)",
147
+ ],
148
+ ),
149
+ ],
150
+ },
131
151
  ]
132
152
 
133
153
 
@@ -137,23 +157,23 @@ class ImpacketPsexecPlugin(PluginBase):
137
157
  category = "lateral_movement"
138
158
  HELP = HELP
139
159
 
140
-
141
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
160
+ def build_command(
161
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
162
+ ):
142
163
  """Build command for background execution with PID tracking."""
143
164
  args = args or []
144
-
165
+
145
166
  # Replace <target> placeholder
146
167
  args = [arg.replace("<target>", target) for arg in args]
147
-
168
+
148
169
  # Build command (args should include credentials)
149
170
  cmd = ["impacket-psexec"] + args
150
-
151
- return {
152
- 'cmd': cmd,
153
- 'timeout': 1800
154
- }
155
171
 
156
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
172
+ return {"cmd": cmd, "timeout": 1800}
173
+
174
+ def run(
175
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
176
+ ) -> int:
157
177
  """Execute impacket-psexec and write output to log_path."""
158
178
 
159
179
  args = args or []
@@ -181,17 +201,15 @@ class ImpacketPsexecPlugin(PluginBase):
181
201
  fh.write(f"Target: {target}\n")
182
202
  fh.write(f"Args: {args}\n")
183
203
  fh.write(f"Label: {label}\n")
184
- fh.write(f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n")
204
+ fh.write(
205
+ f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
206
+ )
185
207
  fh.write(f"Command: {' '.join(cmd)}\n\n")
186
208
 
187
209
  # Run psexec (non-interactive)
188
210
  # Note: For interactive shells, this would need special handling
189
211
  proc = subprocess.run(
190
- cmd,
191
- capture_output=True,
192
- timeout=60,
193
- check=False,
194
- text=True
212
+ cmd, capture_output=True, timeout=60, check=False, text=True
195
213
  )
196
214
 
197
215
  # Write output
@@ -202,7 +220,9 @@ class ImpacketPsexecPlugin(PluginBase):
202
220
  if proc.stderr:
203
221
  fh.write(f"\n\n# Error output:\n{proc.stderr}\n")
204
222
 
205
- fh.write(f"\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n")
223
+ fh.write(
224
+ f"\nCompleted: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
225
+ )
206
226
  fh.write(f"Exit Code: {proc.returncode}\n")
207
227
 
208
228
  return proc.returncode