OAuth to Account takeover
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
OAuth, OAuth 2.0 belgeleri adresinde erişilebilen temel bilgilerle birlikte çeşitli sürümler sunar. Bu tartışma esas olarak yaygın olarak kullanılan OAuth 2.0 yetkilendirme kodu hibe türü etrafında döner ve bir uygulamanın başka bir uygulamadaki bir kullanıcının hesabına erişmesini veya eylemler gerçekleştirmesini sağlayan bir yetkilendirme çerçevesi sunar (yetkilendirme sunucusu).
Hayali bir web sitesi https://example.com düşünün; bu site tüm sosyal medya gönderilerinizi, özel olanlar da dahil olmak üzere, sergilemek için tasarlanmıştır. Bunu başarmak için OAuth 2.0 kullanılır. https://example.com, sosyal medya gönderilerinize erişim izni talep edecektir. Sonuç olarak, https://socialmedia.com üzerinde talep edilen izinler ve talebi yapan geliştirici hakkında bilgi veren bir onay ekranı belirecektir. Onayınızla, https://example.com, gönderilerinize sizin adınıza erişim sağlama yetkisi kazanır.
OAuth 2.0 çerçevesindeki aşağıdaki bileşenleri anlamak önemlidir:
resource owner: Siz, kullanıcı/varlık olarak, sosyal medya hesabı gönderileriniz gibi kaynaklarınıza erişim izni verirsiniz.
resource server: Erişim token'ı almış uygulamanın kimlik doğrulama isteklerini yöneten sunucu, örneğin, https://socialmedia.com.
client application: resource owner
'dan yetkilendirme talep eden uygulama, örneğin, https://example.com.
authorization server: resource owner
'ın başarılı bir şekilde kimlik doğrulamasını yaptıktan sonra client application
'a access tokens
veren sunucu, örneğin, https://socialmedia.com.
client_id: Uygulama için kamuya açık, benzersiz bir tanımlayıcı.
client_secret: Sadece uygulama ve yetkilendirme sunucusu tarafından bilinen, access_tokens
oluşturmak için kullanılan gizli bir anahtar.
response_type: Talep edilen token türünü belirten bir değer, örneğin code
.
scope: client application
'ın resource owner
'dan talep ettiği erişim seviyesi.
redirect_uri: Kullanıcının yetkilendirmeden sonra yönlendirileceği URL. Bu genellikle önceden kaydedilmiş yönlendirme URL'si ile uyumlu olmalıdır.
state: Kullanıcının yetkilendirme sunucusuna yönlendirilmesi sırasında ve sonrasında verileri korumak için bir parametre. Benzersizliği, CSRF koruma mekanizması olarak hizmet etmesi için kritik öneme sahiptir.
grant_type: Hibe türünü ve döndürülecek token türünü belirten bir parametre.
code: authorization server
'dan alınan yetkilendirme kodu; client application
tarafından access_token
almak için client_id
ve client_secret
ile birlikte kullanılır.
access_token: resource owner
adına API istekleri için client application
'ın kullandığı token.
refresh_token: Uygulamanın kullanıcıyı yeniden istemeden yeni bir access_token
almasını sağlar.
Gerçek OAuth akışı şu şekilde ilerler:
https://example.com adresine gidersiniz ve “Sosyal Medya ile Entegre Ol” butonunu seçersiniz.
Site, https://example.com uygulamasının gönderilerinize erişim izni talep etmek için https://socialmedia.com adresine bir istek gönderir. İstek şu şekilde yapılandırılmıştır:
Ardından bir onay sayfası ile karşılaşırsınız.
Onayınızı takiben, Sosyal Medya code
ve state
parametreleri ile birlikte redirect_uri
'ye bir yanıt gönderir:
https://example.com bu code
'u, client_id
ve client_secret
ile birlikte, sizin adınıza bir access_token
almak için sunucu tarafında bir istek yapmak üzere kullanır ve onayladığınız izinlere erişim sağlar:
Son olarak, süreç https://example.com access_token
'ınızı kullanarak Sosyal Medya'ya API çağrısı yaparak sonuçlanır.
redirect_uri
, OAuth ve OpenID uygulamalarında güvenlik için kritik öneme sahiptir, çünkü yetkilendirme kodları gibi hassas verilerin yetkilendirme sonrası nereye gönderileceğini belirler. Yanlış yapılandırıldığında, saldırganların bu istekleri kötü niyetli sunuculara yönlendirmesine izin verebilir ve hesap ele geçirme olanağı sağlar.
Sömürü teknikleri, yetkilendirme sunucusunun doğrulama mantığına bağlı olarak değişir. Katı yol eşleştirmeden, belirtilen alan veya alt dizin içindeki herhangi bir URL'yi kabul etmeye kadar uzanabilir. Yaygın sömürü yöntemleri arasında açık yönlendirmeler, yol geçişi, zayıf regexlerin istismarı ve token hırsızlığı için HTML enjeksiyonu yer alır.
redirect_uri
dışında, client_uri
, policy_uri
, tos_uri
ve initiate_login_uri
gibi diğer OAuth ve OpenID parametreleri de yönlendirme saldırılarına karşı hassastır. Bu parametreler isteğe bağlıdır ve destekleri sunucular arasında değişiklik gösterir.
OpenID sunucusunu hedef alanlar için, keşif uç noktası (**.well-known/openid-configuration**
) genellikle registration_endpoint
, request_uri_parameter_supported
ve "require_request_uri_registration
" gibi değerli yapılandırma detaylarını listeler. Bu detaylar, kayıt uç noktasını ve sunucunun diğer yapılandırma özelliklerini belirlemede yardımcı olabilir.
Bu hata ödülü raporunda belirtildiği gibi https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html, yönlendirme URL'sinin kullanıcının kimlik doğrulamasından sonra sunucunun yanıtında yansıtılması mümkün olabilir ve bu durum XSS'ye karşı savunmasızdır. Test etmek için olası yük:
OAuth uygulamalarında, state
parametresinin kötüye kullanımı veya atlanması, Cross-Site Request Forgery (CSRF) saldırılarının riskini önemli ölçüde artırabilir. Bu zafiyet, state
parametresinin kullanılmaması, statik bir değer olarak kullanılması veya düzgün bir şekilde doğrulanmaması durumunda ortaya çıkar ve saldırganların CSRF korumalarını aşmasına olanak tanır.
Saldırganlar, yetkilendirme sürecini keserek kendi hesaplarını bir mağdurun hesabıyla ilişkilendirebilir, bu da potansiyel hesap ele geçirmelerine yol açar. Bu, OAuth'un kimlik doğrulama amaçları için kullanıldığı uygulamalarda özellikle kritik öneme sahiptir.
Bu zafiyetin gerçek dünya örnekleri, çeşitli CTF yarışmaları ve hacking platformları üzerinde belgelenmiştir ve pratik etkilerini vurgulamaktadır. Sorun, Slack, Stripe ve PayPal gibi üçüncü taraf hizmetlerle entegrasyonlara da uzanmakta, burada saldırganlar bildirimleri veya ödemeleri kendi hesaplarına yönlendirebilir.
state
parametresinin doğru yönetimi ve doğrulanması, CSRF'ye karşı korunmak ve OAuth akışını güvence altına almak için kritik öneme sahiptir.
Hesap Oluşturma sırasında E-posta Doğrulaması Olmadan: Saldırganlar, mağdurun e-posta adresini kullanarak önceden bir hesap oluşturabilir. Eğer mağdur daha sonra bir üçüncü taraf hizmeti ile giriş yaparsa, uygulama bu üçüncü taraf hesabını saldırganın önceden oluşturduğu hesapla yanlışlıkla ilişkilendirebilir ve yetkisiz erişime yol açabilir.
Gevşek OAuth E-posta Doğrulamasını Kötüye Kullanma: Saldırganlar, e-postaları doğrulamayan OAuth hizmetlerini kötüye kullanarak kendi hizmetleriyle kaydolabilir ve ardından hesap e-posta adresini mağdurunki ile değiştirebilir. Bu yöntem, ilk senaryoya benzer şekilde yetkisiz hesap erişimi riski taşır, ancak farklı bir saldırı vektörü aracılığıyla.
Gizli OAuth parametrelerini tanımlamak ve korumak çok önemlidir. client_id
güvenle ifşa edilebilirken, client_secret
ifşa edilmesi önemli riskler taşır. Eğer client_secret
ele geçirilirse, saldırganlar uygulamanın kimliğini ve güvenini kötüye kullanarak kullanıcı access_tokens
ve özel bilgileri çalabilir.
Uygulamaların yetkilendirme code
'unu access_token
ile istemci tarafında değil, sunucu tarafında yanlışlıkla yönetmesi durumunda yaygın bir zafiyet ortaya çıkar. Bu hata, client_secret
'in açığa çıkmasına yol açar ve saldırganların uygulamanın kimliğini kullanarak access_tokens
oluşturmasına olanak tanır. Ayrıca, sosyal mühendislik yoluyla, saldırganlar OAuth yetkilendirmesine ek kapsamlar ekleyerek ayrıcalıkları artırabilir ve uygulamanın güvenilir durumunu daha da kötüye kullanabilir.
Bir hizmet sağlayıcının client_secret'ini çalmak için kimlik sağlayıcı ile bruteforce yapmayı deneyebilirsiniz. BF isteği şu şekilde görünebilir:
Müşteri kod ve durumu aldıktan sonra, eğer bu Referer başlığında yansıtılıyorsa farklı bir sayfaya gittiğinde, o zaman savunmasızdır.
Tarayıcı geçmişine gidin ve erişim token'ının orada kaydedilip kaydedilmediğini kontrol edin.
Yetkilendirme kodu, bir saldırganın onu çalabileceği ve kullanabileceği zaman penceresini sınırlamak için sadece bir süre boyunca geçerli olmalıdır.
Eğer yetkilendirme kodunu alabilir ve bunu farklı bir istemci ile kullanabilirseniz, diğer hesapları ele geçirebilirsiniz.
Bu hata ödül raporunda: https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/ AWS Cognito tarafından kullanıcıya geri verilen token'ın kullanıcı verilerini üzerine yazmak için yeterli izinlere sahip olabileceğini görebilirsiniz. Bu nedenle, eğer bir kullanıcı e-posta adresini farklı bir kullanıcı e-posta adresi ile değiştirebilirseniz, diğer hesapları ele geçirebilirsiniz.
For more detailed info about how to abuse AWS cognito check:
As mentioned in this writeup, OAuth akışları token (ve kod değil) almayı bekliyorsa, token'ın uygulamaya ait olduğunu kontrol etmedikleri takdirde savunmasız olabilirler.
Bu, bir saldırganın kendi uygulamasında OAuth destekleyen ve Facebook ile giriş yapan bir uygulama oluşturabileceği anlamına gelir. Daha sonra, bir kurban saldırganın uygulamasında Facebook ile giriş yaptığında, saldırgan kullanıcının uygulamasına verilen OAuth token'ını alabilir ve bunu kurbanın OAuth uygulamasında kurbanın kullanıcı token'ı ile giriş yapmak için kullanabilir.
Bu nedenle, eğer saldırgan kullanıcıyı kendi OAuth uygulamasına eriştirmeyi başarırsa, token bekleyen ve token'ın kendi uygulama kimliğine verilip verilmediğini kontrol etmeyen uygulamalarda kurbanın hesabını ele geçirebilir.
According to this writeup, bir kurbanın saldırganın ana bilgisayarına işaret eden bir returnUrl ile bir sayfa açması sağlanabiliyordu. Bu bilgi bir çerezde (RU) saklanacak ve sonraki adımda istem kullanıcıya o saldırganın ana bilgisayarına erişim vermek isteyip istemediğini soracaktır.
Bu istemi atlatmak için, returnUrl kullanarak bu RU çerezini ayarlayacak şekilde Oauth akışını başlatmak için bir sekme açmak, istem gösterilmeden önce sekmeyi kapatmak ve o değeri içermeyen yeni bir sekme açmak mümkündü. Böylece, istem saldırganın ana bilgisayarı hakkında bilgi vermeyecek, ancak çerez ona ayarlanacak, bu nedenle token saldırganın ana bilgisayarına yönlendirmede gönderilecektir.
As explained in this video, bazı OAuth uygulamaları, kullanıcıların platformda zaten oturum açmışlarsa webde verilen erişimi onaylamaları için prompt
GET parametresini None (&prompt=none
) olarak belirtmelerine izin verir.
As explained in this video, kodun son URL'de nerede sağlanmasını istediğinizi belirtmek için response_mode
parametresini belirtmek mümkün olabilir:
response_mode=query
-> Kod bir GET parametresi içinde sağlanır: ?code=2397rf3gu93f
response_mode=fragment
-> Kod URL parçası parametresi içinde sağlanır #code=2397rf3gu93f
response_mode=form_post
-> Kod, code
adında bir girdi ile bir POST formu içinde sağlanır ve değer
response_mode=web_message
-> Kod bir post mesajında gönderilir: window.opener.postMessage({"code": "asdasdasd...
According to this blog post, bu, OAuth üzerinden kullanıcı adı ve şifre ile giriş yapmayı sağlayan bir OAuth akışıdır. Bu basit akış sırasında, kullanıcının gerçekleştirebileceği tüm eylemlere erişim sağlayan bir token dönerse, bu token kullanılarak 2FA atlatılabilir.
This blogpost comments how it was possible to abuse an open redirect to the value from the referrer to abuse OAuth to ATO. The attack was:
Kurban saldırganın web sayfasına erişir
Kurban kötü niyetli bağlantıyı açar ve bir açıcı, referrer olarak saldırganın web sitesini kullanarak response_type=id_token,code&prompt=none
ek parametreleri ile Google OAuth akışını başlatır.
Açıcıda, sağlayıcı kurbanı yetkilendirdikten sonra, onları redirect_uri
parametresinin değerine (kurban web) 30X kodu ile geri gönderir, bu da hala saldırganın web sitesini referans olarak tutar.
Kurban web sitesi referansa dayalı açık yönlendirmeyi tetikler ve kurban kullanıcıyı saldırganın web sitesine yönlendirir, çünkü respose_type
id_token,code
olduğundan, kod URL'nin parçasında saldırgana geri gönderilecektir, bu da onun kurbanın sitesinde Google aracılığıyla kullanıcının hesabını ele geçirmesine olanak tanır.
Check this research For further details of this technique.
OAuth'taki Dinamik İstemci Kaydı, güvenlik açıkları için daha az belirgin ama kritik bir vektör olarak hizmet eder, özellikle Sunucu Tarafı İstek Sahteciliği (SSRF) saldırıları için. Bu uç nokta, OAuth sunucularının istemci uygulamaları hakkında, kötüye kullanılabilecek hassas URL'ler de dahil olmak üzere ayrıntılar almasına olanak tanır.
Ana Noktalar:
Dinamik İstemci Kaydı genellikle /register
ile eşleştirilir ve client_name
, client_secret
, redirect_uris
ve logolar veya JSON Web Anahtar Setleri (JWK'ler) için URL'ler gibi ayrıntıları POST istekleri aracılığıyla kabul eder.
Bu özellik, RFC7591 ve OpenID Connect Kaydı 1.0'da belirtilen spesifikasyonlara uyar ve SSRF'ye karşı potansiyel olarak savunmasız olabilecek parametreleri içerir.
Kayıt süreci, istemcileri birkaç şekilde SSRF'ye maruz bırakabilir:
logo_uri
: Sunucu tarafından alınabilecek istemci uygulamasının logosu için bir URL, bu da SSRF'yi tetikleyebilir veya URL yanlış yönetilirse XSS'ye yol açabilir.
jwks_uri
: İstemcinin JWK belgesine giden bir URL, kötü niyetle oluşturulursa, sunucunun saldırgan kontrolündeki bir sunucuya dışa dönük istekler yapmasına neden olabilir.
sector_identifier_uri
: Sunucunun alabileceği redirect_uris
JSON dizisini referans alır, bu da bir SSRF fırsatı yaratır.
request_uris
: İstemci için izin verilen istek URI'lerini listeler, bu da sunucu bu URI'leri yetkilendirme sürecinin başında alırsa kötüye kullanılabilir.
Kötüye Kullanım Stratejisi:
SSRF, logo_uri
, jwks_uri
veya sector_identifier_uri
gibi parametrelerde kötü niyetli URL'lerle yeni bir istemci kaydederek tetiklenebilir.
request_uris
aracılığıyla doğrudan kötüye kullanım, beyaz liste kontrolleri ile azaltılabilirken, önceden kaydedilmiş, saldırgan kontrolündeki bir request_uri
sağlamak, yetkilendirme aşamasında SSRF'yi kolaylaştırabilir.
If the platform you are testing is an OAuth provider read this to test for possible Race Conditions.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)