souleyez 2.23.0__py3-none-any.whl → 2.27.1__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.
Files changed (36) hide show
  1. souleyez/__init__.py +1 -1
  2. souleyez/assets/__init__.py +1 -0
  3. souleyez/assets/souleyez-icon.png +0 -0
  4. souleyez/core/msf_sync_manager.py +15 -5
  5. souleyez/core/tool_chaining.py +143 -26
  6. souleyez/docs/README.md +2 -2
  7. souleyez/docs/user-guide/configuration.md +1 -1
  8. souleyez/docs/user-guide/installation.md +11 -0
  9. souleyez/engine/background.py +620 -154
  10. souleyez/engine/result_handler.py +262 -1
  11. souleyez/engine/worker_manager.py +98 -2
  12. souleyez/main.py +103 -4
  13. souleyez/parsers/crackmapexec_parser.py +101 -43
  14. souleyez/parsers/dnsrecon_parser.py +50 -35
  15. souleyez/parsers/enum4linux_parser.py +101 -21
  16. souleyez/parsers/http_fingerprint_parser.py +319 -0
  17. souleyez/parsers/hydra_parser.py +56 -5
  18. souleyez/parsers/impacket_parser.py +123 -44
  19. souleyez/parsers/john_parser.py +47 -14
  20. souleyez/parsers/msf_parser.py +20 -5
  21. souleyez/parsers/nmap_parser.py +48 -27
  22. souleyez/parsers/smbmap_parser.py +39 -23
  23. souleyez/parsers/sqlmap_parser.py +18 -9
  24. souleyez/parsers/theharvester_parser.py +21 -13
  25. souleyez/plugins/http_fingerprint.py +598 -0
  26. souleyez/plugins/nuclei.py +41 -17
  27. souleyez/ui/interactive.py +96 -4
  28. souleyez/ui/setup_wizard.py +71 -0
  29. souleyez/ui/tool_setup.py +3 -0
  30. souleyez/utils/tool_checker.py +42 -2
  31. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/METADATA +20 -3
  32. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/RECORD +36 -32
  33. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/WHEEL +0 -0
  34. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/entry_points.txt +0 -0
  35. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/licenses/LICENSE +0 -0
  36. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/top_level.txt +0 -0
souleyez/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.23.0'
1
+ __version__ = '2.27.1'
@@ -0,0 +1 @@
1
+ # SoulEyez assets package
Binary file
@@ -29,15 +29,25 @@ logger = logging.getLogger(__name__)
29
29
 
30
30
  def get_msf_database_config() -> Optional[Dict[str, Any]]:
31
31
  """
32
- Get MSF database configuration from ~/.msf4/database.yml
32
+ Get MSF database configuration from ~/.msf4/database.yml or system-wide config.
33
+
34
+ Checks user config first, then falls back to system-wide config (Kali Linux).
33
35
 
34
36
  Returns:
35
37
  Dictionary with database config or None if not found/parseable
36
38
  """
37
- db_yml_path = Path.home() / ".msf4" / "database.yml"
38
-
39
- if not db_yml_path.exists():
40
- logger.debug(f"MSF database.yml not found at {db_yml_path}")
39
+ # Check user config first, then system-wide config (Kali uses system-wide)
40
+ user_db_path = Path.home() / ".msf4" / "database.yml"
41
+ system_db_path = Path('/usr/share/metasploit-framework/config/database.yml')
42
+
43
+ db_yml_path = None
44
+ if user_db_path.exists():
45
+ db_yml_path = user_db_path
46
+ elif system_db_path.exists():
47
+ db_yml_path = system_db_path
48
+
49
+ if not db_yml_path:
50
+ logger.debug("MSF database.yml not found in user or system config")
41
51
  return None
42
52
 
43
53
  try:
@@ -15,6 +15,17 @@ CATEGORY_CTF = "ctf" # Lab/learning scenarios - vulnerable by design
15
15
  CATEGORY_ENTERPRISE = "enterprise" # Real-world enterprise testing
16
16
  CATEGORY_GENERAL = "general" # Standard recon that applies everywhere
17
17
 
18
+ # Managed hosting platforms - skip CGI enumeration (pointless on these)
19
+ # These are detected from server headers/banners and product names
20
+ MANAGED_HOSTING_PLATFORMS = {
21
+ 'squarespace', 'wix', 'shopify', 'webflow', 'weebly',
22
+ 'wordpress.com', 'ghost.io', 'medium', 'tumblr', 'blogger',
23
+ 'netlify', 'vercel', 'github.io', 'pages.dev', 'cloudflare',
24
+ 'heroku', 'railway', 'render.com', 'fly.io',
25
+ 'aws cloudfront', 'akamai', 'fastly', 'cloudflare',
26
+ 'azure', 'google cloud', 'firebase',
27
+ }
28
+
18
29
  # Category display icons
19
30
  CATEGORY_ICONS = {
20
31
  CATEGORY_CTF: "🎯",
@@ -140,6 +151,75 @@ def classify_os_device(os_string: str, services: list) -> dict:
140
151
  return {'os_family': 'unknown', 'device_type': 'unknown', 'vendor': None}
141
152
 
142
153
 
154
+ def is_managed_hosting(services: List[Dict[str, Any]], http_fingerprint: Dict[str, Any] = None) -> bool:
155
+ """
156
+ Detect if target is a managed hosting platform.
157
+
158
+ These platforms don't have CGI directories, so tools like nikto
159
+ should skip CGI enumeration to avoid long, pointless scans.
160
+
161
+ Args:
162
+ services: List of service dicts from nmap parser
163
+ http_fingerprint: Optional fingerprint data from http_fingerprint plugin
164
+
165
+ Returns:
166
+ True if managed hosting detected, False otherwise
167
+ """
168
+ # Check fingerprint data first (most reliable, comes from actual HTTP headers)
169
+ if http_fingerprint:
170
+ managed = http_fingerprint.get('managed_hosting')
171
+ if managed:
172
+ return True
173
+
174
+ # Fall back to checking services data (less reliable, from nmap banners)
175
+ for service in services:
176
+ # Check product field
177
+ product = (service.get('product') or '').lower()
178
+ raw_version = (service.get('raw_version') or '').lower()
179
+ service_name = (service.get('service') or '').lower()
180
+
181
+ # Combine all fields for matching
182
+ combined = f"{product} {raw_version} {service_name}"
183
+
184
+ # Check against known managed hosting platforms
185
+ for platform in MANAGED_HOSTING_PLATFORMS:
186
+ if platform in combined:
187
+ return True
188
+
189
+ return False
190
+
191
+
192
+ def get_managed_hosting_platform(services: List[Dict[str, Any]], http_fingerprint: Dict[str, Any] = None) -> Optional[str]:
193
+ """
194
+ Get the name of the managed hosting platform if detected.
195
+
196
+ Args:
197
+ services: List of service dicts from nmap parser
198
+ http_fingerprint: Optional fingerprint data from http_fingerprint plugin
199
+
200
+ Returns:
201
+ Platform name or None
202
+ """
203
+ # Check fingerprint data first
204
+ if http_fingerprint:
205
+ managed = http_fingerprint.get('managed_hosting')
206
+ if managed:
207
+ return managed
208
+
209
+ # Fall back to services check
210
+ for service in services:
211
+ product = (service.get('product') or '').lower()
212
+ raw_version = (service.get('raw_version') or '').lower()
213
+ service_name = (service.get('service') or '').lower()
214
+ combined = f"{product} {raw_version} {service_name}"
215
+
216
+ for platform in MANAGED_HOSTING_PLATFORMS:
217
+ if platform in combined:
218
+ return platform.title()
219
+
220
+ return None
221
+
222
+
143
223
  # Technology to Nuclei tags mapping
144
224
  # Maps detected products/technologies to relevant nuclei template tags
145
225
  TECH_TO_NUCLEI_TAGS = {
@@ -511,6 +591,23 @@ class ChainRule:
511
591
  if svc_port in group.get('ports', []):
512
592
  port = str(svc_port)
513
593
  break
594
+ elif 'has:services' in self.trigger_condition:
595
+ # For has:services condition, extract port from the services array
596
+ # Prioritize HTTP services for web tools (gobuster, nuclei, etc.)
597
+ services = context.get('services', [])
598
+ http_ports = {80, 443, 8080, 8443, 8000, 8888, 3000, 5000}
599
+
600
+ # First pass: look for HTTP service by name or common HTTP ports
601
+ for svc in services:
602
+ svc_name = svc.get('service_name', '').lower()
603
+ svc_port = svc.get('port')
604
+ if svc_name == 'http' or svc_name == 'https' or svc_port in http_ports:
605
+ port = str(svc_port)
606
+ break
607
+
608
+ # Second pass: if no HTTP service, use the first service's port
609
+ if not port and services:
610
+ port = str(services[0].get('port', ''))
514
611
 
515
612
  # Calculate subnet for {subnet} placeholder (e.g., 10.0.0.88 → 10.0.0.0/24)
516
613
  subnet = ''
@@ -575,6 +672,25 @@ class ChainRule:
575
672
  new_args.append(arg)
576
673
  args = new_args
577
674
 
675
+ # For Nikto: Skip CGI enumeration on managed hosting platforms
676
+ # This prevents long, pointless scans on Squarespace, Wix, etc.
677
+ if self.target_tool == 'nikto':
678
+ services = context.get('services', [])
679
+ http_fingerprint = context.get('http_fingerprint', {})
680
+ if is_managed_hosting(services, http_fingerprint):
681
+ # Add -C none to skip CGI dirs (pointless on managed hosting)
682
+ if '-C' not in str(args):
683
+ args.extend(['-C', 'none'])
684
+ # Add -Tuning x6 to skip remote file inclusion tests
685
+ if '-Tuning' not in str(args):
686
+ args.extend(['-Tuning', 'x6'])
687
+ # Log which platform was detected
688
+ platform = get_managed_hosting_platform(services, http_fingerprint)
689
+ if platform:
690
+ from souleyez.log_config import get_logger
691
+ logger = get_logger(__name__)
692
+ logger.info(f"[FINGERPRINT] Managed hosting detected ({platform}) - nikto using optimized scan config")
693
+
578
694
  # For SQLMap with POST injections, add --data if we have POST data
579
695
  if self.target_tool == 'sqlmap' and post_data and '--data' not in str(args):
580
696
  # Insert --data after -u argument
@@ -642,32 +758,42 @@ class ToolChaining:
642
758
 
643
759
  # Web service discovered → run web scanners
644
760
  self.rules.extend([
645
- # Modern vulnerability scanner (Nuclei) - PRIORITY
646
- # Uses {nuclei_tags} placeholder to auto-detect tech and run relevant templates
761
+ # HTTP Fingerprinting - runs FIRST to detect WAF/CDN/managed hosting
762
+ # This enables smarter tool configuration for downstream scanners
647
763
  ChainRule(
648
764
  trigger_tool='nmap',
649
765
  trigger_condition='service:http',
766
+ target_tool='http_fingerprint',
767
+ priority=11, # Highest priority - runs before all other web tools
768
+ args_template=[],
769
+ description='Web server detected, fingerprinting for WAF/CDN/platform detection'
770
+ ),
771
+ # Nikto triggered by http_fingerprint (uses fingerprint data for smart config)
772
+ ChainRule(
773
+ trigger_tool='http_fingerprint',
774
+ trigger_condition='has:services',
775
+ target_tool='nikto',
776
+ priority=8,
777
+ args_template=['-nointeractive', '-timeout', '10'],
778
+ description='Fingerprinting complete, scanning for server misconfigurations with Nikto'
779
+ ),
780
+ # Nuclei triggered by http_fingerprint
781
+ ChainRule(
782
+ trigger_tool='http_fingerprint',
783
+ trigger_condition='has:services',
650
784
  target_tool='nuclei',
651
785
  priority=9,
652
786
  args_template=['-tags', '{nuclei_tags}', '-severity', 'critical,high', '-rate-limit', '50', '-c', '10', '-timeout', '10'],
653
- description='Web server detected (HTTP/HTTPS), scanning with Nuclei'
787
+ description='Fingerprinting complete, scanning with Nuclei'
654
788
  ),
789
+ # Gobuster triggered by http_fingerprint
655
790
  ChainRule(
656
- trigger_tool='nmap',
657
- trigger_condition='service:http',
791
+ trigger_tool='http_fingerprint',
792
+ trigger_condition='has:services',
658
793
  target_tool='gobuster',
659
794
  priority=7,
660
795
  args_template=['dir', '-u', 'http://{target}:{port}', '-w', 'data/wordlists/web_dirs_common.txt', '-x', 'js,json,php,asp,aspx,html,txt,bak,old,zip', '--no-error', '--timeout', '30s', '-t', '5', '--delay', '20ms'],
661
- description='Web server detected (HTTP/HTTPS), discovering directories and files'
662
- ),
663
- # Nikto - web server vulnerability scanner (complements nuclei)
664
- ChainRule(
665
- trigger_tool='nmap',
666
- trigger_condition='service:http',
667
- target_tool='nikto',
668
- priority=8,
669
- args_template=['-nointeractive', '-timeout', '10'],
670
- description='Web server detected, scanning for server misconfigurations with Nikto'
796
+ description='Fingerprinting complete, discovering directories and files'
671
797
  ),
672
798
  # Dalfox - XSS scanner triggered after gobuster finds pages
673
799
  ChainRule(
@@ -746,17 +872,8 @@ class ToolChaining:
746
872
  args_template=['-a', '{target}'],
747
873
  description='SMB service detected, enumerating shares and users (runs after CrackMapExec)'
748
874
  ),
749
- # DISABLED: smbmap has upstream pickling bug with impacket (affects all versions)
750
- # Use crackmapexec/netexec --shares instead (rule #10 above)
751
- ChainRule(
752
- trigger_tool='nmap',
753
- trigger_condition='service:smb',
754
- target_tool='smbmap',
755
- priority=7,
756
- enabled=False, # Disabled due to impacket pickling bug
757
- args_template=['-H', '{target}'],
758
- description='SMB service detected, mapping shares (DISABLED - use netexec)'
759
- ),
875
+ # NOTE: smbmap removed - has upstream impacket pickling bug on Python 3.13+
876
+ # Use crackmapexec/netexec --shares instead (enum4linux rule above)
760
877
  ])
761
878
 
762
879
  # Active Directory attacks - smart chaining workflow
souleyez/docs/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 2.23.0
4
- **Last Updated:** January 7, 2026
3
+ **Version:** 2.27.1
4
+ **Last Updated:** January 8, 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.
@@ -748,4 +748,4 @@ rm ~/.souleyez/config.json && souleyez --version
748
748
 
749
749
  ---
750
750
 
751
- **Last Updated:** 2026-01-04 | **Version:** 2.6.0
751
+ **Last Updated:** 2026-01-09 | **Version:** 2.27.1
@@ -22,6 +22,17 @@ This guide walks you through installing souleyez on your system. The process tak
22
22
  - **RAM Usage**: Running multiple heavy tools (Metasploit, SQLMap, Hashcat) simultaneously requires additional RAM
23
23
  - **Disk I/O**: SSD recommended for database operations and log processing
24
24
 
25
+ > **🐉 Kali Linux Recommended**
26
+ >
27
+ > SoulEyez performs significantly better on **Kali Linux** than other distributions:
28
+ > - All pentesting tools pre-installed and optimized
29
+ > - Metasploit database and RPC already configured
30
+ > - Security-focused kernel and networking stack
31
+ > - No dependency hunting or version conflicts
32
+ > - Wordlists, databases, and tool configs ready to go
33
+ >
34
+ > While Ubuntu and other Debian-based distros are supported, you may experience slower setup times and occasional tool compatibility issues.
35
+
25
36
  ### Software Requirements
26
37
 
27
38
  - **Operating System**: Linux (Kali Linux recommended, any Debian-based distro supported)