AWS - S3, Athena & Glacier Enum

Support HackTricks

S3

Amazon S3 ni huduma inayokuruhusu hifadhi kiasi kikubwa cha data.

Amazon S3 inatoa chaguzi nyingi za kufikia ulinzi wa data katika hali ya kupumzika. Chaguzi hizo ni pamoja na Ruhusa (Sera), Ushifirishaji (Upande wa Mteja na Upande wa Server), Mabadiliko ya Bucket na kuondolewa kwa msingi wa MFA. Mtumiaji anaweza kuwezesha chaguo lolote kati ya haya ili kufikia ulinzi wa data. Replika ya data ni huduma ya ndani ya AWS ambapo S3 inajirudia kiotomatiki kila kitu katika maeneo yote ya Upatikanaji na shirika halihitaji kuifanya iweze katika kesi hii.

Kwa ruhusa za msingi wa rasilimali, unaweza kufafanua ruhusa kwa sub-directory za bucket yako tofauti.

Mabadiliko ya Bucket na kuondolewa kwa msingi wa MFA

Wakati mabadiliko ya bucket yanapowezeshwa, kitendo chochote kinachojaribu kubadilisha faili ndani ya faili kitazalisha toleo jipya la faili, huku pia ikihifadhi yaliyomo ya awali ya hiyo. Hivyo, haitafuta yaliyomo yake.

Zaidi ya hayo, kuondolewa kwa msingi wa MFA kutazuia matoleo ya faili katika bucket ya S3 kufutwa na pia Mabadiliko ya Bucket yasizuiliwe, hivyo mshambuliaji hataweza kubadilisha faili hizi.

S3 Access logs

Inawezekana kuwezesha kuingia kwa S3 (ambayo kwa kawaida imezimwa) kwa baadhi ya bucket na kuhifadhi logi katika bucket tofauti ili kujua nani anayeingia kwenye bucket (bucket zote lazima ziwe katika eneo moja).

S3 Presigned URLs

Inawezekana kuzalisha URL iliyosainiwa mapema ambayo kwa kawaida inaweza kutumika kufikia faili iliyoainishwa katika bucket. URL iliyosainiwa mapema inaonekana kama hii:

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

A presigned URL can be created from the cli using credentials of a principal with access to the object (ikiwa akaunti unayotumia haina ufikiaji, URL fupi ya presigned itaundwa lakini itakuwa haina maana)

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

Ruhusa pekee inayohitajika kuunda URL iliyoandikwa mapema ni ruhusa inayotolewa, hivyo kwa amri ya awali ruhusa pekee inayohitajika na kiongozi ni s3:GetObject

Pia inawezekana kuunda URL zilizoandikwa mapema zikiwa na ruhusa nyingine:

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 inamaanisha Data Encryption Key na ni ufunguo ambao kila wakati unaundwa na kutumika kupeleka data.

Server-side encryption with S3 managed keys, SSE-S3

Chaguo hili kinahitaji usanidi mdogo na usimamizi wote wa funguo za usimbaji zinazotumika unasimamiwa na AWS. Unachohitaji kufanya ni kupakia data yako na S3 itashughulikia mambo mengine yote. Kila ndoo katika akaunti ya S3 inapewa funguo ya ndoo.

  • Usimbaji:

  • Data ya Kitu + DEK ya maandiko iliyoundwa --> Data iliyosimbwa (hifadhi ndani ya S3)

  • DEK ya maandiko iliyoundwa + S3 Master Key --> DEK iliyosimbwa (hifadhi ndani ya S3) na maandiko yanatolewa kutoka kwenye kumbukumbu

  • Ufunguo:

  • DEK iliyosimbwa + S3 Master Key --> DEK ya maandiko

  • DEK ya maandiko + Data iliyosimbwa --> Data ya Kitu

Tafadhali, kumbuka kwamba katika kesi hii funguo inasimamiwa na AWS (mabadiliko kila miaka 3 tu). Ikiwa utatumia funguo zako mwenyewe utaweza kubadilisha, kuzima na kuweka udhibiti wa ufikiaji.

Server-side encryption with KMS managed keys, SSE-KMS

Njia hii inaruhusu S3 kutumia huduma ya usimamizi wa funguo kuunda funguo zako za usimbaji wa data. KMS inakupa uwezo mkubwa zaidi wa jinsi funguo zako zinavyosimamiwa. Kwa mfano, unaweza kuzima, kubadilisha, na kuweka udhibiti wa ufikiaji kwa CMK, na kuagiza dhidi ya matumizi yao kwa kutumia AWS Cloud Trail.

  • Usimbaji:

  • S3 inahitaji funguo za data kutoka KMS CMK

  • KMS inatumia CMK kuunda DEK ya maandiko na DEK iliyosimbwa na kuzipeleka kwa S3

  • S3 inatumia funguo ya maandiko kusimbwa kwa data, hifadhi data iliyosimbwa na funguo iliyosimbwa na inafuta funguo ya maandiko kutoka kwenye kumbukumbu

  • Ufunguo:

  • S3 inaomba KMS kufungua funguo iliyosimbwa ya data ya kitu

  • KMS inafungua funguo ya data kwa kutumia CMK na kuirudisha kwa S3

  • S3 inafungua data ya kitu

Server-side encryption with customer provided keys, SSE-C

Chaguo hili linakupa fursa ya kutoa funguo zako za msingi ambazo huenda tayari unazitumia nje ya AWS. Funguo yako iliyotolewa na mteja itatumwa pamoja na data yako kwenda S3, ambapo S3 itafanya usimbaji kwa niaba yako.

  • Usimbaji:

  • Mtumiaji anatumia data ya kitu + funguo ya Mteja kwenda S3

  • Funguo ya mteja inatumika kusimbwa kwa data na data iliyosimbwa inahifadhiwa

  • thamani ya HMAC iliyo na chumvi ya funguo ya mteja pia inahifadhiwa kwa ajili ya uthibitishaji wa funguo zijazo

  • funguo ya mteja inafuta kutoka kwenye kumbukumbu

  • Ufunguo:

  • Mtumiaji anatumia funguo ya mteja

  • Funguo inathibitishwa dhidi ya thamani ya HMAC iliyohifadhiwa

  • Funguo iliyotolewa na mteja inatumika kufungua data

Client-side encryption with KMS, CSE-KMS

Vivyo hivyo na SSE-KMS, hii pia inatumia huduma ya usimamizi wa funguo kuunda funguo zako za usimbaji wa data. Hata hivyo, wakati huu KMS inaitwa kupitia mteja si S3. Usimbaji unafanyika upande wa mteja na data iliyosimbwa inatumwa kwa S3 kuhifadhiwa.

  • Usimbaji:

  • Mteja anahitaji funguo ya data kutoka KMS

  • KMS inarudisha DEK ya maandiko na DEK iliyosimbwa na CMK

  • Funguo zote mbili zinatumwa nyuma

  • Mteja kisha anasimba data kwa kutumia DEK ya maandiko na kutuma kwa S3 data iliyosimbwa + DEK iliyosimbwa (ambayo inahifadhiwa kama metadata ya data iliyosimbwa ndani ya S3)

  • Ufunguo:

  • Data iliyosimbwa na DEK iliyosimbwa inatumwa kwa mteja

  • Mteja anaomba KMS kufungua funguo iliyosimbwa kwa kutumia CMK na KMS inarudisha DEK ya maandiko

  • Mteja sasa anaweza kufungua data iliyosimbwa

Client-side encryption with customer provided keys, CSE-C

Kwa kutumia mekanizimu hii, unaweza kutumia funguo zako zilizotolewa na kutumia mteja wa AWS-SDK kusimbwa kwa data yako kabla ya kuituma kwa S3 kwa ajili ya uhifadhi.

  • Usimbaji:

  • Mteja anaunda DEK na kusimbwa kwa data ya maandiko

  • Kisha, kwa kutumia CMK yake ya kawaida inasimbwa DEK

  • inapeleka data iliyosimbwa + DEK iliyosimbwa kwa S3 ambapo inahifadhiwa

  • Ufunguo:

  • S3 inatuma data iliyosimbwa na DEK

  • Kwa kuwa mteja tayari ana CMK iliyotumika kusimbwa DEK, inafungua DEK kisha inatumia DEK ya maandiko kufungua data

Enumeration

Moja ya njia za jadi za kukiuka mashirika ya AWS huanza kwa kukiuka ndoo zinazopatikana hadharani. Unaweza kupata waandishi wa ndoo za umma katika ukurasa huu.

# 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

Unaweza kufikia S3 bucket kupitia dual-stack endpoint kwa kutumia jina la virtual hosted-style au path-style endpoint. Hizi ni muhimu kufikia S3 kupitia IPv6.

Dual-stack endpoints hutumia sintaks hii:

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

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

Privesc

Katika ukurasa ufuatao unaweza kuangalia jinsi ya kudhulumu ruhusa za S3 ili kupandisha mamlaka:

Unauthenticated Access

S3 Post Exploitation

Persistence

Other S3 vulns

S3 HTTP Cache Poisoning Issue

Kulingana na utafiti huu ilikuwa inawezekana kuhifadhi jibu la bucket yoyote kama ingekuwa inahusiana na nyingine. Hii ingeweza kutumika kubadilisha kwa mfano majibu ya faili ya javascript na kuathiri kurasa yoyote kwa kutumia S3 kuhifadhi msimbo wa static.

Amazon Athena

Amazon Athena ni huduma ya uchunguzi wa mwingiliano ambayo inafanya iwe rahisi kuchambua data moja kwa moja katika Amazon Simple Storage Service (Amazon S3) kwa kutumia SQL ya kawaida.

Unahitaji kuandaa jedwali la DB la uhusiano na muundo wa maudhui ambayo yatakuwa yanaonekana katika S3 buckets zinazofuatiliwa. Na kisha, Amazon Athena itakuwa na uwezo wa kujaza DB kutoka kwa logi, ili uweze kuifanya uchunguzi.

Amazon Athena inasaidia uwezo wa kuchunguza data ya S3 ambayo tayari imefungwa na ikiwa imewekwa kufanya hivyo, Athena pia inaweza kufunga matokeo ya uchunguzi ambayo yanaweza kuhifadhiwa katika S3.

Hii ufungaji wa matokeo hauitegemei data ya S3 iliyochunguzwa, ikimaanisha kwamba hata kama data ya S3 haijafungwa, matokeo yaliyofanyiwa uchunguzi yanaweza kufungwa. Vidokezo kadhaa vya kuzingatia ni kwamba Amazon Athena inasaidia tu data ambayo ime fungwa kwa kutumia mbinu za ufungaji za S3, SSE-S3, SSE-KMS, na CSE-KMS.

SSE-C na CSE-E hazikubaliwi. Mbali na hii, ni muhimu kuelewa kwamba Amazon Athena itafanya uchunguzi tu dhidi ya vitu vilivyofungwa vilivyoko katika eneo moja na uchunguzi wenyewe. Ikiwa unahitaji kuchunguza data ya S3 ambayo imefungwa kwa kutumia KMS, basi ruhusa maalum zinahitajika na mtumiaji wa Athena ili kuwapa uwezo wa kufanya uchunguzi.

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>

References

Support HackTricks

Last updated