souleyez 2.43.28__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 +23142 -10430
  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.28.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.28.dist-info → souleyez-2.43.32.dist-info}/WHEEL +1 -1
  353. souleyez-2.43.28.dist-info/RECORD +0 -379
  354. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/entry_points.txt +0 -0
  355. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/licenses/LICENSE +0 -0
  356. {souleyez-2.43.28.dist-info → souleyez-2.43.32.dist-info}/top_level.txt +0 -0
souleyez/plugins/whois.py CHANGED
@@ -37,56 +37,80 @@ HELP = {
37
37
  ["-p <port>", "Connect to specific port (default: 43)"],
38
38
  ],
39
39
  "presets": [
40
- {"name": "Standard Lookup", "args": [], "desc": "Basic WHOIS query for domain information"},
40
+ {
41
+ "name": "Standard Lookup",
42
+ "args": [],
43
+ "desc": "Basic WHOIS query for domain information",
44
+ },
41
45
  ],
42
46
  "help_sections": [
43
47
  {
44
48
  "title": "What is WHOIS?",
45
49
  "color": "cyan",
46
50
  "content": [
47
- {"title": "Overview", "desc": "WHOIS queries domain registration databases to retrieve registrant information, registrar details, creation/expiration dates, nameservers, and technical contacts."},
48
- {"title": "Use Cases", "desc": "Essential for reconnaissance to understand domain ownership and gather contact information.", "tips": [
49
- "Identify domain owner and organization",
50
- "Find registration and expiration dates",
51
- "Discover nameservers and DNS configuration",
52
- "Gather email addresses and phone numbers for social engineering",
53
- "Identify related domains by registrant"
54
- ]}
55
- ]
51
+ {
52
+ "title": "Overview",
53
+ "desc": "WHOIS queries domain registration databases to retrieve registrant information, registrar details, creation/expiration dates, nameservers, and technical contacts.",
54
+ },
55
+ {
56
+ "title": "Use Cases",
57
+ "desc": "Essential for reconnaissance to understand domain ownership and gather contact information.",
58
+ "tips": [
59
+ "Identify domain owner and organization",
60
+ "Find registration and expiration dates",
61
+ "Discover nameservers and DNS configuration",
62
+ "Gather email addresses and phone numbers for social engineering",
63
+ "Identify related domains by registrant",
64
+ ],
65
+ },
66
+ ],
56
67
  },
57
68
  {
58
69
  "title": "How to Use",
59
70
  "color": "green",
60
71
  "content": [
61
- {"title": "Basic Workflow", "desc": "1. Enter target domain name\n 2. Review registration information\n 3. Note nameservers for DNS enumeration\n 4. Save contact information for later use"},
62
- {"title": "What to Look For", "desc": "Key information in WHOIS results", "tips": [
63
- "Registrant name and organization",
64
- "Creation/expiration dates (helps identify abandoned domains)",
65
- "Nameserver configuration",
66
- "Technical/admin contact emails",
67
- "Registrar information"
68
- ]}
69
- ]
72
+ {
73
+ "title": "Basic Workflow",
74
+ "desc": "1. Enter target domain name\n 2. Review registration information\n 3. Note nameservers for DNS enumeration\n 4. Save contact information for later use",
75
+ },
76
+ {
77
+ "title": "What to Look For",
78
+ "desc": "Key information in WHOIS results",
79
+ "tips": [
80
+ "Registrant name and organization",
81
+ "Creation/expiration dates (helps identify abandoned domains)",
82
+ "Nameserver configuration",
83
+ "Technical/admin contact emails",
84
+ "Registrar information",
85
+ ],
86
+ },
87
+ ],
70
88
  },
71
89
  {
72
90
  "title": "Tips & Best Practices",
73
91
  "color": "yellow",
74
92
  "content": [
75
- ("Best Practices:", [
76
- "Query early in reconnaissance phase",
77
- "Cross-reference with theHarvester results",
78
- "Note privacy-protected domains (limited info)",
79
- "Check related TLDs (.com, .net, .org, etc.)",
80
- "Document contact information for reporting"
81
- ]),
82
- ("Common Issues:", [
83
- "Privacy protection: Many domains hide owner details",
84
- "Rate limiting: WHOIS servers may throttle queries",
85
- "Different formats: Each TLD registry has different output format"
86
- ])
87
- ]
88
- }
89
- ]
93
+ (
94
+ "Best Practices:",
95
+ [
96
+ "Query early in reconnaissance phase",
97
+ "Cross-reference with theHarvester results",
98
+ "Note privacy-protected domains (limited info)",
99
+ "Check related TLDs (.com, .net, .org, etc.)",
100
+ "Document contact information for reporting",
101
+ ],
102
+ ),
103
+ (
104
+ "Common Issues:",
105
+ [
106
+ "Privacy protection: Many domains hide owner details",
107
+ "Rate limiting: WHOIS servers may throttle queries",
108
+ "Different formats: Each TLD registry has different output format",
109
+ ],
110
+ ),
111
+ ],
112
+ },
113
+ ],
90
114
  }
91
115
 
92
116
 
@@ -96,35 +120,35 @@ class WhoisPlugin(PluginBase):
96
120
  category = "reconnaissance"
97
121
  HELP = HELP
98
122
 
99
-
100
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
123
+ def build_command(
124
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
125
+ ):
101
126
  """Build command for background execution with PID tracking."""
102
127
  if not target:
103
128
  if log_path:
104
- with open(log_path, 'w') as f:
129
+ with open(log_path, "w") as f:
105
130
  f.write("ERROR: Target domain is required\n")
106
131
  return None
107
-
132
+
108
133
  # Validate target
109
134
  try:
110
135
  target = validate_target(target)
111
136
  except ValidationError as e:
112
137
  if log_path:
113
- with open(log_path, 'w') as f:
138
+ with open(log_path, "w") as f:
114
139
  f.write(f"ERROR: Invalid target: {e}\n")
115
140
  return None
116
-
141
+
117
142
  args = args or []
118
-
143
+
119
144
  # whois syntax: whois target [args]
120
145
  cmd = ["whois", target] + args
121
-
122
- return {
123
- 'cmd': cmd,
124
- 'timeout': 300
125
- }
126
146
 
127
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
147
+ return {"cmd": cmd, "timeout": 300}
148
+
149
+ def run(
150
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
151
+ ) -> int:
128
152
  """
129
153
  Execute WHOIS lookup and write output to log_path.
130
154
  """
@@ -136,7 +160,7 @@ class WhoisPlugin(PluginBase):
136
160
  target = validate_target(target)
137
161
  except ValidationError as e:
138
162
  if log_path:
139
- with open(log_path, 'w') as f:
163
+ with open(log_path, "w") as f:
140
164
  f.write(f"ERROR: Invalid target: {e}\n")
141
165
  return 1
142
166
  raise ValueError(f"Invalid target: {e}")
@@ -147,21 +171,16 @@ class WhoisPlugin(PluginBase):
147
171
  cmd = ["whois", target] + args
148
172
 
149
173
  if log_path:
150
- with open(log_path, 'w') as f:
174
+ with open(log_path, "w") as f:
151
175
  f.write(f"# WHOIS Lookup for {target}\n")
152
176
  f.write(f"# Command: {' '.join(cmd)}\n")
153
177
  f.write(f"# Started: {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n")
154
178
 
155
179
  try:
156
- result = subprocess.run(
157
- cmd,
158
- capture_output=True,
159
- text=True,
160
- timeout=60
161
- )
180
+ result = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
162
181
 
163
182
  if log_path:
164
- with open(log_path, 'a') as f:
183
+ with open(log_path, "a") as f:
165
184
  f.write(result.stdout)
166
185
  if result.stderr:
167
186
  f.write(f"\n\n# Errors:\n{result.stderr}\n")
@@ -170,12 +189,12 @@ class WhoisPlugin(PluginBase):
170
189
 
171
190
  except subprocess.TimeoutExpired:
172
191
  if log_path:
173
- with open(log_path, 'a') as f:
192
+ with open(log_path, "a") as f:
174
193
  f.write("\n\n# ERROR: Command timed out after 60 seconds\n")
175
194
  return 124
176
195
  except Exception as e:
177
196
  if log_path:
178
- with open(log_path, 'a') as f:
197
+ with open(log_path, "a") as f:
179
198
  f.write(f"\n\n# ERROR: {str(e)}\n")
180
199
  return 1
181
200
 
@@ -4,6 +4,7 @@ souleyez.plugins.wpscan
4
4
 
5
5
  WPScan WordPress vulnerability scanner plugin.
6
6
  """
7
+ import os
7
8
  import subprocess
8
9
  import time
9
10
  from typing import List
@@ -29,12 +30,15 @@ HELP = {
29
30
  "usage": "souleyez jobs enqueue wpscan <url>",
30
31
  "examples": [
31
32
  "souleyez jobs enqueue wpscan http://example.com",
32
- "souleyez jobs enqueue wpscan http://example.com --args \"--enumerate vp\"",
33
- "souleyez jobs enqueue wpscan http://example.com --args \"--enumerate u,ap,at\"",
34
- "souleyez jobs enqueue wpscan http://example.com --args \"--passwords data/wordlists/top100.txt\"",
33
+ 'souleyez jobs enqueue wpscan http://example.com --args "--enumerate vp"',
34
+ 'souleyez jobs enqueue wpscan http://example.com --args "--enumerate u,ap,at"',
35
+ 'souleyez jobs enqueue wpscan http://example.com --args "--passwords data/wordlists/top100.txt"',
35
36
  ],
36
37
  "flags": [
37
- ["--enumerate <opts>", "Enumerate: u (users), p (plugins), t (themes), vp (vulnerable plugins), vt (vulnerable themes)"],
38
+ [
39
+ "--enumerate <opts>",
40
+ "Enumerate: u (users), p (plugins), t (themes), vp (vulnerable plugins), vt (vulnerable themes)",
41
+ ],
38
42
  ["--plugins-detection <mode>", "Detection mode: mixed, passive, aggressive"],
39
43
  ["--passwords <file>", "Password list for brute-force attacks"],
40
44
  ["--usernames <list>", "Usernames to use for brute-force (comma-separated)"],
@@ -43,58 +47,100 @@ HELP = {
43
47
  ["--api-token <token>", "WPVulnDB API token for vulnerability data"],
44
48
  ],
45
49
  "presets": [
46
- {"name": "Quick Scan", "args": ["--random-user-agent"], "desc": "Basic WordPress detection and version check"},
47
- {"name": "Full Enumeration", "args": ["--enumerate", "vp,vt,u,ap,at", "--random-user-agent"], "desc": "Enumerate all plugins, themes, and users"},
48
- {"name": "Vulnerable Plugins", "args": ["--enumerate", "vp", "--plugins-detection", "aggressive", "--random-user-agent"], "desc": "Find vulnerable plugins only"},
49
- {"name": "User Enumeration", "args": ["--enumerate", "u", "--random-user-agent"], "desc": "Enumerate WordPress users"},
50
+ {
51
+ "name": "Quick Scan",
52
+ "args": ["--random-user-agent"],
53
+ "desc": "Basic WordPress detection and version check",
54
+ },
55
+ {
56
+ "name": "Full Enumeration",
57
+ "args": ["--enumerate", "ap,at,u", "--random-user-agent"],
58
+ "desc": "Enumerate all plugins, themes, and users",
59
+ },
60
+ {
61
+ "name": "Vulnerable Plugins",
62
+ "args": [
63
+ "--enumerate",
64
+ "vp",
65
+ "--plugins-detection",
66
+ "aggressive",
67
+ "--random-user-agent",
68
+ ],
69
+ "desc": "Find vulnerable plugins only",
70
+ },
71
+ {
72
+ "name": "User Enumeration",
73
+ "args": ["--enumerate", "u", "--random-user-agent"],
74
+ "desc": "Enumerate WordPress users",
75
+ },
50
76
  ],
51
77
  "help_sections": [
52
78
  {
53
79
  "title": "What is WPScan?",
54
80
  "color": "cyan",
55
81
  "content": [
56
- {"title": "Overview", "desc": "WPScan is the de-facto WordPress vulnerability scanner, identifying WordPress version, plugins, themes, misconfigurations, and known vulnerabilities."},
57
- {"title": "Use Cases", "desc": "Essential for WordPress security assessments", "tips": [
58
- "Detect WordPress version and vulnerabilities",
59
- "Enumerate installed plugins and themes",
60
- "Find security misconfigurations",
61
- "Test for weak passwords via brute-force"
62
- ]}
63
- ]
82
+ {
83
+ "title": "Overview",
84
+ "desc": "WPScan is the de-facto WordPress vulnerability scanner, identifying WordPress version, plugins, themes, misconfigurations, and known vulnerabilities.",
85
+ },
86
+ {
87
+ "title": "Use Cases",
88
+ "desc": "Essential for WordPress security assessments",
89
+ "tips": [
90
+ "Detect WordPress version and vulnerabilities",
91
+ "Enumerate installed plugins and themes",
92
+ "Find security misconfigurations",
93
+ "Test for weak passwords via brute-force",
94
+ ],
95
+ },
96
+ ],
64
97
  },
65
98
  {
66
99
  "title": "How to Use",
67
100
  "color": "green",
68
101
  "content": [
69
- {"title": "Basic Workflow", "desc": "1. Run quick scan to detect WordPress version\n 2. Enumerate vulnerable plugins/themes (vp,vt)\n 3. Check for users and misconfigurations\n 4. Test weak passwords if authorized"},
70
- {"title": "Enumeration Options", "desc": "Key flags for different scans", "tips": [
71
- "vp: Vulnerable plugins only",
72
- "ap: All plugins (slow but thorough)",
73
- "u: User enumeration",
74
- "--passwords: Brute-force password file"
75
- ]}
76
- ]
102
+ {
103
+ "title": "Basic Workflow",
104
+ "desc": "1. Run quick scan to detect WordPress version\n 2. Enumerate vulnerable plugins/themes (vp,vt)\n 3. Check for users and misconfigurations\n 4. Test weak passwords if authorized",
105
+ },
106
+ {
107
+ "title": "Enumeration Options",
108
+ "desc": "Key flags for different scans",
109
+ "tips": [
110
+ "vp: Vulnerable plugins only",
111
+ "ap: All plugins (slow but thorough)",
112
+ "u: User enumeration",
113
+ "--passwords: Brute-force password file",
114
+ ],
115
+ },
116
+ ],
77
117
  },
78
118
  {
79
119
  "title": "Tips & Best Practices",
80
120
  "color": "yellow",
81
121
  "content": [
82
- ("Best Practices:", [
83
- "Always use --random-user-agent to avoid detection",
84
- "Start with vulnerable plugins/themes only (vp,vt)",
85
- "Use WPVulnDB API token for full vulnerability data",
86
- "Document outdated plugins as security findings",
87
- "Test password lists only with explicit authorization"
88
- ]),
89
- ("Common Issues:", [
90
- "Not WordPress site: Verify URL is a WordPress installation",
91
- "Rate limiting: Add delays or reduce enumeration scope",
92
- "No vulnerabilities found: Update WPScan or use API token",
93
- "Enumeration blocked: Some hosts block automated scanners"
94
- ])
95
- ]
96
- }
97
- ]
122
+ (
123
+ "Best Practices:",
124
+ [
125
+ "Always use --random-user-agent to avoid detection",
126
+ "Start with vulnerable plugins/themes only (vp,vt)",
127
+ "Use WPVulnDB API token for full vulnerability data",
128
+ "Document outdated plugins as security findings",
129
+ "Test password lists only with explicit authorization",
130
+ ],
131
+ ),
132
+ (
133
+ "Common Issues:",
134
+ [
135
+ "Not WordPress site: Verify URL is a WordPress installation",
136
+ "Rate limiting: Add delays or reduce enumeration scope",
137
+ "No vulnerabilities found: Update WPScan or use API token",
138
+ "Enumeration blocked: Some hosts block automated scanners",
139
+ ],
140
+ ),
141
+ ],
142
+ },
143
+ ],
98
144
  }
99
145
 
100
146
 
@@ -104,37 +150,64 @@ class WpscanPlugin(PluginBase):
104
150
  category = "vulnerability_analysis"
105
151
  HELP = HELP
106
152
 
107
-
108
153
  def _get_base_url(self, url: str) -> str:
109
154
  """
110
- Extract base URL (scheme + host + port) from a full URL.
155
+ Extract WordPress root URL from a full URL.
111
156
 
112
157
  WPScan needs the WordPress root URL, not subpaths like /wp-content.
113
- e.g., http://10.0.0.48/wp-content http://10.0.0.48/
158
+ For WordPress in subdirectories, we preserve the parent path.
159
+
160
+ Examples:
161
+ http://10.0.0.48/wp-content → http://10.0.0.48/
162
+ http://10.0.0.48/blogblog/wp-admin/ → http://10.0.0.48/blogblog/
163
+ http://10.0.0.48/site/wordpress/wp-includes/ → http://10.0.0.48/site/wordpress/
114
164
  """
115
165
  parsed = urlparse(url)
116
- # Reconstruct with just scheme, netloc (host:port), and root path
117
- base = urlunparse((parsed.scheme, parsed.netloc, '/', '', '', ''))
166
+ path = parsed.path
167
+
168
+ # WordPress subdirectory patterns to strip
169
+ # These indicate we're inside the WordPress installation
170
+ wp_subpaths = ["/wp-admin", "/wp-content", "/wp-includes", "/wp-login.php"]
171
+
172
+ # Find and strip WordPress-specific subpaths
173
+ for wp_sub in wp_subpaths:
174
+ idx = path.lower().find(wp_sub.lower())
175
+ if idx != -1:
176
+ # Keep everything before the WordPress subpath
177
+ path = path[:idx]
178
+ break
179
+
180
+ # Ensure path ends with /
181
+ if not path.endswith("/"):
182
+ path = path + "/"
183
+
184
+ # If path is empty, use root
185
+ if not path:
186
+ path = "/"
187
+
188
+ base = urlunparse((parsed.scheme, parsed.netloc, path, "", "", ""))
118
189
  return base
119
190
 
120
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
191
+ def build_command(
192
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
193
+ ):
121
194
  """Build command for background execution with PID tracking."""
122
195
  if not target:
123
196
  if log_path:
124
- with open(log_path, 'w') as f:
197
+ with open(log_path, "w") as f:
125
198
  f.write("ERROR: Target URL is required\n")
126
199
  return None
127
200
 
128
201
  # Ensure URL format
129
- if not target.startswith('http://') and not target.startswith('https://'):
130
- target = f'http://{target}'
202
+ if not target.startswith("http://") and not target.startswith("https://"):
203
+ target = f"http://{target}"
131
204
 
132
205
  # Validate URL
133
206
  try:
134
207
  target = validate_url(target)
135
208
  except ValidationError as e:
136
209
  if log_path:
137
- with open(log_path, 'w') as f:
210
+ with open(log_path, "w") as f:
138
211
  f.write(f"ERROR: Invalid URL: {e}\n")
139
212
  return None
140
213
 
@@ -144,20 +217,31 @@ class WpscanPlugin(PluginBase):
144
217
 
145
218
  args = args or []
146
219
 
220
+ # Add --disable-tls-checks for HTTPS targets (handles self-signed certs)
221
+ if target.startswith("https://") and "--disable-tls-checks" not in args:
222
+ args = ["--disable-tls-checks"] + args
223
+
224
+ # Auto-add API token from environment if not already specified
225
+ if "--api-token" not in " ".join(args):
226
+ api_token = os.environ.get("WPSCAN_API_TOKEN")
227
+ if api_token:
228
+ args = ["--api-token", api_token] + args
229
+
147
230
  # wpscan uses --url flag
148
231
  cmd = ["wpscan", "--url", target] + args
149
232
 
150
233
  # Log if we modified the URL
151
234
  if log_path and original_target != target:
152
- with open(log_path, 'w') as f:
153
- f.write(f"INFO: Using base URL {target} (original: {original_target})\n\n")
235
+ with open(log_path, "w") as f:
236
+ f.write(
237
+ f"INFO: Using base URL {target} (original: {original_target})\n\n"
238
+ )
154
239
 
155
- return {
156
- 'cmd': cmd,
157
- 'timeout': 1800
158
- }
240
+ return {"cmd": cmd, "timeout": 1800}
159
241
 
160
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
242
+ def run(
243
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
244
+ ) -> int:
161
245
  """
162
246
  Execute WPScan and write output to log_path.
163
247
  """
@@ -165,15 +249,15 @@ class WpscanPlugin(PluginBase):
165
249
  raise ValueError("Target URL is required")
166
250
 
167
251
  # Ensure URL format
168
- if not target.startswith('http://') and not target.startswith('https://'):
169
- target = f'http://{target}'
252
+ if not target.startswith("http://") and not target.startswith("https://"):
253
+ target = f"http://{target}"
170
254
 
171
255
  # Validate URL
172
256
  try:
173
257
  target = validate_url(target)
174
258
  except ValidationError as e:
175
259
  if log_path:
176
- with open(log_path, 'w') as f:
260
+ with open(log_path, "w") as f:
177
261
  f.write(f"ERROR: Invalid URL: {e}\n")
178
262
  return 1
179
263
  raise ValueError(f"Invalid URL: {e}")
@@ -184,24 +268,44 @@ class WpscanPlugin(PluginBase):
184
268
  if args is None:
185
269
  args = []
186
270
 
271
+ # Add --disable-tls-checks for HTTPS targets (handles self-signed certs)
272
+ if target.startswith("https://") and "--disable-tls-checks" not in args:
273
+ args = ["--disable-tls-checks"] + args
274
+
275
+ # Auto-add API token from environment if not already specified
276
+ if "--api-token" not in " ".join(args):
277
+ api_token = os.environ.get("WPSCAN_API_TOKEN")
278
+ if api_token:
279
+ args = ["--api-token", api_token] + args
280
+
187
281
  cmd = ["wpscan", "--url", target] + args
188
282
 
189
283
  if log_path:
190
- with open(log_path, 'w') as f:
284
+ # Redact API token from logged command
285
+ logged_cmd = []
286
+ skip_next = False
287
+ for arg in cmd:
288
+ if skip_next:
289
+ logged_cmd.append("[REDACTED]")
290
+ skip_next = False
291
+ elif arg == "--api-token":
292
+ logged_cmd.append(arg)
293
+ skip_next = True
294
+ else:
295
+ logged_cmd.append(arg)
296
+
297
+ with open(log_path, "w") as f:
191
298
  f.write(f"# WPScan for {target}\n")
192
- f.write(f"# Command: {' '.join(cmd)}\n")
299
+ f.write(f"# Command: {' '.join(logged_cmd)}\n")
193
300
  f.write(f"# Started: {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n")
194
301
 
195
302
  try:
196
303
  result = subprocess.run(
197
- cmd,
198
- capture_output=True,
199
- text=True,
200
- timeout=600 # 10 minutes
304
+ cmd, capture_output=True, text=True, timeout=600 # 10 minutes
201
305
  )
202
306
 
203
307
  if log_path:
204
- with open(log_path, 'a') as f:
308
+ with open(log_path, "a") as f:
205
309
  f.write(result.stdout)
206
310
  if result.stderr:
207
311
  f.write(f"\n\n# Errors:\n{result.stderr}\n")
@@ -210,12 +314,12 @@ class WpscanPlugin(PluginBase):
210
314
 
211
315
  except subprocess.TimeoutExpired:
212
316
  if log_path:
213
- with open(log_path, 'a') as f:
317
+ with open(log_path, "a") as f:
214
318
  f.write("\n\n# ERROR: Command timed out after 10 minutes\n")
215
319
  return 124
216
320
  except Exception as e:
217
321
  if log_path:
218
- with open(log_path, 'a') as f:
322
+ with open(log_path, "a") as f:
219
323
  f.write(f"\n\n# ERROR: {str(e)}\n")
220
324
  return 1
221
325
 
@@ -1,4 +1,5 @@
1
1
  """SoulEyez reporting module."""
2
+
2
3
  from .generator import ReportGenerator
3
4
 
4
- __all__ = ['ReportGenerator']
5
+ __all__ = ["ReportGenerator"]