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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. souleyez/__init__.py +1 -2
  2. souleyez/ai/__init__.py +21 -15
  3. souleyez/ai/action_mapper.py +249 -150
  4. souleyez/ai/chain_advisor.py +116 -100
  5. souleyez/ai/claude_provider.py +29 -28
  6. souleyez/ai/context_builder.py +80 -62
  7. souleyez/ai/executor.py +158 -117
  8. souleyez/ai/feedback_handler.py +136 -121
  9. souleyez/ai/llm_factory.py +27 -20
  10. souleyez/ai/llm_provider.py +4 -2
  11. souleyez/ai/ollama_provider.py +6 -9
  12. souleyez/ai/ollama_service.py +44 -37
  13. souleyez/ai/path_scorer.py +91 -76
  14. souleyez/ai/recommender.py +176 -144
  15. souleyez/ai/report_context.py +74 -73
  16. souleyez/ai/report_service.py +84 -66
  17. souleyez/ai/result_parser.py +222 -229
  18. souleyez/ai/safety.py +67 -44
  19. souleyez/auth/__init__.py +23 -22
  20. souleyez/auth/audit.py +36 -26
  21. souleyez/auth/engagement_access.py +65 -48
  22. souleyez/auth/permissions.py +14 -3
  23. souleyez/auth/session_manager.py +54 -37
  24. souleyez/auth/user_manager.py +109 -64
  25. souleyez/commands/audit.py +40 -43
  26. souleyez/commands/auth.py +35 -15
  27. souleyez/commands/deliverables.py +55 -50
  28. souleyez/commands/engagement.py +47 -28
  29. souleyez/commands/license.py +32 -23
  30. souleyez/commands/screenshots.py +36 -32
  31. souleyez/commands/user.py +82 -36
  32. souleyez/config.py +52 -44
  33. souleyez/core/credential_tester.py +87 -81
  34. souleyez/core/cve_mappings.py +179 -192
  35. souleyez/core/cve_matcher.py +162 -148
  36. souleyez/core/msf_auto_mapper.py +100 -83
  37. souleyez/core/msf_chain_engine.py +294 -256
  38. souleyez/core/msf_database.py +153 -70
  39. souleyez/core/msf_integration.py +679 -673
  40. souleyez/core/msf_rpc_client.py +40 -42
  41. souleyez/core/msf_rpc_manager.py +77 -79
  42. souleyez/core/msf_sync_manager.py +241 -181
  43. souleyez/core/network_utils.py +22 -15
  44. souleyez/core/parser_handler.py +34 -25
  45. souleyez/core/pending_chains.py +114 -63
  46. souleyez/core/templates.py +158 -107
  47. souleyez/core/tool_chaining.py +9564 -2881
  48. souleyez/core/version_utils.py +79 -94
  49. souleyez/core/vuln_correlation.py +136 -89
  50. souleyez/core/web_utils.py +33 -32
  51. souleyez/data/wordlists/ad_users.txt +378 -0
  52. souleyez/data/wordlists/api_endpoints_large.txt +769 -0
  53. souleyez/data/wordlists/home_dir_sensitive.txt +39 -0
  54. souleyez/data/wordlists/lfi_payloads.txt +82 -0
  55. souleyez/data/wordlists/passwords_brute.txt +1548 -0
  56. souleyez/data/wordlists/passwords_crack.txt +2479 -0
  57. souleyez/data/wordlists/passwords_spray.txt +386 -0
  58. souleyez/data/wordlists/subdomains_large.txt +5057 -0
  59. souleyez/data/wordlists/usernames_common.txt +694 -0
  60. souleyez/data/wordlists/web_dirs_large.txt +4769 -0
  61. souleyez/detection/__init__.py +1 -1
  62. souleyez/detection/attack_signatures.py +12 -17
  63. souleyez/detection/mitre_mappings.py +61 -55
  64. souleyez/detection/validator.py +97 -86
  65. souleyez/devtools.py +23 -10
  66. souleyez/docs/README.md +4 -4
  67. souleyez/docs/api-reference/cli-commands.md +2 -2
  68. souleyez/docs/developer-guide/adding-new-tools.md +562 -0
  69. souleyez/docs/user-guide/auto-chaining.md +30 -8
  70. souleyez/docs/user-guide/getting-started.md +1 -1
  71. souleyez/docs/user-guide/installation.md +26 -3
  72. souleyez/docs/user-guide/metasploit-integration.md +2 -2
  73. souleyez/docs/user-guide/rbac.md +1 -1
  74. souleyez/docs/user-guide/scope-management.md +1 -1
  75. souleyez/docs/user-guide/siem-integration.md +1 -1
  76. souleyez/docs/user-guide/tools-reference.md +1 -8
  77. souleyez/docs/user-guide/worker-management.md +1 -1
  78. souleyez/engine/background.py +1239 -535
  79. souleyez/engine/base.py +4 -1
  80. souleyez/engine/job_status.py +17 -49
  81. souleyez/engine/log_sanitizer.py +103 -77
  82. souleyez/engine/manager.py +38 -7
  83. souleyez/engine/result_handler.py +2200 -1550
  84. souleyez/engine/worker_manager.py +50 -41
  85. souleyez/export/evidence_bundle.py +72 -62
  86. souleyez/feature_flags/features.py +16 -20
  87. souleyez/feature_flags.py +5 -9
  88. souleyez/handlers/__init__.py +11 -0
  89. souleyez/handlers/base.py +188 -0
  90. souleyez/handlers/bash_handler.py +277 -0
  91. souleyez/handlers/bloodhound_handler.py +243 -0
  92. souleyez/handlers/certipy_handler.py +311 -0
  93. souleyez/handlers/crackmapexec_handler.py +486 -0
  94. souleyez/handlers/dnsrecon_handler.py +344 -0
  95. souleyez/handlers/enum4linux_handler.py +400 -0
  96. souleyez/handlers/evil_winrm_handler.py +493 -0
  97. souleyez/handlers/ffuf_handler.py +815 -0
  98. souleyez/handlers/gobuster_handler.py +1114 -0
  99. souleyez/handlers/gpp_extract_handler.py +334 -0
  100. souleyez/handlers/hashcat_handler.py +444 -0
  101. souleyez/handlers/hydra_handler.py +564 -0
  102. souleyez/handlers/impacket_getuserspns_handler.py +343 -0
  103. souleyez/handlers/impacket_psexec_handler.py +222 -0
  104. souleyez/handlers/impacket_secretsdump_handler.py +426 -0
  105. souleyez/handlers/john_handler.py +286 -0
  106. souleyez/handlers/katana_handler.py +425 -0
  107. souleyez/handlers/kerbrute_handler.py +298 -0
  108. souleyez/handlers/ldapsearch_handler.py +636 -0
  109. souleyez/handlers/lfi_extract_handler.py +464 -0
  110. souleyez/handlers/msf_auxiliary_handler.py +409 -0
  111. souleyez/handlers/msf_exploit_handler.py +380 -0
  112. souleyez/handlers/nikto_handler.py +413 -0
  113. souleyez/handlers/nmap_handler.py +821 -0
  114. souleyez/handlers/nuclei_handler.py +359 -0
  115. souleyez/handlers/nxc_handler.py +417 -0
  116. souleyez/handlers/rdp_sec_check_handler.py +353 -0
  117. souleyez/handlers/registry.py +292 -0
  118. souleyez/handlers/responder_handler.py +232 -0
  119. souleyez/handlers/service_explorer_handler.py +434 -0
  120. souleyez/handlers/smbclient_handler.py +344 -0
  121. souleyez/handlers/smbmap_handler.py +510 -0
  122. souleyez/handlers/smbpasswd_handler.py +296 -0
  123. souleyez/handlers/sqlmap_handler.py +1116 -0
  124. souleyez/handlers/theharvester_handler.py +601 -0
  125. souleyez/handlers/web_login_test_handler.py +327 -0
  126. souleyez/handlers/whois_handler.py +277 -0
  127. souleyez/handlers/wpscan_handler.py +554 -0
  128. souleyez/history.py +32 -16
  129. souleyez/importers/msf_importer.py +106 -75
  130. souleyez/importers/smart_importer.py +208 -147
  131. souleyez/integrations/siem/__init__.py +10 -10
  132. souleyez/integrations/siem/base.py +17 -18
  133. souleyez/integrations/siem/elastic.py +108 -122
  134. souleyez/integrations/siem/factory.py +207 -80
  135. souleyez/integrations/siem/googlesecops.py +146 -154
  136. souleyez/integrations/siem/rule_mappings/__init__.py +1 -1
  137. souleyez/integrations/siem/rule_mappings/wazuh_rules.py +8 -5
  138. souleyez/integrations/siem/sentinel.py +107 -109
  139. souleyez/integrations/siem/splunk.py +246 -212
  140. souleyez/integrations/siem/wazuh.py +65 -71
  141. souleyez/integrations/wazuh/__init__.py +5 -5
  142. souleyez/integrations/wazuh/client.py +70 -93
  143. souleyez/integrations/wazuh/config.py +85 -57
  144. souleyez/integrations/wazuh/host_mapper.py +28 -36
  145. souleyez/integrations/wazuh/sync.py +78 -68
  146. souleyez/intelligence/__init__.py +4 -5
  147. souleyez/intelligence/correlation_analyzer.py +309 -295
  148. souleyez/intelligence/exploit_knowledge.py +661 -623
  149. souleyez/intelligence/exploit_suggestions.py +159 -139
  150. souleyez/intelligence/gap_analyzer.py +132 -97
  151. souleyez/intelligence/gap_detector.py +251 -214
  152. souleyez/intelligence/sensitive_tables.py +266 -129
  153. souleyez/intelligence/service_parser.py +137 -123
  154. souleyez/intelligence/surface_analyzer.py +407 -268
  155. souleyez/intelligence/target_parser.py +159 -162
  156. souleyez/licensing/__init__.py +6 -6
  157. souleyez/licensing/validator.py +17 -19
  158. souleyez/log_config.py +79 -54
  159. souleyez/main.py +1505 -687
  160. souleyez/migrations/fix_job_counter.py +16 -14
  161. souleyez/parsers/bloodhound_parser.py +41 -39
  162. souleyez/parsers/crackmapexec_parser.py +178 -111
  163. souleyez/parsers/dalfox_parser.py +72 -77
  164. souleyez/parsers/dnsrecon_parser.py +103 -91
  165. souleyez/parsers/enum4linux_parser.py +183 -153
  166. souleyez/parsers/ffuf_parser.py +29 -25
  167. souleyez/parsers/gobuster_parser.py +301 -41
  168. souleyez/parsers/hashcat_parser.py +324 -79
  169. souleyez/parsers/http_fingerprint_parser.py +350 -103
  170. souleyez/parsers/hydra_parser.py +131 -111
  171. souleyez/parsers/impacket_parser.py +231 -178
  172. souleyez/parsers/john_parser.py +98 -86
  173. souleyez/parsers/katana_parser.py +316 -0
  174. souleyez/parsers/msf_parser.py +943 -498
  175. souleyez/parsers/nikto_parser.py +346 -65
  176. souleyez/parsers/nmap_parser.py +262 -174
  177. souleyez/parsers/nuclei_parser.py +40 -44
  178. souleyez/parsers/responder_parser.py +26 -26
  179. souleyez/parsers/searchsploit_parser.py +74 -74
  180. souleyez/parsers/service_explorer_parser.py +279 -0
  181. souleyez/parsers/smbmap_parser.py +180 -124
  182. souleyez/parsers/sqlmap_parser.py +434 -308
  183. souleyez/parsers/theharvester_parser.py +75 -57
  184. souleyez/parsers/whois_parser.py +135 -94
  185. souleyez/parsers/wpscan_parser.py +278 -190
  186. souleyez/plugins/afp.py +44 -36
  187. souleyez/plugins/afp_brute.py +114 -46
  188. souleyez/plugins/ard.py +48 -37
  189. souleyez/plugins/bloodhound.py +95 -61
  190. souleyez/plugins/certipy.py +303 -0
  191. souleyez/plugins/crackmapexec.py +186 -85
  192. souleyez/plugins/dalfox.py +120 -59
  193. souleyez/plugins/dns_hijack.py +146 -41
  194. souleyez/plugins/dnsrecon.py +97 -61
  195. souleyez/plugins/enum4linux.py +91 -66
  196. souleyez/plugins/evil_winrm.py +291 -0
  197. souleyez/plugins/ffuf.py +166 -90
  198. souleyez/plugins/firmware_extract.py +133 -29
  199. souleyez/plugins/gobuster.py +387 -190
  200. souleyez/plugins/gpp_extract.py +393 -0
  201. souleyez/plugins/hashcat.py +100 -73
  202. souleyez/plugins/http_fingerprint.py +913 -267
  203. souleyez/plugins/hydra.py +566 -200
  204. souleyez/plugins/impacket_getnpusers.py +117 -69
  205. souleyez/plugins/impacket_psexec.py +84 -64
  206. souleyez/plugins/impacket_secretsdump.py +103 -69
  207. souleyez/plugins/impacket_smbclient.py +89 -75
  208. souleyez/plugins/john.py +86 -69
  209. souleyez/plugins/katana.py +313 -0
  210. souleyez/plugins/kerbrute.py +237 -0
  211. souleyez/plugins/lfi_extract.py +541 -0
  212. souleyez/plugins/macos_ssh.py +117 -48
  213. souleyez/plugins/mdns.py +35 -30
  214. souleyez/plugins/msf_auxiliary.py +253 -130
  215. souleyez/plugins/msf_exploit.py +239 -161
  216. souleyez/plugins/nikto.py +134 -78
  217. souleyez/plugins/nmap.py +275 -91
  218. souleyez/plugins/nuclei.py +180 -89
  219. souleyez/plugins/nxc.py +285 -0
  220. souleyez/plugins/plugin_base.py +35 -36
  221. souleyez/plugins/plugin_template.py +13 -5
  222. souleyez/plugins/rdp_sec_check.py +130 -0
  223. souleyez/plugins/responder.py +112 -71
  224. souleyez/plugins/router_http_brute.py +76 -65
  225. souleyez/plugins/router_ssh_brute.py +118 -41
  226. souleyez/plugins/router_telnet_brute.py +124 -42
  227. souleyez/plugins/routersploit.py +91 -59
  228. souleyez/plugins/routersploit_exploit.py +77 -55
  229. souleyez/plugins/searchsploit.py +91 -77
  230. souleyez/plugins/service_explorer.py +1160 -0
  231. souleyez/plugins/smbmap.py +122 -72
  232. souleyez/plugins/smbpasswd.py +215 -0
  233. souleyez/plugins/sqlmap.py +301 -113
  234. souleyez/plugins/theharvester.py +127 -75
  235. souleyez/plugins/tr069.py +79 -57
  236. souleyez/plugins/upnp.py +65 -47
  237. souleyez/plugins/upnp_abuse.py +73 -55
  238. souleyez/plugins/vnc_access.py +129 -42
  239. souleyez/plugins/vnc_brute.py +109 -38
  240. souleyez/plugins/web_login_test.py +417 -0
  241. souleyez/plugins/whois.py +77 -58
  242. souleyez/plugins/wpscan.py +219 -69
  243. souleyez/reporting/__init__.py +2 -1
  244. souleyez/reporting/attack_chain.py +411 -346
  245. souleyez/reporting/charts.py +436 -501
  246. souleyez/reporting/compliance_mappings.py +334 -201
  247. souleyez/reporting/detection_report.py +126 -125
  248. souleyez/reporting/formatters.py +828 -591
  249. souleyez/reporting/generator.py +386 -302
  250. souleyez/reporting/metrics.py +72 -75
  251. souleyez/scanner.py +35 -29
  252. souleyez/security/__init__.py +37 -11
  253. souleyez/security/scope_validator.py +175 -106
  254. souleyez/security/validation.py +237 -149
  255. souleyez/security.py +22 -6
  256. souleyez/storage/credentials.py +247 -186
  257. souleyez/storage/crypto.py +296 -129
  258. souleyez/storage/database.py +73 -50
  259. souleyez/storage/db.py +58 -36
  260. souleyez/storage/deliverable_evidence.py +177 -128
  261. souleyez/storage/deliverable_exporter.py +282 -246
  262. souleyez/storage/deliverable_templates.py +134 -116
  263. souleyez/storage/deliverables.py +135 -130
  264. souleyez/storage/engagements.py +109 -56
  265. souleyez/storage/evidence.py +181 -152
  266. souleyez/storage/execution_log.py +31 -17
  267. souleyez/storage/exploit_attempts.py +93 -57
  268. souleyez/storage/exploits.py +67 -36
  269. souleyez/storage/findings.py +48 -61
  270. souleyez/storage/hosts.py +176 -144
  271. souleyez/storage/migrate_to_engagements.py +43 -19
  272. souleyez/storage/migrations/_001_add_credential_enhancements.py +22 -12
  273. souleyez/storage/migrations/_002_add_status_tracking.py +10 -7
  274. souleyez/storage/migrations/_003_add_execution_log.py +14 -8
  275. souleyez/storage/migrations/_005_screenshots.py +13 -5
  276. souleyez/storage/migrations/_006_deliverables.py +13 -5
  277. souleyez/storage/migrations/_007_deliverable_templates.py +12 -7
  278. souleyez/storage/migrations/_008_add_nuclei_table.py +10 -4
  279. souleyez/storage/migrations/_010_evidence_linking.py +17 -10
  280. souleyez/storage/migrations/_011_timeline_tracking.py +20 -13
  281. souleyez/storage/migrations/_012_team_collaboration.py +34 -21
  282. souleyez/storage/migrations/_013_add_host_tags.py +12 -6
  283. souleyez/storage/migrations/_014_exploit_attempts.py +22 -10
  284. souleyez/storage/migrations/_015_add_mac_os_fields.py +15 -7
  285. souleyez/storage/migrations/_016_add_domain_field.py +10 -4
  286. souleyez/storage/migrations/_017_msf_sessions.py +16 -8
  287. souleyez/storage/migrations/_018_add_osint_target.py +10 -6
  288. souleyez/storage/migrations/_019_add_engagement_type.py +10 -6
  289. souleyez/storage/migrations/_020_add_rbac.py +36 -15
  290. souleyez/storage/migrations/_021_wazuh_integration.py +20 -8
  291. souleyez/storage/migrations/_022_wazuh_indexer_columns.py +6 -4
  292. souleyez/storage/migrations/_023_fix_detection_results_fk.py +16 -6
  293. souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +26 -10
  294. souleyez/storage/migrations/_025_multi_siem_support.py +3 -5
  295. souleyez/storage/migrations/_026_add_engagement_scope.py +31 -12
  296. souleyez/storage/migrations/_027_multi_siem_persistence.py +32 -15
  297. souleyez/storage/migrations/__init__.py +26 -26
  298. souleyez/storage/migrations/migration_manager.py +19 -19
  299. souleyez/storage/msf_sessions.py +100 -65
  300. souleyez/storage/osint.py +17 -24
  301. souleyez/storage/recommendation_engine.py +269 -235
  302. souleyez/storage/screenshots.py +33 -32
  303. souleyez/storage/smb_shares.py +136 -92
  304. souleyez/storage/sqlmap_data.py +183 -128
  305. souleyez/storage/team_collaboration.py +135 -141
  306. souleyez/storage/timeline_tracker.py +122 -94
  307. souleyez/storage/wazuh_vulns.py +64 -66
  308. souleyez/storage/web_paths.py +33 -37
  309. souleyez/testing/credential_tester.py +221 -205
  310. souleyez/ui/__init__.py +1 -1
  311. souleyez/ui/ai_quotes.py +12 -12
  312. souleyez/ui/attack_surface.py +2439 -1516
  313. souleyez/ui/chain_rules_view.py +914 -382
  314. souleyez/ui/correlation_view.py +312 -230
  315. souleyez/ui/dashboard.py +2382 -1130
  316. souleyez/ui/deliverables_view.py +148 -62
  317. souleyez/ui/design_system.py +13 -13
  318. souleyez/ui/errors.py +49 -49
  319. souleyez/ui/evidence_linking_view.py +284 -179
  320. souleyez/ui/evidence_vault.py +393 -285
  321. souleyez/ui/exploit_suggestions_view.py +555 -349
  322. souleyez/ui/export_view.py +100 -66
  323. souleyez/ui/gap_analysis_view.py +315 -171
  324. souleyez/ui/help_system.py +105 -97
  325. souleyez/ui/intelligence_view.py +436 -293
  326. souleyez/ui/interactive.py +23034 -10679
  327. souleyez/ui/interactive_selector.py +75 -68
  328. souleyez/ui/log_formatter.py +47 -39
  329. souleyez/ui/menu_components.py +22 -13
  330. souleyez/ui/msf_auxiliary_menu.py +184 -133
  331. souleyez/ui/pending_chains_view.py +336 -172
  332. souleyez/ui/progress_indicators.py +5 -3
  333. souleyez/ui/recommendations_view.py +195 -137
  334. souleyez/ui/rule_builder.py +343 -225
  335. souleyez/ui/setup_wizard.py +678 -284
  336. souleyez/ui/shortcuts.py +217 -165
  337. souleyez/ui/splunk_gap_analysis_view.py +452 -270
  338. souleyez/ui/splunk_vulns_view.py +139 -86
  339. souleyez/ui/team_dashboard.py +498 -335
  340. souleyez/ui/template_selector.py +196 -105
  341. souleyez/ui/terminal.py +6 -6
  342. souleyez/ui/timeline_view.py +198 -127
  343. souleyez/ui/tool_setup.py +264 -164
  344. souleyez/ui/tutorial.py +202 -72
  345. souleyez/ui/tutorial_state.py +40 -40
  346. souleyez/ui/wazuh_vulns_view.py +235 -141
  347. souleyez/ui/wordlist_browser.py +260 -107
  348. souleyez/ui.py +464 -312
  349. souleyez/utils/tool_checker.py +427 -367
  350. souleyez/utils.py +33 -29
  351. souleyez/wordlists.py +134 -167
  352. {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/METADATA +2 -2
  353. souleyez-3.0.0.dist-info/RECORD +443 -0
  354. {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/WHEEL +1 -1
  355. souleyez-2.43.29.dist-info/RECORD +0 -379
  356. {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/entry_points.txt +0 -0
  357. {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/licenses/LICENSE +0 -0
  358. {souleyez-2.43.29.dist-info → souleyez-3.0.0.dist-info}/top_level.txt +0 -0
@@ -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