Merge branch 'master' into stsroles

This commit is contained in:
Kenneth Toler
2018-09-25 17:11:52 -04:00
63 changed files with 178 additions and 79 deletions

View File

@@ -6,7 +6,7 @@ import builtins
import sqlite3 import sqlite3
from sqlite3 import Error from sqlite3 import Error
from libs.sql import * from libs.aws.sql import *

View File

@@ -16,7 +16,7 @@ import pprint
import sys import sys
from libs.sql import * from libs.aws.sql import *
pp = pprint.PrettyPrinter(indent=5, width=80) pp = pprint.PrettyPrinter(indent=5, width=80)

View File

@@ -10,7 +10,7 @@ import pprint
import sys import sys
import time import time
from libs.sql import * from libs.aws.sql import *
pp = pprint.PrettyPrinter(indent=5, width=80) pp = pprint.PrettyPrinter(indent=5, width=80)

View File

@@ -11,20 +11,25 @@ regions = ['us-east-1', 'us-east-2', 'us-west-1', 'us-west-2', 'ca-central-1', '
session = boto3.Session() session = boto3.Session()
credentials = session.get_credentials() credentials = session.get_credentials()
AWS_ACCESS_KEY_ID = credentials.access_key AWS_ACCESS_KEY_ID = credentials.access_key
topics_list = {}
def list_sns_topics(): def list_sns_topics(should_i_print=True):
title = "SNS Topics" title = "SNS Topics"
print(title) if should_i_print:
print("-" * len(title)) print(title)
print("-" * len(title))
try: try:
for region in regions: for region in regions:
client = boto3.client('sns', region_name=region) client = boto3.client('sns', region_name=region)
topics = client.list_topics() topics = client.list_topics()
print(region) if should_i_print:
print("=" * len(region)) print(region)
print("=" * len(region))
if topics['Topics']: if topics['Topics']:
for topic in topics['Topics']: topics_list[region] = topics['Topics']
print(topic) if should_i_print:
for topic in topics['Topics']:
print(topic)
except botocore.exceptions.ClientError as e: except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'InvalidClientTokenId': if e.response['Error']['Code'] == 'InvalidClientTokenId':
sys.exit("The AWS KEY IS INVALID. Exiting") sys.exit("The AWS KEY IS INVALID. Exiting")
@@ -79,6 +84,20 @@ def delete_sns_topic(topic, region):
except KeyboardInterrupt: except KeyboardInterrupt:
print("CTRL-C received, exiting...") print("CTRL-C received, exiting...")
def list_all_sns_subscribers():
print("Scanning regions....")
list_sns_topics(False)
for region,topics in topics_list.items():
for topic in topics:
region_title = "Region: {}".format(region)
print(region_title)
print("=" * len(region_title))
list_sns_subscribers(topic['TopicArn'],region)
def delete_sns_subscriber(endpoint, region): def delete_sns_subscriber(endpoint, region):
try: try:
client = boto3.client('sns', region_name=region) client = boto3.client('sns', region_name=region)
@@ -90,8 +109,8 @@ def delete_sns_subscriber(endpoint, region):
print('{} : Is NOT a root key' .format(AWS_ACCESS_KEY_ID)) print('{} : Is NOT a root key' .format(AWS_ACCESS_KEY_ID))
elif e.response['Error']['Code'] == 'SubscriptionRequiredException': elif e.response['Error']['Code'] == 'SubscriptionRequiredException':
print('{} : Has permissions but isnt signed up for service - usually means you have a root account' .format(AWS_ACCESS_KEY_ID)) print('{} : Has permissions but isnt signed up for service - usually means you have a root account' .format(AWS_ACCESS_KEY_ID))
#elif e.response['Error']['Code'] == 'InvalidParameter': elif e.response['Error']['Code'] == 'InvalidParameter':
# print('The region you provided ({}) is invalid for the Subscriber endpoint. Are you sure this subscriber exists in this region?'.format(region)) print('The region you provided ({}) is invalid for the Subscriber endpoint. Are you sure this subscriber exists in this region?'.format(region))
else: else:
print("Unexpected error: {}" .format(e)) print("Unexpected error: {}" .format(e))
except KeyboardInterrupt: except KeyboardInterrupt:

View File

@@ -5,8 +5,13 @@ def list_all_files(directory):
array = [] array = []
for file in list_of_files: path ="modules"
filename_and_ext = os.path.splitext(file) for (dirpath, dirnames, filenames) in os.walk(path):
if (filename_and_ext[1] == ".py") and not (filename_and_ext[0].startswith("__")): if ( not (dirpath == os.path.basename(directory)) and
array.append(filename_and_ext[0]) (os.path.isdir(dirpath))
and not (os.path.basename(dirpath).startswith('__')) ):
for file in filenames:
list_path_name = dirpath.split('/')
if not (file.startswith('.')):
array.append(".".join(list_path_name) + "." + os.path.splitext(file)[0])
return array return array

View File

@@ -1,7 +1,7 @@
''' '''
This file is used to list lambda functions and event mappings This file is used to list lambda functions and event mappings
''' '''
from libs.aws_lambda import * from libs.aws.aws_lambda import *
def module_lambda_list_functions(): def module_lambda_list_functions():

View File

@@ -4,7 +4,7 @@ usually have to be root or be specifically assigned the
permission to get anything from this permission to get anything from this
''' '''
from libs.ce import * from libs.aws.ce import *
def module_costexplorer_get_cost_and_usage(): def module_costexplorer_get_cost_and_usage():

View File

@@ -2,7 +2,7 @@
This file is used to perform some EMR actions This file is used to perform some EMR actions
''' '''
from libs.cloudfront import * from libs.aws.cloudfront import *
def module_cloudfront_list_distributions(): def module_cloudfront_list_distributions():

View File

@@ -1,7 +1,7 @@
''' '''
This file is used to perform cloudtrail actions This file is used to perform cloudtrail actions
''' '''
from libs.cloudtrail import * from libs.aws.cloudtrail import *
def module_cloudtrail_describe_trails(): def module_cloudtrail_describe_trails():

View File

@@ -2,7 +2,7 @@
example calling cloudwatch functions example calling cloudwatch functions
decribe alarms, describe alarm history, list metrics decribe alarms, describe alarm history, list metrics
''' '''
from libs.cloudwatch import * from libs.aws.cloudwatch import *
def module_cloudwatch_describe_alarms(): def module_cloudwatch_describe_alarms():

View File

@@ -2,7 +2,7 @@
Module for interacting with the config service Module for interacting with the config service
''' '''
from libs.config import * from libs.aws.config import *
def module_config_list_all_rules(): def module_config_list_all_rules():

View File

@@ -2,7 +2,7 @@
datapipeline modules datapipeline modules
''' '''
from libs.datapipeline import * from libs.aws.datapipeline import *
def module_datapipeline_list_pipelines(): def module_datapipeline_list_pipelines():

View File

@@ -6,7 +6,7 @@ import boto3
import sqlite3 import sqlite3
from sqlite3 import Error from sqlite3 import Error
from libs.sql import * from libs.aws.sql import *
session = boto3.Session() session = boto3.Session()
credentials = session.get_credentials() credentials = session.get_credentials()
@@ -21,21 +21,21 @@ def module_show_services_by_key():
Show services for a given key service:sub_service Show services for a given key service:sub_service
example: elasticbeanstalk:DescribeEvents example: elasticbeanstalk:DescribeEvents
''' '''
results = search_recon_by_key(db_name, AWS_ACCESS_KEY_ID) results = ["{}.{}".format(r[0], r[1]) for r in search_recon_by_key(db_name, AWS_ACCESS_KEY_ID)]
print("Services enumerated for {}".format(AWS_ACCESS_KEY_ID)) print("Services enumerated for {}".format(AWS_ACCESS_KEY_ID))
for result in results: for result in sorted(results):
print("{}:{}".format(result[0], result[1])) print(result)
def module_show_services_by_key_with_date(): def module_show_services_by_key_with_date():
''' '''
Show services for a given key service:sub_service Show services for a given key service:sub_service
example: elasticbeanstalk:DescribeEvents example: elasticbeanstalk:DescribeEvents -> Date: 2018-04-18 20:36:41.791780
''' '''
results = search_recon_by_key(db_name, AWS_ACCESS_KEY_ID) results = [("{}.{}".format(r[0], r[1]), r[2]) for r in search_recon_by_key(db_name, AWS_ACCESS_KEY_ID)]
print("Services enumerated for {}".format(AWS_ACCESS_KEY_ID)) print("Services enumerated for {}".format(AWS_ACCESS_KEY_ID))
for result in results: for result, date in sorted(results, key=lambda r: r[0]):
print("{}:{} -> Date: {}".format(result[0], result[1], result[2])) print("{} -> Date: {}".format(result, date))
# same as show_sevices # same as show_sevices
@@ -45,10 +45,10 @@ def module_list_services_by_key():
Show services for a given key service:sub_service Show services for a given key service:sub_service
example: elasticbeanstalk:DescribeEvents example: elasticbeanstalk:DescribeEvents
''' '''
results = search_recon_by_key(db_name, AWS_ACCESS_KEY_ID) results = ["{}.{}".format(r[0], r[1]) for r in search_recon_by_key(db_name, AWS_ACCESS_KEY_ID)]
print("Services enumerated for {}".format(AWS_ACCESS_KEY_ID)) print("Services enumerated for {}".format(AWS_ACCESS_KEY_ID))
for result in results: for result in sorted(results):
print("{}:{}".format(result[0], result[1])) print(result)
# for a key, what services does it have listed in the DB and the date # for a key, what services does it have listed in the DB and the date
@@ -59,7 +59,7 @@ def module_list_services_by_key_with_date():
Show services for a given key service:sub_service with date Show services for a given key service:sub_service with date
example: elasticbeanstalk:DescribeEvents -> Date: 2018-04-18 20:36:41.791780 example: elasticbeanstalk:DescribeEvents -> Date: 2018-04-18 20:36:41.791780
''' '''
results = search_recon_by_key(db_name, AWS_ACCESS_KEY_ID) results = [("{}.{}".format(r[0], r[1]), r[2]) for r in search_recon_by_key(db_name, AWS_ACCESS_KEY_ID)]
print("Services enumerated for {}".format(AWS_ACCESS_KEY_ID)) print("Services enumerated for {}".format(AWS_ACCESS_KEY_ID))
for result in results: for result, date in sorted(results, key=lambda r: r[0]):
print("{}:{} -> Date: {}".format(result[0], result[1], result[2])) print("{} -> Date: {}".format(result, date))

View File

@@ -1,7 +1,7 @@
''' '''
dynamoDB examples dynamoDB examples
''' '''
from libs.dynamodb import * from libs.aws.dynamodb import *
def module_dynamodb_list_tables(): def module_dynamodb_list_tables():

View File

@@ -1,7 +1,7 @@
''' '''
dynamoDBstreams examples dynamoDBstreams examples
''' '''
from libs.dynamodbstreams import * from libs.aws.dynamodbstreams import *
def module_dynamodbstreams_list_streams(): def module_dynamodbstreams_list_streams():

View File

@@ -2,7 +2,7 @@
This file is used to perform various EC2 operations This file is used to perform various EC2 operations
''' '''
from libs.ec2 import * from libs.aws.ec2 import *
def module_ec2_describe_instances_basic(): def module_ec2_describe_instances_basic():

View File

@@ -2,7 +2,7 @@
ECR functions ECR functions
''' '''
from libs.ecr import * from libs.aws.ecr import *
def module_ecr_describe_repos(): def module_ecr_describe_repos():

View File

@@ -1,7 +1,7 @@
''' '''
This file is used to perform some ElasticBeanstalk actions This file is used to perform some ElasticBeanstalk actions
''' '''
from libs.elasticbeanstalk import * from libs.aws.elasticbeanstalk import *
''' '''

View File

@@ -2,7 +2,7 @@
This file is used to perform some EMR actions This file is used to perform some EMR actions
''' '''
from libs.emr import * from libs.aws.emr import *
def module_emr_list_clusters(): def module_emr_list_clusters():

View File

@@ -1,7 +1,7 @@
''' '''
Firehose functions Firehose functions
''' '''
from libs.firehose import * from libs.aws.firehose import *
def module_firehose_list_delivery_streams(): def module_firehose_list_delivery_streams():

View File

@@ -2,7 +2,7 @@
IAM recon functions IAM recon functions
''' '''
from libs.iam import * from libs.aws.iam import *
def module_iam_list_groups(): def module_iam_list_groups():

View File

@@ -2,8 +2,8 @@
Functions specifically related to IAM account takeover if you have root or IAM access gather user info, Functions specifically related to IAM account takeover if you have root or IAM access gather user info,
manipulate access keys or passwords, make backdoor account manipulate access keys or passwords, make backdoor account
''' '''
from libs.iam import * from libs.aws.iam import *
from libs.sts import * from libs.aws.sts import *
def module_iam_get_account_summary(): def module_iam_get_account_summary():

View File

@@ -2,7 +2,7 @@
Module for interacting with the lightsail Module for interacting with the lightsail
''' '''
from libs.lightsail import * from libs.aws.lightsail import *
def module_lightsail_get_instances(): def module_lightsail_get_instances():

View File

@@ -1,4 +1,4 @@
from libs.opsworks import * from libs.aws.opsworks import *
def module_opsworks_describe_stacks(): def module_opsworks_describe_stacks():

View File

@@ -4,7 +4,7 @@ usually have to be root or be specifically assigned the
permission to get anything from this permission to get anything from this
''' '''
from libs.pricing import * from libs.aws.pricing import *
def module_pricing_describe_services(): def module_pricing_describe_services():

View File

@@ -2,7 +2,7 @@
RDS module RDS module
''' '''
from libs.rds import * from libs.aws.rds import *
def module_rds_describe_db_instances(): def module_rds_describe_db_instances():

View File

@@ -3,14 +3,14 @@ This module handles the core recon functionality by asking all the services
that have functions that done have arguments if we can access them :-) that have functions that done have arguments if we can access them :-)
''' '''
from libs.brute import * from libs.aws.brute import *
from libs.s3 import * from libs.aws.s3 import *
# for recon_defaults # for recon_defaults
from libs.elasticbeanstalk import * from libs.aws.elasticbeanstalk import *
from libs.opsworks import * from libs.aws.opsworks import *
from libs.route53 import * from libs.aws.route53 import *
from libs.sts import * from libs.aws.sts import *
# maps to available services in boto 1.7.4 # maps to available services in boto 1.7.4

View File

@@ -2,13 +2,13 @@
route53 functions route53 functions
''' '''
from libs.route53 import * from libs.aws.route53 import *
def module_route53_list_geolocations(): def module_route53_list_geolocations():
''' '''
Route53 list geolocations Route53 list geolocations
python3 weirdAAL.py -m route53_list_geolocations -t demo python3 weirdAAL.py -m route53_list_geolocations -t demo
''' '''
list_geolocations() list_geolocations()

View File

@@ -2,7 +2,7 @@
S3 module S3 module
''' '''
from libs.s3 import * from libs.aws.s3 import *
def module_s3_get_bucket_policy(*args): def module_s3_get_bucket_policy(*args):

View File

@@ -2,7 +2,7 @@
SES module SES module
''' '''
from libs.ses import * from libs.aws.ses import *
def module_ses_list_identities(): def module_ses_list_identities():

View File

@@ -2,7 +2,7 @@
SNS module SNS module
''' '''
from libs.sns import * from libs.aws.sns import *
def module_sns_list_topics(): def module_sns_list_topics():
''' '''
@@ -22,6 +22,13 @@ def module_sns_list_subscribers(*args):
except IndexError: except IndexError:
print("Please provide a topic arn *AND* region, ex: -a arn:aws:sns:us-east-1:123456789123:sometopic,us-east-1") print("Please provide a topic arn *AND* region, ex: -a arn:aws:sns:us-east-1:123456789123:sometopic,us-east-1")
def module_sns_list_all_subscribers():
'''
Rather than listing a single topics subscribers, we'll list all topics and all subscribersself.
python3 weirdAAL.py -m sns_list_all_subscribers
'''
list_all_sns_subscribers()
def module_sns_delete_topic(*args): def module_sns_delete_topic(*args):
''' '''
SNS delete a topic. Takes two arguments - the topic arn and the region. SNS delete a topic. Takes two arguments - the topic arn and the region.

View File

@@ -2,7 +2,7 @@
SQS Modules SQS Modules
''' '''
from libs.sqs import * from libs.aws.sqs import *
def module_sqs_list_queues(): def module_sqs_list_queues():

View File

@@ -2,7 +2,7 @@
This file is used to perform some EMR actions This file is used to perform some EMR actions
''' '''
from libs.sts import * from libs.aws.sts import *
def module_sts_get_accountid(): def module_sts_get_accountid():

View File

@@ -2,7 +2,7 @@
Translate module Translate module
''' '''
from libs.translate import * from libs.aws.translate import *
def module_translate_translate_text(*text): def module_translate_translate_text(*text):

0
modules/gcp/.keep Normal file
View File

View File

@@ -6,3 +6,4 @@ python-dateutil==2.6.1
s3transfer==0.1.11 s3transfer==0.1.11
six==1.11.0 six==1.11.0
virtualenv==15.1.0 virtualenv==15.1.0
tabulate==0.8.2

0
target.txt Normal file
View File

View File

@@ -13,6 +13,9 @@ from botocore.exceptions import ClientError
from modules import * from modules import *
import sys import sys
import builtins import builtins
import re
from tabulate import tabulate
import textwrap
os.environ['AWS_SHARED_CREDENTIALS_FILE'] = '.env' os.environ['AWS_SHARED_CREDENTIALS_FILE'] = '.env'
@@ -24,19 +27,18 @@ for module in all_modules:
exec("from %s import *" % module) exec("from %s import *" % module)
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("-m", "--module", help="list the module you would like to run", action="store", type=str, required=True) parser.add_argument("-m", "--module", help="list the module you would like to run", action="store", type=str, required=False)
parser.add_argument("-t", "--target", help="Give your target a name so we can track results", action="store", type=str, required=True) parser.add_argument("-t", "--target", help="Give your target a name so we can track results", action="store", type=str, required=False)
parser.add_argument("-a", "--arguments", help="Provide a list of arguments, comma separated. Ex: arg1,arg2,arg3", action="store", type=str, required=False) parser.add_argument("-a", "--arguments", help="Provide a list of arguments, comma separated. Ex: arg1,arg2,arg3", action="store", type=str, required=False)
parser.add_argument("-l", "--list", help="list modules", action="store_true") parser.add_argument("-l", "--list", help="list modules", required=False, action="store_true")
parser.add_argument("-v", "--verbosity", help="increase output verbosity", action="store_true") parser.add_argument("-v", "--verbosity", help="increase output verbosity", action="store_true")
args = parser.parse_args() args = parser.parse_args()
# Provides us with a global var "db_name" we can access anywhere # Provides us with a global var "db_name" we can access anywhere
builtins.db_name = "weirdAAL.db" builtins.db_name = "weirdAAL.db"
# Provides us with a global var "target" we can access anywhere
builtins.target = args.target
def perform_credential_check(): def perform_credential_check():
''' '''
@@ -62,6 +64,68 @@ def method_create():
print("That module does not exist") print("That module does not exist")
exit(1) exit(1)
builtins.aws_module_methods_info = {}
builtins.gcp_module_methods_info = {}
def get_methods_for_classname(classname):
methods = []
all_methods = dir(sys.modules[classname])
for meth in all_methods:
if meth.startswith("module_"):
narg = "{}.__doc__".format(meth)
narg = eval(narg)
nhash = {}
nhash[meth] = narg
methods.append(nhash)
return methods
def make_list_of_methods(cloud_service, mod):
meths = get_methods_for_classname(mod)
if cloud_service == 'aws':
new_mod_name = re.sub("modules.aws.", "", mod)
aws_module_methods_info[new_mod_name.upper()] = meths
elif cloud_service == 'gcp':
new_mod_name = re.sub("modules.gcp.", "", mod)
gcp_module_methods_info[new_mod_name.upper()] = meths
def make_the_list():
for m in sys.modules.keys():
if (m.startswith("modules.aws")
and not (m == "modules.aws")):
make_list_of_methods("aws", m)
elif ((m.startswith("modules.gcp"))
and not (m == "modules.gcp")):
make_list_of_methods("gcp", m)
def normalize_comments(string):
string = textwrap.fill(string.strip(), 40)
return string
def make_tabulate_rows(hash, cloud_provider):
entire_contents = []
for (key) in hash:
for item in hash[key]:
for (k,v) in item.items():
normalized_comment = normalize_comments(v)
entire_contents.append([cloud_provider, key, k, normalized_comment])
return entire_contents
def print_the_list():
aws_rows = make_tabulate_rows(aws_module_methods_info, 'AWS')
gcp_rows = make_tabulate_rows(gcp_module_methods_info, 'GCP')
print(tabulate(aws_rows, headers=['Cloud Provider', 'Service', 'Mod', 'Desc']))
print(tabulate(gcp_rows, headers=['Cloud Provider', 'Service', 'Mod', 'Desc']))
if (args.list):
make_the_list()
print_the_list()
sys.exit(1)
# Need to figure out if we have keys in the ENV or not # Need to figure out if we have keys in the ENV or not
try: try:
@@ -70,9 +134,6 @@ except:
print("Check the above error message and fix to use weirdAAL") print("Check the above error message and fix to use weirdAAL")
sys.exit(1) sys.exit(1)
if (args.list):
pass
# arg_list has to be defined otherwise will cause an exception # arg_list has to be defined otherwise will cause an exception
arg_list = None arg_list = None
@@ -82,12 +143,18 @@ if (args.arguments):
# We need the user to tell us the module they want to proceed on # We need the user to tell us the module they want to proceed on
if (args.module): if (args.module):
arg = method_create() if not (args.target):
if callable(arg): print("Use -t to give your target a name so we can track results!!!")
if arg_list: sys.exit(1)
arg(arg_list) else:
else: # Provides us with a global var "target" we can access anywhere
arg() builtins.target = args.target
arg = method_create()
if callable(arg):
if arg_list:
arg(arg_list)
else:
arg()
# Allow the user to specify verbosity for debugging # Allow the user to specify verbosity for debugging