# AWS - S3, Athena & Glacier Enum

{{#include ../../../banners/hacktricks-training.md}}

## S3

Amazon S3 je usluga koja vam omogućava da **čuvate velike količine podataka**.

Amazon S3 pruža više opcija za postizanje **zaštite** podataka u mirovanju. Opcije uključuju **Dozvolu** (Politiku), **Enkripciju** (Klijentsku i Serversku stranu), **Verzionisanje kanti** i **MFA** **zasnovano brisanje**. **Korisnik može omogućiti** bilo koju od ovih opcija za postizanje zaštite podataka. **Replikacija podataka** je interna funkcija AWS-a gde **S3 automatski replicira svaki objekat širom svih dostupnih zona** i organizacija je ne mora omogućiti u ovom slučaju.

Sa dozvolama zasnovanim na resursima, možete odvojeno definisati dozvole za poddirektorijume vaše kante.

### Verzionisanje kanti i MFA zasnovano brisanje

Kada je verzionisanje kanti omogućeno, svaka akcija koja pokušava da izmeni datoteku unutar datoteke generisaće novu verziju datoteke, zadržavajući takođe prethodni sadržaj iste. Stoga, neće prepisati njen sadržaj.

Štaviše, MFA zasnovano brisanje će sprečiti verzije datoteka u S3 kanti da budu obrisane i takođe će sprečiti onemogućavanje verzionisanja kanti, tako da napadač neće moći da menja ove datoteke.

### S3 pristupni logovi

Moguće je **omogućiti S3 pristupne logove** (koji su po defaultu onemogućeni) za neku kantu i sačuvati logove u drugoj kanti kako biste znali ko pristupa kanti (obe kante moraju biti u istoj regiji).

### S3 Presigned URL-ovi

Moguće je generisati presigned URL koji se obično može koristiti za **pristup određenoj datoteci** u kanti. **Presigned URL izgleda ovako**:
```
https://<bucket-name>.s3.us-east-1.amazonaws.com/asd.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAUUE8GZC4S5L3TY3P%2F20230227%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230227T142551Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJHMEUCIBhQpdETJO3HKKDk2hjNIrPWwBE8gZaQccZFV3kCpPCWAiEAid3ueDtFFU%2FOQfUpvxYTGO%2BHoS4SWDMUrQAE0pIaB40qggMIYBAAGgwzMTgxNDIxMzg1NTMiDJLI5t7gr2EGxG1Y5CrfAioW0foHIQ074y4gvk0c%2B%2Fmqc7cNWb1njQslQkeePHkseJ3owzc%2FCwkgE0EuZTd4mw0aJciA2XIbJRCLPWTb%2FCBKPnIMJ5aBzIiA2ltsiUNQTTUxYmEgXZoJ6rFYgcodnmWW0Et4Xw59UlHnCDB2bLImxPprriyCzDDCD6nLyp3J8pFF1S8h3ZTJE7XguA8joMs4%2B2B1%2FeOZfuxXKyXPYSKQOOSbQiHUQc%2BFnOfwxleRL16prWk1t7TamvHR%2Bt3UgMn5QWzB3p8FgWwpJ6GjHLkYMJZ379tkimL1tJ7o%2BIod%2FMYrS7LDCifP9d%2FuYOhKWGhaakPuJKJh9fl%2B0vGl7kmApXigROxEWon6ms75laXebltsWwKcKuYca%2BUWu4jVJx%2BWUfI4ofoaGiCSaKALTqwu4QNBRT%2BMoK6h%2BQa7gN7JFGg322lkxRY53x27WMbUE4unn5EmI54T4dWt1%2Bg8ljDS%2BvKfBjqmAWRwuqyfwXa5YC3xxttOr3YVvR6%2BaXpzWtvNJQNnb6v0uI3%2BTtTexZkJpLQYqFcgZLQSxsXWSnf988qvASCIUhAzp2UnS1uqy7QjtD5T73zksYN2aesll7rvB80qIuujG6NOdHnRJ2M5%2FKXXNo1Yd15MtzPuSjRoSB9RSMon5jFu31OrQnA9eCUoawxbB0nHqwK8a43CKBZHhA8RoUAJW%2B48EuFsp3U%3D&X-Amz-Signature=3436e4139e84dbcf5e2e6086c0ebc92f4e1e9332b6fda24697bc339acbf2cdfa
```
URL sa prethodnim potpisom može biti **napravljen iz cli koristeći akreditive subjekta koji ima pristup objektu** (ako nalog koji koristite nema pristup, biće kreirana kraća URL sa prethodnim potpisom, ali će biti beskorisna)
```bash
aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'
```
> [!NOTE]
> Jedina potrebna dozvola za generisanje presignirane URL adrese je dozvola koja se daje, tako da je za prethodnu komandu jedina dozvola koja je potrebna principalu `s3:GetObject`

Takođe je moguće kreirati presignirane URL adrese sa **drugim dozvolama**:
```python
import boto3
url = boto3.client('s3').generate_presigned_url(
ClientMethod='put_object',
Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600
)
```
### S3 Encryption Mechanisms

**DEK znači Ključ za enkripciju podataka** i to je ključ koji se uvek generiše i koristi za enkripciju podataka.

<details>

<summary><strong>Enkripcija na strani servera sa S3 upravljanim ključevima, SSE-S3</strong></summary>

Ova opcija zahteva minimalnu konfiguraciju i svu upravu nad ključevima za enkripciju vrši AWS. Sve što treba da uradite je da **otpremite svoje podatke i S3 će se pobrinuti za sve ostale aspekte**. Svakom bucket-u u S3 nalogu dodeljuje se ključ bucket-a.

- Enkripcija:
- Podaci objekta + kreirani plaintext DEK --> Enkriptovani podaci (smešteni unutar S3)
- Kreirani plaintext DEK + S3 Master Key --> Enkriptovani DEK (smešten unutar S3) i plaintext se briše iz memorije
- Dekripcija:
- Enkriptovani DEK + S3 Master Key --> Plaintext DEK
- Plaintext DEK + Enkriptovani podaci --> Podaci objekta

Napomena: u ovom slučaju **ključ upravlja AWS** (rotacija samo svake 3 godine). Ako koristite svoj ključ, moći ćete da rotirate, onemogućite i primenite kontrolu pristupa.

</details>

<details>

<summary><strong>Enkripcija na strani servera sa KMS upravljanim ključevima, SSE-KMS</strong></summary>

Ova metoda omogućava S3 da koristi servis za upravljanje ključevima za generisanje vaših ključeva za enkripciju podataka. KMS vam daje mnogo veću fleksibilnost u upravljanju vašim ključevima. Na primer, možete onemogućiti, rotirati i primeniti kontrole pristupa na CMK, i narediti protiv njihove upotrebe koristeći AWS Cloud Trail.

- Enkripcija:
- S3 zahteva ključeve podataka od KMS CMK
- KMS koristi CMK za generisanje para DEK plaintext i DEK enkriptovanog i šalje ih S3
- S3 koristi plaintext ključ za enkripciju podataka, čuva enkriptovane podatke i enkriptovani ključ i briše plaintext ključ iz memorije
- Dekripcija:
- S3 traži od KMS da dekriptuje enkriptovani ključ podataka objekta
- KMS dekriptuje ključ podataka sa CMK i vraća ga S3
- S3 dekriptuje podatke objekta

</details>

<details>

<summary><strong>Enkripcija na strani servera sa ključevima koje obezbeđuje korisnik, SSE-C</strong></summary>

Ova opcija vam daje priliku da obezbedite svoj vlastiti master ključ koji možda već koristite van AWS-a. Vaš ključ koji obezbeđuje korisnik biće poslat sa vašim podacima u S3, gde će S3 izvršiti enkripciju za vas.

- Enkripcija:
- Korisnik šalje podatke objekta + Ključ korisnika u S3
- Ključ korisnika se koristi za enkripciju podataka i enkriptovani podaci se čuvaju
- takođe se čuva salted HMAC vrednost ključa korisnika za buduću validaciju ključa
- ključ korisnika se briše iz memorije
- Dekripcija:
- Korisnik šalje ključ korisnika
- Ključ se validira u odnosu na HMAC vrednost koja je sačuvana
- Ključ koji obezbeđuje korisnik se zatim koristi za dekripciju podataka

</details>

<details>

<summary><strong>Enkripcija na strani klijenta sa KMS, CSE-KMS</strong></summary>

Slično SSE-KMS, ovo takođe koristi servis za upravljanje ključevima za generisanje vaših ključeva za enkripciju podataka. Međutim, ovaj put KMS se poziva putem klijenta, a ne S3. Enkripcija se zatim vrši na strani klijenta, a enkriptovani podaci se šalju u S3 na čuvanje.

- Enkripcija:
- Klijent zahteva ključ podataka od KMS
- KMS vraća plaintext DEK i enkriptovani DEK sa CMK
- Obe ključeve šalje nazad
- Klijent zatim enkriptuje podatke sa plaintext DEK i šalje S3 enkriptovane podatke + enkriptovani DEK (koji se čuva kao metapodatak enkriptovanih podataka unutar S3)
- Dekripcija:
- Enkriptovani podaci sa enkriptovanim DEK se šalju klijentu
- Klijent traži od KMS da dekriptuje enkriptovani ključ koristeći CMK i KMS vraća plaintext DEK
- Klijent sada može dekriptovati enkriptovane podatke

</details>

<details>

<summary><strong>Enkripcija na strani klijenta sa ključevima koje obezbeđuje korisnik, CSE-C</strong></summary>

Korišćenjem ovog mehanizma, možete koristiti svoje obezbeđene ključeve i koristiti AWS-SDK klijent za enkripciju vaših podataka pre slanja u S3 na čuvanje.

- Enkripcija:
- Klijent generiše DEK i enkriptuje plaintext podatke
- Zatim, koristeći svoj vlastiti prilagođeni CMK, enkriptuje DEK
- šalje enkriptovane podatke + enkriptovani DEK u S3 gde se čuva
- Dekripcija:
- S3 šalje enkriptovane podatke i DEK
- Kako klijent već ima CMK koji se koristi za enkripciju DEK, dekriptuje DEK i zatim koristi plaintext DEK za dekripciju podataka

</details>

### **Enumeracija**

Jedan od tradicionalnih glavnih načina kompromitovanja AWS organizacija počinje kompromitovanjem javno dostupnih bucket-a. **Možete pronaći** [**javne enumeratore bucket-a na ovoj stranici**](../aws-unauthenticated-enum-access/#s3-buckets)**.**
```bash
# Get buckets ACLs
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api get-object-acl --bucket <bucket-name> --key flag

# Get policy
aws s3api get-bucket-policy --bucket <bucket-name>
aws s3api get-bucket-policy-status --bucket <bucket-name> #if it's public

# list S3 buckets associated with a profile
aws s3 ls
aws s3api list-buckets

# list content of bucket (no creds)
aws s3 ls s3://bucket-name --no-sign-request
aws s3 ls s3://bucket-name --recursive

# list content of bucket (with creds)
aws s3 ls s3://bucket-name
aws s3api list-objects-v2 --bucket <bucket-name>
aws s3api list-objects --bucket <bucket-name>
aws s3api list-object-versions --bucket <bucket-name>

# copy local folder to S3
aws s3 cp MyFolder s3://bucket-name --recursive

# delete
aws s3 rb s3://bucket-name –-force

# download a whole S3 bucket
aws s3 sync s3://<bucket>/ .

# move S3 bucket to different location
aws s3 sync s3://oldbucket s3://newbucket --source-region us-west-1

# list the sizes of an S3 bucket and its contents
aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"

# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
##JSON policy example
{
"Id": "Policy1568185116930",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1568184932403",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome",
"Principal": "*"
},
{
"Sid": "Stmt1568185007451",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome/*",
"Principal": "*"
}
]
}

# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name> # Way 1 to get the ACL
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json

aws s3api get-object-acl --bucket <bucket-name> --key flag #Way 2 to get the ACL
aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-policy file://objacl.json

##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL
```
### dual-stack <a href="#dual-stack-endpoints-description" id="dual-stack-endpoints-description"></a>

Možete pristupiti S3 bucket-u putem dual-stack endpoint-a koristeći virtualni hosted-style ili path-style endpoint naziv. Ovi su korisni za pristup S3 putem IPv6.

Dual-stack endpoint-i koriste sledeću sintaksu:

- `bucketname.s3.dualstack.aws-region.amazonaws.com`
- `s3.dualstack.aws-region.amazonaws.com/bucketname`

### Privesc

Na sledećoj stranici možete proveriti kako da **zloupotrebite S3 dozvole za eskalaciju privilegija**:

{{#ref}}
../aws-privilege-escalation/aws-s3-privesc.md
{{#endref}}

### Neautentifikovani pristup

{{#ref}}
../aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md
{{#endref}}

### S3 Post Eksploatacija

{{#ref}}
../aws-post-exploitation/aws-s3-post-exploitation.md
{{#endref}}

### Postojanost

{{#ref}}
../aws-persistence/aws-s3-persistence.md
{{#endref}}

## Ostale S3 ranjivosti

### S3 HTTP Cache Poisoning Issue <a href="#heading-s3-http-desync-cache-poisoning-issue" id="heading-s3-http-desync-cache-poisoning-issue"></a>

[**Prema ovom istraživanju**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-s3-http-desync-cache-poisoning-issue) bilo je moguće keširati odgovor proizvoljnog bucket-a kao da pripada drugom. Ovo se moglo zloupotrebiti za promenu, na primer, odgovora javascript datoteka i kompromitovanje proizvoljnih stranica koristeći S3 za skladištenje statičkog koda.

## Amazon Athena

Amazon Athena je interaktivna usluga za upite koja olakšava **analizu podataka** direktno u Amazon Simple Storage Service (Amazon **S3**) **koristeći** standardni **SQL**.

Treba da **pripremite relacijsku DB tabelu** sa formatom sadržaja koji će se pojaviti u nadgledanim S3 bucket-ima. A zatim, Amazon Athena će moći da popuni DB iz logova, tako da možete da upitujete.

Amazon Athena podržava **mogućnost upita nad S3 podacima koji su već enkriptovani** i ako je konfigurisan da to uradi, **Athena takođe može enkriptovati rezultate upita koji se zatim mogu skladištiti u S3**.

**Ova enkripcija rezultata je nezavisna od osnovnih upitanih S3 podataka**, što znači da čak i ako S3 podaci nisu enkriptovani, upitani rezultati mogu biti enkriptovani. Nekoliko tačaka na koje treba obratiti pažnju je da Amazon Athena podržava samo podatke koji su **enkriptovani** sa **sledećim S3 metodama enkripcije**, **SSE-S3, SSE-KMS, i CSE-KMS**.

SSE-C i CSE-E nisu podržani. Pored ovoga, važno je razumeti da Amazon Athena može izvršavati upite samo nad **enkripovanim objektima koji su u istoj regiji kao i sam upit**. Ako trebate da upitujete S3 podatke koji su enkriptovani koristeći KMS, tada su potrebne specifične dozvole za Athena korisnika kako bi im omogućili izvršavanje upita.

### Enumeration
```bash
# Get catalogs
aws athena list-data-catalogs

# Get databases inside catalog
aws athena list-databases --catalog-name <catalog-name>
aws athena list-table-metadata --catalog-name <catalog-name> --database-name <db-name>

# Get query executions, queries and results
aws athena list-query-executions
aws athena get-query-execution --query-execution-id <id> # Get query and meta of results
aws athena get-query-results --query-execution-id <id> # This will rerun the query and get the results

# Get workgroups & Prepared statements
aws athena list-work-groups
aws athena list-prepared-statements --work-group <wg-name>
aws athena get-prepared-statement --statement-name <name> --work-group <wg-name>

# Run query
aws athena start-query-execution --query-string <query>
```
## Reference

- [https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3](https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3)
- [https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html)

{{#include ../../../banners/hacktricks-training.md}}
