souleyez 2.35.0__py3-none-any.whl → 2.37.0__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/core/msf_auto_mapper.py +3 -2
- souleyez/core/tool_chaining.py +53 -7
- souleyez/docs/README.md +1 -1
- souleyez/main.py +1 -1
- {souleyez-2.35.0.dist-info → souleyez-2.37.0.dist-info}/METADATA +3 -3
- {souleyez-2.35.0.dist-info → souleyez-2.37.0.dist-info}/RECORD +11 -11
- {souleyez-2.35.0.dist-info → souleyez-2.37.0.dist-info}/WHEEL +0 -0
- {souleyez-2.35.0.dist-info → souleyez-2.37.0.dist-info}/entry_points.txt +0 -0
- {souleyez-2.35.0.dist-info → souleyez-2.37.0.dist-info}/licenses/LICENSE +0 -0
- {souleyez-2.35.0.dist-info → souleyez-2.37.0.dist-info}/top_level.txt +0 -0
souleyez/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = '2.
|
|
1
|
+
__version__ = '2.37.0'
|
|
2
2
|
|
souleyez/core/msf_auto_mapper.py
CHANGED
|
@@ -49,8 +49,9 @@ class MSFAutoMapper:
|
|
|
49
49
|
risk_levels=['safe', 'noisy', 'moderate', 'dangerous']
|
|
50
50
|
)
|
|
51
51
|
|
|
52
|
-
#
|
|
53
|
-
|
|
52
|
+
# Only store services with actual recommendations
|
|
53
|
+
if recommendations:
|
|
54
|
+
service_map[service_id] = recommendations[:10]
|
|
54
55
|
|
|
55
56
|
return service_map
|
|
56
57
|
except Exception as e:
|
souleyez/core/tool_chaining.py
CHANGED
|
@@ -3972,7 +3972,7 @@ class ToolChaining:
|
|
|
3972
3972
|
# This reduces noise and focuses on high-value targets
|
|
3973
3973
|
from souleyez.intelligence.sensitive_tables import is_sensitive_table, is_system_table
|
|
3974
3974
|
|
|
3975
|
-
MAX_TABLES_FOR_COLUMN_ENUM =
|
|
3975
|
+
MAX_TABLES_FOR_COLUMN_ENUM = 10 # Focused on sensitive tables only
|
|
3976
3976
|
tables_queued = 0
|
|
3977
3977
|
skipped_tables = 0
|
|
3978
3978
|
|
|
@@ -5770,6 +5770,17 @@ class ToolChaining:
|
|
|
5770
5770
|
|
|
5771
5771
|
status = existing_job.get('status')
|
|
5772
5772
|
|
|
5773
|
+
# === SQLMAP RULE-BASED DEDUP (check ALL completed jobs, not just recent) ===
|
|
5774
|
+
# For sqlmap: if same rule was already applied to this URL, skip it entirely
|
|
5775
|
+
# This prevents infinite loops where each sqlmap job re-triggers the same rules
|
|
5776
|
+
if cmd['tool'] == 'sqlmap' and status in ['done', 'queued', 'running']:
|
|
5777
|
+
cmd_rule_id = cmd.get('rule_id')
|
|
5778
|
+
existing_rule_id = existing_job.get('rule_id')
|
|
5779
|
+
if cmd_rule_id and existing_rule_id and cmd_rule_id == existing_rule_id:
|
|
5780
|
+
similar_exists = True
|
|
5781
|
+
print(f" ⏭️ Skipping sqlmap for {cmd_target}: rule #{cmd_rule_id} already applied (job #{existing_job['id']} {status})")
|
|
5782
|
+
break
|
|
5783
|
+
|
|
5773
5784
|
# Check if job is active (queued/running)
|
|
5774
5785
|
is_active = status in ['queued', 'running']
|
|
5775
5786
|
|
|
@@ -5784,11 +5795,28 @@ class ToolChaining:
|
|
|
5784
5795
|
current_time = datetime.now(finished_time.tzinfo) if finished_time.tzinfo else datetime.now()
|
|
5785
5796
|
time_delta = (current_time - finished_time).total_seconds()
|
|
5786
5797
|
|
|
5787
|
-
# Only block if
|
|
5798
|
+
# Only block if finished < 5 min ago AND (same args OR same rule_id for sqlmap)
|
|
5788
5799
|
if time_delta < DUPLICATE_WINDOW_SECONDS:
|
|
5789
5800
|
existing_args = existing_job.get('args', [])
|
|
5790
5801
|
cmd_args = cmd.get('args', [])
|
|
5791
|
-
|
|
5802
|
+
|
|
5803
|
+
# For sqlmap: also check rule_id (same rule = duplicate even with different parent)
|
|
5804
|
+
if cmd['tool'] == 'sqlmap':
|
|
5805
|
+
cmd_rule_id = cmd.get('rule_id')
|
|
5806
|
+
existing_rule_id = existing_job.get('rule_id')
|
|
5807
|
+
if cmd_rule_id and existing_rule_id and cmd_rule_id == existing_rule_id:
|
|
5808
|
+
is_recent_duplicate = True
|
|
5809
|
+
minutes_ago = int(time_delta // 60)
|
|
5810
|
+
seconds_ago = int(time_delta % 60)
|
|
5811
|
+
time_str = f"{minutes_ago}m {seconds_ago}s ago" if minutes_ago > 0 else f"{seconds_ago}s ago"
|
|
5812
|
+
print(f" ⏭️ Skipping sqlmap for {cmd_target}: rule #{cmd_rule_id} completed {time_str} (duplicate)")
|
|
5813
|
+
elif existing_args == cmd_args:
|
|
5814
|
+
is_recent_duplicate = True
|
|
5815
|
+
minutes_ago = int(time_delta // 60)
|
|
5816
|
+
seconds_ago = int(time_delta % 60)
|
|
5817
|
+
time_str = f"{minutes_ago}m {seconds_ago}s ago" if minutes_ago > 0 else f"{seconds_ago}s ago"
|
|
5818
|
+
print(f" ⏭️ Skipping sqlmap for {cmd_target}: job #{existing_job['id']} completed {time_str} (duplicate)")
|
|
5819
|
+
elif existing_args == cmd_args:
|
|
5792
5820
|
is_recent_duplicate = True
|
|
5793
5821
|
minutes_ago = int(time_delta // 60)
|
|
5794
5822
|
seconds_ago = int(time_delta % 60)
|
|
@@ -5810,16 +5838,34 @@ class ToolChaining:
|
|
|
5810
5838
|
print(f" ⏭️ Skipping {cmd['tool']} for {cmd_target}: similar job #{existing_job['id']} already exists ({existing_job['status']})")
|
|
5811
5839
|
break
|
|
5812
5840
|
|
|
5813
|
-
# For sqlmap
|
|
5814
|
-
elif cmd['tool']
|
|
5841
|
+
# For sqlmap: check by rule_id to prevent same rule firing twice on same URL
|
|
5842
|
+
elif cmd['tool'] == 'sqlmap':
|
|
5843
|
+
cmd_rule_id = cmd.get('rule_id')
|
|
5844
|
+
existing_rule_id = existing_job.get('rule_id')
|
|
5845
|
+
existing_args = existing_job.get('args', [])
|
|
5846
|
+
cmd_args = cmd.get('args', [])
|
|
5847
|
+
|
|
5848
|
+
# If both have rule_id and they match, it's a duplicate
|
|
5849
|
+
# (same rule already applied to this injection point)
|
|
5850
|
+
if cmd_rule_id and existing_rule_id and cmd_rule_id == existing_rule_id:
|
|
5851
|
+
similar_exists = True
|
|
5852
|
+
print(f" ⏭️ Skipping sqlmap for {cmd_target}: rule #{cmd_rule_id} already applied (job #{existing_job['id']} {existing_job['status']})")
|
|
5853
|
+
break
|
|
5854
|
+
# Also check if exact same args (covers manual/no-rule jobs)
|
|
5855
|
+
elif existing_args == cmd_args:
|
|
5856
|
+
similar_exists = True
|
|
5857
|
+
print(f" ⏭️ Skipping sqlmap for {cmd_target}: similar job #{existing_job['id']} already exists ({existing_job['status']})")
|
|
5858
|
+
break
|
|
5859
|
+
# If different rule_id and different args, allow it (different SQLMap phase)
|
|
5860
|
+
|
|
5861
|
+
# For gobuster: check if args match
|
|
5862
|
+
elif cmd['tool'] == 'gobuster':
|
|
5815
5863
|
existing_args = existing_job.get('args', [])
|
|
5816
5864
|
cmd_args = cmd.get('args', [])
|
|
5817
|
-
# Compare args - if they're the same, it's a duplicate
|
|
5818
5865
|
if existing_args == cmd_args:
|
|
5819
5866
|
similar_exists = True
|
|
5820
5867
|
print(f" ⏭️ Skipping {cmd['tool']} for {cmd_target}: similar job #{existing_job['id']} already exists ({existing_job['status']})")
|
|
5821
5868
|
break
|
|
5822
|
-
# If args are different, allow it (different SQLMap phase)
|
|
5823
5869
|
|
|
5824
5870
|
# For quick lookup tools (whois, dnsrecon), skip 5-min duplicate check
|
|
5825
5871
|
# They're fast and each theHarvester run should trigger them
|
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.
|
|
176
|
+
@click.version_option(version='2.37.0')
|
|
177
177
|
def cli():
|
|
178
178
|
"""SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
|
|
179
179
|
from souleyez.log_config import init_logging
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: souleyez
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.37.0
|
|
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>
|
|
@@ -78,7 +78,7 @@ Welcome to the SoulEyez beta! Thank you for helping us test and improve this pen
|
|
|
78
78
|
|
|
79
79
|
> ⚠️ **Important**: Only use SoulEyez on systems you have explicit authorization to test.
|
|
80
80
|
|
|
81
|
-
## Version: 2.
|
|
81
|
+
## Version: 2.37.0
|
|
82
82
|
|
|
83
83
|
### What's Included
|
|
84
84
|
|
|
@@ -316,4 +316,4 @@ Happy hacking! 🛡️
|
|
|
316
316
|
|
|
317
317
|
---
|
|
318
318
|
|
|
319
|
-
**Version**: 2.
|
|
319
|
+
**Version**: 2.37.0 | **Release Date**: January 2026 | **Maintainer**: CyberSoul Security
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
souleyez/__init__.py,sha256=
|
|
1
|
+
souleyez/__init__.py,sha256=EnvD3UdQZvTHVjG11Jhy8rN6ONMxP7LaKrLUVpFGljY,24
|
|
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=xsbPaRTqScTkAI0v2Wkk5tycMuNHOedNzp2qPxpHP-4,130228
|
|
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
|
|
@@ -48,7 +48,7 @@ souleyez/core/__init__.py,sha256=_WzKeywShaf_uQknBk-_d5LDqRKHoV5de6ZYP-JizKQ,109
|
|
|
48
48
|
souleyez/core/credential_tester.py,sha256=sRVfzEJ3tgWanAvWgdm3voKzCw5cwCSI2u0NZQudQgw,10439
|
|
49
49
|
souleyez/core/cve_mappings.py,sha256=C8qcEjz2rin9QZveT7Znpc6fltpqUhn-6pHPXO8bbH4,11944
|
|
50
50
|
souleyez/core/cve_matcher.py,sha256=LyFP2nZHkdWJuD0yWIcgRfzMpqfOZPJRVCuO3u9gGSI,12059
|
|
51
|
-
souleyez/core/msf_auto_mapper.py,sha256
|
|
51
|
+
souleyez/core/msf_auto_mapper.py,sha256=-XaY7jiSlQqGBDCGyM-EToD2VYEC70FJUx9oiuBjGzM,11617
|
|
52
52
|
souleyez/core/msf_chain_engine.py,sha256=ou-lNXTYt9WG6gzrIEw9HaoaiDZNnCnz-HHbB9bb-uY,18939
|
|
53
53
|
souleyez/core/msf_database.py,sha256=xaGt0wMX15CQv3-s2NobLK8niHgrE98qAkmS9zhrLe8,29135
|
|
54
54
|
souleyez/core/msf_integration.py,sha256=J9EXecxq72q65Itv1lBqjSkhh8Zx6SbZO2VPtlZXuOg,64842
|
|
@@ -59,7 +59,7 @@ souleyez/core/network_utils.py,sha256=-4WgUE91RBzyXDFgGTxMa0zsWowJ47cEOAKXNeVa-W
|
|
|
59
59
|
souleyez/core/parser_handler.py,sha256=cyZtEDctqMdWgubsU0Jg6o4XqBgyfaJ_AeBHQmmv4hM,5564
|
|
60
60
|
souleyez/core/pending_chains.py,sha256=Dnka7JK7A8gTWCGpTu6qrIgIDIXprkZmwJ0Rm2oWqRE,10972
|
|
61
61
|
souleyez/core/templates.py,sha256=DzlXlAz8_lwAFjjUWPp3r81KCCzbNeK-bkN1IlgQBSU,18112
|
|
62
|
-
souleyez/core/tool_chaining.py,sha256=
|
|
62
|
+
souleyez/core/tool_chaining.py,sha256=x1cJ6icuWu5YBZJ31q_Jm2iahGC3mBoUCnfYrkT0Kcc,281598
|
|
63
63
|
souleyez/core/version_utils.py,sha256=UOrOa3qfUdLKdzWT6GAGNV9TauwinXyLyelS8sOk0eE,11769
|
|
64
64
|
souleyez/core/vuln_correlation.py,sha256=U69MSI5I-AtiyOAbXohGDKMpEHRW9y4G_0M1ppRGX18,14765
|
|
65
65
|
souleyez/core/web_utils.py,sha256=f-Dqa6tH8ROnygn6-k7J1y8Qz2f1FmeJnPjPE0WRn34,4902
|
|
@@ -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=uJe48CLXNWih3scBVHojNH0XN1Yuzd80HGo5WwphuJo,7183
|
|
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
|
|
@@ -370,9 +370,9 @@ souleyez/ui/tutorial_state.py,sha256=Thf7_qCj4VKjG7UqgJqa9kjIqiFUU-7Q7kG4v-u2B4A
|
|
|
370
370
|
souleyez/ui/wazuh_vulns_view.py,sha256=3vJJEmrjgS2wD6EDB7ZV7WxgytBHTm-1WqNDjp7lVEI,21830
|
|
371
371
|
souleyez/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
372
372
|
souleyez/utils/tool_checker.py,sha256=kQcXJVY5NiO-orQAUnpHhpQvR5UOBNHJ0PaT0fBxYoQ,30782
|
|
373
|
-
souleyez-2.
|
|
374
|
-
souleyez-2.
|
|
375
|
-
souleyez-2.
|
|
376
|
-
souleyez-2.
|
|
377
|
-
souleyez-2.
|
|
378
|
-
souleyez-2.
|
|
373
|
+
souleyez-2.37.0.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
|
|
374
|
+
souleyez-2.37.0.dist-info/METADATA,sha256=zgaqCGsYF3Ow0Vy5sZbYynhVeommbaydh_9YSlasXpg,11345
|
|
375
|
+
souleyez-2.37.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
376
|
+
souleyez-2.37.0.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
|
|
377
|
+
souleyez-2.37.0.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
|
|
378
|
+
souleyez-2.37.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|