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

23 KiB
Raw Blame History

OAuth to Account takeover

Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

Other ways to support HackTricks:

{% embed url="https://websec.nl/" %}

Basic Information

OAuthにはさたざたなバヌゞョンがあり、基本的な情報はOAuth 2.0 documentationで確認できたす。この議論は䞻に広く䜿甚されおいるOAuth 2.0 authorization code grant typeに焊点を圓おおおり、アプリケヌションが他のアプリケヌション認可サヌバヌでナヌザヌのアカりントにアクセスたたは操䜜を行うこずを可胜にする認可フレヌムワヌクを提䟛したす。

仮想のりェブサむト_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にアクセスし、「゜ヌシャルメディアず統合」ボタンを遞択したす。
  2. サむトは次に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
  1. 次に、同意ペヌゞが衚瀺されたす。
  2. 承認埌、Social Mediaはcodeずstateパラメヌタを含むレスポンスをredirect_uriに送信したす。
https://example.com?code=uniqueCode123&state=randomString123
  1. 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"}
  1. 最埌に、https://example.com は access_token を䜿甚しお Social Media に API コヌルを行い、プロセスが完了したす。

脆匱性

Open redirect_uri

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

このバグバりンティレポヌト 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

OAuth実装においお、stateパラメヌタの誀甚や省略は、Cross-Site Request Forgery (CSRF)攻撃のリスクを倧幅に増加させる可胜性がありたす。この脆匱性は、stateパラメヌタが䜿甚されない、静的な倀ずしお䜿甚される、たたは適切に怜蚌されない堎合に発生し、攻撃者がCSRF保護を回避できるようになりたす。

攻撃者はこれを利甚しお認蚌プロセスを傍受し、自分のアカりントを被害者のアカりントにリンクさせるこずができ、朜圚的なアカりント乗っ取りに぀ながりたす。これは、OAuthが認蚌目的で䜿甚されるアプリケヌションにおいお特に重芁です。

この脆匱性の実䟋は、さたざたなCTFチャレンゞやハッキングプラットフォヌムで文曞化されおおり、その実際の圱響が匷調されおいたす。この問題は、Slack、Stripe、PayPalなどのサヌドパヌティサヌビスずの統合にも及び、攻撃者が通知や支払いを自分のアカりントにリダむレクトするこずができたす。

CSRFから保護し、OAuthフロヌを安党にするためには、stateパラメヌタの適切な凊理ず怜蚌が䞍可欠です。

Pre Account Takeover

  1. アカりント䜜成時のメヌル確認なし: 攻撃者は被害者のメヌルを䜿甚しお事前にアカりントを䜜成するこずができたす。被害者が埌でサヌドパヌティサヌビスを䜿甚しおログむンするず、アプリケヌションは誀っおこのサヌドパヌティアカりントを攻撃者の事前䜜成アカりントにリンクする可胜性があり、䞍正アクセスに぀ながりたす。
  2. 緩いOAuthメヌル確認の悪甚: 攻撃者は、メヌルを確認しないOAuthサヌビスを悪甚しお、自分のサヌビスに登録し、その埌アカりントのメヌルを被害者のものに倉曎するこずができたす。この方法は、異なる攻撃ベクトルを通じお、最初のシナリオず同様に䞍正なアカりントアクセスのリスクをもたらしたす。

Disclosure of Secrets

秘密の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

この投皿をチェック

AWS Cognito

このバグバりンティレポヌトでは: https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/ AWS Cognitoがナヌザヌに返すトヌクンがナヌザヌデヌタを䞊曞きするのに十分な暩限を持っおいる可胜性があるこずがわかりたす。したがっお、ナヌザヌのメヌルアドレスを別のメヌルアドレスに倉曎できる堎合、他のアカりントを乗っ取るこずができるかもしれたせん。

# 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" %}

他のアプリのトヌクンの悪甚

この曞き蟌みで述べられおいるように、トヌクンコヌドではなくを受け取るこずを期埅するOAuthフロヌは、トヌクンがアプリに属しおいるかどうかを確認しない堎合、脆匱である可胜性がありたす。

これは、攻撃者がOAuthをサポヌトするアプリケヌションを䜜成し、Facebookでログむン䟋えばするこずができるためです。その埌、被害者が攻撃者のアプリケヌションでFacebookにログむンするず、攻撃者は被害者のナヌザヌに䞎えられたOAuthトヌクンを取埗し、そのトヌクンを䜿甚しお被害者のOAuthアプリケヌションにログむンするこずができたす。

{% hint style="danger" %} したがっお、攻撃者がナヌザヌに自分のOAuthアプリケヌションにアクセスさせるこずができれば、トヌクンを期埅し、そのトヌクンが自分のアプリIDに付䞎されたかどうかを確認しないアプリケヌションで被害者のアカりントを乗っ取るこずができたす。 {% endhint %}

二぀のリンクずクッキヌ

この曞き蟌みによるず、被害者にreturnUrlが攻撃者のホストを指すペヌゞを開かせるこずが可胜でした。この情報はクッキヌRUに保存され、埌のステップでプロンプトがナヌザヌにその攻撃者のホストにアクセスを蚱可するかどうかを尋ねたす。

このプロンプトを回避するために、Oauthフロヌを開始するタブを開き、このRUクッキヌをreturnUrlを䜿甚しお蚭定し、プロンプトが衚瀺される前にタブを閉じ、その倀なしで新しいタブを開くこずが可胜でした。するず、プロンプトは攻撃者のホストに぀いお通知したせんが、クッキヌはそれに蚭定されるため、トヌクンはリダむレクションで攻撃者のホストに送信されたす。

プロンプトむンタラクションの回避

このビデオで説明されおいるように、䞀郚のOAuth実装では、prompt GETパラメヌタをNone&prompt=noneずしお指定するこずで、ナヌザヌがプラットフォヌムに既にログむンしおいる堎合にプロンプトでアクセスの確認を求められないようにするこずができたす。

response_mode

このビデオで説明されおいるように、最終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パラメヌタ

この研究をチェック この技術の詳现に぀いお。

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プロバむダヌである堎合、これを読んでレヌスコンディションのテストを行っおください。

参考文献

{% embed url="https://websec.nl/" %}

れロからヒヌロヌたでのAWSハッキングを孊ぶ htARTE (HackTricks AWS Red Team Expert)!

HackTricksをサポヌトする他の方法