Lucene search
+L

Enumerate AWS IAM

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

KittySploit module to enumerate AWS IAM users, roles, groups, and policies.

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

"""
AWS IAM Enumeration Module
Author: KittySploit Team
Version: 1.0.0

This module enumerates IAM users, roles, policies, and permissions.
"""

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

class Module(Post):
    """Enumerate AWS IAM users, roles, and policies"""
    
    __info__ = {
        "name": "Enumerate AWS IAM",
        "description": "Enumerate IAM users, roles, groups, and policies",
        "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_users = OptBool(True, "Enumerate IAM users", False)
    enum_roles = OptBool(True, "Enumerate IAM roles", False)
    enum_groups = OptBool(True, "Enumerate IAM groups", False)
    enum_policies = OptBool(True, "Enumerate IAM policies", False)
    enum_attached_policies = OptBool(True, "Enumerate attached policies for users/roles", False)
    check_permissions = OptBool(True, "Check current user permissions", False)
    output_file = OptString("", "Output file to save results (JSON format)", False)
    
    def run(self):
        """Run the IAM enumeration"""
        try:
            results = {}
            
            print_info("Starting AWS IAM enumeration...")
            print_info("=" * 80)
            
            # Check current identity
            if self.check_permissions:
                print_info("\n[1] Checking current IAM identity...")
                identity = self._get_caller_identity()
                if identity:
                    results['identity'] = identity
                    print_success(f"Current identity: {identity.get('Arn', 'Unknown')}")
                    print_info(f"  User ID: {identity.get('UserId', 'Unknown')}")
                    print_info(f"  Account: {identity.get('Account', 'Unknown')}")
                else:
                    print_warning("Could not retrieve IAM identity")
            
            # Enumerate users
            if self.enum_users:
                print_info("\n[2] Enumerating IAM users...")
                users = self._enum_users()
                if users:
                    results['users'] = users
                    print_success(f"Found {len(users)} IAM users")
                    for user in users[:10]:  # Show first 10
                        print_info(f"  - {user.get('UserName', 'Unknown')} ({user.get('UserId', 'Unknown')})")
                    if len(users) > 10:
                        print_info(f"  ... and {len(users) - 10} more")
                else:
                    print_info("No users found or access denied")
            
            # Enumerate roles
            if self.enum_roles:
                print_info("\n[3] Enumerating IAM roles...")
                roles = self._enum_roles()
                if roles:
                    results['roles'] = roles
                    print_success(f"Found {len(roles)} IAM roles")
                    for role in roles[:10]:  # Show first 10
                        print_info(f"  - {role.get('RoleName', 'Unknown')} ({role.get('RoleId', 'Unknown')})")
                    if len(roles) > 10:
                        print_info(f"  ... and {len(roles) - 10} more")
                else:
                    print_info("No roles found or access denied")
            
            # Enumerate groups
            if self.enum_groups:
                print_info("\n[4] Enumerating IAM groups...")
                groups = self._enum_groups()
                if groups:
                    results['groups'] = groups
                    print_success(f"Found {len(groups)} IAM groups")
                    for group in groups:
                        print_info(f"  - {group.get('GroupName', 'Unknown')}")
                else:
                    print_info("No groups found or access denied")
            
            # Enumerate policies
            if self.enum_policies:
                print_info("\n[5] Enumerating IAM policies...")
                policies = self._enum_policies()
                if policies:
                    results['policies'] = policies
                    print_success(f"Found {len(policies)} IAM policies")
                    for policy in policies[:10]:  # Show first 10
                        print_info(f"  - {policy.get('PolicyName', 'Unknown')} ({policy.get('Arn', 'Unknown')})")
                    if len(policies) > 10:
                        print_info(f"  ... and {len(policies) - 10} more")
                else:
                    print_info("No policies found or access denied")
            
            # Enumerate attached policies
            if self.enum_attached_policies and results.get('users'):
                print_info("\n[6] Enumerating attached policies for users...")
                for user in results['users'][:5]:  # Limit to first 5 users
                    username = user.get('UserName')
                    if username:
                        attached = self._get_user_policies(username)
                        if attached:
                            user['attached_policies'] = attached
                            print_info(f"  {username}: {len(attached)} attached policies")
            
            if self.enum_attached_policies and results.get('roles'):
                print_info("\n[7] Enumerating attached policies for roles...")
                for role in results['roles'][:5]:  # Limit to first 5 roles
                    role_name = role.get('RoleName')
                    if role_name:
                        attached = self._get_role_policies(role_name)
                        if attached:
                            role['attached_policies'] = attached
                            print_info(f"  {role_name}: {len(attached)} attached policies")
            
            # Summary
            print_info("\n" + "=" * 80)
            print_info("ENUMERATION SUMMARY")
            print_info("=" * 80)
            print_success(f"Enumerated:")
            print_info(f"  - Users: {len(results.get('users', []))}")
            print_info(f"  - Roles: {len(results.get('roles', []))}")
            print_info(f"  - Groups: {len(results.get('groups', []))}")
            print_info(f"  - Policies: {len(results.get('policies', []))}")
            
            # Save to file if requested
            if self.output_file:
                try:
                    with open(self.output_file, 'w') as f:
                        json.dump(results, 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 _get_caller_identity(self):
        """Get current IAM identity"""
        cmd = "aws sts get-caller-identity 2>/dev/null"
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                return json.loads(result)
            except:
                # Try Python boto3
                python_cmd = """
python3 -c "
import boto3, json
try:
    sts = boto3.client('sts')
    identity = sts.get_caller_identity()
    print(json.dumps(identity))
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:
                        return json.loads(result)
                    except:
                        pass
        return None
    
    def _enum_users(self):
        """Enumerate IAM users"""
        cmd = "aws iam list-users 2>/dev/null"
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                data = json.loads(result)
                return data.get('Users', [])
            except:
                pass
        
        # Try Python boto3
        python_cmd = """
python3 -c "
import boto3, json
try:
    iam = boto3.client('iam')
    response = iam.list_users()
    print(json.dumps(response.get('Users', [])))
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:
                return json.loads(result)
            except:
                pass
        return []
    
    def _enum_roles(self):
        """Enumerate IAM roles"""
        cmd = "aws iam list-roles 2>/dev/null"
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                data = json.loads(result)
                return data.get('Roles', [])
            except:
                pass
        
        # Try Python boto3
        python_cmd = """
python3 -c "
import boto3, json
try:
    iam = boto3.client('iam')
    response = iam.list_roles()
    print(json.dumps(response.get('Roles', [])))
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:
                return json.loads(result)
            except:
                pass
        return []
    
    def _enum_groups(self):
        """Enumerate IAM groups"""
        cmd = "aws iam list-groups 2>/dev/null"
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                data = json.loads(result)
                return data.get('Groups', [])
            except:
                pass
        
        # Try Python boto3
        python_cmd = """
python3 -c "
import boto3, json
try:
    iam = boto3.client('iam')
    response = iam.list_groups()
    print(json.dumps(response.get('Groups', [])))
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:
                return json.loads(result)
            except:
                pass
        return []
    
    def _enum_policies(self):
        """Enumerate IAM policies"""
        cmd = "aws iam list-policies --scope Local 2>/dev/null"
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                data = json.loads(result)
                return data.get('Policies', [])
            except:
                pass
        
        # Try Python boto3
        python_cmd = """
python3 -c "
import boto3, json
try:
    iam = boto3.client('iam')
    response = iam.list_policies(Scope='Local')
    print(json.dumps(response.get('Policies', [])))
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:
                return json.loads(result)
            except:
                pass
        return []
    
    def _get_user_policies(self, username):
        """Get attached policies for a user"""
        cmd = f"aws iam list-attached-user-policies --user-name {username} 2>/dev/null"
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                data = json.loads(result)
                return data.get('AttachedPolicies', [])
            except:
                pass
        return []
    
    def _get_role_policies(self, role_name):
        """Get attached policies for a role"""
        cmd = f"aws iam list-attached-role-policies --role-name {role_name} 2>/dev/null"
        result = self.cmd_execute(cmd)
        
        if result:
            try:
                data = json.loads(result)
                return data.get('AttachedPolicies', [])
            except:
                pass
        return []


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
0