souleyez 2.43.3__py3-none-any.whl → 2.43.11__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.
- souleyez/__init__.py +1 -1
- souleyez/docs/README.md +2 -2
- souleyez/engine/result_handler.py +30 -1
- souleyez/main.py +1 -1
- souleyez/storage/engagements.py +6 -2
- souleyez/ui/dashboard.py +31 -15
- souleyez/ui/interactive.py +58 -13
- souleyez/ui/tutorial.py +7 -6
- souleyez/utils/tool_checker.py +2 -2
- {souleyez-2.43.3.dist-info → souleyez-2.43.11.dist-info}/METADATA +1 -1
- {souleyez-2.43.3.dist-info → souleyez-2.43.11.dist-info}/RECORD +15 -15
- {souleyez-2.43.3.dist-info → souleyez-2.43.11.dist-info}/WHEEL +0 -0
- {souleyez-2.43.3.dist-info → souleyez-2.43.11.dist-info}/entry_points.txt +0 -0
- {souleyez-2.43.3.dist-info → souleyez-2.43.11.dist-info}/licenses/LICENSE +0 -0
- {souleyez-2.43.3.dist-info → souleyez-2.43.11.dist-info}/top_level.txt +0 -0
souleyez/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = '2.43.
|
|
1
|
+
__version__ = '2.43.11'
|
|
2
2
|
|
souleyez/docs/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# SoulEyez Documentation
|
|
2
2
|
|
|
3
|
-
**Version:** 2.43.
|
|
4
|
-
**Last Updated:** January
|
|
3
|
+
**Version:** 2.43.11
|
|
4
|
+
**Last Updated:** January 12, 2026
|
|
5
5
|
**Organization:** CyberSoul Security
|
|
6
6
|
|
|
7
7
|
Welcome to the SoulEyez documentation! This documentation covers architecture, development, user guides, and operational information for the SoulEyez penetration testing platform.
|
|
@@ -2643,6 +2643,12 @@ def parse_nuclei_job(engagement_id: int, log_path: str, job: Dict[str, Any]) ->
|
|
|
2643
2643
|
'info': parsed.get('info', 0)
|
|
2644
2644
|
}
|
|
2645
2645
|
except Exception as e:
|
|
2646
|
+
logger.error("parse_nuclei_job exception", extra={
|
|
2647
|
+
"error": str(e),
|
|
2648
|
+
"error_type": type(e).__name__,
|
|
2649
|
+
"target": job.get('target', ''),
|
|
2650
|
+
"job_id": job.get('id')
|
|
2651
|
+
})
|
|
2646
2652
|
return {'error': str(e)}
|
|
2647
2653
|
|
|
2648
2654
|
|
|
@@ -3285,9 +3291,12 @@ def parse_http_fingerprint_job(engagement_id: int, log_path: str, job: Dict[str,
|
|
|
3285
3291
|
# Get tool recommendations
|
|
3286
3292
|
recommendations = get_tool_recommendations(parsed)
|
|
3287
3293
|
|
|
3288
|
-
# Determine status
|
|
3294
|
+
# Determine status and build summary
|
|
3295
|
+
summary_parts = []
|
|
3296
|
+
|
|
3289
3297
|
if parsed.get('error'):
|
|
3290
3298
|
status = STATUS_ERROR
|
|
3299
|
+
summary_parts.append(f"Error: {parsed.get('error')}")
|
|
3291
3300
|
elif parsed.get('managed_hosting') or parsed.get('waf') or parsed.get('cdn'):
|
|
3292
3301
|
status = STATUS_DONE # Found useful info
|
|
3293
3302
|
elif parsed.get('server'):
|
|
@@ -3295,11 +3304,31 @@ def parse_http_fingerprint_job(engagement_id: int, log_path: str, job: Dict[str,
|
|
|
3295
3304
|
else:
|
|
3296
3305
|
status = STATUS_NO_RESULTS
|
|
3297
3306
|
|
|
3307
|
+
# Build summary for successful scans
|
|
3308
|
+
if not parsed.get('error'):
|
|
3309
|
+
if parsed.get('server'):
|
|
3310
|
+
summary_parts.append(f"Server: {parsed.get('server')}")
|
|
3311
|
+
if parsed.get('managed_hosting'):
|
|
3312
|
+
summary_parts.append(f"Platform: {parsed.get('managed_hosting')}")
|
|
3313
|
+
if parsed.get('waf'):
|
|
3314
|
+
summary_parts.append(f"WAF: {', '.join(parsed.get('waf', []))}")
|
|
3315
|
+
if parsed.get('cdn'):
|
|
3316
|
+
summary_parts.append(f"CDN: {', '.join(parsed.get('cdn', []))}")
|
|
3317
|
+
if parsed.get('technologies'):
|
|
3318
|
+
techs = parsed.get('technologies', [])
|
|
3319
|
+
if len(techs) <= 3:
|
|
3320
|
+
summary_parts.append(f"Tech: {', '.join(techs)}")
|
|
3321
|
+
else:
|
|
3322
|
+
summary_parts.append(f"Tech: {', '.join(techs[:3])} +{len(techs)-3} more")
|
|
3323
|
+
|
|
3324
|
+
summary = ' | '.join(summary_parts) if summary_parts else 'No fingerprint data detected'
|
|
3325
|
+
|
|
3298
3326
|
return {
|
|
3299
3327
|
'tool': 'http_fingerprint',
|
|
3300
3328
|
'status': status,
|
|
3301
3329
|
'target': target,
|
|
3302
3330
|
'target_host': target_host,
|
|
3331
|
+
'summary': summary,
|
|
3303
3332
|
# Core fingerprint data
|
|
3304
3333
|
'server': parsed.get('server'),
|
|
3305
3334
|
'managed_hosting': parsed.get('managed_hosting'),
|
souleyez/main.py
CHANGED
|
@@ -173,7 +173,7 @@ def _check_privileged_tools():
|
|
|
173
173
|
|
|
174
174
|
|
|
175
175
|
@click.group()
|
|
176
|
-
@click.version_option(version='2.43.
|
|
176
|
+
@click.version_option(version='2.43.11')
|
|
177
177
|
def cli():
|
|
178
178
|
"""SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
|
|
179
179
|
from souleyez.log_config import init_logging
|
souleyez/storage/engagements.py
CHANGED
|
@@ -125,8 +125,12 @@ class EngagementManager:
|
|
|
125
125
|
# File contains invalid data, reset to default
|
|
126
126
|
pass
|
|
127
127
|
|
|
128
|
-
# Reset to default engagement
|
|
129
|
-
|
|
128
|
+
# Reset to default engagement - use existing or create new
|
|
129
|
+
default_eng = self.get("default")
|
|
130
|
+
if default_eng:
|
|
131
|
+
default_id = default_eng['id']
|
|
132
|
+
else:
|
|
133
|
+
default_id = self.create("default", "Default engagement")
|
|
130
134
|
self.set_current("default")
|
|
131
135
|
return self.get_by_id(default_id)
|
|
132
136
|
|
souleyez/ui/dashboard.py
CHANGED
|
@@ -1392,9 +1392,20 @@ def render_active_jobs(width: int, engagement_id: Optional[int] = None):
|
|
|
1392
1392
|
if engagement_id is not None and job_eng_id != engagement_id:
|
|
1393
1393
|
warning = click.style(" [!other]", fg='red')
|
|
1394
1394
|
|
|
1395
|
-
|
|
1395
|
+
# Check for scope warnings
|
|
1396
|
+
job_warnings = job.get('metadata', {}).get('warnings', [])
|
|
1397
|
+
scope_warning = any('SCOPE' in w for w in job_warnings)
|
|
1398
|
+
scope_indicator = click.style("⚠ ", fg='yellow') if scope_warning else ""
|
|
1399
|
+
|
|
1400
|
+
job_line = f" [{jid:>3}] {scope_indicator}{tool:<10} {target:<30} {status_str:<18} {elapsed}{warning}"
|
|
1396
1401
|
lines.append(job_line)
|
|
1397
1402
|
|
|
1403
|
+
# Show scope warning details on next line if present
|
|
1404
|
+
if scope_warning:
|
|
1405
|
+
for w in job_warnings:
|
|
1406
|
+
if 'SCOPE' in w:
|
|
1407
|
+
lines.append(click.style(f" └─ {w}", fg='yellow'))
|
|
1408
|
+
|
|
1398
1409
|
return lines
|
|
1399
1410
|
|
|
1400
1411
|
|
|
@@ -3333,14 +3344,14 @@ def _show_dashboard_menu(engagement_id: int) -> str:
|
|
|
3333
3344
|
click.echo(click.style(" 📋 DOCUMENTATION", bold=True, fg='yellow'))
|
|
3334
3345
|
click.echo(" " + "─" * 76)
|
|
3335
3346
|
click.echo(" " + click.style("[e]", fg='yellow', bold=True) + " or " +
|
|
3336
|
-
click.style("[
|
|
3347
|
+
click.style("[5]", fg='yellow') + " 📦 Evidence & Artifacts - Screenshots, files, exports")
|
|
3337
3348
|
click.echo(" " + click.style("[d]", fg='yellow', bold=True) + " or " +
|
|
3338
|
-
click.style("[
|
|
3349
|
+
click.style("[6]", fg='yellow') + " ✅ Deliverables - Progress tracking, checklists")
|
|
3339
3350
|
|
|
3340
3351
|
# Reports - Pro feature (show to all with appropriate badge)
|
|
3341
3352
|
pro_badge_yellow = click.style("💎", fg='yellow') if is_pro_user else click.style("🔒 PRO", fg='yellow')
|
|
3342
3353
|
click.echo(" " + click.style("[r]", fg='yellow', bold=True) + " or " +
|
|
3343
|
-
click.style("[
|
|
3354
|
+
click.style("[7]", fg='yellow') + " 📄 Reports " +
|
|
3344
3355
|
pro_badge_yellow + " - Generate & export reports")
|
|
3345
3356
|
click.echo()
|
|
3346
3357
|
|
|
@@ -3348,30 +3359,30 @@ def _show_dashboard_menu(engagement_id: int) -> str:
|
|
|
3348
3359
|
click.echo(click.style(" 📊 DATA MANAGEMENT (Deep Dive)", bold=True, fg='green'))
|
|
3349
3360
|
click.echo(" " + "─" * 76)
|
|
3350
3361
|
click.echo(" " + click.style("[h]", fg='cyan', bold=True) + " or " +
|
|
3351
|
-
click.style("[
|
|
3362
|
+
click.style("[8]", fg='cyan') + " 🎯 Hosts - Discovered hosts, tags, filtering")
|
|
3352
3363
|
click.echo(" " + click.style("[v]", fg='cyan', bold=True) + " or " +
|
|
3353
|
-
click.style("[
|
|
3364
|
+
click.style("[9]", fg='cyan') + " 🔌 Services - Open ports, service enumeration")
|
|
3354
3365
|
click.echo(" " + click.style("[f]", fg='cyan', bold=True) + " or " +
|
|
3355
|
-
click.style("[
|
|
3366
|
+
click.style("[10]", fg='cyan') + " 🔍 Findings - All vulnerabilities (detailed view)")
|
|
3356
3367
|
click.echo(" " + click.style("[c]", fg='cyan', bold=True) + " or " +
|
|
3357
|
-
click.style("[
|
|
3368
|
+
click.style("[11]", fg='cyan') + " 🔑 Credentials - Discovered users, passwords, hashes")
|
|
3358
3369
|
click.echo()
|
|
3359
3370
|
click.echo(" " + click.style("[b]", fg='cyan', bold=True) + " or " +
|
|
3360
|
-
click.style("[
|
|
3371
|
+
click.style("[12]", fg='cyan') + " 🌐 Web Paths - Directory enumeration results")
|
|
3361
3372
|
click.echo(" " + click.style("[n]", fg='cyan', bold=True) + " or " +
|
|
3362
|
-
click.style("[
|
|
3373
|
+
click.style("[13]", fg='cyan') + " 📁 SMB Shares - SMB enumeration, accessible shares")
|
|
3363
3374
|
click.echo(" " + click.style("[l]", fg='cyan', bold=True) + " or " +
|
|
3364
|
-
click.style("[
|
|
3375
|
+
click.style("[14]", fg='cyan') + " 💉 SQLMap Intelligence - Deduplicated injections, high-value tables")
|
|
3365
3376
|
click.echo(" " + click.style("[p]", fg='cyan', bold=True) + " or " +
|
|
3366
|
-
click.style("[
|
|
3377
|
+
click.style("[15]", fg='cyan') + " 🔌 WordPress Data - WPScan vulnerabilities")
|
|
3367
3378
|
click.echo(" " + click.style("[o]", fg='cyan', bold=True) + " or " +
|
|
3368
|
-
click.style("[
|
|
3379
|
+
click.style("[16]", fg='cyan') + " 💣 Exploits - SearchSploit exploit database")
|
|
3369
3380
|
click.echo(" " + click.style("[t]", fg='cyan', bold=True) + " or " +
|
|
3370
|
-
click.style("[
|
|
3381
|
+
click.style("[17]", fg='cyan') + " 🔍 OSINT/Discovery - DNS, WHOIS, emails, infrastructure")
|
|
3371
3382
|
click.echo()
|
|
3372
3383
|
|
|
3373
3384
|
click.echo(" " + click.style("[q]", fg='red', bold=True) + " or " +
|
|
3374
|
-
click.style("[
|
|
3385
|
+
click.style("[18]", fg='red') + " ← Return to Command Center")
|
|
3375
3386
|
click.echo()
|
|
3376
3387
|
|
|
3377
3388
|
# Footer instructions
|
|
@@ -3414,6 +3425,11 @@ def _show_dashboard_menu(engagement_id: int) -> str:
|
|
|
3414
3425
|
|
|
3415
3426
|
# Intelligence Section (Consolidated - 3 items)
|
|
3416
3427
|
elif action == 'intelligence_hub':
|
|
3428
|
+
# Pro feature - check tier
|
|
3429
|
+
if not is_pro_user:
|
|
3430
|
+
from souleyez.ui.interactive import _show_upgrade_prompt
|
|
3431
|
+
_show_upgrade_prompt("Intelligence Hub")
|
|
3432
|
+
continue
|
|
3417
3433
|
# Unified Intelligence Hub (was Attack Correlation)
|
|
3418
3434
|
from souleyez.ui.attack_surface import view_attack_surface
|
|
3419
3435
|
view_attack_surface(engagement_id)
|
souleyez/ui/interactive.py
CHANGED
|
@@ -17,6 +17,7 @@ from rich.table import Table
|
|
|
17
17
|
from souleyez.ui.design_system import DesignSystem
|
|
18
18
|
from souleyez.engine.loader import discover_plugins
|
|
19
19
|
from souleyez.engine.background import enqueue_job, list_jobs, get_job
|
|
20
|
+
from souleyez.security.scope_validator import ScopeViolationError
|
|
20
21
|
from souleyez.storage.engagements import EngagementManager
|
|
21
22
|
from souleyez.storage.hosts import HostManager
|
|
22
23
|
from souleyez.storage.findings import FindingsManager
|
|
@@ -199,10 +200,11 @@ def _show_upgrade_prompt(feature_name: str):
|
|
|
199
200
|
f"Unlock all Pro features:\n"
|
|
200
201
|
f" • Intelligence Hub - Exploit suggestions & attack surface\n"
|
|
201
202
|
f" • Auto-Chaining - Automatic follow-up scans\n"
|
|
202
|
-
f" • AI
|
|
203
|
+
f" • AI Settings - Configure Ollama, Claude API providers\n"
|
|
204
|
+
f" • SIEM Integration - Wazuh, Splunk, Elastic, Sentinel\n"
|
|
203
205
|
f" • MSF Integration - Metasploit attack chains\n"
|
|
204
206
|
f" • Reports & Export - Professional deliverables\n"
|
|
205
|
-
f" • Team Dashboard - Collaboration &
|
|
207
|
+
f" • Team Dashboard - Collaboration & task assignment\n\n"
|
|
206
208
|
f"[cyan]Visit: https://www.cybersoulsecurity.com/souleyez[/cyan]",
|
|
207
209
|
title="🔒 Upgrade Required",
|
|
208
210
|
border_style="yellow"
|
|
@@ -3955,19 +3957,29 @@ def launch_job(job_params: Dict[str, Any]) -> Optional[int]:
|
|
|
3955
3957
|
click.echo()
|
|
3956
3958
|
|
|
3957
3959
|
job_ids = []
|
|
3960
|
+
blocked_targets = []
|
|
3958
3961
|
for t in targets:
|
|
3959
|
-
|
|
3960
|
-
|
|
3961
|
-
|
|
3962
|
-
|
|
3963
|
-
|
|
3964
|
-
|
|
3965
|
-
|
|
3966
|
-
|
|
3967
|
-
|
|
3962
|
+
try:
|
|
3963
|
+
job_id = enqueue_job(
|
|
3964
|
+
tool=tool_name,
|
|
3965
|
+
target=t,
|
|
3966
|
+
args=args,
|
|
3967
|
+
label=label,
|
|
3968
|
+
metadata=metadata if metadata else None
|
|
3969
|
+
)
|
|
3970
|
+
job_ids.append(job_id)
|
|
3971
|
+
click.echo(click.style(f"✓ Job #{job_id} enqueued for {t}", fg='green'))
|
|
3972
|
+
except ScopeViolationError:
|
|
3973
|
+
blocked_targets.append(t)
|
|
3974
|
+
click.echo(click.style(f"✗ BLOCKED (out of scope): {t}", fg='red', bold=True))
|
|
3968
3975
|
|
|
3969
3976
|
click.echo()
|
|
3970
|
-
|
|
3977
|
+
if blocked_targets:
|
|
3978
|
+
click.echo(click.style(f"⚠ {len(blocked_targets)} targets blocked (out of scope)", fg='yellow', bold=True))
|
|
3979
|
+
if job_ids:
|
|
3980
|
+
click.echo(click.style(f"✓ {len(job_ids)} jobs enqueued successfully!", fg='green', bold=True))
|
|
3981
|
+
else:
|
|
3982
|
+
click.echo(click.style("✗ No jobs created - all targets blocked", fg='red', bold=True))
|
|
3971
3983
|
click.echo(f"Tool: {tool_name}")
|
|
3972
3984
|
if label:
|
|
3973
3985
|
click.echo(f"Label: {label}")
|
|
@@ -3998,6 +4010,15 @@ def launch_job(job_params: Dict[str, Any]) -> Optional[int]:
|
|
|
3998
4010
|
|
|
3999
4011
|
return job_id # Return the job_id
|
|
4000
4012
|
|
|
4013
|
+
except ScopeViolationError as e:
|
|
4014
|
+
click.echo()
|
|
4015
|
+
click.echo(click.style("✗ JOB BLOCKED - OUT OF SCOPE", fg='red', bold=True))
|
|
4016
|
+
click.echo(click.style(f" Target: {job_params.get('target', 'unknown')}", fg='red'))
|
|
4017
|
+
click.echo(click.style(f" Reason: {e}", fg='yellow'))
|
|
4018
|
+
click.echo()
|
|
4019
|
+
click.echo(click.style(" Scope enforcement is set to 'block' for this engagement.", fg='cyan'))
|
|
4020
|
+
click.echo(click.style(" Use 'souleyez scope' to view or modify scope settings.", fg='cyan'))
|
|
4021
|
+
return None
|
|
4001
4022
|
except Exception as e:
|
|
4002
4023
|
click.echo(click.style(f"✗ Error enqueueing job: {e}", fg='red'))
|
|
4003
4024
|
return None
|
|
@@ -4599,6 +4620,12 @@ def view_jobs_menu():
|
|
|
4599
4620
|
rule_id = job.get('rule_id') or job.get('metadata', {}).get('rule_id')
|
|
4600
4621
|
rule_display = f"#{rule_id}" if rule_id else '-'
|
|
4601
4622
|
|
|
4623
|
+
# Check for scope warnings
|
|
4624
|
+
job_warnings = job.get('metadata', {}).get('warnings', [])
|
|
4625
|
+
scope_warning = any('SCOPE' in w for w in job_warnings)
|
|
4626
|
+
if scope_warning:
|
|
4627
|
+
target = f"[yellow]⚠[/yellow] {target}"
|
|
4628
|
+
|
|
4602
4629
|
# Checkbox based on selection
|
|
4603
4630
|
checkbox = '●' if job_id_int in selected_jobs else '○'
|
|
4604
4631
|
table.add_row(checkbox, jid, status_display, tool, target, label, parent_display, rule_display)
|
|
@@ -5048,6 +5075,7 @@ def _view_ai_suggestions(engagement_id: int):
|
|
|
5048
5075
|
# Accept all suggestions
|
|
5049
5076
|
if click.confirm(f" Queue all {len(suggestions)} AI suggestions?", default=True):
|
|
5050
5077
|
queued = 0
|
|
5078
|
+
blocked = 0
|
|
5051
5079
|
for sug in suggestions:
|
|
5052
5080
|
try:
|
|
5053
5081
|
job_id = enqueue_job(
|
|
@@ -5059,12 +5087,17 @@ def _view_ai_suggestions(engagement_id: int):
|
|
|
5059
5087
|
)
|
|
5060
5088
|
if job_id:
|
|
5061
5089
|
queued += 1
|
|
5090
|
+
except ScopeViolationError:
|
|
5091
|
+
blocked += 1
|
|
5092
|
+
click.echo(click.style(f" ✗ BLOCKED: {sug['target']} (out of scope)", fg='red'))
|
|
5062
5093
|
except Exception as e:
|
|
5063
5094
|
pass
|
|
5064
5095
|
|
|
5065
5096
|
# Mark all as approved
|
|
5066
5097
|
_mark_suggestions_approved(engagement_id, [s for s in suggestions])
|
|
5067
|
-
|
|
5098
|
+
if blocked:
|
|
5099
|
+
click.echo(click.style(f"\n ⚠ {blocked} job(s) blocked (out of scope)", fg='yellow'))
|
|
5100
|
+
click.echo(click.style(f" ✓ Queued {queued} job(s)", fg='green'))
|
|
5068
5101
|
click.pause()
|
|
5069
5102
|
return
|
|
5070
5103
|
continue
|
|
@@ -5147,6 +5180,11 @@ def _view_suggestion_detail(engagement_id: int, suggestion: dict, all_suggestion
|
|
|
5147
5180
|
)
|
|
5148
5181
|
_mark_suggestions_approved(engagement_id, [suggestion])
|
|
5149
5182
|
click.echo(click.style(f"\n ✓ Queued job #{job_id}", fg='green'))
|
|
5183
|
+
except ScopeViolationError as e:
|
|
5184
|
+
click.echo()
|
|
5185
|
+
click.echo(click.style(" ✗ JOB BLOCKED - OUT OF SCOPE", fg='red', bold=True))
|
|
5186
|
+
click.echo(click.style(f" Target: {suggestion['target']}", fg='red'))
|
|
5187
|
+
click.echo(click.style(f" Reason: {e}", fg='yellow'))
|
|
5150
5188
|
except Exception as e:
|
|
5151
5189
|
click.echo(click.style(f"\n ✗ Failed to queue: {e}", fg='red'))
|
|
5152
5190
|
click.pause()
|
|
@@ -5435,6 +5473,13 @@ def view_job_detail(job_id: int):
|
|
|
5435
5473
|
else:
|
|
5436
5474
|
click.echo(f"Reason: Manual (created by user)")
|
|
5437
5475
|
|
|
5476
|
+
# Show scope warnings if any
|
|
5477
|
+
warnings = metadata.get('warnings', [])
|
|
5478
|
+
if warnings:
|
|
5479
|
+
click.echo()
|
|
5480
|
+
for warning in warnings:
|
|
5481
|
+
click.echo(click.style(f" ⚠ {warning}", fg='yellow', bold=True))
|
|
5482
|
+
|
|
5438
5483
|
if job.get('pid'):
|
|
5439
5484
|
click.echo(f"PID: {click.style(str(job['pid']), fg='cyan')}")
|
|
5440
5485
|
|
souleyez/ui/tutorial.py
CHANGED
|
@@ -355,14 +355,15 @@ def _cleanup_tutorial_data():
|
|
|
355
355
|
except Exception:
|
|
356
356
|
pass
|
|
357
357
|
|
|
358
|
-
#
|
|
358
|
+
# Reset current engagement BEFORE deleting tutorial engagement
|
|
359
|
+
# (otherwise get_current() will fail trying to load deleted engagement)
|
|
359
360
|
if tutorial_eng:
|
|
360
|
-
em.
|
|
361
|
+
current = em.get_current()
|
|
362
|
+
if current and current.get('id') == tutorial_eng['id']:
|
|
363
|
+
em.set_current("default")
|
|
361
364
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
if current and current.get('name') == 'Tutorial Engagement':
|
|
365
|
-
em.set_current(None)
|
|
365
|
+
# Now safe to delete the tutorial engagement
|
|
366
|
+
em.delete("Tutorial Engagement")
|
|
366
367
|
|
|
367
368
|
except Exception as e:
|
|
368
369
|
click.echo(click.style(f" Note: Could not fully clean up: {e}", fg='yellow'))
|
souleyez/utils/tool_checker.py
CHANGED
|
@@ -320,8 +320,8 @@ EXTERNAL_TOOLS = {
|
|
|
320
320
|
},
|
|
321
321
|
'responder': {
|
|
322
322
|
'command': 'responder',
|
|
323
|
-
'install_kali': 'sudo apt install responder && sudo pip install --break-system-packages aioquic',
|
|
324
|
-
'install_ubuntu': 'sudo git clone https://github.com/lgandx/Responder.git /opt/Responder && sudo pip install --break-system-packages -r /opt/Responder/requirements.txt aioquic && sudo ln -sf /opt/Responder/Responder.py /usr/local/bin/responder',
|
|
323
|
+
'install_kali': 'sudo apt install responder && sudo pip install --break-system-packages --ignore-installed aioquic',
|
|
324
|
+
'install_ubuntu': 'sudo git clone https://github.com/lgandx/Responder.git /opt/Responder && sudo pip install --break-system-packages --ignore-installed -r /opt/Responder/requirements.txt aioquic && sudo ln -sf /opt/Responder/Responder.py /usr/local/bin/responder',
|
|
325
325
|
'install_method': 'kali_only',
|
|
326
326
|
'description': 'LLMNR, NBT-NS and MDNS poisoner',
|
|
327
327
|
'needs_sudo': True # Required for network poisoning
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: souleyez
|
|
3
|
-
Version: 2.43.
|
|
3
|
+
Version: 2.43.11
|
|
4
4
|
Summary: AI-Powered Penetration Testing Platform with 40+ integrated tools
|
|
5
5
|
Author-email: CyberSoul Security <contact@cybersoulsecurity.com>
|
|
6
6
|
Maintainer-email: CyberSoul Security <contact@cybersoulsecurity.com>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
souleyez/__init__.py,sha256=
|
|
1
|
+
souleyez/__init__.py,sha256=I4B_wvr7ZkBdzHTJ1C1cbfONbQvc9vr87_vW5Waa8eE,25
|
|
2
2
|
souleyez/config.py,sha256=av357I3GYRWAklv8Dto-9-5Db699Wq5znez7zo7241Q,11595
|
|
3
3
|
souleyez/devtools.py,sha256=rptmUY4a5eVvYjdEc6273MSagL-D9xibPOFgohVqUno,3508
|
|
4
4
|
souleyez/feature_flags.py,sha256=mo6YAq07lc6sR3lEFKmIwTKxXZ2JPxwa5X97uR_mu50,4642
|
|
5
5
|
souleyez/history.py,sha256=gzs5I_j-3OigIP6yfmBChdqxaFmyUIxvTpzWUPe_Q6c,2853
|
|
6
6
|
souleyez/log_config.py,sha256=MMhPAJOqgXDfuE-xm5g0RxAfWndcmbhFHvIEMm1a_Wo,5830
|
|
7
|
-
souleyez/main.py,sha256=
|
|
7
|
+
souleyez/main.py,sha256=9oF2-NPp-jve01_HqbuObmGUli4irgJbESdJBkf6yWk,129101
|
|
8
8
|
souleyez/scanner.py,sha256=U3IWHRrJ5aQ32dSHiVAHB60w1R_z0E0QxfM99msYNlw,3124
|
|
9
9
|
souleyez/security.py,sha256=S84m1QmnKz_6NgH2I6IBIAorMHxRPNYVFSnks5xjihQ,2479
|
|
10
10
|
souleyez/ui.py,sha256=15pfsqoDPnojAqr5S0TZHJE2ZkSHzkHpNVfVvsRj66A,34301
|
|
@@ -104,7 +104,7 @@ souleyez/detection/__init__.py,sha256=QIhvXjFdjrquQ6A0VQ7GZQkK_EXB59t8Dv9PKXhEUe
|
|
|
104
104
|
souleyez/detection/attack_signatures.py,sha256=akgWwiIkh6WYnghCuLhRV0y6FS0SQ0caGF8tZUc49oA,6965
|
|
105
105
|
souleyez/detection/mitre_mappings.py,sha256=xejE80YK-g8kKaeQoo-vBl8P3t8RTTItbfN0NaVZw6s,20558
|
|
106
106
|
souleyez/detection/validator.py,sha256=-AJ7QSJ3-6jFKLnPG_Rc34IXyF4JPyI82BFUgTA9zw0,15641
|
|
107
|
-
souleyez/docs/README.md,sha256=
|
|
107
|
+
souleyez/docs/README.md,sha256=SmQbiTNYTKW03oV1aXcdCFlWK9e3_Enpp6viJtqPGb4,7188
|
|
108
108
|
souleyez/docs/api-reference/cli-commands.md,sha256=lTLFnILN3YRVdqCaag7WgsYXfDGglb1TuPexkxDsVdE,12917
|
|
109
109
|
souleyez/docs/api-reference/engagement-api.md,sha256=nd-EvQMtiJrobg2bzFEADp853HP1Uhb9dmgok0_-neE,11672
|
|
110
110
|
souleyez/docs/api-reference/integration-guide.md,sha256=c96uX79ukHyYotLa54wZ20Kx-EUZnrKegTeGkfLD-pw,16285
|
|
@@ -152,7 +152,7 @@ souleyez/engine/job_status.py,sha256=OAEf2rAzapm55m4tc3PSilotdA5ONX15JavUMLre0is
|
|
|
152
152
|
souleyez/engine/loader.py,sha256=ke6QQVVWozDnqGNBotajC3RBYOa2_DZmv5DAnDZVgIc,2769
|
|
153
153
|
souleyez/engine/log_sanitizer.py,sha256=QHF6zSms-wHo6SbL6fHXIh1GG-8G34lE7kl45nbPn70,7130
|
|
154
154
|
souleyez/engine/manager.py,sha256=aBQMoib-VWNXtIp5Qn34tRj1P1jiLpwAIoo1fexAaLU,3629
|
|
155
|
-
souleyez/engine/result_handler.py,sha256=
|
|
155
|
+
souleyez/engine/result_handler.py,sha256=eD5fqGAlnG0pr1gxhKB40HBw_uyzsFJZpFaTDeMXc1g,142535
|
|
156
156
|
souleyez/engine/worker_manager.py,sha256=B7b8RbkKTNofmiIyHTNgdikoZCLXpB-iIl1S4-U3q9o,6127
|
|
157
157
|
souleyez/export/__init__.py,sha256=2kFHftSqqrRUG6PhtfhCyhnkpkjc-8Zb4utGo-Nb6B4,61
|
|
158
158
|
souleyez/export/evidence_bundle.py,sha256=hqPn_h2CidhL-1VAT0qraZ8r1yfnUTnLZ3RfPPCK5Ds,9966
|
|
@@ -282,7 +282,7 @@ souleyez/storage/deliverable_evidence.py,sha256=XRagZV6Ol3SySZjk9joc8elvaqBwvi1s
|
|
|
282
282
|
souleyez/storage/deliverable_exporter.py,sha256=2c7CHiuCo40Z9WRfzjujSkdZCjKSJmk_BzxsJPswELM,16320
|
|
283
283
|
souleyez/storage/deliverable_templates.py,sha256=DxsIqkUd54qr7nFByFmF9st6btteKV9bLM2RbgL7MHk,10875
|
|
284
284
|
souleyez/storage/deliverables.py,sha256=AR2hIRjXIhf3NxzQouh38zZrH5-RIx6Yo0d8i16oHxo,11976
|
|
285
|
-
souleyez/storage/engagements.py,sha256=
|
|
285
|
+
souleyez/storage/engagements.py,sha256=0w6P2AVDoXPkakIZ3sgN2tWW-OiIiqOe6E_R_WSxAJ0,10419
|
|
286
286
|
souleyez/storage/evidence.py,sha256=mG4stROZL3hjA1EJNpGpW_ytbMbyOpLfPT3WgSAPvR4,11643
|
|
287
287
|
souleyez/storage/execution_log.py,sha256=HiU44zk5txbwJvGVuGFrzrEHjTOfEvKUuaSyOvnsS1M,4049
|
|
288
288
|
souleyez/storage/exploit_attempts.py,sha256=1ygYOuvmmRq2FASUinEZh_JYgdItu06Kf-GM1HbJgkc,10188
|
|
@@ -336,7 +336,7 @@ souleyez/ui/ai_quotes.py,sha256=Ho2QCYIFfks6tPIRFwVUKpvfGChUduWLMpmIDJV4xh0,5489
|
|
|
336
336
|
souleyez/ui/attack_surface.py,sha256=PMClCqiw1fIFFpYTghGKnXykamWFWgvraEBQzkiyuF8,196226
|
|
337
337
|
souleyez/ui/chain_rules_view.py,sha256=BZ7I3UnQEDtt9AWVqufdu1soZLkBn3cMu5lfArnx9aI,63228
|
|
338
338
|
souleyez/ui/correlation_view.py,sha256=BxJytk8Zq2-MhrMFgf4ZgN5G0-xU3ZdxqNWdRqMghxU,24674
|
|
339
|
-
souleyez/ui/dashboard.py,sha256=
|
|
339
|
+
souleyez/ui/dashboard.py,sha256=xjyhC35CdK9QHSR2ZvJd3HiiBbrIEdH7EP2rsNcfJnA,179250
|
|
340
340
|
souleyez/ui/deliverables_view.py,sha256=hxYCwcZNzT0loZMSQXODRuZXDNZFrHZ8FTKwcwuZdoI,9604
|
|
341
341
|
souleyez/ui/design_system.py,sha256=wyI73gwBGQDzo3L_JYn7DiEGXWByFkRjlDkp5MEpZ3s,3415
|
|
342
342
|
souleyez/ui/errors.py,sha256=vk4gMP5UyLd3W-Gfz06C2B_v4ra8qcie6NFmz1VjY8o,10645
|
|
@@ -347,7 +347,7 @@ souleyez/ui/export_view.py,sha256=0nQvVsKk7FU4uRzSfJ_qBZh_Lfn8hgGA2rbJ5bNg5-Y,65
|
|
|
347
347
|
souleyez/ui/gap_analysis_view.py,sha256=AytAOEBq010wwo9hne1TE-uJpY_xicjLrFANbvN3r3w,30727
|
|
348
348
|
souleyez/ui/help_system.py,sha256=nKGxLaMi-TKYs6xudTyw_tZqBb1cGFEuYYh6N-MAsJE,16648
|
|
349
349
|
souleyez/ui/intelligence_view.py,sha256=VeAQ-3mANRnLIVpRqocL3JV0HUmJtADdxDeC5lzQhE0,32168
|
|
350
|
-
souleyez/ui/interactive.py,sha256=
|
|
350
|
+
souleyez/ui/interactive.py,sha256=XqaN0Jnh-qRud24yAP5U-NViLM2G70sfCaAbcGC65i4,1409179
|
|
351
351
|
souleyez/ui/interactive_selector.py,sha256=6A51fgmFRnemBY0aCPHIhK2Rpba16NjSGKLzC0Q5vI8,16407
|
|
352
352
|
souleyez/ui/log_formatter.py,sha256=akhIkYoO_cCaKxS1V5N3iPmIrHzgsU7pmsedx70s9TI,3845
|
|
353
353
|
souleyez/ui/menu_components.py,sha256=N8zq2QXGmfaLJ08l53MMYt1y-5LRWgpZH6r8nXHonj8,3519
|
|
@@ -365,14 +365,14 @@ souleyez/ui/template_selector.py,sha256=qQJkFNnVjYctb-toeYlupP_U1asGrJWYi5-HR89A
|
|
|
365
365
|
souleyez/ui/terminal.py,sha256=Sw9ma1-DZclJE1sENjTZ3Q7r-Ct1NiB3Lpmv-RZW5tE,2372
|
|
366
366
|
souleyez/ui/timeline_view.py,sha256=Ze8Mev9VE4_ECdNFEJwZK2V42EBguR83uCCdwAbJqmc,11111
|
|
367
367
|
souleyez/ui/tool_setup.py,sha256=HkRTjzN7FHUs_XKtNYnphkdXb5kC4P6ghpI8TeCuEjU,36375
|
|
368
|
-
souleyez/ui/tutorial.py,sha256=
|
|
368
|
+
souleyez/ui/tutorial.py,sha256=efDF6nWRek6fySppjmq3qMQ3J2WfW89LOcaeltqnWH4,14917
|
|
369
369
|
souleyez/ui/tutorial_state.py,sha256=Thf7_qCj4VKjG7UqgJqa9kjIqiFUU-7Q7kG4v-u2B4A,8123
|
|
370
370
|
souleyez/ui/wazuh_vulns_view.py,sha256=3vJJEmrjgS2wD6EDB7ZV7WxgytBHTm-1WqNDjp7lVEI,21830
|
|
371
371
|
souleyez/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
372
|
-
souleyez/utils/tool_checker.py,sha256=
|
|
373
|
-
souleyez-2.43.
|
|
374
|
-
souleyez-2.43.
|
|
375
|
-
souleyez-2.43.
|
|
376
|
-
souleyez-2.43.
|
|
377
|
-
souleyez-2.43.
|
|
378
|
-
souleyez-2.43.
|
|
372
|
+
souleyez/utils/tool_checker.py,sha256=YzNajZpFyKJA5fp0Kq_gQ0YnKb7J1BaKJSZ8vP-IWj8,30868
|
|
373
|
+
souleyez-2.43.11.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
|
|
374
|
+
souleyez-2.43.11.dist-info/METADATA,sha256=zebGSczpR2dVjmQwhwV9MBb0XcSFgF4iVSIZ0sziUrs,10426
|
|
375
|
+
souleyez-2.43.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
376
|
+
souleyez-2.43.11.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
|
|
377
|
+
souleyez-2.43.11.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
|
|
378
|
+
souleyez-2.43.11.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|