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
souleyez/plugins/afp.py CHANGED
@@ -44,16 +44,23 @@ HELP = {
44
44
  "title": "What is AFP?",
45
45
  "color": "cyan",
46
46
  "content": [
47
- {"title": "Overview", "desc": "AFP (Apple Filing Protocol) is Apple's native file sharing protocol, optimized for macOS features like resource forks and metadata."},
48
- {"title": "Security Notes", "desc": "AFP security considerations", "tips": [
49
- "Guest access often enabled by default",
50
- "Credentials transmitted in cleartext (older versions)",
51
- "Time Machine backups may contain full disk images",
52
- "Path traversal vulnerabilities in some versions"
53
- ]}
54
- ]
47
+ {
48
+ "title": "Overview",
49
+ "desc": "AFP (Apple Filing Protocol) is Apple's native file sharing protocol, optimized for macOS features like resource forks and metadata.",
50
+ },
51
+ {
52
+ "title": "Security Notes",
53
+ "desc": "AFP security considerations",
54
+ "tips": [
55
+ "Guest access often enabled by default",
56
+ "Credentials transmitted in cleartext (older versions)",
57
+ "Time Machine backups may contain full disk images",
58
+ "Path traversal vulnerabilities in some versions",
59
+ ],
60
+ },
61
+ ],
55
62
  }
56
- ]
63
+ ],
57
64
  }
58
65
 
59
66
 
@@ -63,7 +70,9 @@ class AFPPlugin(PluginBase):
63
70
  category = "scanning"
64
71
  HELP = HELP
65
72
 
66
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
73
+ def build_command(
74
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
75
+ ):
67
76
  """Build nmap command for AFP enumeration."""
68
77
  args = args or []
69
78
 
@@ -71,63 +80,62 @@ class AFPPlugin(PluginBase):
71
80
  target = validate_target(target)
72
81
  except ValidationError as e:
73
82
  if log_path:
74
- with open(log_path, 'w') as f:
83
+ with open(log_path, "w") as f:
75
84
  f.write(f"ERROR: Invalid target: {e}\n")
76
85
  return None
77
86
 
78
87
  # Determine scripts
79
- if '--deep' in args:
80
- scripts = 'afp-serverinfo,afp-showmount,afp-brute,afp-path-vuln'
88
+ if "--deep" in args:
89
+ scripts = "afp-serverinfo,afp-showmount,afp-brute,afp-path-vuln"
81
90
  else:
82
- scripts = 'afp-serverinfo,afp-showmount'
91
+ scripts = "afp-serverinfo,afp-showmount"
83
92
 
84
93
  cmd = [
85
- 'nmap',
86
- '-sV',
87
- '-p', '548',
88
- '--script', scripts,
89
- '-oN', '-',
90
- '--open',
91
- '-T4',
92
- target
94
+ "nmap",
95
+ "-sV",
96
+ "-p",
97
+ "548",
98
+ "--script",
99
+ scripts,
100
+ "-oN",
101
+ "-",
102
+ "--open",
103
+ "-T4",
104
+ target,
93
105
  ]
94
106
 
95
- return {
96
- 'cmd': cmd,
97
- 'timeout': 600
98
- }
107
+ return {"cmd": cmd, "timeout": 600}
99
108
 
100
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
109
+ def run(
110
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
111
+ ) -> int:
101
112
  """Execute AFP enumeration."""
102
113
  cmd_spec = self.build_command(target, args, label, log_path)
103
114
  if cmd_spec is None:
104
115
  return 1
105
116
 
106
- cmd = cmd_spec['cmd']
117
+ cmd = cmd_spec["cmd"]
107
118
 
108
119
  if log_path:
109
- with open(log_path, 'w') as f:
120
+ with open(log_path, "w") as f:
110
121
  f.write(f"# AFP Enumeration on {target}\n")
111
122
  f.write(f"# Command: {' '.join(cmd)}\n")
112
123
  f.write(f"# Started: {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n")
113
124
 
114
125
  try:
115
- with open(log_path, 'a') as f:
126
+ with open(log_path, "a") as f:
116
127
  result = subprocess.run(
117
- cmd,
118
- stdout=f,
119
- stderr=subprocess.STDOUT,
120
- timeout=cmd_spec['timeout']
128
+ cmd, stdout=f, stderr=subprocess.STDOUT, timeout=cmd_spec["timeout"]
121
129
  )
122
130
  return result.returncode
123
131
  except subprocess.TimeoutExpired:
124
132
  if log_path:
125
- with open(log_path, 'a') as f:
133
+ with open(log_path, "a") as f:
126
134
  f.write("\n\n# ERROR: Scan timed out\n")
127
135
  return 124
128
136
  except Exception as e:
129
137
  if log_path:
130
- with open(log_path, 'a') as f:
138
+ with open(log_path, "a") as f:
131
139
  f.write(f"\n\n# ERROR: {e}\n")
132
140
  return 1
133
141
 
@@ -26,7 +26,7 @@ HELP = {
26
26
  "usage": "souleyez jobs enqueue afp_brute <target>",
27
27
  "examples": [
28
28
  "souleyez jobs enqueue afp_brute 192.168.1.100",
29
- "souleyez jobs enqueue afp_brute 192.168.1.100 --args \"-l admin\"",
29
+ 'souleyez jobs enqueue afp_brute 192.168.1.100 --args "-l admin"',
30
30
  ],
31
31
  "flags": [
32
32
  ["-l USER", "Single username to test"],
@@ -34,7 +34,78 @@ HELP = {
34
34
  ],
35
35
  "presets": [
36
36
  {"name": "Common Users", "args": [], "desc": "Test common macOS usernames"},
37
- {"name": "Single User", "args": ["-l", "admin"], "desc": "Test single user 'admin'"},
37
+ {
38
+ "name": "Single User",
39
+ "args": ["-l", "admin"],
40
+ "desc": "Test single user 'admin'",
41
+ },
42
+ ],
43
+ "help_sections": [
44
+ {
45
+ "title": "What is AFP Brute Force?",
46
+ "color": "cyan",
47
+ "content": [
48
+ (
49
+ "Overview",
50
+ [
51
+ "AFP (Apple Filing Protocol) brute force uses Hydra to test credentials",
52
+ "Targets macOS file sharing on port 548",
53
+ "Uses common macOS usernames and passwords by default",
54
+ ],
55
+ ),
56
+ (
57
+ "When to Use",
58
+ [
59
+ "After discovering AFP service (port 548) with nmap",
60
+ "When you need to access shared folders on macOS",
61
+ "To test weak password policies on Apple systems",
62
+ ],
63
+ ),
64
+ ],
65
+ },
66
+ {
67
+ "title": "Usage & Examples",
68
+ "color": "green",
69
+ "content": [
70
+ (
71
+ "Basic Usage",
72
+ [
73
+ "souleyez jobs enqueue afp_brute 192.168.1.100",
74
+ " → Tests common macOS users with common passwords",
75
+ ],
76
+ ),
77
+ (
78
+ "Single User Attack",
79
+ [
80
+ 'souleyez jobs enqueue afp_brute 192.168.1.100 --args "-l admin"',
81
+ " → Tests only the 'admin' user",
82
+ ],
83
+ ),
84
+ ],
85
+ },
86
+ {
87
+ "title": "Tips & Best Practices",
88
+ "color": "yellow",
89
+ "content": [
90
+ (
91
+ "Attack Tips",
92
+ [
93
+ "Run AFP enumeration first to identify valid usernames",
94
+ "Check if guest access is enabled (no brute force needed)",
95
+ "Use low thread count (-t 2) to avoid lockouts",
96
+ "macOS uses local accounts, not domain accounts",
97
+ ],
98
+ ),
99
+ (
100
+ "After Success",
101
+ [
102
+ "Use AFP to browse shared folders",
103
+ "Look for sensitive documents and backups",
104
+ "Time Machine backups may contain full disk images",
105
+ ],
106
+ ),
107
+ ],
108
+ },
38
109
  ],
39
110
  }
40
111
 
@@ -47,18 +118,13 @@ class AFPBrutePlugin(PluginBase):
47
118
 
48
119
  def _get_wordlist_path(self, filename: str) -> str:
49
120
  """Get path to wordlist file."""
50
- import os
51
- locations = [
52
- os.path.join(os.path.dirname(__file__), '..', 'data', 'wordlists', filename),
53
- os.path.expanduser(f'~/.souleyez/wordlists/{filename}'),
54
- f'/usr/share/seclists/Passwords/{filename}',
55
- ]
56
- for loc in locations:
57
- if os.path.exists(loc):
58
- return os.path.abspath(loc)
59
- return filename
60
-
61
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
121
+ from souleyez.wordlists import resolve_wordlist_path
122
+
123
+ return resolve_wordlist_path(f"data/wordlists/{filename}")
124
+
125
+ def build_command(
126
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
127
+ ):
62
128
  """Build Hydra command for AFP brute force."""
63
129
  args = args or []
64
130
 
@@ -66,69 +132,71 @@ class AFPBrutePlugin(PluginBase):
66
132
  target = validate_target(target)
67
133
  except ValidationError as e:
68
134
  if log_path:
69
- with open(log_path, 'w') as f:
135
+ with open(log_path, "w") as f:
70
136
  f.write(f"ERROR: Invalid target: {e}\n")
71
137
  return None
72
138
 
73
139
  # Check for user specification in args
74
- has_user = '-l' in args or '-L' in args
140
+ has_user = "-l" in args or "-L" in args
75
141
 
76
- users = self._get_wordlist_path('macos_users.txt')
77
- passwords = self._get_wordlist_path('top100.txt')
142
+ users = self._get_wordlist_path("macos_users.txt")
143
+ passwords = self._get_wordlist_path("top100.txt")
78
144
 
79
- cmd = ['hydra']
145
+ cmd = ["hydra"]
80
146
 
81
147
  if not has_user:
82
- cmd.extend(['-L', users])
148
+ cmd.extend(["-L", users])
83
149
 
84
150
  cmd.extend(args) # Add any user-specified args
85
- cmd.extend([
86
- '-P', passwords,
87
- '-s', '548',
88
- '-t', '2',
89
- '-w', '3',
90
- '-vV',
91
- '-f',
92
- target,
93
- 'afp'
94
- ])
95
-
96
- return {
97
- 'cmd': cmd,
98
- 'timeout': 1800
99
- }
100
-
101
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
151
+ cmd.extend(
152
+ [
153
+ "-P",
154
+ passwords,
155
+ "-s",
156
+ "548",
157
+ "-t",
158
+ "2",
159
+ "-w",
160
+ "3",
161
+ "-vV",
162
+ "-f",
163
+ target,
164
+ "afp",
165
+ ]
166
+ )
167
+
168
+ return {"cmd": cmd, "timeout": 1800}
169
+
170
+ def run(
171
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
172
+ ) -> int:
102
173
  """Execute AFP brute force."""
103
174
  cmd_spec = self.build_command(target, args, label, log_path)
104
175
  if cmd_spec is None:
105
176
  return 1
106
177
 
107
- cmd = cmd_spec['cmd']
178
+ cmd = cmd_spec["cmd"]
108
179
 
109
180
  if log_path:
110
- with open(log_path, 'w') as f:
181
+ with open(log_path, "w") as f:
111
182
  f.write(f"# AFP Brute Force on {target}\n")
112
183
  f.write(f"# Command: {' '.join(cmd)}\n")
113
184
  f.write(f"# Started: {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n")
114
185
 
115
186
  try:
116
- with open(log_path, 'a') as f:
187
+ with open(log_path, "a") as f:
117
188
  result = subprocess.run(
118
- cmd,
119
- stdout=f,
120
- stderr=subprocess.STDOUT,
121
- timeout=cmd_spec['timeout']
189
+ cmd, stdout=f, stderr=subprocess.STDOUT, timeout=cmd_spec["timeout"]
122
190
  )
123
191
  return result.returncode
124
192
  except subprocess.TimeoutExpired:
125
193
  if log_path:
126
- with open(log_path, 'a') as f:
194
+ with open(log_path, "a") as f:
127
195
  f.write("\n\n# ERROR: Brute force timed out\n")
128
196
  return 124
129
197
  except Exception as e:
130
198
  if log_path:
131
- with open(log_path, 'a') as f:
199
+ with open(log_path, "a") as f:
132
200
  f.write(f"\n\n# ERROR: {e}\n")
133
201
  return 1
134
202
 
souleyez/plugins/ard.py CHANGED
@@ -44,17 +44,27 @@ HELP = {
44
44
  "title": "macOS Remote Access",
45
45
  "color": "cyan",
46
46
  "content": [
47
- {"title": "Screen Sharing", "desc": "Built-in VNC server (port 5900). Uses macOS user credentials or VNC password."},
48
- {"title": "Apple Remote Desktop", "desc": "Enterprise management tool (port 3283). Used by IT admins for fleet management."},
49
- {"title": "Security Notes", "desc": "VNC vulnerabilities", "tips": [
50
- "Some Macs have VNC with no auth",
51
- "ARD auth bypass (CVE-2017-13872)",
52
- "Weak VNC passwords common",
53
- "Traffic often unencrypted"
54
- ]}
55
- ]
47
+ {
48
+ "title": "Screen Sharing",
49
+ "desc": "Built-in VNC server (port 5900). Uses macOS user credentials or VNC password.",
50
+ },
51
+ {
52
+ "title": "Apple Remote Desktop",
53
+ "desc": "Enterprise management tool (port 3283). Used by IT admins for fleet management.",
54
+ },
55
+ {
56
+ "title": "Security Notes",
57
+ "desc": "VNC vulnerabilities",
58
+ "tips": [
59
+ "Some Macs have VNC with no auth",
60
+ "ARD auth bypass (CVE-2017-13872)",
61
+ "Weak VNC passwords common",
62
+ "Traffic often unencrypted",
63
+ ],
64
+ },
65
+ ],
56
66
  }
57
- ]
67
+ ],
58
68
  }
59
69
 
60
70
 
@@ -64,7 +74,9 @@ class ARDPlugin(PluginBase):
64
74
  category = "scanning"
65
75
  HELP = HELP
66
76
 
67
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
77
+ def build_command(
78
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
79
+ ):
68
80
  """Build nmap command for VNC/ARD enumeration."""
69
81
  args = args or []
70
82
 
@@ -72,65 +84,64 @@ class ARDPlugin(PluginBase):
72
84
  target = validate_target(target)
73
85
  except ValidationError as e:
74
86
  if log_path:
75
- with open(log_path, 'w') as f:
87
+ with open(log_path, "w") as f:
76
88
  f.write(f"ERROR: Invalid target: {e}\n")
77
89
  return None
78
90
 
79
91
  # Determine scripts
80
- if '--deep' in args:
81
- scripts = 'vnc-info,vnc-title,realvnc-auth-bypass'
92
+ if "--deep" in args:
93
+ scripts = "vnc-info,vnc-title,realvnc-auth-bypass"
82
94
  else:
83
- scripts = 'vnc-info'
95
+ scripts = "vnc-info"
84
96
 
85
97
  # VNC = 5900, ARD = 3283
86
98
  cmd = [
87
- 'nmap',
88
- '-sV',
89
- '-p', '5900,3283,5901,5902,5903',
90
- '--script', scripts,
91
- '-oN', '-',
92
- '--open',
93
- '-T4',
94
- target
99
+ "nmap",
100
+ "-sV",
101
+ "-p",
102
+ "5900,3283,5901,5902,5903",
103
+ "--script",
104
+ scripts,
105
+ "-oN",
106
+ "-",
107
+ "--open",
108
+ "-T4",
109
+ target,
95
110
  ]
96
111
 
97
- return {
98
- 'cmd': cmd,
99
- 'timeout': 600
100
- }
112
+ return {"cmd": cmd, "timeout": 600}
101
113
 
102
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
114
+ def run(
115
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
116
+ ) -> int:
103
117
  """Execute VNC/ARD enumeration."""
104
118
  cmd_spec = self.build_command(target, args, label, log_path)
105
119
  if cmd_spec is None:
106
120
  return 1
107
121
 
108
- cmd = cmd_spec['cmd']
122
+ cmd = cmd_spec["cmd"]
109
123
 
110
124
  if log_path:
111
- with open(log_path, 'w') as f:
125
+ with open(log_path, "w") as f:
112
126
  f.write(f"# VNC/ARD Enumeration on {target}\n")
113
127
  f.write(f"# Ports: 5900 (VNC), 3283 (ARD)\n")
114
128
  f.write(f"# Command: {' '.join(cmd)}\n")
115
129
  f.write(f"# Started: {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n")
116
130
 
117
131
  try:
118
- with open(log_path, 'a') as f:
132
+ with open(log_path, "a") as f:
119
133
  result = subprocess.run(
120
- cmd,
121
- stdout=f,
122
- stderr=subprocess.STDOUT,
123
- timeout=cmd_spec['timeout']
134
+ cmd, stdout=f, stderr=subprocess.STDOUT, timeout=cmd_spec["timeout"]
124
135
  )
125
136
  return result.returncode
126
137
  except subprocess.TimeoutExpired:
127
138
  if log_path:
128
- with open(log_path, 'a') as f:
139
+ with open(log_path, "a") as f:
129
140
  f.write("\n\n# ERROR: Scan timed out\n")
130
141
  return 124
131
142
  except Exception as e:
132
143
  if log_path:
133
- with open(log_path, 'a') as f:
144
+ with open(log_path, "a") as f:
134
145
  f.write(f"\n\n# ERROR: {e}\n")
135
146
  return 1
136
147