AWS - S3, Athena & Glacier Enum

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

S3

Amazon S3 je usluga koja vam omogućava skladištenje velikih količina podataka.

Amazon S3 pruža više opcija za postizanje zaštite podataka u mirovanju. Opcije uključuju dozvole (Politika), Enkripciju (Klijentska i serverska strana), Verzioniranje kante i MFA bazirano brisanje. Korisnik može omogućiti bilo koju od ovih opcija za postizanje zaštite podataka. Replikacija podataka je interna mogućnost od strane AWS-a gde S3 automatski replikuje svaki objekat preko svih zona dostupnosti i organizacija ne mora da je omogući u ovom slučaju.

Sa dozvolama zasnovanim na resursima, možete definisati dozvole za pod-direktorijume vaše kante zasebno.

Verzioniranje kante i MFA bazirano brisanje

Kada je verzioniranje kante omogućeno, bilo koja akcija koja pokušava da izmeni fajl unutar fajla će generisati novu verziju fajla, čuvajući takođe prethodni sadržaj istog. Stoga, neće prepisati njegov sadržaj.

Osim toga, MFA bazirano brisanje će sprečiti verzije fajlova u S3 kanti da budu obrisane i takođe onemogućiti Verzioniranje kante, tako da napadač neće moći da izmeni ove fajlove.

S3 Pristupni logovi

Moguće je omogućiti pristupne logove S3 (što je podrazumevano onemogućeno) za neku kantu i sačuvati logove u drugoj kanti kako bi se znalo ko pristupa kanti (obe kante moraju biti u istom regionu).

S3 Prepotpisani URL-ovi

Moguće je generisati prepotpisani URL koji se obično može koristiti za pristupanje određenom fajlu u kanti. Prepotpisani 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

Može se kreirati prethodno potpisani URL sa klijentske strane koristeći akreditive glavnog subjekta sa pristupom objektu (ako nalog koji koristite nema pristup, biće kreiran kraći prethodno potpisani URL ali će biti beskoristan)

aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'

Jedina potrebna dozvola za generisanje prethodno potpisanog URL-a je dozvola koja se daje, tako da je jedina dozvola potrebna od strane principala s3:GetObject

Takođe je moguće kreirati prethodno potpisane URL-ove sa drugim dozvolama:

import boto3
url = boto3.client('s3').generate_presigned_url(
ClientMethod='put_object',
Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600
)

Mehanizmi šifrovanja S3

DEK znači Data Encryption Key i ključ koji se uvek generiše i koristi za šifrovanje podataka.

Šifrovanje na strani servera sa upravljanjem ključevima S3, SSE-S3

Ova opcija zahteva minimalnu konfiguraciju i svi ključevi za šifrovanje koje koristi upravlja AWS. Sve što treba da uradite je da otpremite svoje podatke i S3 će se baviti svim ostalim aspektima. Svaki bucket u S3 nalogu dodeljen je ključu za bucket.

  • Šifrovanje:

  • Podaci objekta + kreirani plaintext DEK --> Šifrovani podaci (sačuvani unutar S3)

  • Kreirani plaintext DEK + S3 Master ključ --> Šifrovani DEK (sačuvan unutar S3) i plaintext se briše iz memorije

  • Dekripcija:

  • Šifrovani DEK + S3 Master ključ --> Plaintext DEK

  • Plaintext DEK + Šifrovani podaci --> Podaci objekta

Molimo, imajte na umu da je u ovom slučaju ključ upravljan od strane AWS-a (rotacija samo svake 3 godine). Ako koristite svoj ključ, moći ćete da vršite rotaciju, onemogućite i primenite kontrolu pristupa.

Šifrovanje na strani servera sa upravljanjem ključevima KMS, SSE-KMS

Ovaj metod omogućava S3 da koristi uslugu upravljanja ključevima za generisanje ključeva za šifrovanje podataka. KMS vam pruža mnogo veću fleksibilnost u upravljanju ključevima. Na primer, možete onemogućiti, rotirati i primeniti kontrole pristupa na CMK, i naručiti protiv njihove upotrebe koristeći AWS Cloud Trail.

  • Šifrovanje:

  • S3 zahteva ključeve podataka od KMS CMK

  • KMS koristi CMK za generisanje para plaintext DEK i šifrovanog DEK-a i šalje ih S3

  • S3 koristi plaintext ključ za šifrovanje podataka, čuva šifrovane podatke i šifrovani ključ i briše plaintext ključ iz memorije

  • Dekripcija:

  • S3 traži od KMS-a da dešifruje šifrovani ključ podataka objekta

  • KMS dešifruje ključ podataka sa CMK i šalje ga nazad S3

  • S3 dešifruje podatke objekta

Šifrovanje na strani servera sa ključevima koje pruža korisnik, SSE-C

Ova opcija vam pruža mogućnost da obezbedite svoj sopstveni master ključ koji već možda koristite van AWS-a. Vaš ključ koji je obezbedio korisnik biće zatim poslat sa vašim podacima S3, gde će S3 zatim izvršiti šifrovanje za vas.

  • Šifrovanje:

  • Korisnik šalje podatke objekta + Ključ korisnika S3

  • Ključ korisnika se koristi za šifrovanje podataka i šifrovani podaci se čuvaju

  • sačuvana je soljena HMAC vrednost ključa korisnika i za buduću validaciju ključa

  • ključ korisnika se briše iz memorije

  • Dekripcija:

  • Korisnik šalje ključ korisnika

  • Ključ se validira protiv sačuvane HMAC vrednosti

  • Ključ koji je obezbedio korisnik se zatim koristi za dešifrovanje podataka

Šifrovanje na strani klijenta sa KMS-om, CSE-KMS

Slično kao SSE-KMS, i ovo koristi uslugu upravljanja ključevima za generisanje ključeva za šifrovanje podataka. Međutim, ovog puta KMS se poziva putem klijenta, a ne S3. Šifrovanje se zatim vrši na strani klijenta i šifrovani podaci se zatim šalju S3 radi čuvanja.

  • Šifrovanje:

  • Klijent zahteva ključ podataka od KMS-a

  • KMS vraća plaintext DEK i šifrovani DEK sa CMK

  • Oba ključa se šalju nazad

  • Klijent zatim šifruje podatke sa plaintext DEK i šalje S3 šifrovane podatke + šifrovani DEK (koji se čuva kao metapodaci šifrovanih podataka unutar S3)

  • Dekripcija:

  • Šifrovani podaci sa šifrovanim DEK-om se šalju klijentu

  • Klijent traži od KMS-a da dešifruje šifrovani ključ koristeći CMK i KMS šalje nazad plaintext DEK

  • Klijent sada može dešifrovati šifrovane podatke

Šifrovanje na strani klijenta sa ključevima koje pruža korisnik, CSE-C

Koristeći ovaj mehanizam, možete koristiti svoje sopstvene ključeve i koristiti AWS-SDK klijent za šifrovanje podataka pre slanja u S3 radi čuvanja.

  • Šifrovanje:

  • Klijent generiše DEK i šifruje plaintext podatke

  • Zatim, koristeći svoj sopstveni prilagođeni CMK, šifruje DEK

  • podnosi šifrovane podatke + šifrovani DEK S3 gde se čuvaju

  • Dekripcija:

  • S3 šalje šifrovane podatke i DEK

  • Pošto klijent već ima CMK koji se koristio za šifrovanje DEK-a, dešifruje DEK a zatim koristi plaintext DEK za dešifrovanje podataka

Enumeracija

Jedan od tradicionalnih glavnih načina kompromitovanja AWS organizacija počinje kompromitovanjem javno dostupnih bucket-a. Možete pronaći alate za enumeraciju javnih bucket-a na ovoj stranici.

# 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

Možete pristupiti S3 kanti putem dual-stack endpointa koristeći virtual hosted-style ili path-style endpoint ime. Ovi su korisni za pristup S3 putem IPv6.

Dual-stack endpointi 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 zloupotrebiti S3 dozvole za eskalaciju privilegija:

AWS - S3 Privesc

Neautentifikovan pristup

AWS - S3 Unauthenticated Enum

S3 Post Eksploatacija

AWS - S3 Post Exploitation

Persistencija

AWS - S3 Persistence

Ostale S3 ranjivosti

S3 HTTP Cache Poisoning Issue

Prema ovom istraživanju bilo je moguće keširati odgovor proizvoljne kante kao da pripada drugoj. Ovo bi moglo biti zloupotrebljeno da se promene, na primer, odgovori javascript fajlova i kompromituju proizvoljne stranice koje koriste S3 za čuvanje statičkog koda.

Amazon Athena

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

Potrebno je pripremiti relacijsku DB tabelu sa formatom sadržaja koji će se pojaviti u praćenim S3 kantama. Zatim, Amazon Athena će moći da popuni DB iz logova, tako da možete upitati.

Amazon Athena podržava mogućnost upita nad S3 podacima koji su već enkriptovani i ako je konfigurisano, Athena takođe može enkriptovati rezultate upita koji se mogu zatim čuvati 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. Važno je napomenuti 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 toga, važno je razumeti da će Amazon Athena izvršavati upite samo nad enkriptovanim objektima koji se nalaze u istom regionu kao i sam upit. Ako treba da upitate S3 podatke koji su enkriptovani korišćenjem KMS, onda su potrebne specifične dozvole od strane korisnika Athene da im omoguće da izvrše upit.

Enumeracija

# 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

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated