mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 13:13:41 +00:00
222 lines
18 KiB
Markdown
222 lines
18 KiB
Markdown
# OAuth za preuzimanje naloga
|
|
|
|
<details>
|
|
|
|
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Drugi načini podrške HackTricks-u:
|
|
|
|
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
|
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
|
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
|
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
|
|
|
</details>
|
|
|
|
## Osnovne informacije <a href="#d4a8" id="d4a8"></a>
|
|
|
|
OAuth nudi različite verzije, sa osnovnim informacijama dostupnim na [OAuth 2.0 dokumentaciji](https://oauth.net/2/). Ova diskusija se uglavnom fokusira na široko korišćeni [OAuth 2.0 grant tip autorizacije](https://oauth.net/2/grant-types/authorization-code/), pružajući **okvir za autorizaciju koji omogućava aplikaciji pristup ili izvršavanje radnji na korisničkom nalogu u drugoj aplikaciji** (autorizacioni server).
|
|
|
|
Razmotrimo hipotetički veb sajt _**https://example.com**_, dizajniran da **prikaže sve vaše objave na društvenim mrežama**, uključujući privatne. Da bi se to postiglo, koristi se OAuth 2.0. _https://example.com_ će zatražiti vašu dozvolu da **pristupi vašim objavama na društvenim mrežama**. Kao rezultat toga, pojaviće se ekran za saglasnost na _https://socialmedia.com_, koji prikazuje **dozvole koje se traže i razvojnog programera koji je podneo zahtev**. Nakon vaše autorizacije, _https://example.com_ dobija mogućnost da **pristupa vašim objavama u vaše ime**.
|
|
|
|
Važno je razumeti sledeće komponente unutar OAuth 2.0 okvira:
|
|
|
|
- **vlasnik resursa**: Vi, kao **korisnik/entitet**, autorizujete pristup vašem resursu, kao što su objave na vašem društvenom mrežnom nalogu.
|
|
- **server resursa**: **Server koji upravlja autentifikovanim zahtevima** nakon što je aplikacija obezbedila `access token` u ime `vlasnika resursa`, npr. **https://socialmedia.com**.
|
|
- **klijentska aplikacija**: **Aplikacija koja traži autorizaciju** od `vlasnika resursa`, kao što je **https://example.com**.
|
|
- **autorizacioni server**: **Server koji izdaje `access tokene`** `klijentskoj aplikaciji` nakon uspešne autentifikacije `vlasnika resursa` i obezbeđivanja autorizacije, npr. **https://socialmedia.com**.
|
|
- **client\_id**: Javni, jedinstveni identifikator aplikacije.
|
|
- **client\_secret:** Poverljivi ključ, poznat samo aplikaciji i autorizacionom serveru, koji se koristi za generisanje `access tokena`.
|
|
- **response\_type**: Vrednost koja određuje **tip traženog tokena**, kao što je `code`.
|
|
- **scope**: **Nivo pristupa** koji `klijentska aplikacija` traži od `vlasnika resursa`.
|
|
- **redirect\_uri**: **URL na koji korisnik biva preusmeren nakon autorizacije**. Ovo obično mora biti u skladu sa prethodno registrovanim preusmerenim URL-om.
|
|
- **state**: Parametar za **čuvanje podataka tokom preusmeravanja korisnika ka i od autorizacionog servera**. Njegova jedinstvenost je ključna za služenje kao **mehanizam zaštite od CSRF napada**.
|
|
- **grant\_type**: Parametar koji ukazuje **tip granta i tip tokena koji će biti vraćen**.
|
|
- **code**: Autorizacioni kod sa `autorizacionog servera`, koji se koristi zajedno sa `client_id` i `client_secret` od strane klijentske aplikacije za dobijanje `access_tokena`.
|
|
- **access\_token**: Token koji klijentska aplikacija koristi za API zahteve u ime `vlasnika resursa`.
|
|
- **refresh\_token**: Omogućava aplikaciji da **dobije novi `access_token` bez ponovnog traženja dozvole od korisnika**.
|
|
|
|
### Tok
|
|
|
|
**Stvarni OAuth tok** se odvija na sledeći način:
|
|
|
|
1. Posetite [https://example.com](https://example.com) i izaberite dugme "Integriši sa društvenim mrežama".
|
|
2. Sajt zatim šalje zahtev na [https://socialmedia.com](https://socialmedia.com) tražeći vašu autorizaciju da dozvoli aplikaciji https://example.com pristup vašim objavama. Zahtev je strukturiran kao:
|
|
```
|
|
https://socialmedia.com/auth
|
|
?response_type=code
|
|
&client_id=example_clientId
|
|
&redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
|
|
&scope=readPosts
|
|
&state=randomString123
|
|
```
|
|
3. Zatim vam se prikazuje stranica za davanje pristanka.
|
|
|
|
4. Nakon što odobrite, društvena mreža šalje odgovor na `redirect_uri` sa parametrima `code` i `state`:
|
|
```
|
|
https://example.com?code=uniqueCode123&state=randomString123
|
|
```
|
|
5. https://example.com koristi ovaj `code`, zajedno sa svojim `client_id` i `client_secret`, da bi napravio serverski zahtev za dobijanje `access_token`-a u vaše ime, omogućavajući pristup dozvolama na koje ste pristali:
|
|
```
|
|
POST /oauth/access_token
|
|
Host: socialmedia.com
|
|
...{"client_id": "example_clientId", "client_secret": "example_clientSecret", "code": "uniqueCode123", "grant_type": "authorization_code"}
|
|
```
|
|
6. Na kraju, proces se završava kada https://example.com koristi vaš `access_token` da bi napravio API poziv ka društvenim medijima kako bi pristupio.
|
|
|
|
## Ranjivosti <a href="#323a" id="323a"></a>
|
|
|
|
### Otvoreni redirect\_uri <a href="#cc36" id="cc36"></a>
|
|
|
|
`redirect_uri` je ključan za sigurnost u OAuth i OpenID implementacijama, jer usmerava gde se šalju osetljivi podaci, poput autorizacionih kodova, nakon autorizacije. Ako je konfigurisan na pogrešan način, može omogućiti napadačima da preusmere ove zahteve na zlonamerne servere, omogućavajući preuzimanje naloga.
|
|
|
|
Tehnike eksploatacije variraju u zavisnosti od logike validacije autorizacionog servera. One mogu ići od stroge provere putanje do prihvatanja bilo koje URL adrese unutar određene domene ili poddirektorijuma. Uobičajene metode eksploatacije uključuju otvorene preusmere, pretragu putanja, iskorišćavanje slabih regularnih izraza i HTML ubacivanje radi krađe tokena.
|
|
|
|
Osim `redirect_uri`, i drugi OAuth i OpenID parametri poput `client_uri`, `policy_uri`, `tos_uri` i `initiate_login_uri` su podložni napadima preusmeravanja. Ovi parametri su opcioni i podrška za njih varira među serverima.
|
|
|
|
Za one koji ciljaju OpenID server, endpoint otkrivanja (`**.well-known/openid-configuration**`) često sadrži vredne konfiguracione detalje poput `registration_endpoint`, `request_uri_parameter_supported` i "`require_request_uri_registration`. Ovi detalji mogu pomoći u identifikaciji endpointa za registraciju i drugih specifičnosti konfiguracije servera.
|
|
|
|
### XSS u implementaciji preusmeravanja <a href="#bda5" id="bda5"></a>
|
|
|
|
Kao što je pomenuto u ovom izveštaju o nagradi za otkrivanje grešaka [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html), moguće je da se **URL preusmeravanja reflektuje u odgovoru** servera nakon što korisnik autentifikuje, što ga čini **ranjivim na XSS**. Mogući payload za testiranje:
|
|
```
|
|
https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</script><h1>test</h1>
|
|
```
|
|
### CSRF - Nepravilno rukovanje parametrom stanja <a href="#bda5" id="bda5"></a>
|
|
|
|
U implementacijama OAuth-a, zloupotreba ili izostavljanje **parametra stanja** može značajno povećati rizik od napada **Cross-Site Request Forgery (CSRF)**. Ova ranjivost se javlja kada se parametar `state` ili **ne koristi, koristi kao statička vrednost ili nije pravilno validiran**, što omogućava napadačima da zaobiđu CSRF zaštitu.
|
|
|
|
Napadači mogu iskoristiti ovo tako što presreću proces autorizacije kako bi povezali svoj nalog sa žrtvinim nalogom, što može dovesti do potencijalnog **preuzimanja naloga**. Ovo je posebno kritično u aplikacijama gde se OAuth koristi u **svrhu autentifikacije**.
|
|
|
|
Primeri ove ranjivosti su dokumentovani u raznim **CTF izazovima** i **hakerskim platformama**, što ističe njene praktične implikacije. Ovaj problem takođe se odnosi na integracije sa uslugama trećih strana poput **Slack**, **Stripe** i **PayPal**, gde napadači mogu preusmeriti obaveštenja ili uplate na svoje naloge.
|
|
|
|
Pravilno rukovanje i validacija **parametra stanja** su ključni za zaštitu od CSRF i obezbeđivanje sigurnosti OAuth protoka.
|
|
|
|
### Preuzimanje naloga pre preuzimanja <a href="#ebe4" id="ebe4"></a>
|
|
|
|
1. **Bez provere e-pošte prilikom kreiranja naloga**: Napadači mogu unapred kreirati nalog koristeći e-poštu žrtve. Ako žrtva kasnije koristi uslugu treće strane za prijavu, aplikacija može nenamerno povezati ovaj nalog treće strane sa unapred kreiranim nalogom napadača, što dovodi do neovlašćenog pristupa.
|
|
|
|
2. **Iskorišćavanje slabih provjera e-pošte u OAuth-u**: Napadači mogu iskoristiti OAuth usluge koje ne proveravaju e-poštu tako što se registruju sa svojom uslugom, a zatim promene e-poštu naloga na žrtvinu. Ovaj metod takođe predstavlja rizik od neovlašćenog pristupa nalogu, slično kao i prvi scenario, ali kroz drugi vektor napada.
|
|
|
|
### Otkrivanje tajni <a href="#e177" id="e177"></a>
|
|
|
|
Identifikacija i zaštita tajnih OAuth parametara su ključni. Dok se **`client_id`** može bezbedno otkriti, otkrivanje **`client_secret`** predstavlja značajan rizik. Ako `client_secret` bude kompromitovan, napadači mogu iskoristiti identitet i poverenje aplikacije kako bi **ukrali korisničke `access_tokens`** i privatne informacije.
|
|
|
|
Česta ranjivost se javlja kada aplikacije greškom rukuju razmenom autorizacijskog `koda` za `access_token` na strani klijenta umesto na strani servera. Ova greška dovodi do otkrivanja `client_secret`, omogućavajući napadačima da generišu `access_token` pod lažnim identitetom aplikacije. Osim toga, kroz socijalno inženjerstvo, napadači mogu povećati privilegije dodavanjem dodatnih opsega autorizacije OAuth-a, dalje iskorišćavajući poveren status aplikacije.
|
|
|
|
### Brute force napad na tajni klijenta
|
|
|
|
Možete pokušati **brute force napadom na tajnu klijenta** pružatelja usluga sa identifikacionim pružateljem kako biste pokušali da ukradete naloge.\
|
|
Zahtev za BF može izgledati slično:
|
|
```
|
|
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 otkriva kod + stanje
|
|
|
|
Kada klijent dobije **kod i stanje**, ako se **reflektuje unutar Referer zaglavlja** kada prelazi na drugu stranicu, onda je ranjiv.
|
|
|
|
### Pristupni token sačuvan u istoriji pretraživača
|
|
|
|
Idite na **istoriju pretraživača i proverite da li je pristupni token sačuvan tamo**.
|
|
|
|
### Večni autorizacioni kod
|
|
|
|
**Autorizacioni kod treba da živi samo određeno vreme kako bi se ograničio vremenski prozor u kojem napadač može da ga ukrade i koristi**.
|
|
|
|
### Autorizacioni/Osvježavajući token nije vezan za klijenta
|
|
|
|
Ako možete dobiti **autorizacioni kod i koristiti ga sa drugim klijentom, onda možete preuzeti druge naloge**.
|
|
|
|
### Srećni putovi, XSS, Iframe i Post poruke za otkrivanje vrednosti koda i stanja
|
|
|
|
**[Proverite ovaj post](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>
|
|
|
|
U ovom izveštaju o otkrivanju grešaka: [**https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/**](https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/) možete videti da **token** koji **AWS Cognito** vraća korisniku može imati **dovoljno dozvola za prebrisavanje korisničkih podataka**. Stoga, ako možete **promeniti e-poštu korisnika za drugu e-poštu korisnika**, možda ćete moći **preuzeti** druge naloge.
|
|
```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"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
Za više detalja o tome kako zloupotrebiti AWS Cognito, pogledajte:
|
|
|
|
{% embed url="https://cloud.hacktricks.xyz/pentesting-cloud/aws-pentesting/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum" %}
|
|
|
|
### Zloupotreba tokena drugih aplikacija <a href="#bda5" id="bda5"></a>
|
|
|
|
Kao što je [**pomenuto u ovom članku**](https://salt.security/blog/oh-auth-abusing-oauth-to-take-over-millions-of-accounts), OAuth tokovi koji očekuju da prime **token** (a ne kod) mogu biti ranjivi ako ne provere da li token pripada aplikaciji.
|
|
|
|
To je zato što **napadač** može kreirati **aplikaciju koja podržava OAuth i prijaviti se putem Facebook-a** (na primer) u svojoj sopstvenoj aplikaciji. Zatim, kada žrtva se prijavi putem Facebook-a u **napadačevu aplikaciju**, napadač može dobiti **OAuth token korisnika koji je dat njegovoj aplikaciji i koristiti ga za prijavu u OAuth aplikaciju žrtve koristeći token korisnika žrtve**.
|
|
|
|
{% hint style="danger" %}
|
|
Dakle, ako napadač uspe da navede korisnika da pristupi njegovoj sopstvenoj OAuth aplikaciji, on će moći preuzeti kontrolu nad žrtvinim nalogom u aplikacijama koje očekuju token i ne proveravaju da li je token dodeljen njihovom ID-u aplikacije.
|
|
{% endhint %}
|
|
|
|
### Dva linka i kolačić <a href="#bda5" id="bda5"></a>
|
|
|
|
Prema [**ovom članku**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), bilo je moguće naterati žrtvu da otvori stranicu sa **returnUrl** koji pokazuje na napadačevu host. Ove informacije bi bile **sačuvane u kolačiću (RU)**, a u **kasnijem koraku** **prompt** će **pitati** korisnika da li želi da pruži pristup napadačevom hostu.
|
|
|
|
Da bi se zaobišao ovaj prompt, bilo je moguće otvoriti karticu kako bi se pokrenuo **Oauth tok** koji bi postavio ovaj RU kolačić koristeći **returnUrl**, zatvoriti karticu pre nego što se prikaže prompt, i otvoriti novu karticu bez te vrednosti. Tada, **prompt neće obavestiti o napadačevom hostu**, ali će kolačić biti postavljen na njega, tako da će **token biti poslat napadačevom hostu** u preusmeravanju.
|
|
|
|
### Parametri SSRF-a <a href="#bda5" id="bda5"></a>
|
|
|
|
**[Proverite ovu istraživačku studiju](https://portswigger.net/research/hidden-oauth-attack-vectors) za dalje detalje o ovoj tehnici.**
|
|
|
|
Dinamička registracija klijenta u OAuth-u služi kao manje očigledan, ali ključni vektor za ranjivosti bezbednosti, posebno za napade **Server-Side Request Forgery (SSRF)**. Ova tačka omogućava OAuth serverima da primaju detalje o klijentskim aplikacijama, uključujući osetljive URL-ove koji mogu biti iskorišćeni.
|
|
|
|
**Ključne tačke:**
|
|
|
|
- **Dinamička registracija klijenta** često je mapirana na `/register` i prihvata detalje poput `client_name`, `client_secret`, `redirect_uris` i URL-ove za logoe ili JSON Web Key Sets (JWKs) putem POST zahteva.
|
|
- Ova funkcionalnost se pridržava specifikacija navedenih u **RFC7591** i **OpenID Connect Registration 1.0**, koje uključuju parametre koji su potencijalno ranjivi na SSRF.
|
|
- Proces registracije može nenamerno izložiti servere SSRF na nekoliko načina:
|
|
- **`logo_uri`**: URL za logo klijentske aplikacije koji može biti preuzet od strane servera, pokrećući SSRF ili dovodeći do XSS-a ako URL nije pravilno obrađen.
|
|
- **`jwks_uri`**: URL do JWK dokumenta klijenta, koji ako je zlonamerno oblikovan, može naterati server da izvrši odlazne zahteve ka serveru pod kontrolom napadača.
|
|
- **`sector_identifier_uri`**: Referenca na JSON niz `redirect_uris`, koje server može preuzeti, stvarajući mogućnost za SSRF.
|
|
- **`request_uris`**: Navodi dozvoljene URI-je zahteva za klijenta, koje mogu biti iskorišćene ako server preuzima ove URI-je na početku procesa autorizacije.
|
|
|
|
**Strategija iskorišćavanja:**
|
|
|
|
- SSRF se može pokrenuti registracijom novog klijenta sa zlonamernim URL-ovima u parametrima poput `logo_uri`, `jwks_uri` ili `sector_identifier_uri`.
|
|
- Iako se direktno iskorišćavanje putem `request_uris` može umanjiti kontrolama bele liste, obezbeđivanje prethodno registrovanog, napadačem kontrolisanog `request_uri` može olakšati SSRF tokom faze autorizacije.
|
|
|
|
## Trke uslova OAuth provajdera
|
|
|
|
Ako je platforma koju testirate OAuth provajder, [**pročitajte ovo da biste testirali moguće trke uslova**](race-condition.md).
|
|
|
|
## Reference
|
|
|
|
* [**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)
|
|
|
|
<details>
|
|
|
|
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Drugi načini da podržite HackTricks:
|
|
|
|
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu**, proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
|
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
|
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
|
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
|
|
|
</details>
|