diff --git a/aws_service_enum/README.md b/aws_service_enum/README.md index a4786ce..04f294b 100644 --- a/aws_service_enum/README.md +++ b/aws_service_enum/README.md @@ -6,6 +6,10 @@ This tool is helpful in scenarios where you got AWS credentials (`AWS_ACCESS_KEY ## Usage +- **aws_enum_services.py**: This option allows the script to utilize default AWS credentials stored in the credentials file. +- **aws_enum_services.py --profile**: Users can specify a profile option from the AWS credentials file to be used by the script. +- **aws_enum_services.py --access-key ACCESS_KEY --secret-key SECRET_KEY --session-token SESSION_TOKEN**: With this option, users can manually input their AWS access key, secret key, and session token for authentication. + ~~~ usage: aws_enum_services.py [-h] [--access-key ACCESS_KEY] [--secret-key SECRET_KEY] [--session-token SESSION_TOKEN] [--list-services] diff --git a/aws_service_enum/aws_enum_services.py b/aws_service_enum/aws_enum_services.py index 972b02b..d1579e3 100644 --- a/aws_service_enum/aws_enum_services.py +++ b/aws_service_enum/aws_enum_services.py @@ -5,15 +5,32 @@ from concurrent.futures import ThreadPoolExecutor, as_completed from prettytable import PrettyTable + warnings.filterwarnings("ignore", category=FutureWarning) -choices = ['ec2','s3','rds','lambda','cloudfront','dynamodb','iam','sns','sqs','ecr','elasticbeanstalk','route53','cloudwatch','codepipeline','sagemaker','secretsmanager','glue','stepfunctions','eks','cloudtrail','kinesis','redshift','elasticache', -'apigateway','cloudformation','appsync','ssm','elastictranscoder','datapipeline','mediaconvert','storagegateway','workspaces','cloud9','lex-models','iot','medialive','datasync','emr','athena','pinpoint','efs','mediapackage','mq','organizations','detective','opsworks','codecommit','appmesh','backup','mediapackage-vod','mediastore'] +choices = ['ec2','s3','rds','lambda','cloudfront','dynamodb','iam','sns','sqs','ecr','elasticbeanstalk','route53','cloudwatch','codepipeline','sagemaker','secretsmanager','glue','stepfunctions','eks','cloudtrail','kinesis','redshift','elasticache', 'ecs', +'apigateway','cloudformation','appsync','ssm','elastictranscoder','datapipeline','mediaconvert','storagegateway','workspaces','cloud9','lex-models','iot','medialive','datasync','emr','athena','pinpoint','efs','mediapackage','mq','organizations','detective','opsworks','codecommit','appmesh','backup','mediapackage-vod','mediastore', 'serverlessrepo'] + + +access_key_profile = None +secret_key_profile = None +session_token_profile = None + +session = boto3.Session() +credentials = session.get_credentials() + +if credentials: + access_key_profile = credentials.access_key + secret_key_profile = credentials.secret_key + session_token_profile = credentials.token +else: + print("Error: Configure the credentials manually or use profile. For more information, check help.") parser = argparse.ArgumentParser() -parser.add_argument('--access-key', help='Provide Access key', required=False) -parser.add_argument('--secret-key', help='Provide Secrect Key', required=False) -parser.add_argument('--session-token', help='Provide session token if available', required=False) +parser.add_argument('--access-key', help='Provide Access key', default=access_key_profile, required=False) +parser.add_argument('--secret-key', help='Provide Secrect Key', default=secret_key_profile, required=False) +parser.add_argument('--session-token', help='Provide session token if available', default=session_token_profile, required=False) +parser.add_argument('--profile', help='AWS profile name to use for credentials', required=False) parser.add_argument('--list-services', help='Provide list of services', required=False, action='store_true') parser.add_argument('--services', help='Services that need to be enumerated', nargs='+', required=False, choices=choices) parser.add_argument('--region', help='Provide regions, eg --region us-east-1, eu-north-1', required=False, nargs='+') @@ -37,7 +54,7 @@ 'apigateway', 'cloudformation', 'appsync', 'ssm', 'elastictranscoder', 'datapipeline', 'mediaconvert', 'storagegateway', 'workspaces', 'cloud9', 'lex-models', 'iot', 'medialive', 'datasync', 'emr', 'athena', 'pinpoint', 'efs', 'mediapackage', 'mq', 'organizations', - 'detective', 'opsworks', 'codecommit', 'appmesh', 'backup', 'mediapackage-vod', 'mediastore' + 'detective', 'opsworks', 'codecommit', 'appmesh', 'backup', 'mediapackage-vod', 'mediastore', 'serverlessrepo' ] table = PrettyTable() @@ -49,12 +66,21 @@ print(table) exit() +if args.profile: + session = boto3.Session(profile_name=args.profile) + credentials = session.get_credentials() + access_key = credentials.access_key + secret_key = credentials.secret_key + session_token = credentials.token +else: + access_key = args.access_key + secret_key = args.secret_key + session_token = args.session_token - -access_key = args.access_key -secret_key = args.secret_key -session_token = args.session_token +#access_key = args.access_key +#secret_key = args.secret_key +#session_token = args.session_token if args.region == None: @@ -197,25 +223,33 @@ def describe_instances(region): def list_lambda_functions(): started = "List Lambda functions:" function_data = [] - - lambda_client = get_client('lambda',region_name=None) - response = lambda_client.list_functions() - functions = response['Functions'] - - for function in functions: - function_data.append([ - function['FunctionName'], - function['Runtime'], - function['LastModified'] - ]) + def describe_lambda_functions(region): + lambda_client = get_client('lambda', region_name=region) + response = lambda_client.list_functions() + functions = response['Functions'] + for function in functions: + function_data.append([ + function['FunctionName'], + function['Runtime'], + function['LastModified'] + ]) + + processes = [] + ec2_client = boto3.client('ec2') + regions = [region['RegionName'] for region in ec2_client.describe_regions()['Regions']] + with ThreadPoolExecutor(max_workers=Thread_Count) as executor: + for region in regions: + processes.append(executor.submit(describe_lambda_functions, region)) json_body["lambda"] = function_data - - if function_data == []: + + if not function_data: print(crayons.yellow("[!] " + started + " (Empty!)", bold=True)) return - print(crayons.green("[+] " + started, bold=True), "\r\n" ,tabulate(function_data, headers=['Function Name', 'Runtime', 'Last Modified'], tablefmt='psql')) + print(crayons.green("[+] " + started, bold=True), "\r\n", + tabulate(function_data, headers=['Function Name', 'Runtime', 'Last Modified'], tablefmt='psql')) + def list_cloudfront_distributions(): started = "List CloudFront distributions:" @@ -279,14 +313,19 @@ def list_iam_users(): user_data = [] iam_client = get_client('iam') response = iam_client.list_users() - + groups = iam_client.list_groups() users = response['Users'] for user in users: + policies = [] + attached_policies = iam_client.list_attached_user_policies(UserName=user['UserName']) + for policy in attached_policies['AttachedPolicies']: + policies.append(policy['PolicyName']) user_data.append([ user['UserName'], user['UserId'], - user['Arn'] + user['Arn'], + policies # Attach policies here ]) json_body["iam"] = user_data @@ -294,7 +333,80 @@ def list_iam_users(): if user_data == []: print(crayons.yellow("[!] " + started + " (Empty!)", bold=True)) return - print(crayons.green("[+] " + started, bold=True), "\r\n" ,tabulate(user_data, headers=['Username', 'User ID', 'ARN', 'Region'], tablefmt='psql')) + print(crayons.green("[+] " + started, bold=True), "\r\n" ,tabulate(user_data, headers=['Username', 'User ID', 'ARN', 'Attached Policies'], tablefmt='psql')) + + +def list_iam_users_group(): + started = "List Group Name and Attached Policies:" + iam_client = get_client('iam') + response = iam_client.list_users() + groups = iam_client.list_groups() + roles = iam_client.list_roles()['Roles'] + user_data = [] + + policy_roles = {} + for role in roles: + attached_policies = iam_client.list_attached_role_policies(RoleName=role['RoleName']) + for policy in attached_policies['AttachedPolicies']: + policy_roles[policy['PolicyArn']] = role['RoleName'] + + for group in groups['Groups']: + attached_policies = iam_client.list_attached_group_policies(GroupName=group['GroupName']) + for policy in attached_policies['AttachedPolicies']: + user_data.append([group['GroupName'], policy['PolicyName']]) + + json_body["iam"] = user_data + + if not user_data: + print(crayons.yellow("[!] " + started + " (Empty!)", bold=True)) + return + + print(crayons.green("[+] " + started, bold=True)) + print(tabulate(user_data, headers=['Group Name', 'Attached Policies'], tablefmt='psql')) + + +def list_iam_users_roles(): + started = "List Roles and Attached Policies:" + iam_client = get_client('iam') + roles = iam_client.list_roles()['Roles'] + user_data = [] + + policy_roles = {} + for role in roles: + attached_policies = iam_client.list_attached_role_policies(RoleName=role['RoleName']) + for policy in attached_policies['AttachedPolicies']: + user_data.append([role['RoleName'], policy['PolicyName']]) + + json_body["iam"] = user_data + + if not user_data: + print(crayons.yellow("[!] " + started + " (Empty!)", bold=True)) + return + + print(crayons.green("[+] " + started, bold=True)) + print(tabulate(user_data, headers=['Role Name', 'Attached Policies'], tablefmt='psql')) + +def list_customer_managed_policies(): + started = "List Customer Managed Policies:" + iam_client = get_client('iam') + user_data = [] + + response = iam_client.list_policies(Scope='Local') + policies = response['Policies'] + + for policy in policies: + if policy['IsAttachable']: + user_data.append([policy['PolicyName'], policy['Arn']]) + + json_body["customer_managed_policies"] = user_data + + if not user_data: + print(crayons.yellow("[!] " + started + " (Empty!)", bold=True)) + return + + print(crayons.green("[+] " + started, bold=True), "\r\n", + tabulate(user_data, headers=['Policy Name', 'ARN'], tablefmt='psql')) + def list_sns_topics(): started = "List SNS topics:" @@ -384,7 +496,16 @@ def describe_applications(region): response = elasticbeanstalk_client.describe_applications() applications = response['Applications'] for application in applications: - application_data.append([application['ApplicationName'], application['DateCreated'], region]) + application_name = application['ApplicationName'] + date_created = application['DateCreated'] + + response = elasticbeanstalk_client.describe_environments(ApplicationName=application_name) + environments = response['Environments'] + + for env in environments: + environment_name = env['EnvironmentName'] + environment_url = env.get('CNAME', 'N/A') + application_data.append([application_name, date_created, region, environment_name, environment_url]) processes = [] with ThreadPoolExecutor(max_workers=Thread_Count) as executor: @@ -396,7 +517,9 @@ def describe_applications(region): return print(crayons.green("[+] " + started, bold=True), "\r\n", - tabulate(application_data, headers=['Application Name', 'Date Created', 'Region'], tablefmt='psql')) + tabulate(application_data, headers=['Application Name', 'Date Created', 'Region', 'Environment Name', 'Environment URL'], tablefmt='psql')) + + def list_route53_hosted_zones(): @@ -701,7 +824,38 @@ def get_rest_apis(region): response = apigateway_client.get_rest_apis() apis = response['items'] for api in apis: - api_data.append([api['name'], api['description'], region]) + api_data.append([api['name'], region]) + + processes = [] + with ThreadPoolExecutor(max_workers=Thread_Count) as executor: + for region in regions: + processes.append(executor.submit(get_rest_apis, region)) + + json_body["apigateway"] = api_data + + if not api_data: + print(crayons.yellow("[!] " + started + " (Empty!)", bold=True)) + return + + print(crayons.green("[+] " + started, bold=True), "\r\n", + tabulate(api_data, headers=['API Name', 'Region'], tablefmt='psql')) + + + +def list_apigateway_apis123(): + started = "List API Gateway APIs:" + api_data = [] + + def get_rest_apis(region): + apigateway_client = get_client('apigateway', region_name=region) + response = apigateway_client.get_rest_apis() + apis = response['items'] + for api in apis: + endpoint_configuration = apigateway_client.get_rest_api( + restApiId=api['id'] + )['endpointConfiguration'] + api_type = "Private" if endpoint_configuration['types'] == ['PRIVATE'] else "Public" + api_data.append([api['name'], api_type, region]) processes = [] with ThreadPoolExecutor(max_workers=Thread_Count) as executor: @@ -715,7 +869,40 @@ def get_rest_apis(region): return print(crayons.green("[+] " + started, bold=True), "\r\n", - tabulate(api_data, headers=['API Name', 'Description', 'Region'], tablefmt='psql')) + tabulate(api_data, headers=['API Name', 'Type', 'Region'], tablefmt='psql')) + + +def list_ecs_clusters(): + started = "List ECS Clusters:" + ecs_data = [] + + def get_ecs_clusters(region): + ecs_client = get_client('ecs', region_name=region) + response = ecs_client.list_clusters() + clusters = response['clusterArns'] + if not clusters: + return + + for cluster_arn in clusters: + cluster_name = cluster_arn.split('/')[-1] + ecs_data.append([cluster_name, region]) + + processes = [] + with ThreadPoolExecutor(max_workers=Thread_Count) as executor: + for region in regions: + processes.append(executor.submit(get_ecs_clusters, region)) + + json_body["ecs_clusters"] = ecs_data + + # Check if ecs_data is empty + if not any(ecs_data): + print(crayons.yellow("[!] " + started + " (Empty!)", bold=True)) + return + + print(crayons.green("[+] " + started, bold=True)) + print(tabulate(ecs_data, headers=['Cluster Name', 'Region'], tablefmt='psql')) + + def list_cloudformation_stacks(): @@ -1461,17 +1648,19 @@ def describe_snapshots_in_region(region): ec2_client = get_client('ec2', region_name=region) response = ec2_client.describe_snapshots(OwnerIds=['self']) snapshots = response['Snapshots'] - for snapshot in snapshots: snapshot_data.append([ snapshot['SnapshotId'], snapshot['VolumeId'], snapshot['StartTime'], snapshot['State'], + 'Public' if snapshot.get('Encrypted') is False else 'Private', # Check if snapshot is encrypted region ]) processes = [] + ec2_client = boto3.client('ec2') + regions = [region['RegionName'] for region in ec2_client.describe_regions()['Regions']] with ThreadPoolExecutor(max_workers=Thread_Count) as executor: for region in regions: processes.append(executor.submit(describe_snapshots_in_region, region)) @@ -1481,7 +1670,37 @@ def describe_snapshots_in_region(region): return print(crayons.green("[+] " + started, bold=True)) - print(tabulate(snapshot_data, headers=['Snapshot ID', 'Volume ID', 'Start Time', 'State', 'Region'], tablefmt='psql')) + print(tabulate(snapshot_data, headers=['Snapshot ID', 'Volume ID', 'Start Time', 'State', 'Public/Private', 'Region'], tablefmt='psql')) + + +def describe_serverless_apps(): + app_data = [] + started = "List Serverless Application:" + # Initialize SAR client + sar_client = boto3.client('serverlessrepo', region_name="us-east-1") + + # List applications + response = sar_client.list_applications() + + # Extract application data + for app in response['Applications']: + app_data.append([ + app['Name'], + app['Author'], + app['Description'], + app['CreationTime'] + ]) + + # Display application data in table format + headers = ["Name", "Author", "Description", "Creation Time"] + print(crayons.green("[+] " + started, bold=True)) + if not app_data: + print(crayons.yelow("[!] " + started + " (Empty!)", bold=True)) + else: + print(tabulate(app_data, headers=headers, tablefmt='psql')) + + + def describe_subnets(): @@ -1609,28 +1828,29 @@ def describe_security_groups_in_region(region): services_list = { - "ec2": "describe_ec2_instances","vpc":"describe_vpcs","s3": "list_s3_buckets","rds": "describe_rds_instances","lambda": "list_lambda_functions","cloudfront": "list_cloudfront_distributions","dynamodb": "list_dynamodb_tables","iam": "list_iam_users","sns": "list_sns_topics", + "ec2": "describe_ec2_instances","vpc":"describe_vpcs","s3": "list_s3_buckets","rds": "describe_rds_instances","lambda": "list_lambda_functions","cloudfront": "list_cloudfront_distributions","dynamodb": "list_dynamodb_tables","iam": "list_iam_users","iam": "list_iam_users_group", "iam": "list_iam_users_roles","iam": "list_customer_managed_policies","sns": "list_sns_topics", "sqs": "list_sqs_queues","ecr": "describe_ecr_repositories","elasticbeanstalk": "describe_elasticbeanstalk_applications","route53": "list_route53_hosted_zones","cloudwatch": "describe_cloudwatch_alarms","codepipeline": "list_codepipeline_pipelines","sagemaker": "list_sagemaker_notebooks", "secretsmanager": "list_secretsmanager_secrets","glue": "list_glue_data_catalogs","stepfunctions": "list_stepfunctions_state_machines","eks": "list_eks_clusters","cloudtrail": "describe_cloudtrail_trails","kinesis": "list_kinesis_streams","redshift": "describe_redshift_clusters", - "elasticache": "describe_elasticache_clusters","apigateway": "list_apigateway_apis","cloudformation": "list_cloudformation_stacks","appsync": "list_appsync_apis","ssm": "list_ssm_documents","elastictranscoder": "list_elastictranscoder_pipelines","datapipeline": "list_datapipeline_pipelines", + "elasticache": "describe_elasticache_clusters","apigateway": "list_apigateway_apis", "ecs": "list_ecs_clusters","cloudformation": "list_cloudformation_stacks","appsync": "list_appsync_apis","ssm": "list_ssm_documents","elastictranscoder": "list_elastictranscoder_pipelines","datapipeline": "list_datapipeline_pipelines", "mediaconvert": "list_mediaconvert_jobs","storagegateway": "list_storagegateway_gateways","workspaces": "describe_workspaces","cloud9": "list_cloud9_environments","lex-models": "list_lex_bots","iot": "list_iot_things","medialive": "list_medialive_channels","datasync": "list_datasync_tasks", "emr": "list_emr_clusters","athena": "list_athena_workgroups","pinpoint": "list_pinpoint_applications","efs": "list_efs_file_systems","mediapackage": "list_mediapackage_channels","mq": "list_mq_brokers","organizations": "list_organizations_accounts","detective": "list_detective_graphs", "opsworks": "list_opsworks_stacks","codecommit": "list_codecommit_repositories","appmesh": "list_appmesh_meshes","backup": "list_backup_plans","mediapackage-vod": "list_mediapackage_vod_assets","mediastore": "list_mediastore_containers","Snapshots":"describe_snapshots","Subnet":"describe_subnets", - "Volumes":"describe_volumes","ami":"describe_amis","SecurityGroups":"describe_security_groups" + "Volumes":"describe_volumes","ami":"describe_amis","SecurityGroups":"describe_security_groups", "serverlessrepo": "describe_serverless_apps" } functions = [ - describe_ec2_instances,describe_vpcs,list_s3_buckets,describe_rds_instances,list_lambda_functions,list_cloudfront_distributions,list_dynamodb_tables,list_iam_users,list_sns_topics,list_sqs_queues,describe_ecr_repositories,describe_elasticbeanstalk_applications,list_route53_hosted_zones, + describe_ec2_instances,describe_vpcs,list_s3_buckets,describe_rds_instances,list_lambda_functions,list_cloudfront_distributions,list_dynamodb_tables,list_iam_users,list_iam_users_group,list_iam_users_roles,list_customer_managed_policies,list_sns_topics,list_sqs_queues,describe_ecr_repositories,describe_elasticbeanstalk_applications,list_route53_hosted_zones, describe_cloudwatch_alarms,list_codepipeline_pipelines,list_sagemaker_notebooks,list_secretsmanager_secrets,list_glue_data_catalogs,list_stepfunctions_state_machines,list_eks_clusters,describe_cloudtrail_trails,list_kinesis_streams,describe_redshift_clusters, - describe_elasticache_clusters,list_apigateway_apis,list_cloudformation_stacks,list_appsync_apis,list_ssm_documents,list_elastictranscoder_pipelines,list_datapipeline_pipelines,list_mediaconvert_jobs,list_storagegateway_gateways,describe_workspaces,list_cloud9_environments, + describe_elasticache_clusters,list_apigateway_apis, list_ecs_clusters, list_cloudformation_stacks,list_appsync_apis,list_ssm_documents,list_elastictranscoder_pipelines,list_datapipeline_pipelines,list_mediaconvert_jobs,list_storagegateway_gateways,describe_workspaces,list_cloud9_environments, list_lex_bots,list_iot_things,list_medialive_channels,list_datasync_tasks,list_emr_clusters,list_athena_workgroups,list_pinpoint_applications,list_efs_file_systems,list_glue_crawlers,list_datasync_locations,list_mediapackage_channels,list_mq_brokers,list_organizations_accounts, list_detective_graphs,list_opsworks_stacks,list_codecommit_repositories,list_cloudformation_change_sets,list_appmesh_meshes,list_backup_plans,list_mediapackage_vod_assets,list_mediastore_containers,describe_snapshots, - describe_subnets,describe_volumes,describe_amis,describe_security_groups + describe_subnets,describe_volumes,describe_amis,describe_security_groups, describe_serverless_apps ] + def get_profile(): profile = get_client("sts", region_name=None) try: diff --git a/aws_service_enum/requirements.txt b/aws_service_enum/requirements.txt index f833dee..ff95e0c 100644 --- a/aws_service_enum/requirements.txt +++ b/aws_service_enum/requirements.txt @@ -1,5 +1,751 @@ -tabulate -crayons -prettytable -boto3 -requests \ No newline at end of file +aardwolf==0.2.2 +adblockparser==0.7 +AdvancedHTTPServer==2.2.0 +aesedb==0.1.3 +aiocmd==0.1.2 +aioconsole==0.7.0 +aiodns==3.1.1 +aiofiles==23.2.1 +aiohttp==3.9.1 +aiomultiprocess==0.9.0 +aioquic==0.9.25 +aioquic-mitmproxy==0.9.21.1 +aioredis==1.3.1 +aiosignal==1.3.1 +aiosmb==0.4.4 +aiosqlite==0.17.0 +aiowinreg==0.0.7 +ajpy==0.0.5 +alembic==1.13.1.dev0 +altgraph==0.17.4 +amqp==5.2.0 +aniso8601==9.0.1 +ansible==7.7.0 +ansible-core==2.14.13 +anyio==4.2.0 +anyjson==0.3.3 +apache-libcloud==3.4.1 +apispec==6.3.0 +apispec-webframeworks==0.5.2 +appdirs==1.4.4 +APScheduler==3.9.1 +arc4==0.3.0 +argcomplete==3.1.4 +argon2-cffi==21.3.0 +argon2-cffi-bindings==21.2.0 +arrow==1.2.3 +asciitree==0.3.3 +asgiref==3.7.2 +asn1crypto==1.5.1 +asn1tools==0.164.0 +asttokens==2.4.1 +asyauth==0.0.9 +async-timeout==4.0.3 +asysocks==0.2.2 +attrs==23.2.0 +Authlib==1.3.0 +autobahn==22.7.1 +autocommand==2.2.2 +Automat==22.10.0 +awscli==2.15.9 +awscrt==1.0.0.dev0 +Babel==2.10.3 +backoff==2.2.1 +bandit==1.6.2 +base58==1.0.3 +bcrypt==3.2.2 +beautifulsoup4==4.12.3 +beniget==0.4.1 +bidict==0.22.1 +billiard==4.2.0 +binwalk==2.3.3 +bitstruct==8.15.1 +bleach==6.0.0 +blinker==1.7.0 +bluepy==1.3.0 +boltons==23.0.0 +boto3==1.26.78 +botocore==1.29.78 +bottle==0.12.25 +Bottleneck==1.3.5 +bracex==2.4 +Brlapi==0.8.5 +Brotli==1.1.0 +cachetools==5.3.1 +cbor==1.0.0 +celery==5.3.4 +censys==2.2.11 +certifi==2023.7.22 +cffi==1.16.0 +chardet==5.2.0 +charset-normalizer==3.2.0 +cheroot==10.0.0+ds1 +CherryPy==18.9.0 +cherrypy-cors==1.6 +cli-helpers==2.3.0 +cliapp==1.20180812.1 +click==8.1.7 +click-didyoumean==0.3.0 +click-option-group==0.5.6 +click-plugins==1.1.1 +click-repl==0.3.0 +cmd2==2.4.3+ds +cmdtest==0.32+git +colorama==0.4.6 +commonmark==0.9.1 +configobj==5.0.8 +constantly==23.10.4 +contourpy==1.0.7 +crackmapexec==5.4.0 +crayons==0.4.0 +crit==3.17.1 +cryptography==41.0.7 +cryptography37==37.0.2 +cssselect==1.2.0 +cssselect2==0.7.0 +cssutils==2.6.0 +cvss==2.6 +cycler==0.11.0 +dbus-python==1.3.2 +debtags==2.1 +decorator==5.1.1 +defusedxml==0.7.1 +Deprecated==1.2.14 +dicttoxml==1.7.15 +dill==0.3.7 +diskcache==5.4.0 +distlib==0.3.8 +distro==1.9.0 +distro-info==1.7 +Django==4.2.4 +django-cors-headers==4.2.0 +django-filter==23.2 +django-modeltranslation==0.18.11 +django-picklefield==3.1 +django-q2==1.5.4 +djangorestframework==3.14.0 +dnslib==0.9.24 +dnspython==2.6.1 +docker==5.0.3 +docker-compose==1.29.2 +dockerpty==0.4.1 +docopt==0.6.2 +docutils==0.20.1 +donut-shellcode==0.9.3 +dparse==0.6.4b0 +drf-spectacular==0.26.4 +dropbox==11.36.2 +dsinternals==1.2.4 +ecdsa==0.18.0 +email-validator==1.3.0 +ephem==4.1.5 +et-xmlfile==1.0.1 +exceptiongroup==1.2.0 +executing==2.0.1 +ExifRead==3.0.0 +face==22.0.0 +faraday-agent-parameters-types==1.4.0 +faraday-cli==2.1.8 +faraday-plugins==1.16.0 +faradaysec==5.1.1 +fastapi==0.101.0 +feedparser==6.0.10 +fierce==1.5.0 +filedepot==0.5.2 +filelock==3.13.1 +filteralchemy==0.1.0 +flasgger==0.9.7.2.dev2 +Flask==2.2.5 +Flask-Celery-Helper==1.1.0 +Flask-Classful==0.15.0.dev1 +Flask-KVSession-fork==0.6.4 +Flask-Limiter==3.5.0 +Flask-Login==0.6.3 +Flask-Mail==0.9.1 +Flask-Principal==0.4.0 +Flask-RESTful==0.3.9 +Flask-Security-Too==5.1.2 +Flask-SocketIO==5.3.2 +Flask-SQLAlchemy==3.0.3 +Flask-WTF==1.2.1 +flatbuffers==2.0.8+dfsg1 +fonttools==4.46.0 +frozenlist==1.4.0 +fs==2.4.16 +gast==0.5.2 +GDAL==3.8.3 +geoip2==2.9.0 +geojson==3.1.0 +gevent==23.9.1 +gevent-websocket==0.10.1 +gitdb==4.0.11 +GitPython==3.1.37 +glom==22.1.0 +google-api-core==1.34.1 +google-auth==2.29.0 +google-cloud-compute==1.19.0 +google-cloud-core==2.4.1 +google-cloud-functions==1.16.3 +google-cloud-resource-manager==0.30.5 +google-cloud-storage==2.14.0 +google-crc32c==1.5.0 +google-resumable-media==2.7.0 +googleapis-common-protos==1.63.0 +gpg==1.18.0 +graphene==3.3 +graphene-sqlalchemy==2.1.2 +graphql-core==3.2.3 +graphql-relay==3.2.0 +graphviz==0.20.2.dev0 +greenlet==3.0.1 +grpc-google-iam-v1==0.13.0 +grpcio==1.63.0 +grpcio-status==1.48.2 +gunicorn==21.2.0 +gyp==0.1 +h11==0.14.0 +h2==4.1.0 +hashID==3.1.4 +hiredis==2.3.2 +hpack==4.0.0 +html2text==2020.1.16 +html5lib==1.1 +httpagentparser==1.9.1 +httpcore==1.0.2 +httplib2==0.20.4 +httpx==0.26.0 +humanize==4.9.0 +hupper==1.12 +hyperframe==6.0.0 +hyperlink==21.0.0 +icalendar==5.0.11 +idna==3.4 +impacket==0.11.0 +importlib-metadata==4.12.0 +importlib-resources==6.0.1 +incremental==22.10.0 +inflect==7.0.0 +inflection==0.5.1 +iniconfig==1.1.1 +invoke==2.0.0 +ipwhois==1.2.0 +IPy==1.1 +ipython==8.20.0 +itsdangerous==2.1.2 +jaraco.classes==3.2.1 +jaraco.collections==4.2.0 +jaraco.context==4.3.0 +jaraco.functools==4.0.0 +jaraco.text==3.11.1 +jdcal==1.0 +jedi==0.19.1 +Jinja2==3.1.2 +jmespath==1.0.1 +jq==1.2.1 +jsonpointer==2.3 +jsonschema==4.10.3 +kaitaistruct==0.10 +kali-tweaks==2023.3.2 +KismetCaptureBtGeiger==2021.7.1 +KismetCaptureFreaklabsZigbee==2018.7.0 +KismetCaptureRtl433==2020.10.1 +KismetCaptureRtladsb==2020.10.1 +KismetCaptureRtlamr==2020.10.1 +kiwisolver==0.0.0 +kombu==5.3.5 +kubernetes==27.2.0 +ldap3==2.9.1 +ldapdomaindump==0.9.4 +libevdev==0.5 +libsass==0.22.0 +lightdm-gtk-greeter-settings==1.2.2 +limits==3.6.0 +llvmlite==0.41.1 +lockfile==0.12.2 +log-symbols==0.0.14 +louis==3.28.0 +lsassy==3.1.6 +lxml==5.1.0 +lz4==4.0.2+dfsg +macholib==1.16.3 +Mako==1.3.2.dev0 +Markdown==3.4.4 +markdown-it-py==2.2.0 +MarkupSafe==2.1.3 +marshmallow==3.20.1 +marshmallow-sqlalchemy==1.0.0 +masky==0.1.1 +matplotlib==3.6.3 +matplotlib-inline==0.1.6 +maxminddb==2.5.2 +mdurl==0.1.2 +mechanize==0.4.9 +minidump==0.0.21 +minikerberos==0.4.0 +mistune0==0.8.4 +mitmproxy==10.2.2 +mitmproxy_rs==0.3.11 +mnemonic==0.19 +more-itertools==10.2.0 +mpmath==0.0.0 +msgpack==1.0.3 +msldap==0.4.7 +multidict==6.0.4 +mypy==1.5.1 +mypy-extensions==1.0.0 +mysqlclient==1.4.6 +nassl==5.0.1 +neo4j==5.2.dev0 +neobolt==1.7.17 +neotime==1.7.4 +netaddr==0.8.0 +netifaces==0.11.0 +networkx==2.8.8 +nodeenv==0.13.4 +nplusone==1.0.0 +ntlm-auth==1.4.0 +ntpsec==1.2.2 +numba==0.57.1 +numexpr==2.9.0 +numpy==1.24.2 +oauthlib==3.2.2 +objgraph==3.6.0 +odfpy==1.4.2 +olefile==0.46 +onboard==1.4.1 +openpyxl==3.1.2 +ordered-set==4.1.0 +oscrypto==1.3.0 +packaging==23.2 +pandas==1.5.3 +paramiko==2.12.0 +parso==0.8.3 +passlib==1.7.4 +Paste==3.7.1 +PasteDeploy==3.1.0 +PasteScript==3.2.1 +patator==1.0 +pbr==5.11.1 +pcapy==0.11.5.dev0 +peewee==3.17.0 +pefile==2023.2.7 +pendulum==2.1.2 +pexpect==4.9.0 +pgcli==3.5.0 +pgspecial==2.0.1 +phonenumbers==8.12.57 +Pillow==10.0.0 +plaster==1.0 +plaster-pastedeploy==0.5 +platformdirs==4.2.0 +pluggy==1.4.0 +pluginbase==1.0.1 +ply==3.11 +portend==3.1.0 +premailer==3.10.0 +prettytable==3.6.0 +promise==2.3 +prompt-toolkit==3.0.43 +proto-plus==1.23.0 +protobuf==3.20.3 +psycogreen==1.0.1 +psycopg==3.1.3 +psycopg2==2.9.9 +psycopg2-binary==2.9.7 +ptyprocess==0.7.0 +publicsuffix2==2.20191221 +publicsuffixlist==0.9.3 +pure-eval==0.0.0 +py==1.11.0 +py-sneakers==1.0.1 +py-ubjson==0.16.1 +pyarrow==11.0.0 +pyasn1==0.5.0 +pyasn1-modules==0.3.0 +pyasyncore==1.0.2 +pycairo==1.25.1 +pycares==4.4.0 +pycparser==2.21 +pycryptodome==3.18.0 +pycryptodomex==3.11.0 +pycurl==7.45.2 +pydantic==1.10.14 +PyDispatcher==2.0.5 +pydot==1.4.2 +pydyf==0.7.0 +pyee==11.1.0 +pyExploitDb==0.2.6 +pyfiglet==1.0.2 +pygame==2.5.2 +pygexf==0.2.2 +PyGithub==2.2.0 +Pygments==2.16.1 +PyGObject==3.46.0 +pygraphviz==1.7 +PyHamcrest==2.0.3 +pyinotify==0.9.6 +PyInstaller==3.5+498e6ee058 +PyJWT==2.7.0 +pykerberos==1.1.14 +pylnk3==0.4.2 +pylsqpack==0.3.18 +pymssql==2.2.11 +PyMySQL==1.0.2 +PyNaCl==1.5.0 +PyOpenGL==3.1.7 +pyOpenSSL==23.2.0 +pyotp==2.9.0 +pyparsing==3.1.1 +PyPDF2==2.12.1 +pyperclip==1.8.2 +pyphen==0.14.0 +pypng==0.20231004.0 +pyppeteer==1.0.1 +pypsrp==0.8.1 +pypykatz==0.6.6 +PyQRCode==1.2.1 +PyQt5==5.15.10 +PyQt5-sip==12.13.0 +PyQt6==6.6.1 +PyQt6-sip==13.6.0 +pyqtgraph==0.13.3 +pyramid==2.0 +pyrsistent==0.18.1 +PySecretSOCKS==0.9.1 +pyserial==3.5 +pyShodan==0.2.6 +pysmi==0.3.4 +pysnmp==4.4.12 +PySocks==1.7.1 +pyspnego==0.8.0 +pytest==7.4.4 +python-apt==2.7.5 +python-dateutil==2.8.2 +python-debian==0.1.49 +python-docx==1.1.0 +python-dotenv==1.0.1 +python-engineio==4.3.4 +python-jose==3.3.0 +python-lsp-jsonrpc==1.0.0 +python-magic==0.4.27 +python-memcached==1.58 +python-multipart==0.0.6 +python-pam==2.0.2 +python-pptx==0.6.18 +python-slugify==8.0.3 +python-snappy==0.5.3 +python-socketio==5.7.2 +python-status==1.0.1 +pythran==0.15.0 +PyTrie==0.4.0 +pytz==2023.4 +pytz-deprecation-shim==0.1.0.post0 +pytzdata==2020.1 +pyudev==0.24.0 +pyVNC==0.1 +pywerview==0.3.3 +pywinrm==0.4.3 +pyxdg==0.28 +PyYAML==6.0.1 +qrcode==7.4.2 +Quamash==0.6.1 +reactivex==0.0.0 +redis==4.3.4 +repoze.lru==0.7 +requests==2.31.0 +requests-file==1.5.1 +requests-ntlm==1.1.0 +requests-oauthlib==1.3.1 +resolvelib==1.0.1 +rest-framework-generic-relations==2.1.0 +retrying==1.3.3 +rfc3987==1.3.8 +rich==13.3.1 +roman==3.3 +Routes==2.5.1 +rq==1.15.1 +rsa==4.9 +ruamel.yaml==0.17.21 +ruamel.yaml.clib==0.2.8 +rule-engine==4.1.0 +s3transfer==0.6.0 +safety==3.0.1 +safety-schemas==0.0.2 +scapy==2.5.0 +scipy==1.10.1 +secure==0.3.0 +selinux @ file:///build/reproducible-path/libselinux-3.5/src +semgrep==1.46.0 +service-identity==24.1.0 +setproctitle==1.3.3 +sgmllib3k==1.0.0 +sh==1.14.2 +shodan==1.30.1 +simple-rest-client==1.1.3 +simplejson==3.19.2 +simplekv==0.14.1 +six==1.16.0 +slowapi==0.1.4 +smbmap==1.9.2 +smmap==6.0.0 +smoke-zephyr==2.0.1 +sniffio==1.3.0 +sortedcontainers==2.4.0 +soupsieve==2.5 +speaklater==1.4 +spinners==0.0.24 +SQLAlchemy==1.4.50 +sqlalchemy-schemadisplay==1.3 +SQLAlchemy-Utc==0.14.0 +sqlparse==0.4.4 +sslyze==5.2.0 +stack-data==0.6.3 +starlette==0.31.1 +stevedore==5.1.0 +stone==3.3.1 +stripe==7.3.0 +sympy==1.12 +syslog-rfc5424-formatter==1.2.3 +tables==3.7.0 +tabulate==0.8.10 +Tempita==0.5.2 +tempora==5.5.0 +termcolor==1.1.0 +terminaltables==3.1.10 +texttable==1.6.7 +theHarvester==4.5.1 +tinycss2==1.2.1 +tld==0.11.11 +tldextract==3.1.2 +tls-parser==1.2.2 +tomli==2.0.1 +tornado==6.4 +tqdm==4.64.1 +traitlets==5.5.0 +translationstring==1.4 +ttystatus==0.38 +tutor==12.2.0 +tutor-android==16.0.0 +tutor-discovery==16.0.0 +tutor-ecommerce==16.0.0 +tutor-forum==16.0.0 +tutor-license==16.0.0 +tutor-mfe==16.1.1 +tutor-minio==16.0.1 +tutor-notes==16.0.1 +tutor-openedx==12.2.0 +tutor-webui==16.0.0 +tutor-xqueue==16.0.1 +Twisted==23.10.0 +txaio==23.1.1 +typer==0.9.0 +types-aiofiles==23.2 +types-aws-xray-sdk==2.12 +types-beautifulsoup4==4.12 +types-bleach==6.1 +types-boltons==23.0 +types-boto==2.49 +types-braintree==4.24 +types-cachetools==5.3 +types-caldav==1.3 +types-cffi==1.16 +types-chevron==0.14 +types-click-default-group==1.2 +types-click-spinner==0.1 +types-colorama==0.4 +types-commonmark==0.9 +types-console-menu==0.8 +types-croniter==2.0 +types-dateparser==1.1 +types-decorator==5.1 +types-Deprecated==1.2 +types-dockerfile-parse==2.0 +types-docopt==0.6 +types-docutils==0.20 +types-editdistance==0.6 +types-entrypoints==0.4 +types-ExifRead==3.0 +types-first==2.0 +types-flake8-2020==1.8 +types-flake8-bugbear==23.9.16 +types-flake8-builtins==2.2 +types-flake8-docstrings==1.7 +types-flake8-plugin-utils==1.3 +types-flake8-rst-docstrings==0.3 +types-flake8-simplify==0.21 +types-flake8-typing-imports==1.15 +types-Flask-Cors==4.0 +types-Flask-Migrate==4.0 +types-Flask-SocketIO==5.3 +types-fpdf2==2.7.4 +types-gdb==12.1 +types-google-cloud-ndb==2.2 +types-greenlet==3.0 +types-hdbcli==2.18 +types-html5lib==1.1 +types-httplib2==0.22 +types-humanfriendly==10.0 +types-ibm-db==3.2 +types-influxdb-client==1.38 +types-inifile==0.4 +types-JACK-Client==0.5 +types-jmespath==1.0 +types-jsonschema==4.19 +types-keyboard==0.13 +types-ldap3==2.9 +types-libsass==0.22 +types-Markdown==3.5 +types-mock==5.1 +types-mypy-extensions==1.0 +types-mysqlclient==2.2 +types-netaddr==0.9 +types-oauthlib==3.2 +types-openpyxl==3.1 +types-opentracing==2.4 +types-paho-mqtt==1.6 +types-paramiko==3.3 +types-parsimonious==0.10 +types-passlib==1.7 +types-passpy==1.0 +types-peewee==3.17 +types-pep8-naming==0.13 +types-pexpect==4.8 +types-pika-ts==1.3 +types-Pillow==10.1 +types-playsound==1.3 +types-pluggy==1.2.0 +types-polib==1.2 +types-portpicker==1.6 +types-protobuf==4.24 +types-psutil==5.9 +types-psycopg2==2.9 +types-pyasn1==0.5 +types-pyaudio==0.2 +types-PyAutoGUI==0.9 +types-pycocotools==2.0 +types-pycurl==7.45.2 +types-pyfarmhash==0.3 +types-pyflakes==3.1 +types-Pygments==2.16 +types-pyinstaller==6.1 +types-pyjks==20.0 +types-PyMySQL==1.1 +types-pynput==1.7 +types-pyOpenSSL==23.3 +types-pyRFC3339==1.1 +types-PyScreeze==0.1.29 +types-pyserial==3.5 +types-pysftp==0.2 +types-pytest-lazy-fixture==0.6 +types-python-crontab==3.0 +types-python-datemath==1.5 +types-python-dateutil==2.8 +types-python-gflags==3.1 +types-python-jose==3.3 +types-python-nmap==0.7 +types-python-slugify==8.0 +types-python-xlib==0.33 +types-pytz==2023.3.post1 +types-pywin32==306 +types-pyxdg==0.28 +types-PyYAML==6.0 +types-qrcode==7.4 +types-redis==4.6.0 +types-regex==2023.10.3 +types-requests==2.31 +types-requests-oauthlib==1.3 +types-retry==0.9 +types-s2clientprotocol==5 +types-seaborn==0.13 +types-Send2Trash==1.8 +types-setuptools==68.2 +types-simplejson==3.19 +types-singledispatch==4.1 +types-six==1.16 +types-slumber==0.7 +types-stdlib-list==0.8 +types-stripe==3.5 +types-tabulate==0.9 +types-tensorflow==2.12 +types-toml==0.10 +types-toposort==1.10 +types-tqdm==4.66 +types-translationstring==1.4 +types-tree-sitter==0.20.1 +types-tree-sitter-languages==1.8 +types-ttkthemes==3.2 +types-tzlocal==5.1 +types-ujson==5.8 +types-untangle==1.2 +types-usersettings==1.1 +types-uWSGI==2.0 +types-vobject==0.9 +types-waitress==2.1 +types-WebOb==1.8 +types-whatthepatch==1.0 +types-workalendar==17.0 +types-WTForms==3.1 +types-xmltodict==0.13 +types-zstd==1.5 +types-zxcvbn==4.4 +typing_extensions==4.7.1 +tzlocal==5.2 +u-msgpack-python==2.3.0 +ufoLib2==0.16.0 +ujson==5.9.0 +unattended-upgrades==0.1 +unicodecsv==0.14.1 +unicodedata2==15.1.0 +unicrypto==0.0.10 +Unidecode==1.3.8 +uritemplate==4.1.1 +urllib3==1.26.16 +urwid==2.5.2 +urwid-mitmproxy==2.1.2.1 +uvicorn==0.27.0 +uvloop==0.19.0 +validators==0.20.0 +venusian==3.1.0 +vine==5.0.0 +virtualenv==20.25.0+ds +wafw00f==2.2.0 +wapiti3==3.0.4 +wcmatch==8.5 +wcwidth==0.2.5 +weasyprint==58.1 +webargs==8.0.1 +webcolors==1.11.1 +webencodings==0.5.1 +WebOb==1.8.6 +websocket-client==1.6.2 +websockets==10.4 +websockify==0.10.0 +Werkzeug==2.3.8 +wfuzz==3.1.0 +whois==0.8 +wifite==2.7.0 +winacl==0.1.7 +wrapt==1.15.0 +wsaccel==0.6.3 +wsproto==1.2.0 +WTForms==3.1.1 +xdg==5 +xdot==1.3 +xlrd==2.0.1 +XlsxWriter==3.1.9 +xlutils==2.0.0 +xlwt==1.3.0 +xmltodict==0.13.0 +yagmail==0.15.293 +yara-python==4.3.1 +yarl==1.8.2 +yaswfp==0.9.3 +zc.lockfile==2.0 +zipp==1.0.0 +zlib-wrapper==0.1.3 +zombie-imp==0.0.2 +zope.deprecation==5.0 +zope.event==5.0 +zope.interface==6.1 +zopfli==0.2.2 +zstandard==0.22.0