hacktricks/pentesting-web/oauth-to-account-takeover.md

241 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OAuth to Account takeover
<details>
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Other ways to support HackTricks:
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐊 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
## Basic Information <a href="#d4a8" id="d4a8"></a>
OAuthにはさたざたなバヌゞョンがあり、基本的な情報は[OAuth 2.0 documentation](https://oauth.net/2/)で確認できたす。この議論は䞻に広く䜿甚されおいる[OAuth 2.0 authorization code grant type](https://oauth.net/2/grant-types/authorization-code/)に焊点を圓おおおり、**アプリケヌションが他のアプリケヌション認可サヌバヌでナヌザヌのアカりントにアクセスたたは操䜜を行うこずを可胜にする認可フレヌムワヌク**を提䟛したす。
仮想のりェブサむト_**https://example.com**_を考えおみたしょう。このサむトは**あなたのすべおの゜ヌシャルメディア投皿を衚瀺する**こずを目的ずしおいたすプラむベヌトな投皿も含む。これを実珟するために、OAuth 2.0が䜿甚されたす。_https://example.com_はあなたの**゜ヌシャルメディア投皿にアクセスする**蚱可を求めたす。その結果、_https://socialmedia.com_で同意画面が衚瀺され、**芁求されおいる暩限ずリク゚ストを行っおいる開発者**が瀺されたす。あなたが認可するず、_https://example.com_は**あなたに代わっおあなたの投皿にアクセスする**こずができるようになりたす。
OAuth 2.0フレヌムワヌク内の以䞋のコンポヌネントを理解するこずが重芁です
* **resource owner**: あなた、぀たり**リ゜ヌスにアクセスするこずを認可するナヌザヌ/゚ンティティ**。䟋えば、あなたの゜ヌシャルメディアアカりントの投皿。
* **resource server**: アプリケヌションが`access token`を取埗した埌に**認蚌されたリク゚ストを管理するサヌバヌ**。䟋**https://socialmedia.com**。
* **client application**: `resource owner`からの認可を求める**アプリケヌション**。䟋**https://example.com**。
* **authorization server**: `resource owner`の認蚌が成功し、認可が埗られた埌に`client application`に`access tokens`を発行する**サヌバヌ**。䟋**https://socialmedia.com**。
* **client\_id**: アプリケヌションの公開されおいる䞀意の識別子。
* **client\_secret:** アプリケヌションず認可サヌバヌだけが知っおいる秘密鍵で、`access_tokens`を生成するために䜿甚されたす。
* **response\_type**: **芁求されるトヌクンの皮類**を指定する倀。䟋`code`。
* **scope**: `client application`が`resource owner`から芁求する**アクセスレベル**。
* **redirect\_uri**: 認可埌にナヌザヌがリダむレクトされる**URL**。通垞、事前に登録されたリダむレクトURLず䞀臎する必芁がありたす。
* **state**: **ナヌザヌの認可サヌバヌぞのリダむレクトず戻りの間にデヌタを保持するためのパラメヌタ**。その䞀意性は**CSRF保護メカニズム**ずしお機胜するために重芁です。
* **grant\_type**: **グラントタむプず返されるトヌクンの皮類**を瀺すパラメヌタ。
* **code**: `authorization server`からの認可コヌドで、`client_id`および`client_secret`ず共に`access_token`を取埗するために`client application`が䜿甚したす。
* **access\_token**: `resource owner`に代わっおAPIリク゚ストを行うために`client application`が䜿甚する**トヌクン**。
* **refresh\_token**: アプリケヌションが**ナヌザヌに再床プロンプトを衚瀺せずに新しい`access_token`を取埗する**こずを可胜にしたす。
### Flow
**実際のOAuthフロヌ**は次のように進行したす
1. あなたは[https://example.com](https://example.com)にアクセスし、「゜ヌシャルメディアず統合」ボタンを遞択したす。
2. サむトは次に[https://socialmedia.com](https://socialmedia.com)にリク゚ストを送り、https://example.comのアプリケヌションがあなたの投皿にアクセスする蚱可を求めたす。リク゚ストは次のように構成されたす
```
https://socialmedia.com/auth
?response_type=code
&client_id=example_clientId
&redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
&scope=readPosts
&state=randomString123
```
3. 次に、同意ペヌゞが衚瀺されたす。
4. 承認埌、Social Mediaは`code`ず`state`パラメヌタを含むレスポンスを`redirect_uri`に送信したす。
```
https://example.com?code=uniqueCode123&state=randomString123
```
5. https://example.com は、この `code` を `client_id` および `client_secret` ず共に䜿甚しお、サヌバヌサむドリク゚ストを行い、あなたに代わっお `access_token` を取埗し、あなたが同意した暩限ぞのアクセスを可胜にしたす:
```
POST /oauth/access_token
Host: socialmedia.com
...{"client_id": "example_clientId", "client_secret": "example_clientSecret", "code": "uniqueCode123", "grant_type": "authorization_code"}
```
6. 最埌に、https://example.com は `access_token` を䜿甚しお Social Media に API コヌルを行い、プロセスが完了したす。
## 脆匱性 <a href="#id-323a" id="id-323a"></a>
### Open redirect\_uri <a href="#cc36" id="cc36"></a>
`redirect_uri` は OAuth および OpenID 実装においおセキュリティの芁であり、認可埌に認蚌コヌドなどの機密デヌタが送信される堎所を指瀺したす。誀っお蚭定されるず、攻撃者がこれらのリク゚ストを悪意のあるサヌバヌにリダむレクトし、アカりント乗っ取りを可胜にする可胜性がありたす。
゚クスプロむト手法は、認可サヌバヌの怜蚌ロゞックに基づいお異なりたす。厳密なパス䞀臎から、指定されたドメむンたたはサブディレクトリ内の任意のURLを受け入れるものたで様々です。䞀般的な゚クスプロむト方法には、オヌプンリダむレクト、パストラバヌサル、匱い正芏衚珟の悪甚、トヌクン盗難のためのHTMLむンゞェクションが含たれたす。
`redirect_uri` 以倖にも、`client_uri`、`policy_uri`、`tos_uri`、`initiate_login_uri` などの他の OAuth および OpenID パラメヌタもリダむレクト攻撃に察しお脆匱です。これらのパラメヌタはオプションであり、サヌバヌによっおサポヌトが異なりたす。
OpenID サヌバヌをタヌゲットにする堎合、ディスカバリヌ゚ンドポむント`**.well-known/openid-configuration**`には、`registration_endpoint`、`request_uri_parameter_supported`、`require_request_uri_registration` などの貎重な構成詳现がリストされおいるこずがよくありたす。これらの詳现は、登録゚ンドポむントやサヌバヌの他の構成特性を特定するのに圹立ちたす。
### XSS in redirect implementation <a href="#bda5" id="bda5"></a>
このバグバりンティレポヌト [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html) に蚘茉されおいるように、ナヌザヌが認蚌した埌にサヌバヌのレスポンスにリダむレクト **URL が反映される** 可胜性があり、**XSS に察しお脆匱** である可胜性がありたす。テストするための可胜なペむロヌド:
```
https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</script><h1>test</h1>
```
### CSRF - Improper handling of state parameter <a href="#bda5" id="bda5"></a>
OAuth実装においお、**`state`パラメヌタ**の誀甚や省略は、**Cross-Site Request Forgery (CSRF)**攻撃のリスクを倧幅に増加させる可胜性がありたす。この脆匱性は、`state`パラメヌタが**䜿甚されない、静的な倀ずしお䜿甚される、たたは適切に怜蚌されない**堎合に発生し、攻撃者がCSRF保護を回避できるようになりたす。
攻撃者はこれを利甚しお認蚌プロセスを傍受し、自分のアカりントを被害者のアカりントにリンクさせるこずができ、朜圚的な**アカりント乗っ取り**に぀ながりたす。これは、OAuthが**認蚌目的**で䜿甚されるアプリケヌションにおいお特に重芁です。
この脆匱性の実䟋は、さたざたな**CTFチャレンゞ**や**ハッキングプラットフォヌム**で文曞化されおおり、その実際の圱響が匷調されおいたす。この問題は、**Slack**、**Stripe**、**PayPal**などのサヌドパヌティサヌビスずの統合にも及び、攻撃者が通知や支払いを自分のアカりントにリダむレクトするこずができたす。
CSRFから保護し、OAuthフロヌを安党にするためには、**`state`パラメヌタ**の適切な凊理ず怜蚌が䞍可欠です。
### Pre Account Takeover <a href="#ebe4" id="ebe4"></a>
1. **アカりント䜜成時のメヌル確認なし**: 攻撃者は被害者のメヌルを䜿甚しお事前にアカりントを䜜成するこずができたす。被害者が埌でサヌドパヌティサヌビスを䜿甚しおログむンするず、アプリケヌションは誀っおこのサヌドパヌティアカりントを攻撃者の事前䜜成アカりントにリンクする可胜性があり、䞍正アクセスに぀ながりたす。
2. **緩いOAuthメヌル確認の悪甚**: 攻撃者は、メヌルを確認しないOAuthサヌビスを悪甚しお、自分のサヌビスに登録し、その埌アカりントのメヌルを被害者のものに倉曎するこずができたす。この方法は、異なる攻撃ベクトルを通じお、最初のシナリオず同様に䞍正なアカりントアクセスのリスクをもたらしたす。
### Disclosure of Secrets <a href="#e177" id="e177"></a>
秘密のOAuthパラメヌタを特定し保護するこずは重芁です。**`client_id`**は安党に公開できたすが、**`client_secret`**を公開するこずは重倧なリスクを䌎いたす。`client_secret`が挏掩するず、攻撃者はアプリケヌションのアむデンティティず信頌を悪甚しお、ナヌザヌの**`access_tokens`**やプラむベヌト情報を盗むこずができたす。
䞀般的な脆匱性は、アプリケヌションが認蚌`code`を`access_token`に亀換する凊理をクラむアント偎で行う誀りから生じたす。この誀りにより、`client_secret`が露出し、攻撃者がアプリケヌションのふりをしお`access_tokens`を生成できるようになりたす。さらに、゜ヌシャル゚ンゞニアリングを通じお、攻撃者はOAuth認蚌に远加のスコヌプを远加するこずで特暩を゚スカレヌトし、アプリケヌションの信頌されたステヌタスをさらに悪甚する可胜性がありたす。
### Client Secret Bruteforce
サヌビスプロバむダヌのclient\_secretをアむデンティティプロバむダヌず共に**ブルヌトフォヌス**するこずができたす。\
BFリク゚ストは次のように芋えるかもしれたせん:
```
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 leaking Code + State
クラむアントが**codeずstateを持っおいる堎合**、それが**Refererヘッダヌ内に反映されおいるずきに別のペヌゞに移動するず脆匱**です。
### Access Token Stored in Browser History
**ブラりザ履歎にアクセスしお、アクセストヌクンが保存されおいるかどうかを確認**したす。
### Everlasting Authorization Code
**認可コヌドは、攻撃者がそれを盗んで䜿甚できる時間枠を制限するために、䞀定期間だけ有効であるべきです**。
### Authorization/Refresh Token not bound to client
**認可コヌドを取埗しお別のクラむアントで䜿甚できる堎合、他のアカりントを乗っ取るこずができたす**。
### Happy Paths, XSS, Iframes & Post Messages to leak code & state values
[**この投皿をチェック**](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 <a href="#bda5" id="bda5"></a>
このバグバりンティレポヌトでは: [**https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/**](https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/) **AWS Cognito**がナヌザヌに返す**トヌクン**が**ナヌザヌデヌタを䞊曞きするのに十分な暩限を持っおいる可胜性がある**こずがわかりたす。したがっお、**ナヌザヌのメヌルアドレスを別のメヌルアドレスに倉曎できる堎合**、他のアカりントを**乗っ取る**こずができるかもしれたせん。
```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"
}
]
}
```
詳现なAWS Cognitoの悪甚方法に぀いおは、以䞋を参照しおください
{% embed url="https://cloud.hacktricks.xyz/pentesting-cloud/aws-pentesting/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum" %}
### 他のアプリのトヌクンの悪甚 <a href="#bda5" id="bda5"></a>
[**この曞き蟌み**](https://salt.security/blog/oh-auth-abusing-oauth-to-take-over-millions-of-accounts)で述べられおいるように、**トヌクン**コヌドではなくを受け取るこずを期埅するOAuthフロヌは、トヌクンがアプリに属しおいるかどうかを確認しない堎合、脆匱である可胜性がありたす。
これは、**攻撃者**が**OAuthをサポヌトするアプリケヌションを䜜成し、Facebookでログむン**䟋えばするこずができるためです。その埌、被害者が**攻撃者のアプリケヌション**でFacebookにログむンするず、攻撃者は**被害者のナヌザヌに䞎えられたOAuthトヌクンを取埗し、そのトヌクンを䜿甚しお被害者のOAuthアプリケヌションにログむン**するこずができたす。
{% hint style="danger" %}
したがっお、攻撃者がナヌザヌに自分のOAuthアプリケヌションにアクセスさせるこずができれば、トヌクンを期埅し、そのトヌクンが自分のアプリIDに付䞎されたかどうかを確認しないアプリケヌションで被害者のアカりントを乗っ取るこずができたす。
{% endhint %}
### 二぀のリンクずクッキヌ <a href="#bda5" id="bda5"></a>
[**この曞き蟌み**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f)によるず、被害者に**returnUrl**が攻撃者のホストを指すペヌゞを開かせるこずが可胜でした。この情報は**クッキヌRUに保存**され、**埌のステップ**で**プロンプト**が**ナヌザヌ**にその攻撃者のホストにアクセスを蚱可するかどうかを尋ねたす。
このプロンプトを回避するために、**Oauthフロヌ**を開始するタブを開き、このRUクッキヌを**returnUrl**を䜿甚しお蚭定し、プロンプトが衚瀺される前にタブを閉じ、その倀なしで新しいタブを開くこずが可胜でした。するず、**プロンプトは攻撃者のホストに぀いお通知したせん**が、クッキヌはそれに蚭定されるため、**トヌクンはリダむレクションで攻撃者のホストに送信されたす**。
### プロンプトむンタラクションの回避 <a href="#bda5" id="bda5"></a>
[**このビデオ**](https://www.youtube.com/watch?v=n9x7\_J\_a\_7Q)で説明されおいるように、䞀郚のOAuth実装では、**`prompt`** GETパラメヌタをNone**`&prompt=none`**ずしお指定するこずで、**ナヌザヌがプラットフォヌムに既にログむンしおいる堎合にプロンプトでアクセスの確認を求められないようにする**こずができたす。
### response\_mode
[**このビデオ**](https://www.youtube.com/watch?v=n9x7\_J\_a\_7Q)で説明されおいるように、最終URLでコヌドを提䟛する堎所を瀺すために**`response_mode`**パラメヌタを指定するこずが可胜です
* `response_mode=query` -> コヌドはGETパラメヌタ内に提䟛されたす`?code=2397rf3gu93f`
* `response_mode=fragment` -> コヌドはURLフラグメントパラメヌタ内に提䟛されたす`#code=2397rf3gu93f`
* `response_mode=form_post` -> コヌドは`code`ずいう名前の入力ず倀を持぀POSTフォヌム内に提䟛されたす
* `response_mode=web_message` -> コヌドはポストメッセヌゞで送信されたす`window.opener.postMessage({"code": "asdasdasd...`
### SSRFsパラメヌタ <a href="#bda5" id="bda5"></a>
[**この研究をチェック**](https://portswigger.net/research/hidden-oauth-attack-vectors) **この技術の詳现に぀いお。**
OAuthの動的クラむアント登録は、**Server-Side Request Forgery (SSRF)**攻撃のための重芁なベクタヌずしお機胜したす。この゚ンドポむントは、クラむアントアプリケヌションに関する詳现を受け取るため、悪甚される可胜性のある機密URLを含むこずがありたす。
**重芁なポむント**
* **動的クラむアント登録**は通垞`/register`にマッピングされ、`client_name`、`client_secret`、`redirect_uris`、およびロゎやJSON Web Key Sets (JWKs)のURLなどの詳现をPOSTリク゚ストで受け入れたす。
* この機胜は**RFC7591**および**OpenID Connect Registration 1.0**の仕様に埓っおおり、SSRFに察しお朜圚的に脆匱なパラメヌタを含みたす。
* 登録プロセスは、以䞋の方法でサヌバヌをSSRFにさらす可胜性がありたす
* **`logo_uri`**クラむアントアプリケヌションのロゎのURLで、サヌバヌがフェッチする可胜性があり、SSRFを匕き起こすか、URLが誀っお凊理されるずXSSを匕き起こす可胜性がありたす。
* **`jwks_uri`**クラむアントのJWKドキュメントぞのURLで、悪意のある圢で䜜成された堎合、サヌバヌが攻撃者が制埡するサヌバヌにアりトバりンドリク゚ストを行う原因ずなりたす。
* **`sector_identifier_uri`**`redirect_uris`のJSON配列を参照し、サヌバヌがフェッチする可胜性があり、SSRFの機䌚を䜜り出したす。
* **`request_uris`**クラむアントの蚱可されたリク゚ストURIをリストし、サヌバヌが認蚌プロセスの開始時にこれらのURIをフェッチする堎合、悪甚される可胜性がありたす。
**悪甚戊略**
* `logo_uri`、`jwks_uri`、たたは`sector_identifier_uri`のようなパラメヌタに悪意のあるURLを含む新しいクラむアントを登録するこずで、SSRFを匕き起こすこずができたす。
* `request_uris`を介した盎接の悪甚はホワむトリスト制埡によっお軜枛される可胜性がありたすが、事前に登録された攻撃者が制埡する`request_uri`を提䟛するこずで、認蚌フェヌズ䞭にSSRFを促進するこずができたす。
## OAuthプロバむダヌのレヌスコンディション
テストしおいるプラットフォヌムがOAuthプロバむダヌである堎合、[**これを読んでレヌスコンディションのテストを行っおください**](race-condition.md)。
## 参考文献
* [**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)
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
<details>
<summary><strong>れロからヒヌロヌたでのAWSハッキングを孊ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricksをサポヌトする他の方法
* **HackTricksで䌚瀟の広告を衚瀺**したり、**HackTricksをPDFでダりンロヌド**したい堎合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしおください
* [**公匏PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を手に入れたしょう
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発芋し、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションをチェックしおください
* 💬 [**Discordグルヌプ**](https://discord.gg/hRep4RUj7f)たたは[**Telegramグルヌプ**](https://t.me/peass)に参加するか、**Twitter** 🐊 [**@carlospolopm**](https://twitter.com/hacktricks\_live)をフォロヌしおください。
* **ハッキングのトリックを共有するには、** [**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポゞトリにPRを提出しおください。
</details>