AWS - IAM & STS Unauthenticated Enum
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Καταγραφή ρόλων και ονομάτων χρηστών σε έναν λογαριασμό
Assume Role Brute-Force
Caution
Αυτή η τεχνική δεν λειτουργεί πια, καθώς είτε ο ρόλος υπάρχει είτε όχι πάντα λαμβάνετε αυτό το σφάλμα:
An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::947247140022:user/testenv is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::429217632764:role/account-balanceasdasΜπορείτε να το δοκιμάσετε εκτελώντας:
aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example
Η προσπάθεια να assume a role χωρίς τα απαραίτητα δικαιώματα προκαλεί μήνυμα σφάλματος από το AWS. Για παράδειγμα, αν δεν είστε εξουσιοδοτημένοι, το AWS μπορεί να επιστρέψει:
An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::012345678901:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::111111111111:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS
Αυτό το μήνυμα επιβεβαιώνει την ύπαρξη του role αλλά υποδεικνύει ότι η assume role policy του δεν επιτρέπει την ανάληψή του από εσάς. Αντίθετα, η προσπάθεια να αναλάβετε ένα μη-υπαρκτό role οδηγεί σε διαφορετικό σφάλμα:
An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole
Ενδιαφέρον: αυτή η μέθοδος για τη διάκριση μεταξύ υπαρχόντων και μη-υπαρχόντων roles εφαρμόζεται ακόμη και σε διαφορετικούς AWS λογαριασμούς. Με ένα έγκυρο AWS account ID και μια στοχευμένη wordlist, μπορεί κανείς να απαριθμήσει τους roles που υπάρχουν στον λογαριασμό χωρίς να αντιμετωπίσει εγγενείς περιορισμούς.
You can use this script to enumerate potential principals abusing this issue.
Πολιτικές Εμπιστοσύνης: Brute-Force Cross Account roles and users
Η διαμόρφωση ή ενημέρωση της trust policy ενός IAM role περιλαμβάνει τον ορισμό ποια AWS resources ή services επιτρέπεται να assume αυτόν τον role και να αποκτήσουν temporary credentials. Εάν ο συγκεκριμένος resource στην policy exists, η trust policy αποθηκεύεται successfully. Ωστόσο, αν ο resource does not exist, παράγεται ένα error που υποδεικνύει ότι δόθηκε invalid principal.
Warning
Σημειώστε ότι σε αυτόν τον resource μπορείτε να καθορίσετε έναν cross account role ή user:
arn:aws:iam::acc_id:role/role_namearn:aws:iam::acc_id:user/user_name
Αυτό είναι ένα παράδειγμα policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::216825089941:role/Test"
},
"Action": "sts:AssumeRole"
}
]
}
GUI
Αυτό είναι το σφάλμα που θα βρείτε αν χρησιμοποιήσετε έναν role που δεν υπάρχει. Αν ο role υπάρχει, η policy θα αποθηκευτεί χωρίς κανένα σφάλμα. (Το σφάλμα αφορά την ενημέρωση, αλλά λειτουργεί και κατά τη δημιουργία)
.png)
CLI
### You could also use: aws iam update-assume-role-policy
# When it works
aws iam create-role --role-name Test-Role --assume-role-policy-document file://a.json
{
"Role": {
"Path": "/",
"RoleName": "Test-Role",
"RoleId": "AROA5ZDCUJS3DVEIYOB73",
"Arn": "arn:aws:iam::947247140022:role/Test-Role",
"CreateDate": "2022-05-03T20:50:04Z",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::316584767888:role/account-balance"
},
"Action": [
"sts:AssumeRole"
]
}
]
}
}
}
# When it doesn't work
aws iam create-role --role-name Test-Role2 --assume-role-policy-document file://a.json
An error occurred (MalformedPolicyDocument) when calling the CreateRole operation: Invalid principal in policy: "AWS":"arn:aws:iam::316584767888:role/account-balanceefd23f2"
Μπορείς να αυτοματοποιήσεις αυτή τη διαδικασία με https://github.com/carlospolop/aws_tools
bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt
Ή χρησιμοποιώντας το Pacu:
run iam__enum_users --role-name admin --account-id 229736458923 --word-list /tmp/names.txtrun iam__enum_roles --role-name admin --account-id 229736458923 --word-list /tmp/names.txt- Ο ρόλος
adminπου χρησιμοποιείται στο παράδειγμα είναι ένας role στον λογαριασμό σου που το pacu θα υποδυθεί για να δημιουργήσει τις πολιτικές που χρειάζεται για την enumeration
Privesc
Σε περίπτωση που ο ρόλος ήταν λανθασμένα διαμορφωμένος και επιτρέπει σε οποιονδήποτε να τον αναλάβει:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole"
}
]
}
Ο επιτιθέμενος θα μπορούσε απλώς να το αναλάβει.
Ομοσπονδία OIDC τρίτου μέρους
Φανταστείτε ότι καταφέρνετε να διαβάσετε ένα Github Actions workflow που έχει πρόσβαση σε έναν role μέσα στο AWS.
Αυτή η εμπιστοσύνη μπορεί να δώσει πρόσβαση σε έναν role με την ακόλουθη trust policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<acc_id>:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
}
}
}
]
}
Αυτή η πολιτική εμπιστοσύνης μπορεί να είναι σωστή, αλλά η έλλειψη περισσότερων συνθηκών θα πρέπει να σας κάνει να την αμφισβητήσετε.
Αυτό συμβαίνει επειδή ο προηγούμενος ρόλος μπορεί να αναληφθεί από οποιοσδήποτε από το Github Actions! Πρέπει επίσης να προσδιορίσετε στις συνθήκες και άλλα πράγματα όπως org name, repo name, env, brach…
Μια άλλη πιθανή λανθασμένη διαμόρφωση είναι να προσθέσετε μια συνθήκη όπως η ακόλουθη:
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:org_name*:*"
}
Σημειώστε ότι το wildcard (*) βρίσκεται πριν από την colon (:). Μπορείτε να δημιουργήσετε ένα org όπως org_name1 και να assume the role από ένα Github Action.
Αναφορές
- https://www.youtube.com/watch?v=8ZXRw4Ry3mQ
- https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

