souleyez 2.43.26__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.

Potentially problematic release.


This version of souleyez might be problematic. Click here for more details.

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 +23434 -10286
  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.26.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.26.dist-info → souleyez-2.43.34.dist-info}/WHEEL +1 -1
  355. souleyez-2.43.26.dist-info/RECORD +0 -379
  356. {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/entry_points.txt +0 -0
  357. {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/licenses/LICENSE +0 -0
  358. {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/top_level.txt +0 -0
@@ -25,11 +25,11 @@ HELP = {
25
25
  "Dalfox works best when given URLs with parameters to test. Chain it after "
26
26
  "directory discovery (Gobuster/ffuf) to test discovered endpoints.\n"
27
27
  ),
28
- "usage": "souleyez jobs enqueue dalfox <url> --args \"url <target>\"",
28
+ "usage": 'souleyez jobs enqueue dalfox <url> --args "url <target>"',
29
29
  "examples": [
30
30
  "souleyez jobs enqueue dalfox 'http://example.com/search?q=test' --args \"url 'http://example.com/search?q=test'\"",
31
- "souleyez jobs enqueue dalfox http://example.com --args \"url http://example.com/page?id=1 --deep-domxss\"",
32
- "souleyez jobs enqueue dalfox http://example.com --args \"url http://example.com/form?name=test --waf-evasion\"",
31
+ 'souleyez jobs enqueue dalfox http://example.com --args "url http://example.com/page?id=1 --deep-domxss"',
32
+ 'souleyez jobs enqueue dalfox http://example.com --args "url http://example.com/form?name=test --waf-evasion"',
33
33
  ],
34
34
  "flags": [
35
35
  ["url <url>", "Target URL with parameters (required)"],
@@ -47,76 +47,128 @@ HELP = {
47
47
  {
48
48
  "name": "Quick XSS Scan",
49
49
  "args": ["url", "<target>", "--format", "json", "--skip-bav"],
50
- "desc": "Fast XSS scan on target URL"
50
+ "desc": "Fast XSS scan on target URL",
51
51
  },
52
52
  {
53
53
  "name": "Parameter Discovery",
54
54
  "args": ["url", "<target>", "--only-discovery", "--format", "json"],
55
- "desc": "Find parameters without attacking"
56
- }
55
+ "desc": "Find parameters without attacking",
56
+ },
57
57
  ],
58
58
  "comprehensive": [
59
59
  {
60
60
  "name": "Deep Scan",
61
61
  "args": ["url", "<target>", "--deep-domxss", "--format", "json"],
62
- "desc": "Include DOM XSS analysis"
62
+ "desc": "Include DOM XSS analysis",
63
63
  },
64
64
  {
65
65
  "name": "WAF Bypass",
66
66
  "args": ["url", "<target>", "--waf-evasion", "--format", "json"],
67
- "desc": "Use WAF evasion techniques"
67
+ "desc": "Use WAF evasion techniques",
68
68
  },
69
69
  {
70
70
  "name": "Full Scan",
71
- "args": ["url", "<target>", "--deep-domxss", "--waf-evasion", "--format", "json"],
72
- "desc": "All techniques enabled"
73
- }
71
+ "args": [
72
+ "url",
73
+ "<target>",
74
+ "--deep-domxss",
75
+ "--waf-evasion",
76
+ "--format",
77
+ "json",
78
+ ],
79
+ "desc": "All techniques enabled",
80
+ },
74
81
  ],
75
82
  "stealth": [
76
83
  {
77
84
  "name": "Slow Scan",
78
85
  "args": ["url", "<target>", "--delay", "1000", "--format", "json"],
79
- "desc": "1 second delay between requests"
86
+ "desc": "1 second delay between requests",
80
87
  }
81
- ]
88
+ ],
82
89
  },
83
90
  "presets": [
84
- {"name": "Quick XSS Scan", "args": ["url", "<target>", "--format", "json", "--skip-bav"], "desc": "Fast XSS scan on target URL"},
85
- {"name": "Parameter Discovery", "args": ["url", "<target>", "--only-discovery", "--format", "json"], "desc": "Find parameters without attacking"},
86
- {"name": "Deep Scan", "args": ["url", "<target>", "--deep-domxss", "--format", "json"], "desc": "Include DOM XSS analysis"},
87
- {"name": "WAF Bypass", "args": ["url", "<target>", "--waf-evasion", "--format", "json"], "desc": "Use WAF evasion techniques"},
88
- {"name": "Full Scan", "args": ["url", "<target>", "--deep-domxss", "--waf-evasion", "--format", "json"], "desc": "All techniques enabled"},
89
- {"name": "Slow Scan", "args": ["url", "<target>", "--delay", "1000", "--format", "json"], "desc": "1 second delay between requests"},
91
+ {
92
+ "name": "Quick XSS Scan",
93
+ "args": ["url", "<target>", "--format", "json", "--skip-bav"],
94
+ "desc": "Fast XSS scan on target URL",
95
+ },
96
+ {
97
+ "name": "Parameter Discovery",
98
+ "args": ["url", "<target>", "--only-discovery", "--format", "json"],
99
+ "desc": "Find parameters without attacking",
100
+ },
101
+ {
102
+ "name": "Deep Scan",
103
+ "args": ["url", "<target>", "--deep-domxss", "--format", "json"],
104
+ "desc": "Include DOM XSS analysis",
105
+ },
106
+ {
107
+ "name": "WAF Bypass",
108
+ "args": ["url", "<target>", "--waf-evasion", "--format", "json"],
109
+ "desc": "Use WAF evasion techniques",
110
+ },
111
+ {
112
+ "name": "Full Scan",
113
+ "args": [
114
+ "url",
115
+ "<target>",
116
+ "--deep-domxss",
117
+ "--waf-evasion",
118
+ "--format",
119
+ "json",
120
+ ],
121
+ "desc": "All techniques enabled",
122
+ },
123
+ {
124
+ "name": "Slow Scan",
125
+ "args": ["url", "<target>", "--delay", "1000", "--format", "json"],
126
+ "desc": "1 second delay between requests",
127
+ },
90
128
  ],
91
129
  "help_sections": [
92
130
  {
93
131
  "title": "What is Dalfox?",
94
132
  "color": "cyan",
95
133
  "content": [
96
- {"title": "Overview", "desc": "Dalfox (XSS Finder) is a fast, powerful parameter analysis and XSS scanner written in Go. It's designed specifically for finding XSS vulnerabilities."},
97
- {"title": "Use Cases", "desc": "Perfect for testing web applications", "tips": [
98
- "Test form inputs for XSS",
99
- "Analyze URL parameters",
100
- "Find DOM-based XSS",
101
- "Bypass WAF protections",
102
- "Detect blind XSS opportunities"
103
- ]}
104
- ]
134
+ {
135
+ "title": "Overview",
136
+ "desc": "Dalfox (XSS Finder) is a fast, powerful parameter analysis and XSS scanner written in Go. It's designed specifically for finding XSS vulnerabilities.",
137
+ },
138
+ {
139
+ "title": "Use Cases",
140
+ "desc": "Perfect for testing web applications",
141
+ "tips": [
142
+ "Test form inputs for XSS",
143
+ "Analyze URL parameters",
144
+ "Find DOM-based XSS",
145
+ "Bypass WAF protections",
146
+ "Detect blind XSS opportunities",
147
+ ],
148
+ },
149
+ ],
105
150
  },
106
151
  {
107
152
  "title": "Best Practices",
108
153
  "color": "green",
109
154
  "content": [
110
- {"title": "Workflow", "desc": "1. Run Gobuster/ffuf to find endpoints\n2. Identify URLs with parameters\n3. Run Dalfox on each parameterized URL\n4. Review findings for exploitability"},
111
- {"title": "Tips", "desc": "Maximize XSS detection", "tips": [
112
- "Use --deep-domxss for JavaScript-heavy apps",
113
- "Enable --waf-evasion for protected sites",
114
- "Check --blind for delayed XSS detection",
115
- "Use --delay to avoid rate limiting"
116
- ]}
117
- ]
118
- }
119
- ]
155
+ {
156
+ "title": "Workflow",
157
+ "desc": "1. Run Gobuster/ffuf to find endpoints\n2. Identify URLs with parameters\n3. Run Dalfox on each parameterized URL\n4. Review findings for exploitability",
158
+ },
159
+ {
160
+ "title": "Tips",
161
+ "desc": "Maximize XSS detection",
162
+ "tips": [
163
+ "Use --deep-domxss for JavaScript-heavy apps",
164
+ "Enable --waf-evasion for protected sites",
165
+ "Check --blind for delayed XSS detection",
166
+ "Use --delay to avoid rate limiting",
167
+ ],
168
+ },
169
+ ],
170
+ },
171
+ ],
120
172
  }
121
173
 
122
174
 
@@ -128,11 +180,13 @@ class DalfoxPlugin(PluginBase):
128
180
 
129
181
  def _ensure_url_scheme(self, target: str) -> str:
130
182
  """Ensure target has http:// or https:// scheme."""
131
- if not target.startswith(('http://', 'https://')):
132
- return f'http://{target}'
183
+ if not target.startswith(("http://", "https://")):
184
+ return f"http://{target}"
133
185
  return target
134
186
 
135
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
187
+ def build_command(
188
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
189
+ ):
136
190
  """Build dalfox command for background execution."""
137
191
  args = args or []
138
192
 
@@ -140,24 +194,23 @@ class DalfoxPlugin(PluginBase):
140
194
  target = self._ensure_url_scheme(target)
141
195
 
142
196
  # If no mode specified, add 'url' mode with target
143
- if 'url' not in args and 'file' not in args and 'pipe' not in args:
144
- args = ['url', target] + args
197
+ if "url" not in args and "file" not in args and "pipe" not in args:
198
+ args = ["url", target] + args
145
199
 
146
200
  # Replace <target> placeholder (also ensure scheme in placeholder)
147
201
  processed_args = [arg.replace("<target>", target) for arg in args]
148
202
 
149
203
  # Add JSON output format if not specified
150
- if '--format' not in processed_args and '-format' not in processed_args:
151
- processed_args.extend(['--format', 'json'])
204
+ if "--format" not in processed_args and "-format" not in processed_args:
205
+ processed_args.extend(["--format", "json"])
152
206
 
153
207
  cmd = ["dalfox"] + processed_args
154
208
 
155
- return {
156
- 'cmd': cmd,
157
- 'timeout': 1800 # 30 minutes
158
- }
209
+ return {"cmd": cmd, "timeout": 1800} # 30 minutes
159
210
 
160
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
211
+ def run(
212
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
213
+ ) -> int:
161
214
  """Execute dalfox scan and write output to log_path."""
162
215
  args = args or []
163
216
 
@@ -165,21 +218,23 @@ class DalfoxPlugin(PluginBase):
165
218
  target = self._ensure_url_scheme(target)
166
219
 
167
220
  # If no mode specified, add 'url' mode with target
168
- if 'url' not in args and 'file' not in args and 'pipe' not in args:
169
- args = ['url', target] + args
221
+ if "url" not in args and "file" not in args and "pipe" not in args:
222
+ args = ["url", target] + args
170
223
 
171
224
  # Replace <target> placeholder (also ensure scheme in placeholder)
172
225
  processed_args = [arg.replace("<target>", target) for arg in args]
173
226
 
174
227
  # Add JSON output format if not specified
175
- if '--format' not in processed_args and '-format' not in processed_args:
176
- processed_args.extend(['--format', 'json'])
228
+ if "--format" not in processed_args and "-format" not in processed_args:
229
+ processed_args.extend(["--format", "json"])
177
230
 
178
231
  cmd = ["dalfox"] + processed_args
179
232
 
180
233
  if not log_path:
181
234
  try:
182
- proc = subprocess.run(cmd, capture_output=True, timeout=1800, check=False)
235
+ proc = subprocess.run(
236
+ cmd, capture_output=True, timeout=1800, check=False
237
+ )
183
238
  return proc.returncode
184
239
  except Exception:
185
240
  return 1
@@ -191,7 +246,9 @@ class DalfoxPlugin(PluginBase):
191
246
  fh.write(f"Args: {processed_args}\n")
192
247
  if label:
193
248
  fh.write(f"Label: {label}\n")
194
- fh.write(f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n")
249
+ fh.write(
250
+ f"Started: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())}\n"
251
+ )
195
252
  fh.write(f"Command: {' '.join(cmd)}\n")
196
253
  fh.write("=" * 60 + "\n\n")
197
254
  fh.flush()
@@ -202,11 +259,13 @@ class DalfoxPlugin(PluginBase):
202
259
  stderr=subprocess.STDOUT,
203
260
  timeout=1800,
204
261
  check=False,
205
- text=True
262
+ text=True,
206
263
  )
207
264
 
208
265
  fh.write(proc.stdout)
209
- fh.write(f"\n=== Completed: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())} ===\n")
266
+ fh.write(
267
+ f"\n=== Completed: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())} ===\n"
268
+ )
210
269
  fh.write(f"Exit Code: {proc.returncode}\n")
211
270
 
212
271
  return proc.returncode
@@ -219,7 +278,9 @@ class DalfoxPlugin(PluginBase):
219
278
  except FileNotFoundError:
220
279
  with open(log_path, "a", encoding="utf-8", errors="replace") as fh:
221
280
  fh.write("\nERROR: dalfox not found in PATH\n")
222
- fh.write("Install with: go install github.com/hahwul/dalfox/v2@latest\n")
281
+ fh.write(
282
+ "Install with: go install github.com/hahwul/dalfox/v2@latest\n"
283
+ )
223
284
  return 127
224
285
 
225
286
  except Exception as e:
@@ -31,14 +31,97 @@ HELP = {
31
31
  "usage": "souleyez jobs enqueue dns_hijack <router_ip>",
32
32
  "examples": [
33
33
  "souleyez jobs enqueue dns_hijack 192.168.1.1",
34
- "souleyez jobs enqueue dns_hijack 192.168.1.1 --args \"--domains google.com,microsoft.com\"",
34
+ 'souleyez jobs enqueue dns_hijack 192.168.1.1 --args "--domains google.com,microsoft.com"',
35
35
  ],
36
36
  "flags": [
37
37
  ["--domains DOMAINS", "Comma-separated test domains"],
38
38
  ],
39
39
  "presets": [
40
40
  {"name": "Quick Check", "args": [], "desc": "Test with common domains"},
41
- {"name": "Extended", "args": ["--domains", "google.com,microsoft.com,apple.com,facebook.com,amazon.com"], "desc": "Test multiple major sites"},
41
+ {
42
+ "name": "Extended",
43
+ "args": [
44
+ "--domains",
45
+ "google.com,microsoft.com,apple.com,facebook.com,amazon.com",
46
+ ],
47
+ "desc": "Test multiple major sites",
48
+ },
49
+ ],
50
+ "help_sections": [
51
+ {
52
+ "title": "What is DNS Hijacking?",
53
+ "color": "cyan",
54
+ "content": [
55
+ (
56
+ "Overview",
57
+ [
58
+ "DNS hijacking redirects DNS queries to attacker-controlled servers",
59
+ "Compromised routers may modify DNS to redirect traffic",
60
+ "This tool compares router DNS responses to known-good DNS (8.8.8.8)",
61
+ ],
62
+ ),
63
+ (
64
+ "Common Attack Goals",
65
+ [
66
+ "Redirect users to phishing sites (fake banking, email)",
67
+ "Inject ads into web pages for profit",
68
+ "Monitor browsing activity and steal credentials",
69
+ "Block security updates to maintain access",
70
+ ],
71
+ ),
72
+ ],
73
+ },
74
+ {
75
+ "title": "Usage & Examples",
76
+ "color": "green",
77
+ "content": [
78
+ (
79
+ "Basic Usage",
80
+ [
81
+ "souleyez jobs enqueue dns_hijack 192.168.1.1",
82
+ " → Tests router DNS against Google DNS (8.8.8.8)",
83
+ ],
84
+ ),
85
+ (
86
+ "Custom Domains",
87
+ [
88
+ 'souleyez jobs enqueue dns_hijack 192.168.1.1 --args "--domains google.com,bank.com"',
89
+ " → Tests specific domains you're concerned about",
90
+ ],
91
+ ),
92
+ ],
93
+ },
94
+ {
95
+ "title": "Understanding Results",
96
+ "color": "yellow",
97
+ "content": [
98
+ (
99
+ "Result Indicators",
100
+ [
101
+ "[OK] - DNS responses match the reference server",
102
+ "[WARN] - Partial match, some IPs differ (investigate)",
103
+ "[ALERT] - No matching IPs, likely hijacked!",
104
+ ],
105
+ ),
106
+ (
107
+ "NXDOMAIN Test",
108
+ [
109
+ "Tests if router returns IPs for fake domains",
110
+ "If yes: Router hijacks typos to show ads/search pages",
111
+ "Common ISP 'feature' but can mask real hijacking",
112
+ ],
113
+ ),
114
+ (
115
+ "Next Steps if Hijacked",
116
+ [
117
+ "Change router DNS to 8.8.8.8 or 1.1.1.1 manually",
118
+ "Check router for firmware compromise",
119
+ "Look for unauthorized admin accounts",
120
+ "Consider factory reset if malware suspected",
121
+ ],
122
+ ),
123
+ ],
124
+ },
42
125
  ],
43
126
  }
44
127
 
@@ -49,7 +132,9 @@ class DNSHijackPlugin(PluginBase):
49
132
  category = "vulnerability_analysis"
50
133
  HELP = HELP
51
134
 
52
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
135
+ def build_command(
136
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
137
+ ):
53
138
  """Build dig commands for DNS hijack detection."""
54
139
  args = args or []
55
140
 
@@ -57,39 +142,37 @@ class DNSHijackPlugin(PluginBase):
57
142
  target = validate_target(target)
58
143
  except ValidationError as e:
59
144
  if log_path:
60
- with open(log_path, 'w') as f:
145
+ with open(log_path, "w") as f:
61
146
  f.write(f"ERROR: Invalid target: {e}\n")
62
147
  return None
63
148
 
64
149
  # Parse domains to test
65
- domains = ['google.com', 'microsoft.com', 'example.com']
150
+ domains = ["google.com", "microsoft.com", "example.com"]
66
151
  i = 0
67
152
  while i < len(args):
68
- if args[i] == '--domains' and i + 1 < len(args):
69
- domains = [d.strip() for d in args[i + 1].split(',')]
153
+ if args[i] == "--domains" and i + 1 < len(args):
154
+ domains = [d.strip() for d in args[i + 1].split(",")]
70
155
  i += 2
71
156
  else:
72
157
  i += 1
73
158
 
74
159
  # We'll build a shell script that compares responses
75
160
  # This is stored and executed
76
- return {
77
- 'domains': domains,
78
- 'target': target,
79
- 'timeout': 120
80
- }
161
+ return {"domains": domains, "target": target, "timeout": 120}
81
162
 
82
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
163
+ def run(
164
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
165
+ ) -> int:
83
166
  """Execute DNS hijack detection."""
84
167
  cmd_spec = self.build_command(target, args, label, log_path)
85
168
  if cmd_spec is None:
86
169
  return 1
87
170
 
88
- domains = cmd_spec['domains']
89
- reference_dns = '8.8.8.8' # Google DNS as reference
171
+ domains = cmd_spec["domains"]
172
+ reference_dns = "8.8.8.8" # Google DNS as reference
90
173
 
91
174
  if log_path:
92
- with open(log_path, 'w') as f:
175
+ with open(log_path, "w") as f:
93
176
  f.write(f"# DNS Hijack Detection on {target}\n")
94
177
  f.write(f"# Reference DNS: {reference_dns}\n")
95
178
  f.write(f"# Test domains: {', '.join(domains)}\n")
@@ -99,7 +182,7 @@ class DNSHijackPlugin(PluginBase):
99
182
 
100
183
  try:
101
184
  for domain in domains:
102
- with open(log_path, 'a') as f:
185
+ with open(log_path, "a") as f:
103
186
  f.write(f"\n{'='*60}\n")
104
187
  f.write(f"Testing: {domain}\n")
105
188
  f.write(f"{'='*60}\n\n")
@@ -107,32 +190,40 @@ class DNSHijackPlugin(PluginBase):
107
190
  # Query target router
108
191
  try:
109
192
  router_result = subprocess.run(
110
- ['dig', '+short', f'@{target}', domain, 'A'],
193
+ ["dig", "+short", f"@{target}", domain, "A"],
111
194
  capture_output=True,
112
195
  text=True,
113
- timeout=10
196
+ timeout=10,
197
+ )
198
+ router_ips = (
199
+ set(router_result.stdout.strip().split("\n"))
200
+ if router_result.stdout.strip()
201
+ else set()
114
202
  )
115
- router_ips = set(router_result.stdout.strip().split('\n')) if router_result.stdout.strip() else set()
116
203
  except subprocess.TimeoutExpired:
117
204
  router_ips = set()
118
- with open(log_path, 'a') as f:
205
+ with open(log_path, "a") as f:
119
206
  f.write(f" Router DNS (@{target}): TIMEOUT\n")
120
207
 
121
208
  # Query reference DNS
122
209
  try:
123
210
  ref_result = subprocess.run(
124
- ['dig', '+short', f'@{reference_dns}', domain, 'A'],
211
+ ["dig", "+short", f"@{reference_dns}", domain, "A"],
125
212
  capture_output=True,
126
213
  text=True,
127
- timeout=10
214
+ timeout=10,
215
+ )
216
+ ref_ips = (
217
+ set(ref_result.stdout.strip().split("\n"))
218
+ if ref_result.stdout.strip()
219
+ else set()
128
220
  )
129
- ref_ips = set(ref_result.stdout.strip().split('\n')) if ref_result.stdout.strip() else set()
130
221
  except subprocess.TimeoutExpired:
131
222
  ref_ips = set()
132
- with open(log_path, 'a') as f:
223
+ with open(log_path, "a") as f:
133
224
  f.write(f" Reference DNS (@{reference_dns}): TIMEOUT\n")
134
225
 
135
- with open(log_path, 'a') as f:
226
+ with open(log_path, "a") as f:
136
227
  f.write(f" Router DNS (@{target}):\n")
137
228
  for ip in sorted(router_ips):
138
229
  f.write(f" {ip}\n")
@@ -149,50 +240,64 @@ class DNSHijackPlugin(PluginBase):
149
240
  f.write(f" Router only: {router_ips - ref_ips}\n")
150
241
  f.write(f" Reference only: {ref_ips - router_ips}\n")
151
242
  else:
152
- f.write(f"\n [ALERT] No matching IPs - possible DNS hijack!\n")
243
+ f.write(
244
+ f"\n [ALERT] No matching IPs - possible DNS hijack!\n"
245
+ )
153
246
  hijack_detected = True
154
247
  elif router_ips and not ref_ips:
155
- f.write(f"\n [WARN] Router returned IPs but reference didn't\n")
248
+ f.write(
249
+ f"\n [WARN] Router returned IPs but reference didn't\n"
250
+ )
156
251
  elif ref_ips and not router_ips:
157
- f.write(f"\n [WARN] Reference returned IPs but router didn't\n")
252
+ f.write(
253
+ f"\n [WARN] Reference returned IPs but router didn't\n"
254
+ )
158
255
 
159
256
  # Test NXDOMAIN hijacking
160
- with open(log_path, 'a') as f:
257
+ with open(log_path, "a") as f:
161
258
  f.write(f"\n{'='*60}\n")
162
259
  f.write("Testing NXDOMAIN hijacking (nonexistent domain):\n")
163
260
  f.write(f"{'='*60}\n\n")
164
261
 
165
- fake_domain = 'thisisafakedomainthatdoesnotexist12345.com'
262
+ fake_domain = "thisisafakedomainthatdoesnotexist12345.com"
166
263
 
167
264
  try:
168
265
  nxdomain_result = subprocess.run(
169
- ['dig', '+short', f'@{target}', fake_domain, 'A'],
266
+ ["dig", "+short", f"@{target}", fake_domain, "A"],
170
267
  capture_output=True,
171
268
  text=True,
172
- timeout=10
269
+ timeout=10,
173
270
  )
174
271
  nxdomain_ips = nxdomain_result.stdout.strip()
175
272
 
176
- with open(log_path, 'a') as f:
273
+ with open(log_path, "a") as f:
177
274
  if nxdomain_ips:
178
- f.write(f" [ALERT] Router returns IPs for nonexistent domain!\n")
179
- f.write(f" This indicates NXDOMAIN hijacking (likely ads/search redirect)\n")
275
+ f.write(
276
+ f" [ALERT] Router returns IPs for nonexistent domain!\n"
277
+ )
278
+ f.write(
279
+ f" This indicates NXDOMAIN hijacking (likely ads/search redirect)\n"
280
+ )
180
281
  f.write(f" Returned IPs: {nxdomain_ips}\n")
181
282
  hijack_detected = True
182
283
  else:
183
- f.write(f" [OK] Router correctly returns no IPs for nonexistent domain\n")
284
+ f.write(
285
+ f" [OK] Router correctly returns no IPs for nonexistent domain\n"
286
+ )
184
287
  except subprocess.TimeoutExpired:
185
- with open(log_path, 'a') as f:
288
+ with open(log_path, "a") as f:
186
289
  f.write(f" [WARN] NXDOMAIN test timed out\n")
187
290
 
188
291
  # Summary
189
- with open(log_path, 'a') as f:
292
+ with open(log_path, "a") as f:
190
293
  f.write(f"\n{'='*60}\n")
191
294
  f.write("SUMMARY\n")
192
295
  f.write(f"{'='*60}\n\n")
193
296
  if hijack_detected:
194
297
  f.write(" [!] POTENTIAL DNS HIJACKING DETECTED\n")
195
- f.write(" Investigate the router for malware or misconfiguration.\n")
298
+ f.write(
299
+ " Investigate the router for malware or misconfiguration.\n"
300
+ )
196
301
  else:
197
302
  f.write(" [OK] No obvious DNS hijacking detected\n")
198
303
 
@@ -200,7 +305,7 @@ class DNSHijackPlugin(PluginBase):
200
305
 
201
306
  except Exception as e:
202
307
  if log_path:
203
- with open(log_path, 'a') as f:
308
+ with open(log_path, "a") as f:
204
309
  f.write(f"\n\n# ERROR: {e}\n")
205
310
  return 1
206
311