souleyez 2.43.29__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 +22783 -10678
  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.29.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.29.dist-info → souleyez-2.43.32.dist-info}/WHEEL +1 -1
  353. souleyez-2.43.29.dist-info/RECORD +0 -379
  354. {souleyez-2.43.29.dist-info → souleyez-2.43.32.dist-info}/entry_points.txt +0 -0
  355. {souleyez-2.43.29.dist-info → souleyez-2.43.32.dist-info}/licenses/LICENSE +0 -0
  356. {souleyez-2.43.29.dist-info → souleyez-2.43.32.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Deliverable tracking and acceptance criteria management.
3
3
  """
4
+
4
5
  from typing import List, Dict, Optional
5
6
  from .database import get_db
6
7
 
@@ -17,11 +18,11 @@ class DeliverableManager:
17
18
  category: str,
18
19
  title: str,
19
20
  description: str = None,
20
- target_type: str = 'manual',
21
+ target_type: str = "manual",
21
22
  target_value: int = None,
22
23
  auto_validate: bool = False,
23
24
  validation_query: str = None,
24
- priority: str = 'medium'
25
+ priority: str = "medium",
25
26
  ) -> int:
26
27
  """
27
28
  Add a deliverable to an engagement.
@@ -40,25 +41,25 @@ class DeliverableManager:
40
41
  Returns:
41
42
  Deliverable ID
42
43
  """
43
- deliverable_id = self.db.insert('deliverables', {
44
- 'engagement_id': engagement_id,
45
- 'category': category,
46
- 'title': title,
47
- 'description': description,
48
- 'target_type': target_type,
49
- 'target_value': target_value,
50
- 'auto_validate': auto_validate,
51
- 'validation_query': validation_query,
52
- 'priority': priority
53
- })
44
+ deliverable_id = self.db.insert(
45
+ "deliverables",
46
+ {
47
+ "engagement_id": engagement_id,
48
+ "category": category,
49
+ "title": title,
50
+ "description": description,
51
+ "target_type": target_type,
52
+ "target_value": target_value,
53
+ "auto_validate": auto_validate,
54
+ "validation_query": validation_query,
55
+ "priority": priority,
56
+ },
57
+ )
54
58
 
55
59
  return deliverable_id
56
60
 
57
61
  def list_deliverables(
58
- self,
59
- engagement_id: int,
60
- category: str = None,
61
- status: str = None
62
+ self, engagement_id: int, category: str = None, status: str = None
62
63
  ) -> List[Dict]:
63
64
  """
64
65
  List deliverables for engagement.
@@ -89,8 +90,7 @@ class DeliverableManager:
89
90
  def get_deliverable(self, deliverable_id: int) -> Optional[Dict]:
90
91
  """Get deliverable by ID."""
91
92
  return self.db.execute_one(
92
- "SELECT * FROM deliverables WHERE id = ?",
93
- (deliverable_id,)
93
+ "SELECT * FROM deliverables WHERE id = ?", (deliverable_id,)
94
94
  )
95
95
 
96
96
  def update_deliverable(
@@ -98,29 +98,28 @@ class DeliverableManager:
98
98
  deliverable_id: int,
99
99
  current_value: int = None,
100
100
  status: str = None,
101
- completed_at: str = None
101
+ completed_at: str = None,
102
102
  ) -> bool:
103
103
  """Update deliverable progress."""
104
104
  updates = {}
105
105
 
106
106
  if current_value is not None:
107
- updates['current_value'] = current_value
107
+ updates["current_value"] = current_value
108
108
 
109
109
  if status:
110
- updates['status'] = status
110
+ updates["status"] = status
111
111
 
112
112
  if completed_at:
113
- updates['completed_at'] = completed_at
113
+ updates["completed_at"] = completed_at
114
114
 
115
115
  if not updates:
116
116
  return False
117
117
 
118
- set_clause = ', '.join([f"{k} = ?" for k in updates.keys()])
118
+ set_clause = ", ".join([f"{k} = ?" for k in updates.keys()])
119
119
  values = list(updates.values()) + [deliverable_id]
120
120
 
121
121
  self.db.execute(
122
- f"UPDATE deliverables SET {set_clause} WHERE id = ?",
123
- tuple(values)
122
+ f"UPDATE deliverables SET {set_clause} WHERE id = ?", tuple(values)
124
123
  )
125
124
 
126
125
  return True
@@ -128,15 +127,14 @@ class DeliverableManager:
128
127
  def mark_complete(self, deliverable_id: int) -> bool:
129
128
  """Mark deliverable as completed."""
130
129
  from datetime import datetime
130
+
131
131
  return self.update_deliverable(
132
- deliverable_id,
133
- status='completed',
134
- completed_at=datetime.now().isoformat()
132
+ deliverable_id, status="completed", completed_at=datetime.now().isoformat()
135
133
  )
136
134
 
137
135
  def mark_failed(self, deliverable_id: int) -> bool:
138
136
  """Mark deliverable as failed."""
139
- return self.update_deliverable(deliverable_id, status='failed')
137
+ return self.update_deliverable(deliverable_id, status="failed")
140
138
 
141
139
  def validate_all(self, engagement_id: int) -> Dict:
142
140
  """
@@ -151,17 +149,23 @@ class DeliverableManager:
151
149
  }
152
150
  """
153
151
  deliverables = self.list_deliverables(engagement_id)
154
- stats = {'updated': 0, 'completed': 0, 'in_progress': 0, 'pending': 0, 'failed': 0}
152
+ stats = {
153
+ "updated": 0,
154
+ "completed": 0,
155
+ "in_progress": 0,
156
+ "pending": 0,
157
+ "failed": 0,
158
+ }
155
159
 
156
160
  for d in deliverables:
157
- if not d['auto_validate']:
161
+ if not d["auto_validate"]:
158
162
  continue
159
163
 
160
164
  result = self._validate_deliverable(d)
161
165
 
162
- if result['updated']:
163
- stats['updated'] += 1
164
- stats[result['status']] += 1
166
+ if result["updated"]:
167
+ stats["updated"] += 1
168
+ stats[result["status"]] += 1
165
169
 
166
170
  return stats
167
171
 
@@ -177,54 +181,55 @@ class DeliverableManager:
177
181
  'status': 'in_progress'
178
182
  }
179
183
  """
180
- if not deliverable['validation_query']:
181
- return {'updated': False}
184
+ if not deliverable["validation_query"]:
185
+ return {"updated": False}
182
186
 
183
187
  try:
184
- result = self.db.execute_one(deliverable['validation_query'])
188
+ result = self.db.execute_one(deliverable["validation_query"])
185
189
 
186
190
  if not result:
187
- return {'updated': False}
191
+ return {"updated": False}
188
192
 
189
- current_value = result.get('count') or result.get('value') or 0
193
+ current_value = result.get("count") or result.get("value") or 0
190
194
 
191
- target_type = deliverable['target_type']
192
- target_value = deliverable['target_value']
195
+ target_type = deliverable["target_type"]
196
+ target_value = deliverable["target_value"]
193
197
 
194
- if target_type == 'count':
198
+ if target_type == "count":
195
199
  if current_value >= target_value:
196
- status = 'completed'
200
+ status = "completed"
197
201
  elif current_value > 0:
198
- status = 'in_progress'
202
+ status = "in_progress"
199
203
  else:
200
- status = 'pending'
201
- elif target_type == 'boolean':
202
- status = 'completed' if current_value > 0 else 'pending'
204
+ status = "pending"
205
+ elif target_type == "boolean":
206
+ status = "completed" if current_value > 0 else "pending"
203
207
  else:
204
- status = 'pending'
208
+ status = "pending"
205
209
 
206
210
  completed_at = None
207
- if status == 'completed' and deliverable['status'] != 'completed':
211
+ if status == "completed" and deliverable["status"] != "completed":
208
212
  from datetime import datetime
213
+
209
214
  completed_at = datetime.now().isoformat()
210
215
 
211
216
  self.update_deliverable(
212
- deliverable['id'],
217
+ deliverable["id"],
213
218
  current_value=current_value,
214
219
  status=status,
215
- completed_at=completed_at
220
+ completed_at=completed_at,
216
221
  )
217
222
 
218
223
  return {
219
- 'updated': True,
220
- 'current_value': current_value,
221
- 'target_value': target_value,
222
- 'status': status
224
+ "updated": True,
225
+ "current_value": current_value,
226
+ "target_value": target_value,
227
+ "status": status,
223
228
  }
224
229
 
225
230
  except Exception as e:
226
231
  print(f"Validation error for deliverable {deliverable['id']}: {e}")
227
- return {'updated': False}
232
+ return {"updated": False}
228
233
 
229
234
  def get_summary(self, engagement_id: int) -> Dict:
230
235
  """
@@ -244,34 +249,34 @@ class DeliverableManager:
244
249
  deliverables = self.list_deliverables(engagement_id)
245
250
 
246
251
  summary = {
247
- 'total': len(deliverables),
248
- 'completed': 0,
249
- 'in_progress': 0,
250
- 'pending': 0,
251
- 'failed': 0,
252
- 'by_category': {}
252
+ "total": len(deliverables),
253
+ "completed": 0,
254
+ "in_progress": 0,
255
+ "pending": 0,
256
+ "failed": 0,
257
+ "by_category": {},
253
258
  }
254
259
 
255
260
  for d in deliverables:
256
- status = d['status']
261
+ status = d["status"]
257
262
  summary[status] += 1
258
263
 
259
- category = d['category']
260
- if category not in summary['by_category']:
261
- summary['by_category'][category] = {
262
- 'total': 0,
263
- 'completed': 0,
264
- 'in_progress': 0,
265
- 'pending': 0
264
+ category = d["category"]
265
+ if category not in summary["by_category"]:
266
+ summary["by_category"][category] = {
267
+ "total": 0,
268
+ "completed": 0,
269
+ "in_progress": 0,
270
+ "pending": 0,
266
271
  }
267
272
 
268
- summary['by_category'][category]['total'] += 1
269
- summary['by_category'][category][status] += 1
273
+ summary["by_category"][category]["total"] += 1
274
+ summary["by_category"][category][status] += 1
270
275
 
271
- if summary['total'] > 0:
272
- summary['completion_rate'] = summary['completed'] / summary['total']
276
+ if summary["total"] > 0:
277
+ summary["completion_rate"] = summary["completed"] / summary["total"]
273
278
  else:
274
- summary['completion_rate'] = 0.0
279
+ summary["completion_rate"] = 0.0
275
280
 
276
281
  return summary
277
282
 
@@ -284,74 +289,74 @@ class DeliverableManager:
284
289
  """
285
290
  defaults = [
286
291
  {
287
- 'category': 'reconnaissance',
288
- 'title': 'Identify 5+ live hosts',
289
- 'target_type': 'count',
290
- 'target_value': 5,
291
- 'auto_validate': True,
292
- 'validation_query': f"SELECT COUNT(*) as count FROM hosts WHERE engagement_id = {engagement_id} AND status = 'up'",
293
- 'priority': 'high'
292
+ "category": "reconnaissance",
293
+ "title": "Identify 5+ live hosts",
294
+ "target_type": "count",
295
+ "target_value": 5,
296
+ "auto_validate": True,
297
+ "validation_query": f"SELECT COUNT(*) as count FROM hosts WHERE engagement_id = {engagement_id} AND status = 'up'",
298
+ "priority": "high",
294
299
  },
295
300
  {
296
- 'category': 'reconnaissance',
297
- 'title': 'Enumerate 10+ services',
298
- 'target_type': 'count',
299
- 'target_value': 10,
300
- 'auto_validate': True,
301
- 'validation_query': f"SELECT COUNT(*) as count FROM services s JOIN hosts h ON s.host_id = h.id WHERE h.engagement_id = {engagement_id}",
302
- 'priority': 'medium'
301
+ "category": "reconnaissance",
302
+ "title": "Enumerate 10+ services",
303
+ "target_type": "count",
304
+ "target_value": 10,
305
+ "auto_validate": True,
306
+ "validation_query": f"SELECT COUNT(*) as count FROM services s JOIN hosts h ON s.host_id = h.id WHERE h.engagement_id = {engagement_id}",
307
+ "priority": "medium",
303
308
  },
304
309
  {
305
- 'category': 'enumeration',
306
- 'title': 'Enumerate 5+ user accounts',
307
- 'target_type': 'count',
308
- 'target_value': 5,
309
- 'auto_validate': True,
310
- 'validation_query': f"SELECT COUNT(DISTINCT username) as count FROM credentials WHERE engagement_id = {engagement_id} AND username IS NOT NULL",
311
- 'priority': 'high'
310
+ "category": "enumeration",
311
+ "title": "Enumerate 5+ user accounts",
312
+ "target_type": "count",
313
+ "target_value": 5,
314
+ "auto_validate": True,
315
+ "validation_query": f"SELECT COUNT(DISTINCT username) as count FROM credentials WHERE engagement_id = {engagement_id} AND username IS NOT NULL",
316
+ "priority": "high",
312
317
  },
313
318
  {
314
- 'category': 'exploitation',
315
- 'title': 'Obtain 3+ valid credentials',
316
- 'target_type': 'count',
317
- 'target_value': 3,
318
- 'auto_validate': True,
319
- 'validation_query': f"SELECT COUNT(*) as count FROM credentials WHERE engagement_id = {engagement_id} AND status = 'valid'",
320
- 'priority': 'critical'
319
+ "category": "exploitation",
320
+ "title": "Obtain 3+ valid credentials",
321
+ "target_type": "count",
322
+ "target_value": 3,
323
+ "auto_validate": True,
324
+ "validation_query": f"SELECT COUNT(*) as count FROM credentials WHERE engagement_id = {engagement_id} AND status = 'valid'",
325
+ "priority": "critical",
321
326
  },
322
327
  {
323
- 'category': 'exploitation',
324
- 'title': 'Compromise 2+ hosts',
325
- 'target_type': 'count',
326
- 'target_value': 2,
327
- 'auto_validate': True,
328
- 'validation_query': f"SELECT COUNT(*) as count FROM hosts WHERE engagement_id = {engagement_id} AND access_level != 'none'",
329
- 'priority': 'critical'
328
+ "category": "exploitation",
329
+ "title": "Compromise 2+ hosts",
330
+ "target_type": "count",
331
+ "target_value": 2,
332
+ "auto_validate": True,
333
+ "validation_query": f"SELECT COUNT(*) as count FROM hosts WHERE engagement_id = {engagement_id} AND access_level != 'none'",
334
+ "priority": "critical",
330
335
  },
331
336
  {
332
- 'category': 'post_exploitation',
333
- 'title': 'Extract database contents',
334
- 'target_type': 'count',
335
- 'target_value': 1,
336
- 'auto_validate': True,
337
- 'validation_query': f"SELECT COUNT(*) as count FROM sqli_databases WHERE engagement_id = {engagement_id}",
338
- 'priority': 'high'
337
+ "category": "post_exploitation",
338
+ "title": "Extract database contents",
339
+ "target_type": "count",
340
+ "target_value": 1,
341
+ "auto_validate": True,
342
+ "validation_query": f"SELECT COUNT(*) as count FROM sqli_databases WHERE engagement_id = {engagement_id}",
343
+ "priority": "high",
339
344
  },
340
345
  {
341
- 'category': 'techniques',
342
- 'title': 'Demonstrate privilege escalation',
343
- 'target_type': 'manual',
344
- 'auto_validate': False,
345
- 'priority': 'high',
346
- 'description': 'Escalate from user to root/admin on at least one system'
346
+ "category": "techniques",
347
+ "title": "Demonstrate privilege escalation",
348
+ "target_type": "manual",
349
+ "auto_validate": False,
350
+ "priority": "high",
351
+ "description": "Escalate from user to root/admin on at least one system",
347
352
  },
348
353
  {
349
- 'category': 'techniques',
350
- 'title': 'Perform lateral movement',
351
- 'target_type': 'manual',
352
- 'auto_validate': False,
353
- 'priority': 'medium',
354
- 'description': 'Move from one compromised host to another'
354
+ "category": "techniques",
355
+ "title": "Perform lateral movement",
356
+ "target_type": "manual",
357
+ "auto_validate": False,
358
+ "priority": "medium",
359
+ "description": "Move from one compromised host to another",
355
360
  },
356
361
  ]
357
362