souleyez 2.43.22__py3-none-any.whl → 2.43.24__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 +1 -1
- souleyez/main.py +1 -1
- souleyez/ui/interactive.py +189 -3
- {souleyez-2.43.22.dist-info → souleyez-2.43.24.dist-info}/METADATA +1 -1
- {souleyez-2.43.22.dist-info → souleyez-2.43.24.dist-info}/RECORD +10 -10
- {souleyez-2.43.22.dist-info → souleyez-2.43.24.dist-info}/WHEEL +0 -0
- {souleyez-2.43.22.dist-info → souleyez-2.43.24.dist-info}/entry_points.txt +0 -0
- {souleyez-2.43.22.dist-info → souleyez-2.43.24.dist-info}/licenses/LICENSE +0 -0
- {souleyez-2.43.22.dist-info → souleyez-2.43.24.dist-info}/top_level.txt +0 -0
souleyez/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = '2.43.
|
|
1
|
+
__version__ = '2.43.24'
|
|
2
2
|
|
souleyez/docs/README.md
CHANGED
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.24')
|
|
177
177
|
def cli():
|
|
178
178
|
"""SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
|
|
179
179
|
from souleyez.log_config import init_logging
|
souleyez/ui/interactive.py
CHANGED
|
@@ -5607,7 +5607,8 @@ def view_job_detail(job_id: int):
|
|
|
5607
5607
|
|
|
5608
5608
|
# Parse and display ffuf/gobuster results if available (only when not showing raw logs)
|
|
5609
5609
|
# Also check 'no_results' status - background parser may have missed results due to timing
|
|
5610
|
-
|
|
5610
|
+
# Also handle 'error' status to show helpful error messages
|
|
5611
|
+
if not show_raw_logs and job.get('tool') in ['ffuf', 'gobuster'] and job.get('status') in ['done', 'completed', 'no_results', 'warning', 'error'] and log_path and os.path.exists(log_path):
|
|
5611
5612
|
try:
|
|
5612
5613
|
if job.get('tool') == 'ffuf':
|
|
5613
5614
|
from souleyez.parsers.ffuf_parser import parse_ffuf
|
|
@@ -5618,8 +5619,50 @@ def view_job_detail(job_id: int):
|
|
|
5618
5619
|
log_content = f.read()
|
|
5619
5620
|
parsed = parse_gobuster_output(log_content, job.get('target', ''))
|
|
5620
5621
|
|
|
5622
|
+
# Check for timeout in log
|
|
5623
|
+
timed_out = 'timed out' in log_content.lower() or 'Command timed out' in log_content
|
|
5624
|
+
|
|
5625
|
+
# Show error summary for jobs with error status
|
|
5626
|
+
if job.get('status') == 'error':
|
|
5627
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
5628
|
+
click.echo(click.style("❌ SCAN FAILED", bold=True, fg='red'))
|
|
5629
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
5630
|
+
click.echo()
|
|
5631
|
+
|
|
5632
|
+
# Check if it was a timeout
|
|
5633
|
+
if timed_out:
|
|
5634
|
+
click.echo(" Scan reached timeout before completing.")
|
|
5635
|
+
click.echo()
|
|
5636
|
+
click.echo(click.style(" Possible causes:", fg='bright_black'))
|
|
5637
|
+
click.echo(click.style(" • Target is rate limiting requests", fg='bright_black'))
|
|
5638
|
+
click.echo(click.style(" • Wordlist too large for timeout window", fg='bright_black'))
|
|
5639
|
+
click.echo(click.style(" • Network latency issues", fg='bright_black'))
|
|
5640
|
+
click.echo()
|
|
5641
|
+
click.echo(click.style(" Suggestions:", fg='bright_black'))
|
|
5642
|
+
click.echo(click.style(" • Try smaller wordlist", fg='bright_black'))
|
|
5643
|
+
click.echo(click.style(" • Increase --delay between requests", fg='bright_black'))
|
|
5644
|
+
click.echo(click.style(" • Reduce threads with -t", fg='bright_black'))
|
|
5645
|
+
else:
|
|
5646
|
+
# Try to extract error message from log
|
|
5647
|
+
import re
|
|
5648
|
+
error_msg = None
|
|
5649
|
+
if 'ERROR:' in log_content:
|
|
5650
|
+
match = re.search(r'ERROR:\s*(.+?)(?:\n|$)', log_content)
|
|
5651
|
+
if match:
|
|
5652
|
+
error_msg = match.group(1).strip()
|
|
5653
|
+
|
|
5654
|
+
if error_msg:
|
|
5655
|
+
click.echo(f" Error: {error_msg}")
|
|
5656
|
+
else:
|
|
5657
|
+
click.echo(" Scan failed - see raw logs for details.")
|
|
5658
|
+
click.echo(" Press [r] to view raw logs.")
|
|
5659
|
+
|
|
5660
|
+
click.echo()
|
|
5661
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
5662
|
+
click.echo()
|
|
5663
|
+
|
|
5621
5664
|
# Show warning summary for jobs with warning status
|
|
5622
|
-
|
|
5665
|
+
elif job.get('status') == 'warning':
|
|
5623
5666
|
click.echo(click.style("=" * 70, fg='yellow'))
|
|
5624
5667
|
click.echo(click.style("⚠️ SCAN WARNING", bold=True, fg='yellow'))
|
|
5625
5668
|
click.echo(click.style("=" * 70, fg='yellow'))
|
|
@@ -5677,6 +5720,116 @@ def view_job_detail(job_id: int):
|
|
|
5677
5720
|
except Exception:
|
|
5678
5721
|
pass # Non-critical, just display the paths
|
|
5679
5722
|
|
|
5723
|
+
# Security concern patterns - check for interesting/dangerous paths
|
|
5724
|
+
security_concerns = []
|
|
5725
|
+
concern_patterns = {
|
|
5726
|
+
# Database files
|
|
5727
|
+
'database_files': {
|
|
5728
|
+
'patterns': [r'\.sql$', r'\.db$', r'\.mdb$', r'\.sqlite', r'/db\.', r'/database\.', r'\.bak\.sql'],
|
|
5729
|
+
'label': 'Database file exposed',
|
|
5730
|
+
'severity': 'high',
|
|
5731
|
+
},
|
|
5732
|
+
# Backup files
|
|
5733
|
+
'backup_files': {
|
|
5734
|
+
'patterns': [r'\.bak$', r'\.old$', r'\.backup$', r'\.orig$', r'\.save$', r'\.swp$', r'~$', r'\.zip$', r'\.tar', r'\.gz$', r'\.rar$'],
|
|
5735
|
+
'label': 'Backup/archive file',
|
|
5736
|
+
'severity': 'high',
|
|
5737
|
+
},
|
|
5738
|
+
# Config files
|
|
5739
|
+
'config_files': {
|
|
5740
|
+
'patterns': [r'web\.config', r'\.htaccess', r'\.htpasswd', r'\.env$', r'config\.php', r'config\.inc', r'settings\.py', r'\.ini$', r'\.conf$', r'\.cfg$'],
|
|
5741
|
+
'label': 'Configuration file exposed',
|
|
5742
|
+
'severity': 'high',
|
|
5743
|
+
},
|
|
5744
|
+
# Source code / dev files
|
|
5745
|
+
'source_files': {
|
|
5746
|
+
'patterns': [r'\.git/', r'\.svn/', r'\.DS_Store', r'\.vscode/', r'\.idea/', r'Thumbs\.db', r'\.log$', r'debug\.', r'test\.php', r'phpinfo'],
|
|
5747
|
+
'label': 'Development/debug file',
|
|
5748
|
+
'severity': 'medium',
|
|
5749
|
+
},
|
|
5750
|
+
# Legacy/vulnerable directories
|
|
5751
|
+
'legacy_dirs': {
|
|
5752
|
+
'patterns': [r'_vti_', r'/cgi-bin', r'/cgi/', r'/fcgi/', r'/admin/', r'/administrator/', r'/phpmyadmin', r'/pma/', r'/myadmin'],
|
|
5753
|
+
'label': 'Legacy/admin directory',
|
|
5754
|
+
'severity': 'medium',
|
|
5755
|
+
},
|
|
5756
|
+
# Sensitive endpoints
|
|
5757
|
+
'sensitive_endpoints': {
|
|
5758
|
+
'patterns': [r'/upload', r'/uploads/', r'/file/', r'/files/', r'/tmp/', r'/temp/', r'/private/', r'/internal/', r'/api/'],
|
|
5759
|
+
'label': 'Potentially sensitive directory',
|
|
5760
|
+
'severity': 'low',
|
|
5761
|
+
},
|
|
5762
|
+
}
|
|
5763
|
+
|
|
5764
|
+
import re
|
|
5765
|
+
for path_entry in paths:
|
|
5766
|
+
url = path_entry.get('url', '').lower()
|
|
5767
|
+
for concern_type, concern_info in concern_patterns.items():
|
|
5768
|
+
for pattern in concern_info['patterns']:
|
|
5769
|
+
if re.search(pattern, url, re.IGNORECASE):
|
|
5770
|
+
security_concerns.append({
|
|
5771
|
+
'url': path_entry.get('url', ''),
|
|
5772
|
+
'type': concern_type,
|
|
5773
|
+
'label': concern_info['label'],
|
|
5774
|
+
'severity': concern_info['severity'],
|
|
5775
|
+
'status_code': path_entry.get('status_code', 'unknown'),
|
|
5776
|
+
})
|
|
5777
|
+
break # Only match once per path per type
|
|
5778
|
+
|
|
5779
|
+
# Display security concerns if found
|
|
5780
|
+
if security_concerns:
|
|
5781
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
5782
|
+
click.echo(click.style("⚠️ SECURITY CONCERNS", bold=True, fg='red'))
|
|
5783
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
5784
|
+
click.echo()
|
|
5785
|
+
|
|
5786
|
+
# Group by severity
|
|
5787
|
+
high_concerns = [c for c in security_concerns if c['severity'] == 'high']
|
|
5788
|
+
medium_concerns = [c for c in security_concerns if c['severity'] == 'medium']
|
|
5789
|
+
low_concerns = [c for c in security_concerns if c['severity'] == 'low']
|
|
5790
|
+
|
|
5791
|
+
if high_concerns:
|
|
5792
|
+
click.echo(click.style("[HIGH] Critical findings:", fg='red', bold=True))
|
|
5793
|
+
# Group by label
|
|
5794
|
+
by_label = {}
|
|
5795
|
+
for c in high_concerns:
|
|
5796
|
+
if c['label'] not in by_label:
|
|
5797
|
+
by_label[c['label']] = []
|
|
5798
|
+
by_label[c['label']].append(c['url'])
|
|
5799
|
+
for label, urls in by_label.items():
|
|
5800
|
+
click.echo(click.style(f" • {label}:", fg='red'))
|
|
5801
|
+
for url in urls[:5]: # Limit to 5 per type
|
|
5802
|
+
click.echo(f" → {url}")
|
|
5803
|
+
if len(urls) > 5:
|
|
5804
|
+
click.echo(f" ... and {len(urls) - 5} more")
|
|
5805
|
+
click.echo()
|
|
5806
|
+
|
|
5807
|
+
if medium_concerns:
|
|
5808
|
+
click.echo(click.style("[MEDIUM] Notable findings:", fg='yellow', bold=True))
|
|
5809
|
+
by_label = {}
|
|
5810
|
+
for c in medium_concerns:
|
|
5811
|
+
if c['label'] not in by_label:
|
|
5812
|
+
by_label[c['label']] = []
|
|
5813
|
+
by_label[c['label']].append(c['url'])
|
|
5814
|
+
for label, urls in by_label.items():
|
|
5815
|
+
click.echo(click.style(f" • {label}:", fg='yellow'))
|
|
5816
|
+
for url in urls[:5]:
|
|
5817
|
+
click.echo(f" → {url}")
|
|
5818
|
+
if len(urls) > 5:
|
|
5819
|
+
click.echo(f" ... and {len(urls) - 5} more")
|
|
5820
|
+
click.echo()
|
|
5821
|
+
|
|
5822
|
+
if low_concerns:
|
|
5823
|
+
click.echo(click.style("[LOW] Worth investigating:", fg='cyan', bold=True))
|
|
5824
|
+
by_label = {}
|
|
5825
|
+
for c in low_concerns:
|
|
5826
|
+
if c['label'] not in by_label:
|
|
5827
|
+
by_label[c['label']] = []
|
|
5828
|
+
by_label[c['label']].append(c['url'])
|
|
5829
|
+
for label, urls in by_label.items():
|
|
5830
|
+
click.echo(f" • {label}: {len(urls)} path(s)")
|
|
5831
|
+
click.echo()
|
|
5832
|
+
|
|
5680
5833
|
click.echo(click.style("=" * 70, fg='cyan'))
|
|
5681
5834
|
click.echo(click.style("DISCOVERED WEB PATHS", bold=True, fg='cyan'))
|
|
5682
5835
|
click.echo(click.style("=" * 70, fg='cyan'))
|
|
@@ -5716,7 +5869,40 @@ def view_job_detail(job_id: int):
|
|
|
5716
5869
|
if not show_all_paths and len(status_groups[status]) > 10:
|
|
5717
5870
|
click.echo(f" ... and {len(status_groups[status]) - 10} more")
|
|
5718
5871
|
click.echo()
|
|
5719
|
-
|
|
5872
|
+
|
|
5873
|
+
# No paths found - show helpful no_results summary
|
|
5874
|
+
elif job.get('status') in ['no_results', 'done', 'completed'] and not job.get('status') == 'error':
|
|
5875
|
+
click.echo(click.style("=" * 70, fg='cyan'))
|
|
5876
|
+
click.echo(click.style("GOBUSTER SCAN RESULTS", bold=True, fg='cyan'))
|
|
5877
|
+
click.echo(click.style("=" * 70, fg='cyan'))
|
|
5878
|
+
click.echo()
|
|
5879
|
+
click.echo(" No paths discovered.")
|
|
5880
|
+
click.echo()
|
|
5881
|
+
|
|
5882
|
+
# Extract wordlist name from args
|
|
5883
|
+
args = job.get('args', [])
|
|
5884
|
+
for i, arg in enumerate(args):
|
|
5885
|
+
if arg == '-w' and i + 1 < len(args):
|
|
5886
|
+
import os
|
|
5887
|
+
wordlist = os.path.basename(args[i + 1])
|
|
5888
|
+
click.echo(f" Wordlist: {wordlist}")
|
|
5889
|
+
break
|
|
5890
|
+
|
|
5891
|
+
# Extract extensions
|
|
5892
|
+
for i, arg in enumerate(args):
|
|
5893
|
+
if arg == '-x' and i + 1 < len(args):
|
|
5894
|
+
click.echo(f" Extensions: {args[i + 1]}")
|
|
5895
|
+
break
|
|
5896
|
+
|
|
5897
|
+
click.echo()
|
|
5898
|
+
click.echo(click.style(" This could mean:", fg='bright_black'))
|
|
5899
|
+
click.echo(click.style(" • Target has good security (no exposed paths)", fg='bright_black'))
|
|
5900
|
+
click.echo(click.style(" • Try a different/larger wordlist", fg='bright_black'))
|
|
5901
|
+
click.echo(click.style(" • Target may be blocking automated requests", fg='bright_black'))
|
|
5902
|
+
click.echo()
|
|
5903
|
+
click.echo(click.style("=" * 70, fg='cyan'))
|
|
5904
|
+
click.echo()
|
|
5905
|
+
|
|
5720
5906
|
except Exception as e:
|
|
5721
5907
|
# Silently fail - not critical
|
|
5722
5908
|
pass
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: souleyez
|
|
3
|
-
Version: 2.43.
|
|
3
|
+
Version: 2.43.24
|
|
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=Dlm8Sb-gazHcbQW7XGgbdPvDd9-TWKpWV4WZt5kPQug,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=EDUJ8QB1TBBalTxQROu40kQ5dr2mgS2ehMyJLt-hL_I,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=lQyXwVpbC_iSI3lrL0tgVT5Q8pcKg2GhphEjeUqC8FM,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
|
|
@@ -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=SKur3ctjoUba1-gLE8MgORlA4-BzTCXXNEA0nAZTI88,1427636
|
|
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
|
|
@@ -371,9 +371,9 @@ souleyez/ui/wazuh_vulns_view.py,sha256=3vJJEmrjgS2wD6EDB7ZV7WxgytBHTm-1WqNDjp7lV
|
|
|
371
371
|
souleyez/ui/wordlist_browser.py,sha256=iQ2YYxrVo8FGCfM-Bc0teVBijSAbd2rjbSQ2hOE7eiY,16110
|
|
372
372
|
souleyez/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
373
373
|
souleyez/utils/tool_checker.py,sha256=YzNajZpFyKJA5fp0Kq_gQ0YnKb7J1BaKJSZ8vP-IWj8,30868
|
|
374
|
-
souleyez-2.43.
|
|
375
|
-
souleyez-2.43.
|
|
376
|
-
souleyez-2.43.
|
|
377
|
-
souleyez-2.43.
|
|
378
|
-
souleyez-2.43.
|
|
379
|
-
souleyez-2.43.
|
|
374
|
+
souleyez-2.43.24.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
|
|
375
|
+
souleyez-2.43.24.dist-info/METADATA,sha256=SSLMWcK2w5a2tSL6HC8iGtK63CGSHYKdI9FwSP0w2QQ,10427
|
|
376
|
+
souleyez-2.43.24.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
377
|
+
souleyez-2.43.24.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
|
|
378
|
+
souleyez-2.43.24.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
|
|
379
|
+
souleyez-2.43.24.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|