souleyez 2.43.26__py3-none-any.whl → 2.43.28__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 +393 -1
- {souleyez-2.43.26.dist-info → souleyez-2.43.28.dist-info}/METADATA +1 -1
- {souleyez-2.43.26.dist-info → souleyez-2.43.28.dist-info}/RECORD +10 -10
- {souleyez-2.43.26.dist-info → souleyez-2.43.28.dist-info}/WHEEL +0 -0
- {souleyez-2.43.26.dist-info → souleyez-2.43.28.dist-info}/entry_points.txt +0 -0
- {souleyez-2.43.26.dist-info → souleyez-2.43.28.dist-info}/licenses/LICENSE +0 -0
- {souleyez-2.43.26.dist-info → souleyez-2.43.28.dist-info}/top_level.txt +0 -0
souleyez/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = '2.43.
|
|
1
|
+
__version__ = '2.43.28'
|
|
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.28')
|
|
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:
|
|
@@ -6953,6 +7113,40 @@ def view_job_detail(job_id: int):
|
|
|
6953
7113
|
# Fall back to raw log if parsing fails
|
|
6954
7114
|
pass
|
|
6955
7115
|
|
|
7116
|
+
# WHOIS ERROR handler
|
|
7117
|
+
if not show_raw_logs and job.get('tool') == 'whois' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
|
|
7118
|
+
try:
|
|
7119
|
+
with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
7120
|
+
log_text = f.read()
|
|
7121
|
+
|
|
7122
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7123
|
+
click.echo(click.style("[ERROR] WHOIS LOOKUP FAILED", bold=True, fg='red'))
|
|
7124
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7125
|
+
click.echo()
|
|
7126
|
+
|
|
7127
|
+
# Check for common whois errors
|
|
7128
|
+
error_msg = None
|
|
7129
|
+
if 'No match for' in log_text or 'NOT FOUND' in log_text.upper():
|
|
7130
|
+
error_msg = "Domain not found in WHOIS database"
|
|
7131
|
+
elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
|
|
7132
|
+
error_msg = "WHOIS query timed out - server may be slow"
|
|
7133
|
+
elif 'Connection refused' in log_text:
|
|
7134
|
+
error_msg = "Connection refused - WHOIS server may be down"
|
|
7135
|
+
elif 'rate limit' in log_text.lower() or 'too many' in log_text.lower():
|
|
7136
|
+
error_msg = "Rate limited - too many WHOIS queries"
|
|
7137
|
+
|
|
7138
|
+
if error_msg:
|
|
7139
|
+
click.echo(f" {error_msg}")
|
|
7140
|
+
else:
|
|
7141
|
+
click.echo(" Lookup failed - see raw logs for details (press 'r')")
|
|
7142
|
+
|
|
7143
|
+
click.echo()
|
|
7144
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7145
|
+
click.echo()
|
|
7146
|
+
|
|
7147
|
+
except Exception:
|
|
7148
|
+
pass
|
|
7149
|
+
|
|
6956
7150
|
# Parse and display WHOIS results if available (only when not showing raw logs)
|
|
6957
7151
|
if not show_raw_logs and job.get('tool') == 'whois' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
|
|
6958
7152
|
try:
|
|
@@ -7032,6 +7226,46 @@ def view_job_detail(job_id: int):
|
|
|
7032
7226
|
except Exception as e:
|
|
7033
7227
|
pass
|
|
7034
7228
|
|
|
7229
|
+
# CrackMapExec ERROR handler
|
|
7230
|
+
if not show_raw_logs and job.get('tool') == 'crackmapexec' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
|
|
7231
|
+
try:
|
|
7232
|
+
with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
7233
|
+
log_text = f.read()
|
|
7234
|
+
|
|
7235
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7236
|
+
click.echo(click.style("[ERROR] CRACKMAPEXEC FAILED", bold=True, fg='red'))
|
|
7237
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7238
|
+
click.echo()
|
|
7239
|
+
|
|
7240
|
+
# Check for common CME errors
|
|
7241
|
+
error_msg = None
|
|
7242
|
+
if 'Connection refused' in log_text or 'Connection reset' in log_text:
|
|
7243
|
+
error_msg = "Connection refused - SMB service may be down"
|
|
7244
|
+
elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
|
|
7245
|
+
error_msg = "Connection timed out - target may be slow or filtering"
|
|
7246
|
+
elif 'STATUS_LOGON_FAILURE' in log_text:
|
|
7247
|
+
error_msg = "Authentication failed - invalid credentials"
|
|
7248
|
+
elif 'STATUS_ACCESS_DENIED' in log_text:
|
|
7249
|
+
error_msg = "Access denied - insufficient privileges"
|
|
7250
|
+
elif 'Errno 113' in log_text or 'No route to host' in log_text:
|
|
7251
|
+
error_msg = "No route to host - network unreachable"
|
|
7252
|
+
elif '[-]' in log_text:
|
|
7253
|
+
match = re.search(r'\[-\]\s*(.+?)(?:\n|$)', log_text)
|
|
7254
|
+
if match:
|
|
7255
|
+
error_msg = match.group(1).strip()[:100]
|
|
7256
|
+
|
|
7257
|
+
if error_msg:
|
|
7258
|
+
click.echo(f" {error_msg}")
|
|
7259
|
+
else:
|
|
7260
|
+
click.echo(" Scan failed - see raw logs for details (press 'r')")
|
|
7261
|
+
|
|
7262
|
+
click.echo()
|
|
7263
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7264
|
+
click.echo()
|
|
7265
|
+
|
|
7266
|
+
except Exception:
|
|
7267
|
+
pass
|
|
7268
|
+
|
|
7035
7269
|
# Parse and display CrackMapExec results if available (only when not showing raw logs)
|
|
7036
7270
|
if not show_raw_logs and job.get('tool') == 'crackmapexec' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
|
|
7037
7271
|
try:
|
|
@@ -7081,6 +7315,46 @@ def view_job_detail(job_id: int):
|
|
|
7081
7315
|
except Exception as e:
|
|
7082
7316
|
pass
|
|
7083
7317
|
|
|
7318
|
+
# SMBMap ERROR handler
|
|
7319
|
+
if not show_raw_logs and job.get('tool') == 'smbmap' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
|
|
7320
|
+
try:
|
|
7321
|
+
with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
7322
|
+
log_text = f.read()
|
|
7323
|
+
|
|
7324
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7325
|
+
click.echo(click.style("[ERROR] SMBMAP FAILED", bold=True, fg='red'))
|
|
7326
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7327
|
+
click.echo()
|
|
7328
|
+
|
|
7329
|
+
# Check for common smbmap errors
|
|
7330
|
+
error_msg = None
|
|
7331
|
+
if 'Connection refused' in log_text or 'Connection reset' in log_text:
|
|
7332
|
+
error_msg = "Connection refused - SMB service may be down"
|
|
7333
|
+
elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
|
|
7334
|
+
error_msg = "Connection timed out - target may be slow or filtering"
|
|
7335
|
+
elif 'Authentication error' in log_text or 'LOGON_FAILURE' in log_text:
|
|
7336
|
+
error_msg = "Authentication failed - invalid credentials"
|
|
7337
|
+
elif 'Access denied' in log_text.lower():
|
|
7338
|
+
error_msg = "Access denied - insufficient privileges"
|
|
7339
|
+
elif 'Errno 113' in log_text or 'No route to host' in log_text:
|
|
7340
|
+
error_msg = "No route to host - network unreachable"
|
|
7341
|
+
elif '[-]' in log_text:
|
|
7342
|
+
match = re.search(r'\[-\]\s*(.+?)(?:\n|$)', log_text)
|
|
7343
|
+
if match:
|
|
7344
|
+
error_msg = match.group(1).strip()[:100]
|
|
7345
|
+
|
|
7346
|
+
if error_msg:
|
|
7347
|
+
click.echo(f" {error_msg}")
|
|
7348
|
+
else:
|
|
7349
|
+
click.echo(" Scan failed - see raw logs for details (press 'r')")
|
|
7350
|
+
|
|
7351
|
+
click.echo()
|
|
7352
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7353
|
+
click.echo()
|
|
7354
|
+
|
|
7355
|
+
except Exception:
|
|
7356
|
+
pass
|
|
7357
|
+
|
|
7084
7358
|
# Parse and display SMBMap results if available (only when not showing raw logs)
|
|
7085
7359
|
if not show_raw_logs and job.get('tool') == 'smbmap' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
|
|
7086
7360
|
try:
|
|
@@ -7160,6 +7434,44 @@ def view_job_detail(job_id: int):
|
|
|
7160
7434
|
except Exception as e:
|
|
7161
7435
|
pass
|
|
7162
7436
|
|
|
7437
|
+
# enum4linux ERROR handler
|
|
7438
|
+
if not show_raw_logs and job.get('tool') == 'enum4linux' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
|
|
7439
|
+
try:
|
|
7440
|
+
with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
7441
|
+
log_text = f.read()
|
|
7442
|
+
|
|
7443
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7444
|
+
click.echo(click.style("[ERROR] ENUM4LINUX FAILED", bold=True, fg='red'))
|
|
7445
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7446
|
+
click.echo()
|
|
7447
|
+
|
|
7448
|
+
# Check for common enum4linux errors
|
|
7449
|
+
error_msg = None
|
|
7450
|
+
if 'Connection refused' in log_text:
|
|
7451
|
+
error_msg = "Connection refused - SMB/NetBIOS service may be down"
|
|
7452
|
+
elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
|
|
7453
|
+
error_msg = "Connection timed out - target may be slow or filtering"
|
|
7454
|
+
elif 'NT_STATUS_ACCESS_DENIED' in log_text:
|
|
7455
|
+
error_msg = "Access denied - null session may be blocked"
|
|
7456
|
+
elif 'NT_STATUS_LOGON_FAILURE' in log_text:
|
|
7457
|
+
error_msg = "Logon failure - authentication failed"
|
|
7458
|
+
elif 'Errno 113' in log_text or 'No route to host' in log_text:
|
|
7459
|
+
error_msg = "No route to host - network unreachable"
|
|
7460
|
+
elif 'Could not initialise' in log_text:
|
|
7461
|
+
error_msg = "Could not initialize - target may not support SMB"
|
|
7462
|
+
|
|
7463
|
+
if error_msg:
|
|
7464
|
+
click.echo(f" {error_msg}")
|
|
7465
|
+
else:
|
|
7466
|
+
click.echo(" Scan failed - see raw logs for details (press 'r')")
|
|
7467
|
+
|
|
7468
|
+
click.echo()
|
|
7469
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7470
|
+
click.echo()
|
|
7471
|
+
|
|
7472
|
+
except Exception:
|
|
7473
|
+
pass
|
|
7474
|
+
|
|
7163
7475
|
# Parse and display enum4linux results if available (only when not showing raw logs)
|
|
7164
7476
|
if not show_raw_logs and job.get('tool') == 'enum4linux' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
|
|
7165
7477
|
try:
|
|
@@ -7250,6 +7562,48 @@ def view_job_detail(job_id: int):
|
|
|
7250
7562
|
has_credentials = False
|
|
7251
7563
|
has_many_credentials = False
|
|
7252
7564
|
|
|
7565
|
+
# msf_auxiliary ERROR handler
|
|
7566
|
+
if not show_raw_logs and job.get('tool') == 'msf_auxiliary' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
|
|
7567
|
+
try:
|
|
7568
|
+
with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
7569
|
+
log_text = f.read()
|
|
7570
|
+
|
|
7571
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7572
|
+
click.echo(click.style("[ERROR] METASPLOIT AUXILIARY FAILED", bold=True, fg='red'))
|
|
7573
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7574
|
+
click.echo()
|
|
7575
|
+
|
|
7576
|
+
# Check for common MSF errors
|
|
7577
|
+
error_msg = None
|
|
7578
|
+
if 'Connection refused' in log_text:
|
|
7579
|
+
error_msg = "Connection refused - target service may be down"
|
|
7580
|
+
elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
|
|
7581
|
+
error_msg = "Connection timed out - target may be slow or filtering"
|
|
7582
|
+
elif 'Exploit failed' in log_text:
|
|
7583
|
+
error_msg = "Exploit failed - target may not be vulnerable"
|
|
7584
|
+
elif 'Module not found' in log_text or 'Unknown module' in log_text:
|
|
7585
|
+
error_msg = "Module not found - check module name"
|
|
7586
|
+
elif 'Required option' in log_text:
|
|
7587
|
+
match = re.search(r'Required option\s*[\'"]?(\w+)[\'"]?\s*is missing', log_text)
|
|
7588
|
+
if match:
|
|
7589
|
+
error_msg = f"Required option '{match.group(1)}' is missing"
|
|
7590
|
+
elif '[-]' in log_text:
|
|
7591
|
+
match = re.search(r'\[-\]\s*(.+?)(?:\n|$)', log_text)
|
|
7592
|
+
if match:
|
|
7593
|
+
error_msg = match.group(1).strip()[:100]
|
|
7594
|
+
|
|
7595
|
+
if error_msg:
|
|
7596
|
+
click.echo(f" {error_msg}")
|
|
7597
|
+
else:
|
|
7598
|
+
click.echo(" Module failed - see raw logs for details (press 'r')")
|
|
7599
|
+
|
|
7600
|
+
click.echo()
|
|
7601
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7602
|
+
click.echo()
|
|
7603
|
+
|
|
7604
|
+
except Exception:
|
|
7605
|
+
pass
|
|
7606
|
+
|
|
7253
7607
|
# Parse and display msf_auxiliary results if available (only when not showing raw logs)
|
|
7254
7608
|
if not show_raw_logs and job.get('tool') == 'msf_auxiliary' and job.get('status') in ['done', 'completed'] and log_path and os.path.exists(log_path):
|
|
7255
7609
|
try:
|
|
@@ -7467,6 +7821,40 @@ def view_job_detail(job_id: int):
|
|
|
7467
7821
|
# Silently fail - not critical
|
|
7468
7822
|
pass
|
|
7469
7823
|
|
|
7824
|
+
# SearchSploit ERROR handler
|
|
7825
|
+
if not show_raw_logs and job.get('tool') == 'searchsploit' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
|
|
7826
|
+
try:
|
|
7827
|
+
with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
7828
|
+
log_text = f.read()
|
|
7829
|
+
|
|
7830
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7831
|
+
click.echo(click.style("[ERROR] SEARCHSPLOIT FAILED", bold=True, fg='red'))
|
|
7832
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7833
|
+
click.echo()
|
|
7834
|
+
|
|
7835
|
+
# Check for common searchsploit errors
|
|
7836
|
+
error_msg = None
|
|
7837
|
+
if 'not found' in log_text.lower() and 'command' in log_text.lower():
|
|
7838
|
+
error_msg = "searchsploit not found - install exploitdb package"
|
|
7839
|
+
elif 'database' in log_text.lower() and ('not found' in log_text.lower() or 'missing' in log_text.lower()):
|
|
7840
|
+
error_msg = "Exploit database not found - run searchsploit -u to update"
|
|
7841
|
+
elif 'Error' in log_text:
|
|
7842
|
+
match = re.search(r'Error[:\s]+(.+?)(?:\n|$)', log_text, re.IGNORECASE)
|
|
7843
|
+
if match:
|
|
7844
|
+
error_msg = match.group(1).strip()[:100]
|
|
7845
|
+
|
|
7846
|
+
if error_msg:
|
|
7847
|
+
click.echo(f" {error_msg}")
|
|
7848
|
+
else:
|
|
7849
|
+
click.echo(" Search failed - see raw logs for details (press 'r')")
|
|
7850
|
+
|
|
7851
|
+
click.echo()
|
|
7852
|
+
click.echo(click.style("=" * 70, fg='red'))
|
|
7853
|
+
click.echo()
|
|
7854
|
+
|
|
7855
|
+
except Exception:
|
|
7856
|
+
pass
|
|
7857
|
+
|
|
7470
7858
|
# Parse and display SearchSploit results if available (only when not showing raw logs)
|
|
7471
7859
|
if not show_raw_logs and job.get('tool') == 'searchsploit' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
|
|
7472
7860
|
try:
|
|
@@ -7668,7 +8056,11 @@ def view_job_detail(job_id: int):
|
|
|
7668
8056
|
# =================================================================
|
|
7669
8057
|
|
|
7670
8058
|
# Tools with custom error handlers (don't show generic for these)
|
|
7671
|
-
tools_with_error_handlers = [
|
|
8059
|
+
tools_with_error_handlers = [
|
|
8060
|
+
'gobuster', 'ffuf', 'nmap', 'ard', 'hydra', 'nuclei', 'sqlmap',
|
|
8061
|
+
'nikto', 'wpscan', 'dnsrecon', 'theharvester', 'crackmapexec',
|
|
8062
|
+
'smbmap', 'enum4linux', 'whois', 'searchsploit', 'msf_auxiliary'
|
|
8063
|
+
]
|
|
7672
8064
|
|
|
7673
8065
|
# Tools with custom warning handlers
|
|
7674
8066
|
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.28
|
|
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=kVE1JLiNloJr9atzRGbxg0OhOragXoFGVkJas3aXhm0,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=1B2rnpVf2U7UPngg2jBg76KpAelIGzVQeWiMCTiiV9A,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=xY9_fFYXXI8RfmhGBxWEA6u0Ps9dl0YIPZcsQvY33A8,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=7lfrKAABudjxifkZELjZbgB8aVtlGtwNENr2q-8Dgzg,1462170
|
|
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.28.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
|
|
375
|
+
souleyez-2.43.28.dist-info/METADATA,sha256=BXRZf9vfaEjCH-lRUyRxbcJD3jaVa0gFtr7T3-8RAnk,10427
|
|
376
|
+
souleyez-2.43.28.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
377
|
+
souleyez-2.43.28.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
|
|
378
|
+
souleyez-2.43.28.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
|
|
379
|
+
souleyez-2.43.28.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|