Password Reset Poisoning

Gerek web üzerinde gerekse de mobil mecrada her gün birçok yerde hesap oluşturuyor ya da halihazırda hesap oluşturduğumuz platformları aktif olarak kullanıyoruz. Bu hesapların parolalarını unuttuğumuz zaman ise parola sıfırlama mekanizmalarını kullanarak parolalarımızı yeniden tayin edebiliyoruz. Parola sıfırlama her ne kadar faydalı bir özellik olarak gözüküyor olsa da eğer gerekli önlemler alınmadıysa bir atak vektörü olarak değerlendirilebilir ve kullanıcı hesaplarını saldırıya açık hale getirebilir. Bu yazımızda parola sıfırlama fonksiyonunu istismar etmemizi sağlayan password reset poisoning saldırısından bahsedeceğiz.

1. Password Reset Süreci
2. Password Reset Poisoning Nedir?
3. Password Reset Poisoning Nasıl Gerçekleştirilir ve Neden Oluşur?
4. Password Reset Poisoning Senaryosu Gerçekleştirimi
5. Sonuç


Password Reset Süreci​

Bir hesaba ait parolamızı unutup erişimimizi kaybettiğimizde, erişimi yeniden kazanmak adına parolamızı sıfırlar ve hesabımızı tarafımızca yeniden erişebilir kılarız. Bu tür parolanın unutulması/kaybolması durumlarına karşılık olarak web uygulamalarında genellikle bir parola sıfırlama mekanizması bulunur. Şimdi bu sürecin nasıl işlediğini basitçe inceleyelim:
Parola Sıfırlama Talebi: Kullanıcı, hesabının parolasını sıfırlamak adına kullanıcının girişinin yapıldığı panelde bulunan “Parolanızı mı unuttunuz?”, Şifremi unuttum” şeklindeki linke tıklar. (Aslında parola ve şifre farklı şeylerdir ve doğru sözcük kullanımı parola olacaktır ancak bunun detayına şimdilik girmeyelim 🙂)
Sunucu Parola Resetleme Linki Üretir: Hesabın barındığı sunucu, parolayı sıfırlamak adına kişiye genellikle e-posta aracılığıyla bir link gönderir. Bu link güvenlik açısından içerisinde tek kullanımlıktır ve belirli bir süre sonra işlevini yitirecektir.
Parola Sıfırlama İşlemi: Kullanıcı kendisine iletilen linkte tıklar ve açılan pencere üzerinden hesabının parolasını değiştirir.

Password Reset Poisoning Nedir?​

Password reset poisoning, bir parola sıfırlama isteğinde bulunan host başlığının manipüle edilerek, o başlığın içeriğini saldırganın kendi kontrolündeki bir domain olacak şekilde değiştirmesi ve isteğini karşı tarafa link vasıtasıyla ulaştırdıktan sonra parola değiştirmek adına geçerli bir token değeri elde etme hedefi taşıyan bir saldırı metodudur.
Host header injection saldırıları kategorisinde olan bu saldırı ile saldırganlar parolasını değiştirmek istediği kişinin e-posta hesabını hedef alarak bu saldırıyı gerçekleştirirler. Gerek OSINT teknikleri gerekse de geçmiş veri sızıntılarından faydalanılarak elde edilen e- posta hesaplarına gönderilen, sosyal mühendisliğe dayalı ve aldatıcı içerikle oluşturulan e-postalar, kullanıcıları kandırmayı ve hesaplarını ele geçirmeyi hedefler.

Password Reset Poisoning Nasıl Gerçekleştirilir ve Neden Oluşur?​

Parola sıfırlama mekanizmasını ve password reset poisoning saldırısının ne olduğunu anladığımıza göre şimdi bu saldırının gerçekleştirilmesini ve gerçekleştirimin arkasında yatan teknik sebepleri inceleyelim.
carbon_(5).png
Örneğin, yukarıdaki gibi bir POST isteğinin parola değiştirmek amacıyla kullanıldığını düşünelim. Burada fark edildiği üzere POST isteği belirtiminin ardından web sitesinin example.com şeklinde olduğu görülmektedir. Ancak aşağıdaki host başlığı incelendiğinde ise buradaki başlığın değerinin evilhost.com olduğunu görüyoruz. Yani saldırgan kişi host başlığına kendi zararlı domainini enjekte etmiştir.
Bu enjeksiyon sonucunda parola resetleme linki şu şekle dönüşür:
Yukarıdaki sıfırlama linki özellikle bir görsel ya da bir buton arkasında maskelenirse çok daha efektif ve etkili olacaktır. Böylelikle hedef kişinin token değeri elde edilerek parola sıfırlama işlemi gerçekleştirilebilecektir.
Burada akıllara gelen soru bu saldırının nasıl gerçekleştirildiği olacaktır. Bu doğrultuda kod analizi yaparak süreci daha detaylı ele alalım. Örneğin parola sıfırlama sürecini gerçekleştiren aşağıdaki gibi bir kod parçası olsun.
PHP:
// Parola Sıfırlama Talebinin Gerçekleştirimi if (isset($_POST['reset'])) {

$userEmail = $_POST['email'];


// Parola Sıfırlamak Adına Token Oluşturulması

$resetToken = generateResetToken();


// Parola Sıfırlama Linkinin Oluşturulması

$resetPasswordURL = "https://{$_SERVER['HTTP_HOST']}/reset-password.php?token=$resetToken";


// Parola Sıfırlama E-Postasının İlgili Kullanıcıya Gönderimi

sendEmail($userEmail, "Password Reset", "Click the following link to reset your password: $resetPasswordURL");

}
Bu php kodunda, öncelikle kullanıcı parola sıfırlama isteğinde bulunur ve bu istek if bloğu şartının true olmasını sağlayarak kod parçasının içeriğinin aktifleştirilmesini sağlar. Ardından kullanıcıya ait olan e-posta adresi $userEmail değişkeninde tutulur. Sonrasında, parola sıfırlama linkinin benzersiz olması adına sunucu tarafı benzeri olmayan bir token üretir. Bu iki aşamadan sonra $_SERVER['HTTP_HOST'] başlığı değeri kullanılarak (yani POST isteğindeki host isteğinin değeri) ve üretilen eşsiz token eklenerek parola sıfırlama linki oluşturulur. Son olarak da kullanıcının $userEmail değişkeninde tutulan e-posta değerine oluşturulan parola resetleme linki gönderilir.
Bu kodun zafiyete açık olmasının sebebi host başlığının enjeksiyona açık olmasından kaynaklanmaktadır. Web uygulamaları link üretmek adına kullanıcı tarafından kontrol edilebilir alanları kullandığı zaman bu tür açıklıklar meydana gelebilir. Web uygulaması bu kullanıcı girdisini düzgün bir şekilde doğrulamaz veya filtreden geçirmezse, saldırgan kişi hedef kullanıcıları kendi kontrolündeki bir domaine yönlendirebilir ve böylelikle password reset poisoning saldırısı gerçekleştirilebilir.
Uygulama geliştiriciler genellikle $_SERVER['HTTP_HOST'] gibi başlıklara, girdi üzerinde herhangi bir ek filtreleme gerçekleştirmeden güvenirler. Bu duyulan direkt güven de az önceki örneklerde gösterildiği üzere saldırganlar tarafından parola sıfırlama linkinin kötü amaçlı kullanımına yol açacaktır.

Password Reset Poisoning Saldırı Senaryosu​

Bu zamana kadar öğrendiklerimizi gerçekleştirmek adına PortSwigger Academy üzerindeki Basic password reset poisoning lab uygulamasını şimdi birlikte çözelim.
Öncelikle web uygulamamızı gezdiğimizde burada bir kullanıcı girişi olduğunu görüyoruz. Konu ile paralel olarak Forgot password?
ifadesi dikkatimizi çeken ve odağımızı yönlendireceğimiz kısımdır.
Untitled.png
Lab, bize kullanıcı adımızın wiener ve parolamızın peter olduğunu söylüyor. Şimdi gidip bu fonksiyonu test edelim ve parolamızı değiştirelim. Ayrıca parola sıfırlama linkinin nasıl çalıştığına da bir göz atalım.
Untitled 1.png
Mail kutumuza göz attığımızda standart bir metin eşliğinde parola sıfırlama linkinin geldiğini görüyoruz. Parolamı vvhack olarak değiştirdim. Şimdi daha detaylı analiz etmek adına Burp Suite üzerinden giden/gelen HTTP isteklerine göz atıyorum ve orada /forgot-password isminde yapılan POST isteği benim yaptığım parola sıfırlama talebine denk geliyor. Bu isteği Burp Repeater’a gönderiyorum:
Untitled 2.png
Burada da token değerinin varlığını tekrardan teyit edebiliyorum. Şimdi yeni bir parola sıfırlama isteği oluşturalım ve bu isteğin host başlığını değiştirelim, böylelikle e-postamıza gelen parola değiştirme linkinin değişip değişmediğini görelim.
Untitled 3.png
Gelen maile göz attığımızda link sanki vvhack üzerinden gelmiş gibi gözükmektedir. Bu tam da aradığımız zafiyetin olduğunun göstergesidir. Bu doğrultuda yapmamız gereken, mailde bulunan linkin içerisinde exploit sunucumuzun bulunması ve parolasını değiştirmek istediğimiz kişiye bu maili ulaştırmaktır. Lab, bana carlos kullanıcısının parolasına saldırmamı istediğini söylediğinden bu doğrultuda hareket edelim.
Untitled 4.png
İsteğimizi gönderdikten sonra exploit sunucumuza düşen log kayıtlarına bir göz atalım.

Untitled 5.png
Log kayıtlarımıza göz attığımızda karşı tarafın maile tıkladığını ve tıklaması sonucunda token değerini ele geçirdiğimizi görüyoruz. Şimdi bu değeri kullanarak o kişinin parolasını sıfırlayabiliriz. Tek yapmamız gereken geçerli bir parola değiştirme linki şablonuna ele geçirdiğimiz token değerini girmektir.
Geçmiş parola sıfırlama isteklerimizde yukarıdaki gibi bir link elde etmiştik. Şimdi ele geçirdiğimiz token değerini linkteki token değeri ile değiştirerek parola sıfırlamasını gerçekleştirebiliriz. Ele geçirdiğimiz token değeri (L7G0xPB1F7vyRFrVvaU80M2IT4gTJq8V) ile birlikte yeni linkimiz aşağıdaki gibidir:
Parola değiştirme ekranında parolayı 12345 olacak şekilde değiştirdim. Şimdi kullanıcı girişi yaparak tüm bu süreci tamamlayalım.
Untitled 6.png
Giriş yapıyoruz ve sonuç:
Untitled 7.png
Böylelikle carlos kullanıcısının hesabını ele geçirmiş olduk.

Sonuç​

Password reset poisoning, web uygulamalarının güvenliği ve kullanıcı hesaplarının gizliliği için ciddi bir tehdit oluşturduğunu bu yazımızda ele aldık. Saldırganlar, input değerlerinin yeterince kontrol edilmemesi ve host gibi başlıklara varsayılan olarak güvenilmesi durumundan faydalanarak hesaplara yetkisizce erişebilir ve veri ihlalleri gerçekleştirebilirler. Bu riski azaltmak için geliştiriciler, güvenli kodlama ilkeleri doğrultusunda hareket etmeli, host başlığı gibi HTTP başlıklarının değerlerine dikkat etmeli ve kullanıcı inputlarını uygun yöntemlerle doğrulamalıdır.

Okuduğunuz için teşekkürler. Başka yazılarda görüşmek üzere.
 
Üst