AWS - S3, Athena & Glacier Enum

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

S3

Amazon S3 is ’n diens wat jou toelaat om groot hoeveelhede data te stoor.

Amazon S3 bied verskeie opsies om die beskerming van data by rus te bewerkstellig. Die opsies sluit in Toestemming (Policy), Enkripsie (Client- en Server-side), Bucket Versioning en MFA based delete. Die gebruiker kan enige van hierdie opsies aktiveer om data-beskerming te bereik. Data-replikasie is ’n interne fasiliteit van AWS waar S3 outomaties elke objek oor alle Availability Zones repliseer en die organisasie dit nie hoef te aktiveer nie.

With resource-based permissions, you can define permissions for sub-directories of your bucket separately.

Bucket Versioning en MFA based delete

Wanneer Bucket Versioning geaktiveer is, sal enige aksie wat probeer om ’n lĆŖer binne ’n lĆŖer te verander ’n nuwe weergawe van die lĆŖer genereer, en ook die vorige inhoud behou. Daarom sal dit nie die inhoud oorskryf nie.

Boonop sal MFA based delete verhoed dat weergawes van lĆŖers in die S3 bucket verwyder word en ook dat Bucket Versioning gedeaktiveer word, sodat ’n aanvaller nie hierdie lĆŖers kan verander nie.

S3 Access logs

Dit is moontlik om S3 toegangsaantekeninge te aktiveer (wat standaard gedeaktiveer is) vir ’n bucket en die logs in ’n ander bucket te stoor om te weet wie die bucket benader (albei buckets moet in dieselfde streek wees).

S3 Presigned URLs

Dit is moontlik om ’n presigned URL te genereer wat gewoonlik gebruik kan word om toegang tot die gespesifiseerde lĆŖer in die bucket te kry. ’n presigned URL lyk soos volg:

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

’n presigned URL kan van die cli geskep word deur gebruik te maak van die credentials van ’n principal wat toegang tot die object het (as die account wat jy gebruik nie toegang het nie, sal ’n korter presigned URL geskep word maar dit sal nutteloos wees)

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

Note

Die enigste vereiste toestemming om ’n presigned URL te genereer is die toestemming wat gegee word, so vir die vorige opdrag is die enigste toestemming wat deur die prinsipaal benodig word s3:GetObject

Dit is ook moontlik om presigned URLs met ander regte te skep:

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

S3 Enkripsie-meganismes

DEK beteken Data Encryption Key en is die sleutel wat altyd gegenereer word en gebruik word om data te enkripteer.

Bedienerkant enkripsie met S3 beheerde sleutels, SSE-S3

Hierdie opsie vereis minimale konfigurasie en alle bestuur van enkripsiesleutels word deur AWS hanteer. Al wat jy hoeft te doen is om jou data op te laai en S3 sal al die ander aspekte hanteer. Elke bucket in ’n S3-rekening kry ’n bucket-sleutel toegeken.

  • Enkripsie:
  • Objekdata + gegenereerde plaintext DEK –> Enkripteerde data (gestoor in S3)
  • Gegenereerde plaintext DEK + S3 Master Key –> Enkripteerde DEK (gestoor in S3) en die plain text word uit geheue verwyder
  • Dekripsie:
  • Enkripteerde DEK + S3 Master Key –> Plaintext DEK
  • Plaintext DEK + Enkripteerde data –> Objekdata

Neem asseblief kennis dat in hierdie geval die sleutel deur AWS bestuur word (rotasie slegs elke 3 jaar). As jy jou eie sleutel gebruik, sal jy dit kan roteer, deaktiveer en toegangskontroles toepas.

Bedienerkant enkripsie met KMS beheerde sleutels, SSE-KMS

Hierdie metode laat S3 toe om die key management service te gebruik om jou data-enkripsiesleutels te genereer. KMS gee jou baie meer buigsaamheid oor hoe jou sleutels bestuur word. Byvoorbeeld kan jy die CMK deaktiveer, roteer en toegangskontroles daarop toepas, en hul gebruik dophou met AWS CloudTrail.

  • Enkripsie:
  • S3 vra KMS vir data-sleutels vanaf die CMK
  • KMS gebruik ’n CMK om die paar plaintext DEK en enkripteerde DEK te genereer en stuur dit terug na S3
  • S3 gebruik die plaintext sleutel om die data te enkripteer, stoor die enkripteerde data en die enkripteerde sleutel en verwyder die plaintext sleutel uit geheue
  • Dekripsie:
  • S3 vra KMS om die enkripteerde data-sleutel van die objek te dekripteer
  • KMS dekripteer die data-sleutel met die CMK en stuur dit terug na S3
  • S3 dekripteer die objekdata
Bedienerkant enkripsie met kliƫnt-verskafde sleutels, SSE-C

Hierdie opsie gee jou die geleentheid om jou eie master sleutel te voorsien wat jy dalk reeds buite AWS gebruik. Jou kliƫnt-verskafde sleutel word saam met jou data na S3 gestuur, waar S3 dan die enkripsie vir jou sal uitvoer.

  • Enkripsie:
  • Die gebruiker stuur die objekdata + kliĆ«nt-sleutel na S3
  • Die kliĆ«nt-sleutel word gebruik om die data te enkripteer en die enkripteerde data word gestoor
  • ’n Gesoute HMAC-waarde van die kliĆ«nt-sleutel word ook gestoor vir toekomstige sleutelverifikasie
  • Die kliĆ«nt-sleutel word uit geheue verwyder
  • Dekripsie:
  • Die gebruiker stuur die kliĆ«nt-sleutel
  • Die sleutel word geverifieer teen die gestoor HMAC-waarde
  • Die kliĆ«nt-verskafde sleutel word dan gebruik om die data te dekripteer
Kliƫntkant enkripsie met KMS, CSE-KMS

Soortgelyk aan SSE-KMS, gebruik hierdie metode ook die key management service om jou data-enkripsiesleutels te genereer. Hierdie keer word KMS egter deur die kliƫnt aangespreek en nie deur S3 nie. Die enkripsie vind dus aan kliƫntkant plaas en die enkripteerde data word dan na S3 gestuur om gestoor te word.

  • Enkripsie:
  • KliĆ«nt vra KMS vir ’n data-sleutel
  • KMS stuur die plaintext DEK en die enkripteerde DEK met die CMK terug
  • Albei sleutels word teruggestuur
  • Die kliĆ«nt enkripteer dan die data met die plaintext DEK en stuur na S3 die enkripteerde data + die enkripteerde DEK (wat as metadata van die enkripteerde data binne S3 gestoor word)
  • Dekripsie:
  • Die enkripteerde data met die enkripteerde DEK word na die kliĆ«nt gestuur
  • Die kliĆ«nt vra KMS om die enkripteerde sleutel met die CMK te dekripteer en KMS stuur die plaintext DEK terug
  • Die kliĆ«nt kan nou die enkripteerde data dekripteer
Kliƫntkant enkripsie met kliƫnt-verskafde sleutels, CSE-C

Met hierdie meganisme kan jy jou eie sleutels gebruik en ’n AWS-SDK kliĆ«nt gebruik om jou data te enkripteer voordat dit na S3 gestuur word vir berging.

  • Enkripsie:
  • Die kliĆ«nt genereer ’n DEK en enkripteer die plaintext data
  • Daarna enkripteer hy die DEK met sy eie CMK
  • Stuur die enkripteerde data + enkripteerde DEK na S3 waar dit gestoor word
  • Dekripsie:
  • S3 stuur die enkripteerde data en DEK
  • Aangesien die kliĆ«nt reeds die CMK het wat gebruik is om die DEK te enkripteer, dekripteer hy die DEK en gebruik dan die plaintext DEK om die data te dekripteer

Enumerasie

Een van die tradisionele hoofmaniere om AWS-organisasies te kompromitteer begin deur openbare beskikbare buckets te kompromitteer. Jy kan openbare bucket-enummeraars op hierdie bladsy vind.**

# 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

Jy kan toegang tot ’n S3 bucket kry via ’n dual-stack endpoint deur ’n virtual hosted-style of ’n path-style endpoint-naam te gebruik. Dit is nuttig om toegang tot S3 via IPv6 te kry.

Dual-stack endpoints gebruik die volgende sintaksis:

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

Privesc

Op die volgende bladsy kan jy sien hoe om abuse S3 permissions to escalate privileges:

AWS - S3 Privesc

Unauthenticated Access

AWS - S3 Unauthenticated Enum

S3 Post Exploitation

AWS - S3 Post Exploitation

Persistence

AWS - S3 Persistence

Other S3 vulns

S3 HTTP Cache Poisoning Issue

According to this research dit was moontlik om die respons van ’n arbitrary bucket in die cache te hou asof dit aan ’n ander behoort. Dit kon misbruik word om byvoorbeeld javascript-lĆŖer-respons te verander en willekeurige bladsye wat S3 gebruik om statiese kode te stoor, te kompromitteer.

Amazon Athena

Amazon Athena is ’n interaktiewe query service wat dit maklik maak om data te ontleed direk in Amazon Simple Storage Service (Amazon S3) met standaard SQL.

Jy moet ’n relational DB table voorberei met die formaat van die inhoud wat in die gemonitorde S3 buckets gaan verskyn. En dan sal Amazon Athena in staat wees om die DB vanuit die logs te vul, sodat jy dit kan query.

Amazon Athena ondersteun die vermoë om S3 data wat reeds geïnkripteer is te query en as dit so gekonfigureer is, kan Athena ook die resultate van die query enkripsieer wat dan in S3 gestoor kan word.

Hierdie enkripsie van resultate is onafhanklik van die onderliggende gevraagde S3 data, wat beteken dat selfs al is die S3 data nie geĆÆnkripteer nie, kan die gevraagde resultate geĆÆnkripteer wees. ’n Paar punte om bewus van te wees is dat Amazon Athena slegs data ondersteun wat geĆÆnkripteer is met die volgende S3 enkripsie metodes, SSE-S3, SSE-KMS, and CSE-KMS.

SSE-C en CSE-C word nie ondersteun nie. Daarbenewens is dit belangrik om te verstaan dat Amazon Athena slegs queries teen geënkripteerde objects wat in dieselfde region as die query self is sal uitvoer. As jy S3 data wil query wat met KMS geïnkripteer is, dan is spesifieke permissies deur die Athena gebruiker benodig om hulle in staat te stel om die query uit te voer.

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>

Verwysings

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks