AWS - S3, Athena & Glacier Enum

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure 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 in REST te bereik. Die opsies sluit Toestemming (Beleid), Enkripsie (KliĆ«nt en Bediener-kant), Emmerweergawe en MFA gebaseerde verwydering in. Die gebruiker kan enige van hierdie opsies aktiveer om databesking te bereik. Data-replikaasie is ’n interne fasiliteit deur AWS waar S3 outomaties elke objek oor al die Beschikbaarheidsgebiede repliseer en die organisasie hoef dit nie in hierdie geval te aktiveer nie.

Met hulpbron-gebaseerde toestemmings kan jy toestemmings vir sub-gidse van jou emmer apart definieer.

Emmerweergawe en MFA gebaseerde verwydering

Wanneer emmerweergawe 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, terwyl die vorige inhoud van dieselfde ook behou word. Daarom sal dit nie sy inhoud oorskryf nie.

Boonop sal MFA gebaseerde verwydering verhinder dat weergawes van lĆŖers in die S3-emmer verwyder word en ook dat Emmerweergawe gedeaktiveer word, sodat ’n aanvaller nie in staat sal wees om hierdie lĆŖers te verander nie.

S3 Toegang logs

Dit is moontlik om S3 toegang aan te dui (wat standaard gedeaktiveer is) vir ’n emmer en die logs in ’n ander emmer te stoor om te weet wie die emmer toegang (albei emmers moet in dieselfde streek wees).

S3 Presigned URL’s

Dit is moontlik om ’n presigned URL te genereer wat gewoonlik gebruik kan word om toegang te verkry tot die gespesifiseerde lĆŖer in die emmer. ’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 Voorafondertekende URL kan uit die cli geskep word met die kredensiale van ’n hoofpersoon met toegang tot die objek (as die rekening wat jy gebruik nie toegang het nie, sal ’n korter voorafondertekende 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 voorafondertekende URL te genereer, is die toestemming wat gegee word, so vir die vorige opdrag is die enigste toestemming wat die hoofpersoon nodig het s3:GetObject

Dit is ook moontlik om voorafondertekende URL’s te skep met ander toestemmings:

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

S3 Enkripsiemeganismes

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

Bediener-kant enkripsie met S3 bestuurde sleutels, SSE-S3

Hierdie opsie vereis minimale konfigurasie en al die bestuur van enkripsiesleutels wat gebruik word, word deur AWS bestuur. Al wat jy hoef te doen is om jou data te laai en S3 sal al die ander aspekte hanteer. Elke emmer in ’n S3-rekening word aan ’n emmersleutel toegeken.

  • Enkripsie:
  • Objektdata + geskepte platte DEK –> GeĆ«nkripteerde data (gestoor binne S3)
  • Geskepte platte DEK + S3 Meestersleutel –> GeĆ«nkripteerde DEK (gestoor binne S3) en platte teks word uit geheue verwyder
  • Dekripsie:
  • GeĆ«nkripteerde DEK + S3 Meestersleutel –> Platte DEK
  • Platte DEK + GeĆ«nkripteerde data –> Objektdata

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 in staat wees om te roteer, te deaktiveer en toegangbeheer toe te pas.

Bediener-kant enkripsie met KMS bestuurde sleutels, SSE-KMS

Hierdie metode laat S3 toe om die sleutelbestuursdiens te gebruik om jou data-enkripsiesleutels te genereer. KMS bied jou ’n baie groter buigsaamheid oor hoe jou sleutels bestuur word. Byvoorbeeld, jy kan die CMK deaktiveer, roteer en toegangbeheer toepas, en bestellings teen hul gebruik met AWS Cloud Trail.

  • Enkripsie:
  • S3 versoek data sleutels van KMS CMK
  • KMS gebruik ’n CMK om die paar DEK platte teks en DEK geĆ«nkripteerd te genereer en stuur dit na S3
  • S3 gebruik die platte sleutel om die data te enkripteer, stoor die geĆ«nkripteerde data en die geĆ«nkripteerde sleutel en verwyder die platte sleutel uit geheue
  • Dekripsie:
  • S3 vra KMS om die geĆ«nkripteerde datasleutel van die objek te dekripteer
  • KMS dekripteer die datasleutel met die CMK en stuur dit terug na S3
  • S3 dekripteer die objektdata
Bediener-kant enkripsie met kliƫnt verskaf sleutels, SSE-C

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

  • Enkripsie:
  • Die gebruiker stuur die objektdata + KliĆ«ntsleutel na S3
  • Die kliĆ«ntsleutel word gebruik om die data te enkripteer en die geĆ«nkripteerde data word gestoor
  • ’n Gesoute HMAC-waarde van die kliĆ«ntsleutel word ook gestoor vir toekomstige sleutelvalidasie
  • die kliĆ«ntsleutel word uit geheue verwyder
  • Dekripsie:
  • Die gebruiker stuur die kliĆ«ntsleutel
  • Die sleutel word gevalideer teen die gestoor HMAC-waarde
  • Die kliĆ«nt verskaf sleutel word dan gebruik om die data te dekripteer
Kliƫnt-kant enkripsie met KMS, CSE-KMS

Soos met SSE-KMS, gebruik dit ook die sleutelbestuursdiens om jou data-enkripsiesleutels te genereer. Hierdie keer word KMS egter via die kliƫnt en nie S3 aangespreek nie. Die enkripsie vind dan kliƫnt-kant plaas en die geƫnkripteerde data word dan na S3 gestuur om gestoor te word.

  • Enkripsie:
  • KliĆ«nt versoek ’n datasleutel van KMS
  • KMS stuur die platte DEK en die geĆ«nkripteerde DEK met die CMK terug
  • Beide sleutels word teruggestuur
  • Die kliĆ«nt enkripteer dan die data met die platte DEK en stuur die geĆ«nkripteerde data + die geĆ«nkripteerde DEK (wat as metadata van die geĆ«nkripteerde data binne S3 gestoor word) na S3
  • Dekripsie:
  • Die geĆ«nkripteerde data met die geĆ«nkripteerde DEK word na die kliĆ«nt gestuur
  • Die kliĆ«nt vra KMS om die geĆ«nkripteerde sleutel te dekripteer met die CMK en KMS stuur die platte DEK terug
  • Die kliĆ«nt kan nou die geĆ«nkripteerde data dekripteer
Kliƫnt-kant enkripsie met kliƫnt verskaf sleutels, CSE-C

Deur hierdie meganisme te gebruik, kan jy jou eie verskaf sleutels benut en ’n AWS-SDK kliĆ«nt gebruik om jou data te enkripteer voordat jy dit na S3 vir stoor stuur.

  • Enkripsie:
  • Die kliĆ«nt genereer ’n DEK en enkripteer die platte data
  • Dan, met behulp van sy eie pasgemaakte CMK, enkripteer dit die DEK
  • dien die geĆ«nkripteerde data + geĆ«nkripteerde DEK aan S3 waar dit gestoor word
  • Dekripsie:
  • S3 stuur die geĆ«nkripteerde data en DEK
  • Aangesien die kliĆ«nt reeds die CMK het wat gebruik is om die DEK te enkripteer, dekripteer dit die DEK en gebruik dan die platte DEK om die data te dekripteer

Enumerasie

Een van die tradisionele hoofmaniere om AWS-organisasies te kompromitteer, begin deur emmers wat publiek toeganklik is, te kompromitteer. Jy kan publieke emmer enumerators 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

# 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 verkry deur ’n dual-stack eindpunt te gebruik met ’n virtuele gehoste styl of ’n padstyl eindpuntnaam. Hierdie is nuttig om S3 deur IPv6 te benader.

Dual-stack eindpunte gebruik die volgende sintaksis:

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

Privesc

In die volgende bladsy kan jy kyk hoe om S3-toestemmings te misbruik om voorregte te verhoog:

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

Volgens hierdie navorsing was dit moontlik om die antwoord van ’n arbitrĆŖre bucket te kas asof dit aan ’n ander behoort. Dit kon misbruik gewees het om byvoorbeeld javascript-lĆŖer-antwoorde te verander en arbitrĆŖre bladsye te kompromitteer wat S3 gebruik om statiese kode te stoor.

Amazon Athena

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

Jy moet ’n relationele DB-tabel 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 uit die logs te vul, sodat jy dit kan navraag doen.

Amazon Athena ondersteun die vermoƫ om S3-data wat reeds versleuteld is, te navraag en as dit geconfigureer is om dit te doen, kan Athena ook die resultate van die navraag versleuteld wat dan in S3 gestoor kan word.

Hierdie versleuteling van resultate is onafhanklik van die onderliggende navraag S3-data, wat beteken dat selfs al is die S3-data nie versleuteld nie, kan die navraag resultate versleuteld wees. ’n Paar punte om bewus van te wees is dat Amazon Athena slegs data ondersteun wat versleuteld is met die volgende S3-versleutelingmetodes, SSE-S3, SSE-KMS, en CSE-KMS.

SSE-C en CSE-E word nie ondersteun nie. Benewens dit, is dit belangrik om te verstaan dat Amazon Athena slegs navrae teen versleutelde voorwerpe wat in dieselfde streek as die navraag self is sal uitvoer. As jy S3-data moet navraag doen wat met KMS versleuteld is, dan is spesifieke toestemmings nodig deur die Athena-gebruiker om hulle in staat te stel om die navraag 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 en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks