AWS - S3, Athena & Glacier Enum

htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

S3

Amazon S3, büyük miktarda veri depolamanıza olanak sağlayan bir hizmettir.

Amazon S3, verilerin dinlenme durumunda korunmasını sağlamak için birden fazla seçenek sunar. Seçenekler arasında İzin (Politika), Şifreleme (İstemci ve Sunucu Tarafı), Bucket Sürümleme ve MFA temelli silme bulunur. Kullanıcı, veri koruması sağlamak için bu seçeneklerden herhangi birini etkinleştirebilir. Veri replikasyonu, S3'ün her nesneyi tüm Kullanılabilirlik Bölgeleri üzerinde otomatik olarak replike ettiği bir AWS iç tesisidir ve bu durumda organizasyonun bunu etkinleştirmesi gerekmez.

Kaynak tabanlı izinlerle, kovadaki alt dizinler için ayrı ayrı izinler tanımlayabilirsiniz.

Bucket Sürümleme ve MFA temelli silme

Kova sürümleme etkinleştirildiğinde, bir dosyanın içindeki bir dosyayı değiştirmeye çalışan herhangi bir işlem, aynı dosyanın yeni bir sürümünü oluşturacak ve aynı zamanda önceki içeriğini de koruyacaktır. Bu nedenle, içeriğini üzerine yazmayacaktır.

Ayrıca, MFA temelli silme, S3 kovasındaki dosyaların sürümlerinin silinmesini ve aynı zamanda Bucket Sürümleme'nin devre dışı bırakılmasını engelleyecektir, böylece saldırgan bu dosyaları değiştiremeyecektir.

S3 Erişim günlükleri

S3 erişim günlüklerini etkinleştirmek mümkündür (varsayılan olarak devre dışıdır) ve günlükleri farklı bir kovada kaydederek kovaya kimin eriştiğini bilmek mümkündür (her iki kova da aynı bölgede olmalıdır).

S3 Ön İmzalı URL'ler

Genellikle kovadaki belirtilen dosyaya erişmek için kullanılabilecek ön imzalı bir URL oluşturmak mümkündür. Bir ön imzalı URL şuna benzer:

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 ön imzalı URL, nesneye erişimi olan bir yetkilinin kimlik bilgileri kullanılarak cli'den oluşturulabilir (kullandığınız hesabın erişimi yoksa daha kısa bir ön imzalı URL oluşturulur, ancak işe yaramaz).

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

Presigned URL oluşturmak için gereken tek izin, verilen izindir, bu nedenle önceki komut için ilgili kişi tarafından gereken tek izin s3:GetObject iznidir.

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, Veri Şifreleme Anahtarı anlamına gelir ve her zaman veriyi şifrelemek için oluşturulan ve kullanılan anahtardır.

Sunucu taraflı S3 yönetilen anahtarlar ile şifreleme, SSE-S3

Bu seçenek minimal yapılandırma gerektirir ve kullanılan şifreleme anahtarlarının tüm yönetimi AWS tarafından yönetilir. Yapmanız gereken tek şey verinizi yüklemek ve S3'ün diğer tüm yönleriyle ilgilenmesine izin vermektir. Bir S3 hesabındaki her kovaya bir kova anahtarı atanır.

  • Şifreleme:

  • Nesne Verisi + oluşturulan düz metin DEK --> Şifreli veri (S3 içinde depolanır)

  • Oluşturulan düz metin DEK + S3 Anahtar Anahtarı --> Şifreli DEK (S3 içinde depolanır) ve düz metin bellekten silinir

  • Şifre çözme:

  • Şifreli DEK + S3 Anahtar Anahtarı --> Düz metin DEK

  • Düz metin DEK + Şifreli veri --> Nesne Verisi

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

Sunucu taraflı KMS yönetilen anahtarlar ile şifreleme, SSE-KMS

Bu yöntem, S3'ün anahtar yönetim hizmetini kullanarak veri şifreleme anahtarlarınızı oluşturmasına izin verir. KMS, anahtarlarınızın nasıl yönetildiği konusunda çok daha fazla esneklik sağlar. Örneğin, CMK'ya erişimi devre dışı bırakabilir, döndürebilir ve erişim kontrolleri uygulayabilir ve AWS Cloud Trail kullanarak kullanımlarına karşı önlem alabilirsiniz.

  • Şifreleme:

  • S3, KMS CMK'dan veri anahtarlarını istiyor

  • KMS, bir CMK kullanarak DEK düz metin ve DEK şifreli çiftini oluşturur ve S3'e gönderir

  • S3, veriyi şifrelemek için düz metin anahtarını kullanır, şifreli veriyi ve şifreli anahtarı depolar ve düz metin anahtarını bellekten siler

  • Şifre çözme:

  • S3, nesnenin şifreli veri anahtarını KMS'e çözmesi için sorar

  • KMS, CMK ile veri anahtarını çözer ve S3'e geri gönderir

  • S3, nesne verisini çözer

Sunucu taraflı müşteri tarafından sağlanan anahtarlar ile şifreleme, SSE-C

Bu seçenek, AWS dışında zaten kullandığınız kendi anahtarınızı sağlama imkanı verir. Müşteri tarafından sağlanan anahtarınız daha sonra verinizle birlikte S3'e gönderilir ve S3 şifrelemeyi sizin için gerçekleştirir.

  • Şifreleme:

  • Kullanıcı, nesne verisini + Müşteri anahtarını S3'e gönderir

  • Müşteri anahtarı, veriyi şifrelemek için kullanılır ve şifreli veri depolanır

  • gelecekteki anahtar doğrulaması için müşteri anahtarının tuzlu HMAC değeri de depolanır

  • müşteri anahtarı bellekten silinir

  • Şifre çözme:

  • Kullanıcı, müşteri anahtarını gönderir

  • Anahtar, depolanmış HMAC değeriyle doğrulanır

  • Müşteri tarafından sağlanan anahtar daha sonra veriyi çözmek için kullanılır

İstemci tarafı şifreleme KMS ile, CSE-KMS

SSE-KMS ile benzer şekilde, bu da veri şifreleme anahtarlarınızı oluşturmak için anahtar yönetim hizmetini kullanır. Ancak bu sefer KMS, S3 yerine istemci tarafından çağrılır. Şifreleme daha sonra istemci tarafında gerçekleşir ve şifreli veri S3'e depolanmak üzere gönderilir.

  • Şifreleme:

  • İstemci, KMS'ten bir veri anahtarı talep eder

  • KMS, düz metin DEK ve şifreli DEK'yi CMK ile birlikte döndürür

  • Her iki anahtar da geri gönderilir

  • İstemci daha sonra veriyi düz metin DEK ile şifreler ve şifreli veriyi + şifreli DEK'yi (S3 içinde şifreli verinin meta verisi olarak kaydedilir) S3'e gönderir

  • Şifre çözme:

  • Şifreli DEK ile şifreli veri DEK istemciye gönderilir

  • İstemci, CMK kullanarak şifreli anahtarı çözmek için KMS'e başvurur ve KMS düz metin DEK'yi geri gönderir

  • İstemci şimdi şifreli veriyi çözebilir

İstemci tarafı şifreleme müşteri tarafından sağlanan anahtarlar ile, CSE-C

Bu mekanizmayı kullanarak, kendi sağladığınız anahtarları kullanabilir ve verinizi S3'e depolamadan önce AWS-SDK istemcisini kullanarak verinizi şifreleyebilirsiniz.

  • Şifreleme:

  • İstemci, bir DEK oluşturur ve düz metin veriyi şifreler

  • Ardından, kendi özel CMK'sını kullanarak DEK'yi şifreler

  • şifreli veriyi + şifreli DEK'yi S3'e gönderir ve depolar

  • Şifre çözme:

  • S3, şifreli veriyi ve DEK'yi gönderir

  • İstemci, DEK'yi şifrelemek için kullandığı CMK'ye zaten sahip olduğu için DEK'yi çözer ve ardından düz metin DEK'yi kullanarak veriyi çözer

Numaralandırma

AWS orglarını tehlikeye atan geleneksel ana yollardan biri, halka açık erişilebilir kovaları tehlikeye atarak başlar. Bu sayfada halka açık kova numaralandırıcılarını bulabilirsiniz.

# 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

Çift Yığın

Bir S3 kovasına çift yığın uç noktası aracılığıyla erişebilirsiniz. Bunun için sanal barındırma stili veya yol stili uç nokta adını kullanabilirsiniz. Bunlar, S3'e IPv6 üzerinden erişmek için kullanışlıdır.

Çift yığın uç noktaları aşağıdaki sözdizimini kullanır:

  • bucketname.s3.dualstack.aws-bölge.amazonaws.com

  • s3.dualstack.aws-bölge.amazonaws.com/bucketname

İstismar

Aşağıdaki sayfada, ayrıcalıkları yükseltmek için S3 izinlerini kötüye kullanma yöntemlerini kontrol edebilirsiniz:

pageAWS - S3 Privesc

Kimlik Doğrulama Olmadan Erişim

pageAWS - S3 Unauthenticated Enum

S3 Sonrası Sömürü

pageAWS - S3 Post Exploitation

Kalıcılık

pageAWS - S3 Persistence

Diğer S3 zayıflıkları

S3 HTTP Önbellek Zehirlenme Sorunu

Bu araştırmaya göre, bir başka kovaya ait yanıtı farklı bir kova gibi önbelleğe almak mümkündü. Bu, örneğin JavaScript dosyası yanıtlarını değiştirmek ve S3'ü kullanarak statik kod depolayan herhangi bir sayfayı tehlikeye atmak için kötüye kullanılabilirdi.

Amazon Athena

Amazon Athena, Amazon Simple Storage Service (Amazon S3) üzerindeki verileri standart SQL kullanarak doğrudan analiz etmeyi kolaylaştıran etkileşimli bir sorgu hizmetidir.

İzlenen S3 kovalarında görünecek içeriğin formatına sahip bir ilişkisel DB tablosu hazırlamanız gerekmektedir. Ardından, Amazon Athena günlüklerden DB'yi doldurabilecek ve sorgulama yapabileceksiniz.

Amazon Athena, zaten şifrelenmiş S3 verilerini sorgulama yeteneğini destekler ve yapılandırıldığı takdirde, sorgunun sonuçlarını da şifreleyebilir ve ardından S3'te depolanabilir.

Bu sonuçların şifrelenmesi, sorgulanan temel S3 verilerinden bağımsızdır, yani S3 verileri şifrelenmemiş olsa bile, sorgulanan sonuçlar şifrelenebilir. Dikkate alınması gereken birkaç nokta şunlardır: Amazon Athena yalnızca aşağıdaki S3 şifreleme yöntemleriyle şifrelenmiş verileri destekler: SSE-S3, SSE-KMS ve CSE-KMS.

SSE-C ve CSE-E desteklenmez. Buna ek olarak, Amazon Athena yalnızca sorgunun kendisiyle aynı bölgede bulunan şifrelenmiş nesneler üzerinde sorguları çalıştırır. KMS kullanarak şifrelenmiş S3 verilerini sorgulamak isterseniz, Athena kullanıcısının sorguyu gerçekleştirmek için belirli izinlere sahip olması gerekmektedir.

Numaralandırma

# 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

htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated