souleyez 2.43.26__py3-none-any.whl → 2.43.27__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 +164 -1
- {souleyez-2.43.26.dist-info → souleyez-2.43.27.dist-info}/METADATA +1 -1
- {souleyez-2.43.26.dist-info → souleyez-2.43.27.dist-info}/RECORD +10 -10
- {souleyez-2.43.26.dist-info → souleyez-2.43.27.dist-info}/WHEEL +0 -0
- {souleyez-2.43.26.dist-info → souleyez-2.43.27.dist-info}/entry_points.txt +0 -0
- {souleyez-2.43.26.dist-info → souleyez-2.43.27.dist-info}/licenses/LICENSE +0 -0
- {souleyez-2.43.26.dist-info → souleyez-2.43.27.dist-info}/top_level.txt +0 -0
souleyez/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = '2.43.
|
|
1
|
+
__version__ = '2.43.27'
|
|
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.27')
|
|
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
|
@@ -6140,6 +6140,48 @@ def view_job_detail(job_id: int):
|
|
|
6140
6140
|
import traceback
|
|
6141
6141
|
traceback.print_exc()
|
|
6142
6142
|
|
|
6143
|
+
# WPScan ERROR handler
|
|
6144
|
+
if not show_raw_logs and job.get('tool') == 'wpscan' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
|
|
6145
|
+
try:
|
|
6146
|
+
with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
6147
|
+
log_text = f.read()
|
|
6148
|
+
|
|
6149
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6150
|
+
click.echo(click.style("[ERROR] WPSCAN FAILED", bold=True, fg='red'))
|
|
6151
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6152
|
+
click.echo()
|
|
6153
|
+
|
|
6154
|
+
# Check for common wpscan errors
|
|
6155
|
+
error_msg = None
|
|
6156
|
+
if 'The target is NOT running WordPress' in log_text:
|
|
6157
|
+
error_msg = "Target is not running WordPress"
|
|
6158
|
+
elif 'could not resolve' in log_text.lower():
|
|
6159
|
+
error_msg = "Could not resolve target hostname"
|
|
6160
|
+
elif 'Connection refused' in log_text or 'Unable to connect' in log_text:
|
|
6161
|
+
error_msg = "Connection refused - web server may be down"
|
|
6162
|
+
elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
|
|
6163
|
+
error_msg = "Connection timed out - target may be slow or filtering"
|
|
6164
|
+
elif 'SSL' in log_text and ('error' in log_text.lower() or 'fail' in log_text.lower()):
|
|
6165
|
+
error_msg = "SSL error - try with --disable-tls-checks"
|
|
6166
|
+
elif 'API limit' in log_text.lower() or 'rate limit' in log_text.lower():
|
|
6167
|
+
error_msg = "WPScan API rate limit reached - try again later"
|
|
6168
|
+
elif '[!]' in log_text:
|
|
6169
|
+
match = re.search(r'\[!\]\s*(.+?)(?:\n|$)', log_text)
|
|
6170
|
+
if match:
|
|
6171
|
+
error_msg = match.group(1).strip()[:100]
|
|
6172
|
+
|
|
6173
|
+
if error_msg:
|
|
6174
|
+
click.echo(f" {error_msg}")
|
|
6175
|
+
else:
|
|
6176
|
+
click.echo(" Scan failed - see raw logs for details (press 'r')")
|
|
6177
|
+
|
|
6178
|
+
click.echo()
|
|
6179
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6180
|
+
click.echo()
|
|
6181
|
+
|
|
6182
|
+
except Exception:
|
|
6183
|
+
pass
|
|
6184
|
+
|
|
6143
6185
|
# Parse and display WPScan results if available (only when not showing raw logs)
|
|
6144
6186
|
if not show_raw_logs and job.get('tool') == 'wpscan' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
|
|
6145
6187
|
try:
|
|
@@ -6333,6 +6375,46 @@ def view_job_detail(job_id: int):
|
|
|
6333
6375
|
# Silently fail - not critical
|
|
6334
6376
|
pass
|
|
6335
6377
|
|
|
6378
|
+
# DNSRecon ERROR handler
|
|
6379
|
+
if not show_raw_logs and job.get('tool') == 'dnsrecon' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
|
|
6380
|
+
try:
|
|
6381
|
+
with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
6382
|
+
log_text = f.read()
|
|
6383
|
+
|
|
6384
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6385
|
+
click.echo(click.style("[ERROR] DNSRECON FAILED", bold=True, fg='red'))
|
|
6386
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6387
|
+
click.echo()
|
|
6388
|
+
|
|
6389
|
+
# Check for common dnsrecon errors
|
|
6390
|
+
error_msg = None
|
|
6391
|
+
if 'Could not resolve' in log_text or 'NXDOMAIN' in log_text:
|
|
6392
|
+
error_msg = "Could not resolve domain - check if domain exists"
|
|
6393
|
+
elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
|
|
6394
|
+
error_msg = "DNS query timed out - DNS server may be slow"
|
|
6395
|
+
elif 'SERVFAIL' in log_text:
|
|
6396
|
+
error_msg = "DNS server failure (SERVFAIL)"
|
|
6397
|
+
elif 'REFUSED' in log_text:
|
|
6398
|
+
error_msg = "DNS query refused - server may be blocking queries"
|
|
6399
|
+
elif 'No DNS records' in log_text:
|
|
6400
|
+
error_msg = "No DNS records found for domain"
|
|
6401
|
+
elif '[-]' in log_text:
|
|
6402
|
+
match = re.search(r'\[-\]\s*(.+?)(?:\n|$)', log_text)
|
|
6403
|
+
if match:
|
|
6404
|
+
error_msg = match.group(1).strip()[:100]
|
|
6405
|
+
|
|
6406
|
+
if error_msg:
|
|
6407
|
+
click.echo(f" {error_msg}")
|
|
6408
|
+
else:
|
|
6409
|
+
click.echo(" Scan failed - see raw logs for details (press 'r')")
|
|
6410
|
+
|
|
6411
|
+
click.echo()
|
|
6412
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6413
|
+
click.echo()
|
|
6414
|
+
|
|
6415
|
+
except Exception:
|
|
6416
|
+
pass
|
|
6417
|
+
|
|
6336
6418
|
# Parse and display DNSRecon results if available (only when not showing raw logs)
|
|
6337
6419
|
if not show_raw_logs and job.get('tool') == 'dnsrecon' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
|
|
6338
6420
|
try:
|
|
@@ -6776,6 +6858,46 @@ def view_job_detail(job_id: int):
|
|
|
6776
6858
|
except Exception as e:
|
|
6777
6859
|
pass
|
|
6778
6860
|
|
|
6861
|
+
# theHarvester ERROR handler
|
|
6862
|
+
if not show_raw_logs and job.get('tool') == 'theharvester' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
|
|
6863
|
+
try:
|
|
6864
|
+
with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
6865
|
+
log_text = f.read()
|
|
6866
|
+
|
|
6867
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6868
|
+
click.echo(click.style("[ERROR] THEHARVESTER FAILED", bold=True, fg='red'))
|
|
6869
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6870
|
+
click.echo()
|
|
6871
|
+
|
|
6872
|
+
# Check for common theharvester errors
|
|
6873
|
+
error_msg = None
|
|
6874
|
+
if 'No results found' in log_text:
|
|
6875
|
+
error_msg = "No results found for the specified domain"
|
|
6876
|
+
elif 'Could not resolve' in log_text or 'DNS' in log_text and 'fail' in log_text.lower():
|
|
6877
|
+
error_msg = "Could not resolve domain"
|
|
6878
|
+
elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
|
|
6879
|
+
error_msg = "Connection timed out - source may be slow"
|
|
6880
|
+
elif 'rate limit' in log_text.lower() or 'blocked' in log_text.lower():
|
|
6881
|
+
error_msg = "Rate limited or blocked by source"
|
|
6882
|
+
elif 'API' in log_text and ('key' in log_text.lower() or 'error' in log_text.lower()):
|
|
6883
|
+
error_msg = "API key error - check your API keys configuration"
|
|
6884
|
+
elif '[-]' in log_text:
|
|
6885
|
+
match = re.search(r'\[-\]\s*(.+?)(?:\n|$)', log_text)
|
|
6886
|
+
if match:
|
|
6887
|
+
error_msg = match.group(1).strip()[:100]
|
|
6888
|
+
|
|
6889
|
+
if error_msg:
|
|
6890
|
+
click.echo(f" {error_msg}")
|
|
6891
|
+
else:
|
|
6892
|
+
click.echo(" Scan failed - see raw logs for details (press 'r')")
|
|
6893
|
+
|
|
6894
|
+
click.echo()
|
|
6895
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6896
|
+
click.echo()
|
|
6897
|
+
|
|
6898
|
+
except Exception:
|
|
6899
|
+
pass
|
|
6900
|
+
|
|
6779
6901
|
# Parse and display theHarvester results if available (only when not showing raw logs)
|
|
6780
6902
|
if not show_raw_logs and job.get('tool') == 'theharvester' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
|
|
6781
6903
|
try:
|
|
@@ -6864,6 +6986,44 @@ def view_job_detail(job_id: int):
|
|
|
6864
6986
|
# Fall back to raw log if parsing fails
|
|
6865
6987
|
pass
|
|
6866
6988
|
|
|
6989
|
+
# Nikto ERROR handler
|
|
6990
|
+
if not show_raw_logs and job.get('tool') == 'nikto' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
|
|
6991
|
+
try:
|
|
6992
|
+
with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
6993
|
+
log_text = f.read()
|
|
6994
|
+
|
|
6995
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6996
|
+
click.echo(click.style("[ERROR] NIKTO SCAN FAILED", bold=True, fg='red'))
|
|
6997
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
6998
|
+
click.echo()
|
|
6999
|
+
|
|
7000
|
+
# Check for common nikto errors
|
|
7001
|
+
error_msg = None
|
|
7002
|
+
if 'Unable to connect' in log_text or 'Connection refused' in log_text:
|
|
7003
|
+
error_msg = "Unable to connect to target - check if web server is running"
|
|
7004
|
+
elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
|
|
7005
|
+
error_msg = "Connection timed out - target may be slow or filtering"
|
|
7006
|
+
elif 'No web server found' in log_text:
|
|
7007
|
+
error_msg = "No web server found on target port"
|
|
7008
|
+
elif 'SSL handshake' in log_text.lower():
|
|
7009
|
+
error_msg = "SSL handshake failed - try with/without -ssl flag"
|
|
7010
|
+
elif 'ERROR:' in log_text:
|
|
7011
|
+
match = re.search(r'ERROR:\s*(.+?)(?:\n|$)', log_text)
|
|
7012
|
+
if match:
|
|
7013
|
+
error_msg = match.group(1).strip()[:100]
|
|
7014
|
+
|
|
7015
|
+
if error_msg:
|
|
7016
|
+
click.echo(f" {error_msg}")
|
|
7017
|
+
else:
|
|
7018
|
+
click.echo(" Scan failed - see raw logs for details (press 'r')")
|
|
7019
|
+
|
|
7020
|
+
click.echo()
|
|
7021
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7022
|
+
click.echo()
|
|
7023
|
+
|
|
7024
|
+
except Exception:
|
|
7025
|
+
pass
|
|
7026
|
+
|
|
6867
7027
|
# Parse and display Nikto results if available (only when not showing raw logs)
|
|
6868
7028
|
if not show_raw_logs and job.get('tool') == 'nikto' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
|
|
6869
7029
|
try:
|
|
@@ -7668,7 +7828,10 @@ def view_job_detail(job_id: int):
|
|
|
7668
7828
|
# =================================================================
|
|
7669
7829
|
|
|
7670
7830
|
# Tools with custom error handlers (don't show generic for these)
|
|
7671
|
-
tools_with_error_handlers = [
|
|
7831
|
+
tools_with_error_handlers = [
|
|
7832
|
+
'gobuster', 'ffuf', 'nmap', 'ard', 'hydra', 'nuclei', 'sqlmap',
|
|
7833
|
+
'nikto', 'wpscan', 'dnsrecon', 'theharvester'
|
|
7834
|
+
]
|
|
7672
7835
|
|
|
7673
7836
|
# Tools with custom warning handlers
|
|
7674
7837
|
tools_with_warning_handlers = ['gobuster', 'ffuf']
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: souleyez
|
|
3
|
-
Version: 2.43.
|
|
3
|
+
Version: 2.43.27
|
|
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=OXioAdydP3dSiLSr9BJA6YoY7WSOxYycfwaRKWWJ_y4,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=xsjD3Nz9MaPIYKqBt6NuxCXRV04UlOQ4Q47bYg7W_zs,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=TRn7M2nuQzEiXsERpf1LjKeMeZd2JEvouAaSSh_T3zE,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=Z4ixYut7u_RymcHTjeMkTMjFmQ2z-tqyF4gxIO8KMMU,1450904
|
|
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.27.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
|
|
375
|
+
souleyez-2.43.27.dist-info/METADATA,sha256=0OBxVlojl_y7pAyeh5UqGqBDvV8MhKvYhomVeyiNXzU,10427
|
|
376
|
+
souleyez-2.43.27.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
377
|
+
souleyez-2.43.27.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
|
|
378
|
+
souleyez-2.43.27.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
|
|
379
|
+
souleyez-2.43.27.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|