AWS - IAM & STS Kimlik Doğrulaması Olmayan 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

Bir hesapta Rolleri & Kullanıcı Adlarını Sıralama

Assume Role Brute-Force

Caution

Bu teknik artık çalışmıyor; rol var mı yok mu fark etmeksizin her zaman şu hatayı alırsınız:

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::947247140022:user/testenv is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::429217632764:role/account-balanceasdas

Bunu çalıştırarak test edebilirsiniz:

aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example

Gerekli izinler olmadan bir role AssumeRole ile erişmeye çalışmak AWS tarafından bir hata mesajı tetikler. Örneğin, yetkisiz ise AWS şu hatayı döndürebilir:

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::012345678901:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::111111111111:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS

Bu mesaj rolün varlığını doğrular ancak rolün üstlenme politikası sizin bu rolü üstlenmenize izin vermediğini gösterir. Buna karşılık, var olmayan bir rolü üstlenmeye çalışmak farklı bir hataya yol açar:

An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole

İlginç bir şekilde, bu yöntem mevcut ve mevcut olmayan rolleri ayırt etme işlemi farklı AWS hesapları arasında bile uygulanabilir. Geçerli bir AWS account ID’si ve hedeflenmiş bir wordlist ile, hesaptaki rolleri herhangi bir yerleşik sınırlama olmadan listeleyebilirsiniz.

You can use this script to enumerate potential principals abusing this issue.

Trust Policies: Brute-Force Cross Account roller ve kullanıcılar

Bir IAM role’un trust policy’sini yapılandırmak veya güncellemek, hangi AWS kaynaklarının veya servislerinin bu rolü üstlenip geçici kimlik bilgileri elde edebileceğini tanımlamayı içerir. Eğer politika içindeki belirtilen kaynak mevcutsa, trust policy başarıyla kaydedilir. Ancak kaynak mevcut değilse, bir hata üretilir, bu da geçersiz bir principal sağlandığını gösterir.

Warning

O kaynaktaki değere cross account bir rol veya kullanıcı belirtebileceğinizi unutmayın:

  • arn:aws:iam::acc_id:role/role_name
  • arn:aws:iam::acc_id:user/user_name

This is a policy example:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::216825089941:role/Test"
},
"Action": "sts:AssumeRole"
}
]
}

GUI

Bu, var olmayan bir rol kullandığınızda karşılaşacağınız hatadır. Eğer rol mevcutsa, politika herhangi bir hata olmadan kaydedilecektir. (Hata güncelleme içindir, fakat oluştururken de geçerlidir.)

CLI

### You could also use: aws iam update-assume-role-policy
# When it works
aws iam create-role --role-name Test-Role --assume-role-policy-document file://a.json
{
"Role": {
"Path": "/",
"RoleName": "Test-Role",
"RoleId": "AROA5ZDCUJS3DVEIYOB73",
"Arn": "arn:aws:iam::947247140022:role/Test-Role",
"CreateDate": "2022-05-03T20:50:04Z",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::316584767888:role/account-balance"
},
"Action": [
"sts:AssumeRole"
]
}
]
}
}
}

# When it doesn't work
aws iam create-role --role-name Test-Role2 --assume-role-policy-document file://a.json
An error occurred (MalformedPolicyDocument) when calling the CreateRole operation: Invalid principal in policy: "AWS":"arn:aws:iam::316584767888:role/account-balanceefd23f2"

Bu işlemi şu araçla otomatikleştirebilirsiniz: https://github.com/carlospolop/aws_tools

  • bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt

Veya Pacu kullanarak:

  • run iam__enum_users --role-name admin --account-id 229736458923 --word-list /tmp/names.txt
  • run iam__enum_roles --role-name admin --account-id 229736458923 --word-list /tmp/names.txt
  • The admin role used in the example is a role in your account to by impersonated by pacu to create the policies it needs to create for the enumeration

Privesc

Eğer role kötü yapılandırılmışsa ve herkesin assume etmesine izin veriyorsa:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole"
}
]
}

Saldırgan bunu doğrudan üstlenebilir.

Üçüncü Taraf OIDC Federasyonu

Bir Github Actions workflow’unu okuyabildiğinizi ve bunun AWS içindeki bir role’a eriştiğini hayal edin.
Bu trust, aşağıdaki trust policy ile bir role’a erişim verebilir:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<acc_id>:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
}
}
}
]
}

Bu trust policy doğru olabilir, ancak daha fazla koşulun eksikliği ona güvenmemeniz gerektiğini göstermeli.
Çünkü önceki rol Github Actions’taki HERKES tarafından üstlenilebilir! Koşullarda ayrıca org adı, repo adı, env, brach… gibi diğer şeyleri de belirtmelisiniz.

Başka bir olası yanlış yapılandırma, aşağıdaki gibi bir koşul eklemektir:

"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:org_name*:*"
}

Dikkat: wildcard (*) colon (:)’dan önce olmalıdır. Örneğin org_name1 gibi bir org oluşturabilir ve bir Github Action üzerinden assume the role yapabilirsiniz.

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