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/upnp.py CHANGED
@@ -35,7 +35,7 @@ HELP = {
35
35
  "examples": [
36
36
  "souleyez jobs enqueue upnp 192.168.1.1",
37
37
  "souleyez jobs enqueue upnp 192.168.1.0/24",
38
- "souleyez jobs enqueue upnp 10.0.0.1 --args \"--script upnp-info\"",
38
+ 'souleyez jobs enqueue upnp 10.0.0.1 --args "--script upnp-info"',
39
39
  ],
40
40
  "flags": [
41
41
  ["--full", "Run all UPnP scripts (info + brute)"],
@@ -43,35 +43,50 @@ HELP = {
43
43
  ],
44
44
  "presets": [
45
45
  {"name": "Quick Discovery", "args": [], "desc": "Fast UPnP service discovery"},
46
- {"name": "Full Enumeration", "args": ["--full"], "desc": "All UPnP scripts including brute force"},
46
+ {
47
+ "name": "Full Enumeration",
48
+ "args": ["--full"],
49
+ "desc": "All UPnP scripts including brute force",
50
+ },
47
51
  ],
48
52
  "help_sections": [
49
53
  {
50
54
  "title": "What is UPnP?",
51
55
  "color": "cyan",
52
56
  "content": [
53
- {"title": "Overview", "desc": "UPnP allows devices to discover and communicate with each other automatically. Routers use it for NAT traversal (port forwarding)."},
54
- {"title": "Security Issues", "desc": "Common UPnP vulnerabilities", "tips": [
55
- "Unauthenticated port forwarding (expose internal services)",
56
- "Device information disclosure (model, firmware)",
57
- "Known exploits for specific router firmware",
58
- "Can be abused for DDoS amplification"
59
- ]}
60
- ]
57
+ {
58
+ "title": "Overview",
59
+ "desc": "UPnP allows devices to discover and communicate with each other automatically. Routers use it for NAT traversal (port forwarding).",
60
+ },
61
+ {
62
+ "title": "Security Issues",
63
+ "desc": "Common UPnP vulnerabilities",
64
+ "tips": [
65
+ "Unauthenticated port forwarding (expose internal services)",
66
+ "Device information disclosure (model, firmware)",
67
+ "Known exploits for specific router firmware",
68
+ "Can be abused for DDoS amplification",
69
+ ],
70
+ },
71
+ ],
61
72
  },
62
73
  {
63
74
  "title": "What to Look For",
64
75
  "color": "green",
65
76
  "content": [
66
- {"title": "Indicators", "desc": "Signs of vulnerable UPnP", "tips": [
67
- "UPnP enabled and externally accessible",
68
- "Old firmware versions with known CVEs",
69
- "Add port mapping action available",
70
- "Device info revealing make/model"
71
- ]}
72
- ]
73
- }
74
- ]
77
+ {
78
+ "title": "Indicators",
79
+ "desc": "Signs of vulnerable UPnP",
80
+ "tips": [
81
+ "UPnP enabled and externally accessible",
82
+ "Old firmware versions with known CVEs",
83
+ "Add port mapping action available",
84
+ "Device info revealing make/model",
85
+ ],
86
+ }
87
+ ],
88
+ },
89
+ ],
75
90
  }
76
91
 
77
92
 
@@ -84,9 +99,12 @@ class UPnPPlugin(PluginBase):
84
99
  def _is_root(self) -> bool:
85
100
  """Check if running as root."""
86
101
  import os
102
+
87
103
  return os.geteuid() == 0
88
104
 
89
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
105
+ def build_command(
106
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
107
+ ):
90
108
  """Build nmap command for UPnP enumeration."""
91
109
  args = args or []
92
110
 
@@ -95,70 +113,70 @@ class UPnPPlugin(PluginBase):
95
113
  target = validate_target(target)
96
114
  except ValidationError as e:
97
115
  if log_path:
98
- with open(log_path, 'w') as f:
116
+ with open(log_path, "w") as f:
99
117
  f.write(f"ERROR: Invalid target: {e}\n")
100
118
  return None
101
119
 
102
120
  # Determine which scripts to run
103
- if '--full' in args:
104
- scripts = 'upnp-info,broadcast-upnp-info'
121
+ if "--full" in args:
122
+ scripts = "upnp-info,broadcast-upnp-info"
105
123
  else:
106
- scripts = 'upnp-info'
124
+ scripts = "upnp-info"
107
125
 
108
126
  # Build nmap command for UPnP
109
127
  # UPnP uses UDP 1900 for discovery (SSDP) and TCP high ports for control
110
128
  cmd = [
111
- 'nmap',
112
- '-sU', '-sS', # UDP and TCP SYN scan
113
- '-p', 'U:1900,T:49152-49156,5000,2869', # Common UPnP ports
114
- '--script', scripts,
115
- '-oN', '-', # Output to stdout
116
- '--open',
117
- '-T4',
118
- target
129
+ "nmap",
130
+ "-sU",
131
+ "-sS", # UDP and TCP SYN scan
132
+ "-p",
133
+ "U:1900,T:49152-49156,5000,2869", # Common UPnP ports
134
+ "--script",
135
+ scripts,
136
+ "-oN",
137
+ "-", # Output to stdout
138
+ "--open",
139
+ "-T4",
140
+ target,
119
141
  ]
120
142
 
121
143
  # UPnP scan requires root (uses -sU and -sS)
122
144
  if not self._is_root():
123
- cmd = ['sudo', '-n'] + cmd
145
+ cmd = ["sudo", "-n"] + cmd
124
146
 
125
- return {
126
- 'cmd': cmd,
127
- 'timeout': 600 # 10 minute timeout
128
- }
147
+ return {"cmd": cmd, "timeout": 600} # 10 minute timeout
129
148
 
130
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
149
+ def run(
150
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
151
+ ) -> int:
131
152
  """Execute UPnP enumeration."""
132
153
  cmd_spec = self.build_command(target, args, label, log_path)
133
154
  if cmd_spec is None:
134
155
  return 1
135
156
 
136
- cmd = cmd_spec['cmd']
157
+ cmd = cmd_spec["cmd"]
137
158
 
138
159
  if log_path:
139
- with open(log_path, 'w') as f:
160
+ with open(log_path, "w") as f:
140
161
  f.write(f"# UPnP Enumeration on {target}\n")
141
162
  f.write(f"# Command: {' '.join(cmd)}\n")
142
163
  f.write(f"# Started: {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n")
143
164
 
144
165
  try:
145
- with open(log_path, 'a') as f:
166
+ with open(log_path, "a") as f:
146
167
  result = subprocess.run(
147
- cmd,
148
- stdout=f,
149
- stderr=subprocess.STDOUT,
150
- timeout=cmd_spec['timeout']
168
+ cmd, stdout=f, stderr=subprocess.STDOUT, timeout=cmd_spec["timeout"]
151
169
  )
152
170
  return result.returncode
153
171
 
154
172
  except subprocess.TimeoutExpired:
155
173
  if log_path:
156
- with open(log_path, 'a') as f:
174
+ with open(log_path, "a") as f:
157
175
  f.write("\n\n# ERROR: Scan timed out\n")
158
176
  return 124
159
177
  except Exception as e:
160
178
  if log_path:
161
- with open(log_path, 'a') as f:
179
+ with open(log_path, "a") as f:
162
180
  f.write(f"\n\n# ERROR: {e}\n")
163
181
  return 1
164
182
 
@@ -30,12 +30,12 @@ HELP = {
30
30
  "- Port forwards persist until router reboot (usually)\n"
31
31
  "- Clean up your test forwards when done\n"
32
32
  ),
33
- "usage": "souleyez jobs enqueue upnp_abuse <router_ip> --args \"<action>\"",
33
+ "usage": 'souleyez jobs enqueue upnp_abuse <router_ip> --args "<action>"',
34
34
  "examples": [
35
- "souleyez jobs enqueue upnp_abuse 192.168.1.1 --args \"list\"",
36
- "souleyez jobs enqueue upnp_abuse 192.168.1.1 --args \"info\"",
37
- "souleyez jobs enqueue upnp_abuse 192.168.1.1 --args \"add 8888 192.168.1.100 22 TCP\"",
38
- "souleyez jobs enqueue upnp_abuse 192.168.1.1 --args \"delete 8888 TCP\"",
35
+ 'souleyez jobs enqueue upnp_abuse 192.168.1.1 --args "list"',
36
+ 'souleyez jobs enqueue upnp_abuse 192.168.1.1 --args "info"',
37
+ 'souleyez jobs enqueue upnp_abuse 192.168.1.1 --args "add 8888 192.168.1.100 22 TCP"',
38
+ 'souleyez jobs enqueue upnp_abuse 192.168.1.1 --args "delete 8888 TCP"',
39
39
  ],
40
40
  "flags": [
41
41
  ["list", "List existing port mappings"],
@@ -44,37 +44,57 @@ HELP = {
44
44
  ["delete EXT_PORT PROTO", "Remove port forward"],
45
45
  ],
46
46
  "presets": [
47
- {"name": "List Mappings", "args": ["list"], "desc": "Show existing port forwards"},
48
- {"name": "Get Info", "args": ["info"], "desc": "External IP and gateway details"},
49
- {"name": "Expose SSH", "args": ["add", "2222", "TARGET_IP", "22", "TCP"], "desc": "Expose SSH on port 2222"},
47
+ {
48
+ "name": "List Mappings",
49
+ "args": ["list"],
50
+ "desc": "Show existing port forwards",
51
+ },
52
+ {
53
+ "name": "Get Info",
54
+ "args": ["info"],
55
+ "desc": "External IP and gateway details",
56
+ },
57
+ {
58
+ "name": "Expose SSH",
59
+ "args": ["add", "2222", "TARGET_IP", "22", "TCP"],
60
+ "desc": "Expose SSH on port 2222",
61
+ },
50
62
  ],
51
63
  "help_sections": [
52
64
  {
53
65
  "title": "What Can UPnP Abuse Do?",
54
66
  "color": "cyan",
55
67
  "content": [
56
- {"title": "Capabilities", "desc": "What this plugin enables", "tips": [
57
- "View all active port forwards on the router",
58
- "Get the router's external (public) IP address",
59
- "Add new port forwards without authentication",
60
- "Remove port forwards you added",
61
- "Redirect external traffic to internal hosts"
62
- ]}
63
- ]
68
+ {
69
+ "title": "Capabilities",
70
+ "desc": "What this plugin enables",
71
+ "tips": [
72
+ "View all active port forwards on the router",
73
+ "Get the router's external (public) IP address",
74
+ "Add new port forwards without authentication",
75
+ "Remove port forwards you added",
76
+ "Redirect external traffic to internal hosts",
77
+ ],
78
+ }
79
+ ],
64
80
  },
65
81
  {
66
82
  "title": "Attack Scenarios",
67
83
  "color": "red",
68
84
  "content": [
69
- {"title": "Common Uses", "desc": "How attackers abuse UPnP", "tips": [
70
- "Expose internal services (SSH, RDP, web) to internet",
71
- "Create persistent access through router",
72
- "Pivot from compromised LAN device to WAN access",
73
- "Map network by listing existing forwards"
74
- ]}
75
- ]
76
- }
77
- ]
85
+ {
86
+ "title": "Common Uses",
87
+ "desc": "How attackers abuse UPnP",
88
+ "tips": [
89
+ "Expose internal services (SSH, RDP, web) to internet",
90
+ "Create persistent access through router",
91
+ "Pivot from compromised LAN device to WAN access",
92
+ "Map network by listing existing forwards",
93
+ ],
94
+ }
95
+ ],
96
+ },
97
+ ],
78
98
  }
79
99
 
80
100
 
@@ -86,40 +106,42 @@ class UPnPAbusePlugin(PluginBase):
86
106
 
87
107
  def check_tool_available(self) -> tuple:
88
108
  """Check if upnpc is available."""
89
- if shutil.which('upnpc'):
109
+ if shutil.which("upnpc"):
90
110
  return True, None
91
111
  return False, "upnpc not found. Install with: sudo apt install miniupnpc"
92
112
 
93
- def build_command(self, target: str, args: List[str] = None, label: str = "", log_path: str = None):
113
+ def build_command(
114
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
115
+ ):
94
116
  """Build upnpc command for UPnP manipulation."""
95
- args = args or ['list']
117
+ args = args or ["list"]
96
118
 
97
119
  # Validate target
98
120
  try:
99
121
  target = validate_target(target)
100
122
  except ValidationError as e:
101
123
  if log_path:
102
- with open(log_path, 'w') as f:
124
+ with open(log_path, "w") as f:
103
125
  f.write(f"ERROR: Invalid target: {e}\n")
104
126
  return None
105
127
 
106
- action = args[0] if args else 'list'
128
+ action = args[0] if args else "list"
107
129
 
108
- if action == 'list':
109
- cmd = ['upnpc', '-l']
110
- elif action == 'info':
111
- cmd = ['upnpc', '-s']
112
- elif action == 'add' and len(args) >= 5:
130
+ if action == "list":
131
+ cmd = ["upnpc", "-l"]
132
+ elif action == "info":
133
+ cmd = ["upnpc", "-s"]
134
+ elif action == "add" and len(args) >= 5:
113
135
  # add EXT_PORT INT_IP INT_PORT PROTO
114
136
  ext_port, int_ip, int_port, proto = args[1], args[2], args[3], args[4]
115
- cmd = ['upnpc', '-a', int_ip, int_port, ext_port, proto]
116
- elif action == 'delete' and len(args) >= 3:
137
+ cmd = ["upnpc", "-a", int_ip, int_port, ext_port, proto]
138
+ elif action == "delete" and len(args) >= 3:
117
139
  # delete EXT_PORT PROTO
118
140
  ext_port, proto = args[1], args[2]
119
- cmd = ['upnpc', '-d', ext_port, proto]
141
+ cmd = ["upnpc", "-d", ext_port, proto]
120
142
  else:
121
143
  if log_path:
122
- with open(log_path, 'w') as f:
144
+ with open(log_path, "w") as f:
123
145
  f.write("ERROR: Invalid action. Use: list, info, add, or delete\n")
124
146
  f.write(" list - List port mappings\n")
125
147
  f.write(" info - Get external IP and gateway info\n")
@@ -127,51 +149,47 @@ class UPnPAbusePlugin(PluginBase):
127
149
  f.write(" delete EXT_PORT PROTO - Remove mapping\n")
128
150
  return None
129
151
 
130
- return {
131
- 'cmd': cmd,
132
- 'timeout': 60 # Quick timeout for UPnP operations
133
- }
152
+ return {"cmd": cmd, "timeout": 60} # Quick timeout for UPnP operations
134
153
 
135
- def run(self, target: str, args: List[str] = None, label: str = "", log_path: str = None) -> int:
154
+ def run(
155
+ self, target: str, args: List[str] = None, label: str = "", log_path: str = None
156
+ ) -> int:
136
157
  """Execute UPnP manipulation."""
137
158
  cmd_spec = self.build_command(target, args, label, log_path)
138
159
  if cmd_spec is None:
139
160
  return 1
140
161
 
141
- cmd = cmd_spec['cmd']
142
- action = args[0] if args else 'list'
162
+ cmd = cmd_spec["cmd"]
163
+ action = args[0] if args else "list"
143
164
 
144
165
  if log_path:
145
- with open(log_path, 'w') as f:
166
+ with open(log_path, "w") as f:
146
167
  f.write(f"# UPnP Abuse on {target}\n")
147
168
  f.write(f"# Action: {action}\n")
148
169
  f.write(f"# Command: {' '.join(cmd)}\n")
149
170
  f.write(f"# Started: {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n")
150
171
 
151
172
  try:
152
- with open(log_path, 'a') as f:
173
+ with open(log_path, "a") as f:
153
174
  result = subprocess.run(
154
- cmd,
155
- stdout=f,
156
- stderr=subprocess.STDOUT,
157
- timeout=cmd_spec['timeout']
175
+ cmd, stdout=f, stderr=subprocess.STDOUT, timeout=cmd_spec["timeout"]
158
176
  )
159
177
  return result.returncode
160
178
 
161
179
  except subprocess.TimeoutExpired:
162
180
  if log_path:
163
- with open(log_path, 'a') as f:
181
+ with open(log_path, "a") as f:
164
182
  f.write("\n\n# ERROR: Operation timed out\n")
165
183
  return 124
166
184
  except FileNotFoundError:
167
185
  if log_path:
168
- with open(log_path, 'a') as f:
186
+ with open(log_path, "a") as f:
169
187
  f.write("\n\n# ERROR: upnpc not found\n")
170
188
  f.write("Install with: sudo apt install miniupnpc\n")
171
189
  return 127
172
190
  except Exception as e:
173
191
  if log_path:
174
- with open(log_path, 'a') as f:
192
+ with open(log_path, "a") as f:
175
193
  f.write(f"\n\n# ERROR: {e}\n")
176
194
  return 1
177
195