AWS - IAM & STS Unauthenticated Enum
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:
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:
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:
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
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:
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:
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:
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
Last updated