# OAuth zur Übernahme von Konten
Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)! Andere Möglichkeiten, HackTricks zu unterstützen: * Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks im PDF-Format herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)! * Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com) * Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family) * **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegramm-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories einreichen.
{% embed url="https://websec.nl/" %} ## Grundlegende Informationen OAuth bietet verschiedene Versionen, mit grundlegenden Einblicken unter [OAuth 2.0-Dokumentation](https://oauth.net/2/). Diese Diskussion konzentriert sich hauptsächlich auf den weit verbreiteten [OAuth 2.0-Autorisierungscode-Grant-Typ](https://oauth.net/2/grant-types/authorization-code/), der ein **Autorisierungsframework bereitstellt, das einer Anwendung ermöglicht, auf das Konto eines Benutzers in einer anderen Anwendung zuzugreifen oder Aktionen durchzuführen** (der Autorisierungsserver). Betrachten Sie eine hypothetische Website _**https://example.com**_, die dazu dient, **alle Ihre Social-Media-Beiträge** anzuzeigen, einschließlich privater Beiträge. Um dies zu erreichen, wird OAuth 2.0 eingesetzt. _https://example.com_ wird um Ihre Erlaubnis bitten, **auf Ihre Social-Media-Beiträge zuzugreifen**. Daraufhin erscheint ein Zustimmungsbildschirm auf _https://socialmedia.com_, der die **angeforderten Berechtigungen und den Entwickler, der die Anfrage stellt**, auflistet. Nach Ihrer Autorisierung erhält _https://example.com_ die Möglichkeit, **in Ihrem Namen auf Ihre Beiträge zuzugreifen**. Es ist wichtig, die folgenden Komponenten im OAuth 2.0-Framework zu verstehen: - **Ressourcenbesitzer**: Sie als **Benutzer/Entität** autorisieren den Zugriff auf Ihre Ressource, wie z.B. Ihre Social-Media-Kontobeiträge. - **Ressourcenserver**: Der **Server, der authentifizierte Anfragen verwaltet**, nachdem die Anwendung im Namen des `Ressourcenbesitzers` ein `Zugriffstoken` erhalten hat, z.B. **https://socialmedia.com**. - **Client-Anwendung**: Die **Anwendung, die die Autorisierung anfordert**, vom `Ressourcenbesitzer`, wie z.B. **https://example.com**. - **Autorisierungsserver**: Der **Server, der `Zugriffstoken` ausstellt** an die `Client-Anwendung` nach erfolgreicher Authentifizierung des `Ressourcenbesitzers` und Sicherung der Autorisierung, z.B. **https://socialmedia.com**. - **client\_id**: Ein öffentlicher, eindeutiger Bezeichner für die Anwendung. - **client\_secret:** Ein vertraulicher Schlüssel, der nur der Anwendung und dem Autorisierungsserver bekannt ist und zur Generierung von `Zugriffstoken` verwendet wird. - **response\_type**: Ein Wert, der den **Typ des angeforderten Tokens** angibt, wie z.B. `code`. - **scope**: Das **Zugriffsniveau**, das die `Client-Anwendung` vom `Ressourcenbesitzer` anfordert. - **redirect\_uri**: Die **URL, zu der der Benutzer nach der Autorisierung umgeleitet wird**. Diese muss in der Regel mit der vorregistrierten Umleitungs-URL übereinstimmen. - **state**: Ein Parameter zum **Aufrechterhalten von Daten während der Umleitung des Benutzers zum und vom Autorisierungsserver**. Seine Eindeutigkeit ist entscheidend, um als **CSRF-Schutzmechanismus** zu dienen. - **grant\_type**: Ein Parameter, der **den Grant-Typ und den Typ des zurückzugebenden Tokens** angibt. - **code**: Der Autorisierungscode vom `Autorisierungsserver`, der zusammen mit `client_id` und `client_secret` von der Client-Anwendung verwendet wird, um ein `Zugriffstoken` zu erhalten. - **access\_token**: Das **Token, das die Client-Anwendung für API-Anfragen** im Namen des `Ressourcenbesitzers` verwendet. - **refresh\_token**: Ermöglicht es der Anwendung, **ein neues `Zugriffstoken` zu erhalten, ohne den Benutzer erneut zur Eingabe aufzufordern**. ### Ablauf Der **tatsächliche OAuth-Ablauf** erfolgt wie folgt: 1. Sie navigieren zu [https://example.com](https://example.com) und wählen die Schaltfläche "Mit Social Media integrieren". 2. Die Website sendet dann eine Anfrage an [https://socialmedia.com](https://socialmedia.com), um Ihre Autorisierung zu erhalten, damit die Anwendung von https://example.com auf Ihre Beiträge zugreifen kann. Die Anfrage ist strukturiert als: ``` https://socialmedia.com/auth ?response_type=code &client_id=example_clientId &redirect_uri=https%3A%2F%2Fexample.com%2Fcallback &scope=readPosts &state=randomString123 ``` 3. Sie werden dann mit einer Zustimmungsseite präsentiert. 4. Nach Ihrer Zustimmung sendet Social Media eine Antwort an die `redirect_uri` mit den Parametern `code` und `state`: ``` https://example.com?code=uniqueCode123&state=randomString123 ``` 5. https://example.com verwendet diesen `code` zusammen mit seiner `client_id` und `client_secret`, um eine serverseitige Anfrage zu stellen und im Auftrag von Ihnen ein `access_token` zu erhalten, das den Zugriff auf die von Ihnen zugestimmten Berechtigungen ermöglicht: ``` POST /oauth/access_token Host: socialmedia.com ...{"client_id": "example_clientId", "client_secret": "example_clientSecret", "code": "uniqueCode123", "grant_type": "authorization_code"} ``` 6. Schließlich endet der Prozess, wenn https://example.com Ihren `access_token` verwendet, um einen API-Aufruf an Social Media zu tätigen, um Zugriff zu erhalten. ## Schwachstellen ### Offene redirect\_uri Die `redirect_uri` ist für die Sicherheit bei OAuth- und OpenID-Implementierungen entscheidend, da sie angibt, wohin sensible Daten wie Autorisierungscodes nach der Autorisierung gesendet werden. Wenn sie falsch konfiguriert ist, könnten Angreifer diese Anfragen auf bösartige Server umleiten und so Account-Übernahmen ermöglichen. Die Ausbeutungstechniken variieren je nach Validierungslogik des Autorisierungsservers. Sie reichen von streichenden Pfadübereinstimmungen bis zur Akzeptanz jeder URL innerhalb der angegebenen Domäne oder Unterverzeichnisses. Häufige Ausbeutungsmethoden umfassen offene Weiterleitungen, Pfadtraversierung, Ausnutzung schwacher Regexes und HTML-Injektionen zum Diebstahl von Tokens. Neben `redirect_uri` sind auch andere OAuth- und OpenID-Parameter wie `client_uri`, `policy_uri`, `tos_uri` und `initiate_login_uri` anfällig für Weiterleitungsangriffe. Diese Parameter sind optional und ihre Unterstützung variiert je nach Server. Für diejenigen, die einen OpenID-Server ins Visier nehmen, listet der Entdeckungsendpunkt (`**.well-known/openid-configuration**`) oft wertvolle Konfigurationsdetails wie `registration_endpoint`, `request_uri_parameter_supported` und "`require_request_uri_registration`. Diese Details können dabei helfen, den Registrierungsendpunkt und andere Konfigurationsdetails des Servers zu identifizieren. ### XSS in Redirect-Implementierung Wie in diesem Bug-Bounty-Bericht erwähnt [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html) könnte es möglich sein, dass die Redirect-**URL in der Antwort** des Servers nach der Authentifizierung des Benutzers **reflektiert wird und anfällig für XSS ist**. Möglicher Payload zum Testen: ``` https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard

test

``` ### CSRF - Unzureichende Behandlung des Zustandsparameters Bei OAuth-Implementierungen kann der Missbrauch oder das Weglassen des **`state`-Parameters** das Risiko von **Cross-Site Request Forgery (CSRF)**-Angriffen erheblich erhöhen. Diese Schwachstelle tritt auf, wenn der `state`-Parameter entweder **nicht verwendet wird, als statischer Wert verwendet wird oder nicht ordnungsgemäß validiert wird**, was es Angreifern ermöglicht, CSRF-Schutzmechanismen zu umgehen. Angreifer können dies ausnutzen, indem sie den Autorisierungsprozess abfangen, um ihr Konto mit dem Konto eines Opfers zu verknüpfen, was zu potenziellen **Account-Übernahmen** führt. Dies ist besonders kritisch in Anwendungen, in denen OAuth für **Authentifizierungszwecke** verwendet wird. Beispiele aus der realen Welt für diese Schwachstelle wurden in verschiedenen **CTF-Herausforderungen** und **Hacking-Plattformen** dokumentiert, was ihre praktischen Auswirkungen verdeutlicht. Das Problem erstreckt sich auch auf Integrationen mit Drittanbieterdiensten wie **Slack**, **Stripe** und **PayPal**, wo Angreifer Benachrichtigungen oder Zahlungen auf ihre Konten umleiten können. Eine ordnungsgemäße Behandlung und Validierung des **`state`-Parameters** sind entscheidend, um sich gegen CSRF zu schützen und den OAuth-Fluss abzusichern. ### Vor Kontoübernahme 1. **Ohne E-Mail-Verifizierung bei der Kontenerstellung**: Angreifer können präventiv ein Konto mit der E-Mail des Opfers erstellen. Wenn das Opfer später einen Drittanbieterdienst für die Anmeldung verwendet, könnte die Anwendung möglicherweise dieses Drittanbieterkonto unbeabsichtigt mit dem vorab erstellten Konto des Angreifers verknüpfen, was zu unbefugtem Zugriff führt. 2. **Ausnutzung der laxen OAuth-E-Mail-Verifizierung**: Angreifer können OAuth-Dienste ausnutzen, die keine E-Mail-Verifizierung durchführen, indem sie sich bei ihrem Dienst registrieren und dann die Kontoe-Mail in die des Opfers ändern. Diese Methode birgt ähnliche Risiken für unbefugten Kontozugriff wie das erste Szenario, jedoch über einen anderen Angriffsvektor. ### Offenlegung von Geheimnissen Die Identifizierung und der Schutz geheimer OAuth-Parameter sind entscheidend. Während die **`client_id`** sicher offengelegt werden kann, birgt die Offenlegung des **`client_secret`** erhebliche Risiken. Wenn das `client_secret` kompromittiert ist, können Angreifer die Identität und das Vertrauen der Anwendung ausnutzen, um **Benutzer-`access_tokens`** und private Informationen zu stehlen. Eine häufige Schwachstelle tritt auf, wenn Anwendungen fälschlicherweise den Austausch des Autorisierungs`codes` für einen `access_token` auf der Client-Seite anstelle der Server-Seite behandeln. Dieser Fehler führt zur Offenlegung des `client_secret`, was es Angreifern ermöglicht, `access_tokens` unter dem Deckmantel der Anwendung zu generieren. Darüber hinaus könnten Angreifer durch Social Engineering Privilegien eskalieren, indem sie zusätzliche Berechtigungen zur OAuth-Autorisierung hinzufügen und so den vertrauenswürdigen Status der Anwendung weiter ausnutzen. ### Bruteforce des Client-Secret Sie können versuchen, das **Client-Secret zu bruteforcen** eines Dienstanbieters mit dem Identitätsanbieter, um Konten zu stehlen.\ Die Anfrage an BF könnte ähnlich aussehen: ``` POST /token HTTP/1.1 content-type: application/x-www-form-urlencoded host: 10.10.10.10:3000 content-length: 135 Connection: close code=77515&redirect_uri=http%3A%2F%2F10.10.10.10%3A3000%2Fcallback&grant_type=authorization_code&client_id=public_client_id&client_secret=[bruteforce] ``` ### Referer-Header leakt Code + State Sobald der Client den **Code und den Status** hat, ist er anfällig, wenn diese **im Referer-Header enthalten sind**, während er auf eine andere Seite navigiert. ### Zugriffstoken im Browserverlauf gespeichert Überprüfen Sie den **Browserverlauf und prüfen Sie, ob das Zugriffstoken dort gespeichert ist**. ### Dauerhafter Autorisierungscode Der **Autorisierungscode sollte nur für kurze Zeit gültig sein, um das Zeitfenster zu begrenzen, in dem ein Angreifer ihn stehlen und verwenden kann**. ### Autorisierungs-/Auffrischungstoken nicht an Client gebunden Wenn Sie den **Autorisierungscode erhalten und mit einem anderen Client verwenden können, können Sie andere Konten übernehmen**. ### Erfolgreiche Pfade, XSS, Iframes & Post-Nachrichten zum Leaken von Code- & Statuswerten **[Überprüfen Sie diesen Beitrag](https://labs.detectify.com/writeups/account-hijacking-using-dirty-dancing-in-sign-in-oauth-flows/#gadget-2-xss-on-sandbox-third-party-domain-that-gets-the-url)** ### AWS Cognito In diesem Bug-Bounty-Bericht: [**https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/**](https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/) können Sie sehen, dass das **Token**, das **AWS Cognito** dem Benutzer zurückgibt, möglicherweise **ausreichende Berechtigungen hat, um die Benutzerdaten zu überschreiben**. Daher könnten Sie, wenn Sie die **E-Mail-Adresse des Benutzers in eine andere E-Mail-Adresse ändern können**, möglicherweise die Konten anderer übernehmen. ```bash # Read info of the user aws cognito-idp get-user --region us-east-1 --access-token eyJraWQiOiJPVj[...] # Change email address aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ[...] --user-attributes Name=email,Value=imaginary@flickr.com { "CodeDeliveryDetailsList": [ { "Destination": "i***@f***.com", "DeliveryMedium": "EMAIL", "AttributeName": "email" } ] } ``` ### Ausnutzung von Tokens anderer Apps Wie in [**diesem Bericht erwähnt**](https://salt.security/blog/oh-auth-abusing-oauth-to-take-over-millions-of-accounts), könnten OAuth-Flows, die erwarten, das **Token** (und nicht einen Code) zu erhalten, verwundbar sein, wenn sie nicht überprüfen, ob das Token zur App gehört. Dies liegt daran, dass ein **Angreifer** eine **Anwendung erstellen könnte, die OAuth unterstützt und sich mit Facebook anmeldet** (zum Beispiel) in seiner eigenen Anwendung. Dann, sobald ein Opfer sich mit Facebook in der **Anwendung des Angreifers** anmeldet, könnte der Angreifer das **OAuth-Token des Benutzers, das seiner Anwendung gewährt wurde, erhalten und verwenden, um sich in der OAuth-Anwendung des Opfers mit dem Token des Opfers anzumelden**. {% hint style="danger" %} Daher, wenn es dem Angreifer gelingt, den Benutzer dazu zu bringen, seine eigene OAuth-Anwendung zu nutzen, wird er in der Lage sein, das Konto des Opfers in Anwendungen zu übernehmen, die ein Token erwarten und nicht überprüfen, ob das Token ihrer App-ID zugewiesen wurde. {% endhint %} ### Zwei Links & Cookie Laut [**diesem Bericht**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f) war es möglich, ein Opfer dazu zu bringen, eine Seite mit einer **returnUrl** zu öffnen, die auf den Host des Angreifers zeigt. Diese Information würde in einem Cookie (RU) gespeichert und in einem **späteren Schritt** würde der **Prompt** den **Benutzer** fragen, ob er Zugriff auf diesen Host des Angreifers gewähren möchte. Um diesen Prompt zu umgehen, war es möglich, einen Tab zu öffnen, um den **OAuth-Flow** zu initiieren, der dieses RU-Cookie mit der **returnUrl** setzen würde, den Tab zu schließen, bevor der Prompt angezeigt wird, und einen neuen Tab ohne diesen Wert zu öffnen. Dann würde der **Prompt nicht über den Host des Angreifers informieren**, aber das Cookie würde darauf gesetzt sein, sodass das **Token an den Host des Angreifers gesendet** wird. ### SSRF-Parameter **[Überprüfen Sie diese Forschung](https://portswigger.net/research/hidden-oauth-attack-vectors) für weitere Details zu dieser Technik.** Die dynamische Client-Registrierung in OAuth dient als ein weniger offensichtlicher, aber kritischer Vektor für Sicherheitslücken, insbesondere für **Server-seitige Anforderungsfälschungen (SSRF)**-Angriffe. Dieser Endpunkt ermöglicht es OAuth-Servern, Details über Client-Anwendungen zu erhalten, einschließlich sensibler URLs, die ausgenutzt werden könnten. **Hauptpunkte:** - Die **dynamische Client-Registrierung** ist oft auf `/register` abgebildet und akzeptiert Details wie `client_name`, `client_secret`, `redirect_uris` und URLs für Logos oder JSON Web Key Sets (JWKs) über POST-Anfragen. - Diese Funktion entspricht den in den Spezifikationen von **RFC7591** und **OpenID Connect Registration 1.0** festgelegten Parametern, die potenziell anfällig für SSRF sind. - Der Registrierungsprozess kann Server unbeabsichtigt SSRF auf verschiedene Weisen aussetzen: - **`logo_uri`**: Eine URL für das Logo der Client-Anwendung, das vom Server abgerufen werden könnte, um SSRF auszulösen oder zu XSS zu führen, wenn die URL falsch behandelt wird. - **`jwks_uri`**: Eine URL zum JWK-Dokument des Clients, das bei bösartiger Gestaltung den Server dazu bringen kann, ausgehende Anfragen an einen vom Angreifer kontrollierten Server zu senden. - **`sector_identifier_uri`**: Verweist auf ein JSON-Array von `redirect_uris`, das der Server abrufen könnte, um eine SSRF-Möglichkeit zu schaffen. - **`request_uris`**: Listet erlaubte Anforderungs-URIs für den Client auf, die ausgenutzt werden können, wenn der Server diese URIs zu Beginn des Autorisierungsprozesses abruft. **Ausbeutungsstrategie:** - SSRF kann ausgelöst werden, indem ein neuer Client mit bösartigen URLs in Parametern wie `logo_uri`, `jwks_uri` oder `sector_identifier_uri` registriert wird. - Während eine direkte Ausnutzung über `request_uris` durch Whitelistenkontrollen gemildert werden kann, kann die Bereitstellung eines vorregistrierten, vom Angreifer kontrollierten `request_uri` SSRF während der Autorisierungsphase erleichtern. ## Race Conditions bei OAuth-Anbietern Wenn die Plattform, die Sie testen, ein OAuth-Anbieter ist, [**lesen Sie dies, um mögliche Race Conditions zu testen**](race-condition.md). ## Referenzen * [**https://medium.com/a-bugz-life/the-wondeful-world-of-oauth-bug-bounty-edition-af3073b354c1**](https://medium.com/a-bugz-life/the-wondeful-world-of-oauth-bug-bounty-edition-af3073b354c1) * [**https://portswigger.net/research/hidden-oauth-attack-vectors**](https://portswigger.net/research/hidden-oauth-attack-vectors)
{% embed url="https://websec.nl/" %}
Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)! Andere Möglichkeiten, HackTricks zu unterstützen: * Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks im PDF-Format herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)! * Holen Sie sich das [**offizielle PEASS & HackTricks-Merch**](https://peass.creator-spring.com) * Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family) * **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories einreichen.