13 KiB
AWS - S3 Post Exploitation
{{#include ../../../../banners/hacktricks-training.md}}
S3
Για περισσότερες πληροφορίες ελέγξτε:
{{#ref}} ../../aws-services/aws-s3-athena-and-glacier-enum.md {{#endref}}
Ευαίσθητες Πληροφορίες
Μερικές φορές θα μπορέσετε να βρείτε ευαίσθητες πληροφορίες σε readable μέσα στα buckets. Για παράδειγμα, terraform state secrets.
Pivoting
Διαφορετικές πλατφόρμες μπορεί να χρησιμοποιούν S3 για να αποθηκεύουν ευαίσθητα assets.
Για παράδειγμα, το airflow μπορεί να αποθηκεύει εκεί DAGs code, ή web pages μπορεί να σερβίρονται απευθείας από το S3. Ένας attacker με δικαιώματα εγγραφής θα μπορούσε να τροποποιήσει το code από το bucket για να κάνει pivot σε άλλες πλατφόρμες, ή να κάνει takeover accounts τροποποιώντας JS files.
S3 Ransomware
Σε αυτό το σενάριο, ο attacker δημιουργεί ένα KMS (Key Management Service) key στον δικό του AWS account ή σε άλλο compromised account. Έπειτα κάνει αυτό το key accessible to anyone in the world, επιτρέποντας σε οποιονδήποτε AWS user, role ή account να encrypt objects χρησιμοποιώντας αυτό το key. Ωστόσο, τα objects δεν μπορούν να decrypt.
Ο attacker εντοπίζει ένα target S3 bucket και αποκτά write-level access σε αυτό με διάφορες μεθόδους. Αυτό μπορεί να οφείλεται σε κακή ρύθμιση του bucket που το εκθέτει δημόσια ή στο ότι ο attacker απέκτησε πρόσβαση στο ίδιο το AWS environment. Συνήθως στοχεύει buckets που περιέχουν ευαίσθητες πληροφορίες όπως personally identifiable information (PII), protected health information (PHI), logs, backups και άλλα.
Για να καθορίσει αν το bucket μπορεί να στοχευτεί για ransomware, ο attacker ελέγχει τη ρύθμισή του. Αυτό περιλαμβάνει την επιβεβαίωση ότι το S3 Object Versioning είναι enabled και ότι το multi-factor authentication delete (MFA delete) είναι enabled. Αν το Object Versioning δεν είναι enabled, ο attacker μπορεί να προχωρήσει. Αν το Object Versioning είναι enabled αλλά το MFA delete είναι disabled, ο attacker μπορεί να disable Object Versioning. Αν και το Object Versioning και το MFA delete είναι enabled, γίνεται πιο δύσκολο για τον attacker να ransomware αυτό το συγκεκριμένο bucket.
Χρησιμοποιώντας το AWS API, ο attacker αντικαθιστά κάθε object στο bucket με ένα encrypted copy χρησιμοποιώντας το δικό του KMS key. Αυτό ουσιαστικά encrypts τα δεδομένα στο bucket, καθιστώντας τα inaccessible χωρίς το key.
Για να ασκήσει μεγαλύτερη πίεση, ο attacker προγραμματίζει τη διαγραφή του KMS key που χρησιμοποιήθηκε στην επίθεση. Αυτό δίνει στον στόχο ένα παράθυρο 7 ημερών για να ανακτήσει τα δεδομένα του πριν διαγραφεί το key και τα δεδομένα χαθούν μόνιμα.
Τέλος, ο attacker θα μπορούσε να ανεβάσει ένα τελικό file, συνήθως με όνομα "ransom-note.txt," το οποίο περιέχει οδηγίες για τον στόχο σχετικά με το πώς να ανακτήσει τα files του. Αυτό το file ανεβαίνει χωρίς encryption, πιθανότατα για να τραβήξει την προσοχή του στόχου και να τον ενημερώσει για την ransomware επίθεση.
SSE-C (Customer-Provided Key) Ransomware (Codefinger-like)
Μια άλλη παραλλαγή είναι η κατάχρηση του SSE-C (S3 server-side encryption με customer-provided keys). Με το SSE-C, ο client παρέχει το encryption key σε κάθε request και το AWS δεν αποθηκεύει το key. Αυτό σημαίνει ότι αν ένας attacker ξαναγράψει objects χρησιμοποιώντας το δικό του SSE-C key, τα δεδομένα του θύματος γίνονται unreadable εκτός αν το θύμα μπορεί να παρέχει αυτό το attacker-controlled key.
- Προϋποθέσεις: Compromised AWS credentials (ή οποιοδήποτε principal με τα σωστά permissions) και η δυνατότητα να rewrite objects (π.χ.
s3:PutObjectστα target keys/prefixes). Αυτό συχνά συνδυάζεται με τη δυνατότητα ρύθμισης destructive lifecycle policies (δείτε παρακάτω), π.χ.s3:PutLifecycleConfiguration. - Attack chain:
- Ο attacker δημιουργεί ένα τυχαίο 256-bit key (AES-256) και το κρατά.
- Ο attacker ξαναγράφει υπάρχοντα objects (ίδια object keys) χρησιμοποιώντας SSE-C headers, έτσι ώστε το αποθηκευμένο object να είναι πλέον encrypted με το attacker key.
- Το θύμα δεν μπορεί να download/decrypt χωρίς να παρέχει το SSE-C key (ακόμα κι αν τα IAM permissions είναι σωστά).
- Ο attacker μπορεί να διαγράψει το key (ή απλώς να μην το παρέχει ποτέ) για να κάνει τα δεδομένα unrecoverable.
Παράδειγμα (conceptual) CLI usage:
# Upload/overwrite an object encrypted with attacker-provided SSE-C key
aws s3 cp ./file s3://<BUCKET>/<KEY> \
--sse-c AES256 \
--sse-c-key <BASE64_32_BYTES>
# Download requires providing the same key again
aws s3 cp s3://<BUCKET>/<KEY> ./file \
--sse-c AES256 \
--sse-c-key <BASE64_32_BYTES>
Προσθήκη Πίεσης: Κατάχρηση του Lifecycle "Timer"
Για να αφαιρέσουν επιλογές recovery (όπως παλιές εκδόσεις), οι attackers μπορούν να συνδυάσουν SSE-C rewrites με lifecycle rules που λήγουν objects και/ή διαγράφουν noncurrent versions μετά από σύντομο χρονικό διάστημα:
s3:PutLifecycleConfigurationστο bucket επιτρέπει σε έναν attacker να προγραμματίσει διαγραφές χωρίς να εκτελεί explicit delete operations για κάθε object/version.- Αυτό είναι ιδιαίτερα impactful όταν το versioning is enabled, επειδή μπορεί να αφαιρέσει την "previous good version" που διαφορετικά θα επέτρεπε recovery.
Detection & Mitigations
- Προτιμήστε SSE-KMS (ή SSE-S3) αντί για SSE-C, εκτός αν έχετε ισχυρό operational reason για να επιτρέπετε SSE-C.
- Παρακολουθείτε/alert σε
PutObjectrequests που χρησιμοποιούν SSE-C headers (CloudTrail data events για S3). - Παρακολουθείτε/alert σε απροσδόκητο
PutBucketLifecycleConfiguration(lifecycle changes). - Παρακολουθείτε/alert σε απότομες αυξήσεις στο overwrite activity (ίδια keys ενημερώνονται γρήγορα) και σε delete-marker/version deletions.
- Περιορίστε high-risk permissions: Περιορίστε το
s3:PutObjectμόνο στα απαραίτητα prefixes· περιορίστε αυστηρά ταs3:PutLifecycleConfigurationκαιs3:PutBucketVersioning· εξετάστε την απαίτηση MFA για ευαίσθητες admin actions (όπου ισχύει) και χρησιμοποιήστε ξεχωριστούς admin roles με approvals. - Recovery posture: Χρησιμοποιήστε versioning, backups, και immutable/offline copies (S3 replication σε protected account, backup vaults, κ.λπ.)· προστατέψτε τα noncurrent versions από επιθετική διαγραφή και θωρακίστε τις lifecycle changes με SCPs / guardrails.
s3:RestoreObject
Ένας attacker με το s3:RestoreObject permission μπορεί να επανενεργοποιήσει objects που είναι archived σε Glacier ή Deep Archive, καθιστώντας τα προσωρινά προσβάσιμα. Αυτό επιτρέπει recovery και exfiltration ιστορικά archived data (backups, snapshots, logs, certifications, old secrets) που κανονικά θα ήταν εκτός εμβέλειας. Αν ο attacker συνδυάσει αυτό το permission με read permissions (π.χ. s3:GetObject), μπορεί να αποκτήσει πλήρη αντίγραφα ευαίσθητων δεδομένων.
aws s3api restore-object \
--bucket <BUCKET_NAME> \
--key <OBJECT_KEY> \
--restore-request '{
"Days": <NUMBER_OF_DAYS>,
"GlacierJobParameters": { "Tier": "Standard" }
}'
s3:Delete*
Ένας επιτιθέμενος με το δικαίωμα s3:Delete* μπορεί να διαγράψει objects, versions και ολόκληρα buckets, να διαταράξει backups και να προκαλέσει άμεση και μη αναστρέψιμη απώλεια δεδομένων, καταστροφή αποδεικτικών στοιχείων και παραβίαση backup ή recovery artifacts.
# Delete an object from a bucket
aws s3api delete-object \
--bucket <BUCKET_NAME> \
--key <OBJECT_KEY>
# Delete a specific version
aws s3api delete-object \
--bucket <BUCKET_NAME> \
--key <OBJECT_KEY> \
--version-id <VERSION_ID>
# Delete a bucket
aws s3api delete-bucket \
--bucket <BUCKET_NAME>
Καθολική κατάληψη ονόματος bucket των autonomous writers - s3:DeleteBucket
Τα ονόματα S3 bucket είναι globally unique. Αν ένας victim account έχει automated writers που συνεχίζουν να παραδίδουν δεδομένα στο arn:aws:s3:::<bucket-name> και ένας attacker μπορεί να αδειάσει/διαγράψει αυτό το bucket, ο attacker μπορεί να δημιουργήσει ξανά το ίδιο bucket name σε έναν attacker-controlled account και να λαμβάνει μελλοντικές deliveries χωρίς να αλλάξει τη upstream service configuration.
Καλά targets για review περιλαμβάνουν S3 replication destinations, Kinesis Data Firehose delivery streams, CloudWatch Logs/SNS/WAF delivery chains που καταλήγουν σε S3, και custom backup ή export jobs.
# Review S3 replication destinations on source buckets
aws s3api get-bucket-replication --bucket <SOURCE_BUCKET>
# Review Firehose S3 destinations
aws firehose describe-delivery-stream \
--delivery-stream-name <DELIVERY_STREAM_NAME>
# Empty and delete the target bucket, if permitted
aws s3 rm s3://<BUCKET_NAME> --recursive
aws s3api delete-bucket --bucket <BUCKET_NAME>
# Recreate the same globally-unique name in the attacker account
aws s3 mb s3://<BUCKET_NAME> --region <REGION>
Η πολιτική αντικατάστασης bucket πρέπει να επιτρέπει στον upstream writer να κάνει put objects. Το ακριβές principal εξαρτάται από την υπηρεσία: για παράδειγμα ένα IAM replication role, ένα Firehose delivery role, ή ένα service principal περιορισμένο με aws:SourceArn / aws:SourceAccount.
Potential Impact: σιωπηρή exfiltration μελλοντικών replicated objects, logs, telemetry, backups και pipeline artifacts σε AWS account που ελέγχει ο attacker.
Detection & Mitigation: alert για διαγραφή buckets που αναφέρονται από replication rules ή delivery streams, monitor για NoSuchBucket delivery failures που ακολουθούνται από bucket recreation, restrict το s3:DeleteBucket σε export destinations, και pin cross-account deliveries με strict bucket policies και ownership expectations.
For more info check the original research.
{{#include ../../../../banners/hacktricks-training.md}}