AWS - S3, Athena & Glacier Enum
Tip
Nauči & vežbaj AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Pogledajte subscription plans!
- Pridružite se 💬 Discord group or the telegram group or pratite nas na Twitter 🐦 @hacktricks_live.
- Podelite hacking tricks slanjem PR-ova na HackTricks i HackTricks Cloud github repos.
S3
Amazon S3 је сервис који вам омогућава да чувате велике количине података.
Amazon S3 пружа више опција за постизање заштите података у миру. Опције укључују Permission (Policy), Encryption (Client and Server Side), Bucket Versioning и MFA based delete. Корисник може да омогући било коју од ових опција да обезбеди заштиту података. Data replication је интерна функција AWS-а где S3 automatically replicates each object across all the Availability Zones и организација не мора да је омогући.
With resource-based permissions, можете посебно дефинисати дозволе за поддиректоријуме вашег bucket-а.
Bucket Versioning and MFA based delete
Када је bucket versioning омогућен, свака акција која покушава да измени фајл ће генерисати нову верзију фајла, при чему ће бити сачуван и претходни садржај. Дакле, садржај неће бити преписан.
Поред тога, MFA based delete ће спречити да верзије фајлова у S3 bucket-у буду избрисане и такође спречити онемогућавање Bucket Versioning-а, па нападач неће моћи да измени те фајлове.
S3 Access logs
Могуће је enable S3 access login (што је по подразумеваној вредности онемогућено) за неки bucket и сачувати логове у другом bucket-у да бисте знали ко приступа bucket-у (оба bucket-а морају бити у истом региону).
S3 Presigned URLs
Могуће је генерисати presigned URL који се обично може користити да приступи одређеном фајлу у bucket-у. presigned URL изгледа овако:
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
Presigned URL može biti kreiran iz cli koristeći credentials principala koji ima pristup objektu (ako account koji koristite nema pristup, biće kreiran kraći presigned URL, ali će biti beskoristan)
aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'
Note
Jedina potrebna dozvola za generisanje presigned URL-a je dozvola koja se dodeljuje, tako da je za prethodnu komandu jedina dozvola koja je potrebna principal-u
s3:GetObject
Takođe je moguće kreirati presigned 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
)
S3 Encryption Mechanisms
DEK means Data Encryption Key i predstavlja ključ koji se uvek generiše i koristi za enkripciju podataka.
Server-side encryption with S3 managed keys, SSE-S3
Ova opcija zahteva minimalnu konfiguraciju i celo upravljanje ključevima za enkripciju vrši AWS. Sve što treba da uradite je da otpremite svoje podatke i S3 će se pobrinuti za sve ostalo. Svakom bucket-u na S3 nalogu dodeljuje se bucket key.
- Enkripcija:
- Object Data + created plaintext DEK –> Encrypted data (stored inside S3)
- Created plaintext DEK + S3 Master Key –> Encrypted DEK (stored inside S3) i nešifrovani ključ se briše iz memorije
- Dekripcija:
- Encrypted DEK + S3 Master Key –> Plaintext DEK
- Plaintext DEK + Encrypted data –> Object Data
Napomena: u ovom slučaju ključ je upravljan od strane AWS (rotacija samo na 3 godine). Ako koristite sopstveni ključ moći ćete da ga rotirate, onemogućite i primenite kontrolu pristupa.
Server-side encryption with KMS managed keys, SSE-KMS
Ova metoda omogućava S3 da koristi key management service za generisanje vaših DEK-ova. KMS vam daje znatno veću fleksibilnost u načinu kako se vaši ključevi upravljaju. Na primer, možete onemogućiti, rotirati i primeniti kontrole pristupa CMK‑u, i pratiti njihovu upotrebu koristeći AWS Cloud Trail.
- Enkripcija:
- S3 traži data keys od KMS CMK
- KMS koristi CMK da generiše par: plaintext DEK i enkriptovani DEK i šalje ih S3
- S3 koristi plaintext ključ da enkriptuje podatke, čuva enkriptovane podatke i enkriptovani ključ i briše iz memorije plaintext ključ
- Dekripcija:
- S3 traži od KMS da dekriptuje enkriptovani data key objekta
- KMS dekriptuje data key pomoću CMK i vraća ga S3
- S3 dekriptuje podatak objekta
Server-side encryption with customer provided keys, SSE-C
Ova opcija vam daje mogućnost da obezbedite sopstveni master ključ koji već možete koristiti van AWS. Vaš ključ koji obezbeđuje korisnik biće poslat zajedno sa podacima na S3, gde će S3 izvršiti enkripciju za vas.
- Enkripcija:
- Korisnik šalje object data + Customer key na S3
- Customer key se koristi za enkripciju podataka i enkriptovani podaci se čuvaju
- Saltovana HMAC vrednost customer key-a se takođe čuva za buduću validaciju ključa
- Customer key se briše iz memorije
- Dekripcija:
- Korisnik šalje customer key
- Ključ se validira pomoću sačuvane HMAC vrednosti
- Customer provided key se koristi za dekriptovanje podataka
Client-side encryption with KMS, CSE-KMS
Slično SSE-KMS, i ovo koristi key management service za generisanje vaših data encryption key-ova. Međutim, ovoga puta se KMS poziva preko klijenta, a ne S3. Enkripcija se onda vrši na strani klijenta i enkriptovani podaci se šalju na S3 na čuvanje.
- Enkripcija:
- Klijent zahteva data key od KMS
- KMS vraća plaintext DEK i enkriptovani DEK sa CMK
- Obe vrednosti se vraćaju klijentu
- Klijent enkriptuje podatke plaintext DEK-om i šalje S3 enkriptovane podatke + enkriptovani DEK (koji se čuva kao metadata enkriptovanih podataka u S3)
- Dekripcija:
- Enkriptovani podaci sa enkriptovanim DEK-om 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 da dekriptuje enkriptovane podatke
Client-side encryption with customer provided keys, CSE-C
Korišćenjem ovog mehanizma, možete koristiti sopstvene ključeve i AWS-SDK klijent da enkriptujete podatke pre slanja na S3 za skladištenje.
- Enkripcija:
- Klijent generiše DEK i enkriptuje plaintext podatke
- Zatim, koristeći svoj custom CMK, enkriptuje DEK
- Pošalje enkriptovane podatke + enkriptovani DEK na S3 gde se čuvaju
- Dekripcija:
- S3 šalje enkriptovane podatke i DEK
- Pošto klijent već ima CMK koji je korišćen za enkripciju DEK-a, dekriptuje DEK i zatim koristi plaintext DEK da dekriptuje podatke
Enumeration
Jedan od tradicionalnih glavnih načina kompromitovanja AWS organizacija počinje kompromitovanjem javno dostupnih bucket-a. You can find public buckets enumerators in this page.
# 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 --no-sign-request
# 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
Do S3 bucket-a možete pristupiti preko dual-stack endpointa koristeći virtual hosted-style ili path-style naziv endpointa. Ovo je korisno za pristup S3 preko IPv6.
Dual-stack endpointi koriste sledeću sintaksu:
bucketname.s3.dualstack.aws-region.amazonaws.coms3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
In the following page you can check how to abuse S3 permissions to escalate privileges:
Unauthenticated Access
S3 Post Exploitation
Persistence
Other S3 vulns
S3 HTTP Cache Poisoning Issue
According to this research bilo je moguće keširati odgovor proizvoljnog bucketa kao da pripada drugom. Ovo je moglo biti zloupotrebljeno da, na primer, promeni odgovore javascript fajlova i kompromituje proizvoljne stranice koje koriste S3 za čuvanje statičkog koda.
Amazon Athena
Amazon Athena je interaktivni query servis koji olakšava analizu podataka direktno u Amazon Simple Storage Service (Amazon S3) koristeći standardni SQL.
Potrebno je pripremiti tabelu relacione baze podataka (DB) sa formatom sadržaja koji će se pojavljivati u nadgledanim S3 bucket-ovima. Zatim će Amazon Athena moći da popuni bazu iz logova, tako da možete izvršavati upite.
Athena podržava mogućnost izvršavanja upita nad S3 podacima koji su već enkriptovani, i ako je tako konfigurisana, Athena može takođe enkriptovati rezultate upita koji se potom mogu skladištiti u S3.
Ovo enkriptovanje rezultata je nezavisno od osnovnih S3 podataka nad kojima se vrši upit, što znači da čak i ako S3 podaci nisu enkriptovani, rezultati upita mogu biti enkriptovani. Važno je znati da Amazon Athena podržava samo podatke koji su enkriptovani korišćenjem sledećih metoda enkripcije S3: SSE-S3, SSE-KMS, i CSE-KMS.
SSE-C i CSE-C nisu podržani. Pored toga, važno je razumeti da Amazon Athena izvršava upite samo nad enkriptovanim objektima koji su u istoj regiji kao i sam upit. Ako treba da izvršite upit nad S3 podacima koji su enkriptovani korišćenjem KMS, tada su potrebne specifične permisije za Athena korisnika da bi mogao da izvrši upit.
Enumeration
# 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>
Izvori
- https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3
- https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html
Tip
Nauči & vežbaj AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Pogledajte subscription plans!
- Pridružite se 💬 Discord group or the telegram group or pratite nas na Twitter 🐦 @hacktricks_live.
- Podelite hacking tricks slanjem PR-ova na HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

