AWS - S3, Athena & Glacier Enum

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

S3

Amazon S3, büyük miktarda veri depolamanıza olanak tanıyan bir servistir.

Amazon S3, verilerin at-rest halindeki korunmasını sağlamak için birden fazla seçenek sunar. Bu seçenekler arasında Permission (Policy), Encryption (Client and Server Side), Bucket Versioning ve MFA based delete bulunur. Kullanıcı, veri koruması sağlamak için bu seçeneklerin herhangi birini etkinleştirebilir. Data replication, AWS tarafından sağlanan dahili bir özelliktir; burada S3 automatically replicates each object across all the Availability Zones ve organizasyonun bunu etkinleştirmesine gerek yoktur.

With resource-based permissions, bucket’ınızdaki alt dizinler için izinleri ayrı ayrı tanımlayabilirsiniz.

Bucket Versioning and MFA based delete

Bucket versioning etkinleştirildiğinde, bir dosyada değişiklik yapmayı deneyen herhangi bir işlem dosyanın yeni bir sürümünü oluşturur ve önceki içeriği de saklar. Bu nedenle içeriğin üzerine yazılmaz.

Ayrıca, MFA based delete S3 bucket’taki dosya sürümlerinin silinmesini ve Bucket Versioning’in devre dışı bırakılmasını önler; böylece bir saldırgan bu dosyaları değiştiremeyecektir.

S3 Access logs

Bazı bucket’lar için (varsayılan olarak devre dışı) S3 access login’i etkinleştirip günlükleri farklı bir bucket’a kaydetmek mümkündür; böylece bucket’a kimlerin eriştiğini öğrenebilirsiniz (her iki bucket da aynı region’da olmalıdır).

S3 Presigned URLs

Bir presigned URL oluşturmak mümkündür; bu genellikle bucket içindeki belirtilen dosyaya erişmek için kullanılır. Bir presigned URL şöyle görünür:

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

Bir presigned URL, objeye erişimi olan bir principal’in credentials’ını kullanarak cli üzerinden oluşturulabilir (kullandığınız account’un erişimi yoksa daha kısa bir presigned URL oluşturulur ama işe yaramaz)

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

Note

Bir presigned URL oluşturmak için gereken tek izin verilecek izin olduğu için, önceki komut için principal’in ihtiyaç duyduğu tek izin s3:GetObject’tır

Ayrıca diğer izinlerle presigned URL’ler oluşturmak da mümkündür:

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

S3 Şifreleme Mekanizmaları

DEK, Data Encryption Key anlamına gelir ve veriyi şifrelemek için her zaman oluşturulan ve kullanılan anahtardır.

Sunucu tarafı şifreleme with S3 managed keys, SSE-S3

Bu seçenek minimum yapılandırma gerektirir ve kullanılan şifreleme anahtarlarının tüm yönetimi AWS tarafından yapılır. Yapmanız gereken tek şey verilerinizi yüklemek ve S3 diğer tüm işlemleri halleder. Bir S3 hesabındaki her bucket’e bir bucket key atanır.

  • Şifreleme:
  • Object Data + created plaintext DEK –> Encrypted data (S3 içinde depolanır)
  • Created plaintext DEK + S3 Master Key –> Encrypted DEK (S3 içinde depolanır) ve düz metin bellekten silinir
  • Şifre çözme:
  • Encrypted DEK + S3 Master Key –> Plaintext DEK
  • Plaintext DEK + Encrypted data –> Object Data

Lütfen unutmayın ki bu durumda anahtar AWS tarafından yönetilir (sadece her 3 yılda bir rotation yapılır). Kendi anahtarınızı kullanırsanız anahtarı döndürebilir, devre dışı bırakabilir ve erişim kontrolü uygulayabilirsiniz.

Sunucu tarafı şifreleme with KMS managed keys, SSE-KMS

Bu yöntem S3’ün key management service’i kullanarak data encryption key’lerinizi oluşturmasına izin verir. KMS, anahtarlarınızın nasıl yönetileceği konusunda çok daha fazla esneklik sunar. Örneğin CMK’yi devre dışı bırakabilir, döndürebilir ve erişim kontrolleri uygulayabilir, ayrıca AWS Cloud Trail kullanarak kullanımını denetleyebilirsiniz.

  • Şifreleme:
  • S3, veri anahtarlarını KMS CMK’den talep eder
  • KMS, bir CMK kullanarak düz metin DEK ile şifrelenmiş DEK çiftini üretir ve bunları S£’ye gönderir
  • S3, düz metin anahtarı veriyi şifrelemek için kullanır, şifrelenmiş veriyi ve şifrelenmiş anahtarı depolar ve düz metin anahtarı bellekten siler
  • Şifre çözme:
  • S3, nesnenin şifrelenmiş veri anahtarını çözmek için KMS’den talepte bulunur
  • KMS, CMK ile veri anahtarını çözer ve S3’e geri gönderir
  • S3 nesne verisini çözer
Sunucu tarafı şifreleme with customer provided keys, SSE-C

Bu seçenek, AWS dışında zaten kullandığınız kendi master anahtarınızı sağlamanıza olanak tanır. Müşteri tarafından sağlanan anahtarınız verinizle birlikte S3’e gönderilir ve S3 sizin için şifrelemeyi gerçekleştirir.

  • Şifreleme:
  • Kullanıcı nesne verisini + Customer key’i S3’e gönderir
  • Customer key veri şifrelemek için kullanılır ve şifrelenmiş veri depolanır
  • müşteri anahtarının gelecekteki doğrulama için bir salted HMAC değeri de saklanır
  • müşteri anahtarı bellekten silinir
  • Şifre çözme:
  • Kullanıcı customer key’i gönderir
  • Anahtar saklanan HMAC değeri ile doğrulanır
  • Müşteri tarafından sağlanan anahtar veri şifresini çözmek için kullanılır
Client-side encryption with KMS, CSE-KMS

SSE-KMS’e benzer şekilde, bu da data encryption key’lerinizi oluşturmak için key management service’i kullanır. Ancak bu sefer KMS, S3 yerine client tarafından çağrılır. Şifreleme client tarafında gerçekleşir ve şifrelenmiş veri S3’e depolanmak üzere gönderilir.

  • Şifreleme:
  • Client KMS’den bir data key talep eder
  • KMS, düz metin DEK ve CMK ile şifrelenmiş DEK’i döner
  • Her iki anahtar da geri gönderilir
  • Client düz metin DEK ile veriyi şifreler ve şifrelenmiş veriyi + şifrelenmiş DEK’i (S3 içinde şifrelenmiş verinin metadata’sı olarak saklanır) S3’e gönderir
  • Şifre çözme:
  • Şifrelenmiş veri ve şifrelenmiş DEK client’a gönderilir
  • Client, CMK kullanarak şifrelenmiş anahtarı çözmesi için KMS’den talepte bulunur ve KMS düz metin DEK’i geri gönderir
  • Client artık şifrelenmiş veriyi çözebilir
Client-side encryption with customer provided keys, CSE-C

Bu mekanizma ile kendi sağladığınız anahtarları kullanabilir ve verinizi S3’e göndermeden önce şifrelemek için bir AWS-SDK client kullanabilirsiniz.

  • Şifreleme:
  • Client bir DEK oluşturur ve düz metin veriyi şifreler
  • Ardından kendi özel CMK’sını kullanarak DEK’i şifreler
  • şifrelenmiş veriyi + şifrelenmiş DEK’i S3’e gönderir ve orada depolanır
  • Şifre çözme:
  • S3 şifrelenmiş veriyi ve DEK’i gönderir
  • Client zaten DEK’i şifrelemek için kullanılan CMK’ye sahip olduğundan DEK’i çözer ve ardından düz metin DEK ile veriyi çözer

Enumeration

AWS organizasyonlarını ele geçirmenin geleneksel ana yollarından biri herkese açık erişilebilir bucket’ların ele geçirilmesiyle başlar. Bulabilirsiniz 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

Bir S3 bucket’ına virtual hosted-style veya path-style endpoint adı kullanarak bir dual-stack endpoint üzerinden erişebilirsiniz. Bu, S3’e IPv6 üzerinden erişmek için kullanışlıdır.

Dual-stack endpoint’ler şu sözdizimini kullanır:

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

Privesc

Aşağıdaki sayfada S3 izinlerini kötüye kullanarak yetki yükseltmeyi nasıl yapabileceğinizi kontrol edebilirsiniz:

AWS - S3 Privesc

Kimliksiz Erişim

AWS - S3 Unauthenticated Enum

S3 Post Exploitation

AWS - S3 Post Exploitation

Persistence

AWS - S3 Persistence

Diğer S3 zafiyetleri

S3 HTTP Cache Poisoning Issue

According to this research rastgele bir bucket’ın yanıtını sanki farklı bir bucket’a aitmiş gibi önbelleğe almak mümkün oluyordu. Bu, örneğin javascript dosyası yanıtlarını değiştirmek ve S3’ü statik kod depolamak için kullanan rastgele sayfaları ele geçirmek için kötüye kullanılabilirdi.

Amazon Athena

Amazon Athena, Amazon Simple Storage Service (Amazon S3) içindeki verileri doğrudan standart SQL kullanarak anlamayı/analiz etmeyi kolaylaştıran interaktif bir sorgu servisidir.

İzlenen S3 bucket’larında görünecek içeriğin formatıyla uyumlu bir ilişkisel veritabanı tablosu hazırlamanız gerekir. Ardından, Amazon Athena günlüklerden veritabanını doldurabilir, böylece sorgulayabilirsiniz.

Amazon Athena, zaten şifrelenmiş S3 verilerini sorgulama yeteneğini destekler ve yapılandırıldığında sorgu sonuçlarını da şifreleyebilir; bu sonuçlar sonra S3’te saklanabilir.

Bu sonuçların şifrelenmesi, sorgulanan altındaki S3 verilerinden bağımsızdır, yani S3 verileri şifreli olmasa bile sorgu sonuçları şifrelenebilir. Dikkat edilmesi gereken birkaç nokta: Amazon Athena yalnızca aşağıdaki S3 şifreleme yöntemleriyle şifrelenen verileri destekler: SSE-S3, SSE-KMS, ve CSE-KMS.

SSE-C ve CSE-C desteklenmez. Ayrıca, Amazon Athena’nın yalnızca aynı bölgede bulunan şifreli objelere karşı sorgu çalıştıracağını anlamak önemlidir. KMS kullanılarak şifrelenmiş S3 verilerini sorgulamanız gerekiyorsa, sorguyu gerçekleştirebilmek için Athena kullanıcısına özel izinler verilmiş olmalıdır.

Keşif

# 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>

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin