HTTP Host Header Attack
Last updated
Last updated
Merhabalar bu yazımızda HTTP Host Header saldırısı konusundan bahsedeceğiz.
Bir web sitesine istek atarken arka tarafta çeşitli istekler gönderiliyor. Öncelikle örnek bir web sitesi üzerinden bu istekleri inceleyelim:
example.com adlı web sitesinin iletişim sayfasına bir istek gerçekleştiriliyor.
Yukarıdaki isteği parça parça inceleyelim:
GET / HTTP/1.1: Bu satır, HTTP metodunu (GET
), yolunu (/
) ve HTTP versiyonunu (HTTP/1.1
) belirtir.
Host: İstek gönderilen sunucunun adresi; example.com
.
User-Agent: İsteği gönderen tarayıcı veya uygulama hakkında bilgi.
Accept: Tarayıcının hangi türde içerikleri kabul edeceğini belirtir (HTML, XML, resim vb.).
Accept-Language: İsteğin dil tercihlerini belirler (örneğin, tr-TR
İngilizce dil seçeneği).
Connection: İstek sonrası bağlantının durumu hakkında bilgi verir (keep-alive
, bağlantıyı açık tutar).
Bizim burada ilgileneceğimiz ve manipüle edeceğimiz kısım Host header değeridir.
Host header değeri ile birlikte hangi hedef sisteme istek atacağımızı anlamış oluruz. Host headerı HTTP/1.1 ile zorunlu bir başlık olarak kabul edilir. Eğer host değeri silinirse modern web sunucularında gelen istekler 400 Bad Request ile geri döndürülür.
Teknolojinin ilk dönemlerinde, tek bir sunucu üzerinde genellikle yalnızca bir web sitesi veya uygulama barındırılıyordu. Bu durumda, Host header değerine IP adresi verildiğinde sunucu hangi siteye yönlendirileceğini kolayca anlayabiliyordu. Ancak günümüzde, sanallaştırma ve bulut teknolojilerinin gelişmesiyle aynı IP adresi üzerinde birçok farklı site veya uygulama barındırılabiliyor.
Modern altyapılarda, bir sunucu veya IP adresi genellikle birçok farklı alan adını (domain) destekler. Bu durumda, Host header'ın alan adıyla birlikte gönderilmesi, sunucunun istek yapılan kaynağı doğru bir şekilde belirleyebilmesi için gereklidir. Örneğin, aynı IP adresine sahip bir sunucu hem example.com
hem de example.net
sitelerini barındırıyorsa, Host header değeri olmadan sunucu gelen isteğin hangi siteye ait olduğunu bilemez.
Host header saldırısının gerçekleşmesi için öncelikle saldırganın gönderilen isteği durdurup bu istek üzerinde çeşitli işlemler yapması gerekir. Çeşitli sistemler programlanırken istek ile birlikte gelen host header değerini alır ve kullanırlar. Gerekli kontroller yapılmazsa ve sistem direkt bir şekilde host header değerini alıp kendi üzerinde kullanırsa çeşitli sıkıntılara yol açabilir.
Öncelikle hedef sistem üzerinde host header zafiyetini bulmamız gerekiyor. Bu yüzden Burp Suite aracıyla gönderilen paketleri durdurup çeşitli manipülasyonlar yapıp zafiyeti tetiklememiz gerekiyor.
Rastgele host header değeri eklenerek sistemin vereceği cevap gözlenebilir. Eğer sunucu cevap veriyorsa, sitenin bu hatalı domaini varsayılan bir seçenek olarak kabul ediyor olabilir. Bu durumda, uygulamanın Host header'ı nasıl işlediğini daha detaylı inceleyebilirsiniz. Ancak çoğu durumda, geçersiz bir Host header gönderdiğinizde "Invalid Host header" gibi bir hata alabilirsiniz.
Bazı şartlar altında vereceğimiz domain adını kontrol eder vermiş olduğumuz port adresini önemsemezler. Ayrıca bazı siteler sadece aynı subdomaine sahip olan istekleri işleyebilirler.
Bazı sistemler farklı şekilde içerikleri değerlendirebilirler. Bazı sistemleri manipüle etmek için ikinci host header değeri eklememiz gerekebilir. Gönderilen istekte toplamda 2 tane host header değeri olur ve buna göre bir zafiyet ortaya çıkar.
Bazı sistemlerde ise host header değerinin yerine geçebilecek çeşitli header değerleri vardır. Bu header değerlerini vererek host header değerini manipüle etmiş oluruz. Özellikle proxy veya yük dengeleyici sistemlerde, Host header yerine X-Forwarded-Host veya benzeri bir header kullanılabilir. Böyle durumlarda, doğrudan Host header’a müdahale etmek yerine X-Forwarded-Host header’ı üzerinden zararlı veriyi eklemek mümkündür
Host header değeri dışında kullanılabilecek bazı header'lar şunlardır:
X-Forwarded-Host
X-Host
X-Forwarded-Server
X-HTTP-Host-Override
Forwarded
Bazı sistemlerde ise full link vermek sistemin çalışma yapısını değiştirebilir.
Password reset poisoning (Şifre değiştirme saldırısı)
Web cache poisoning (Web önbelleği saldırısı)
Exploiting classic server-side vulnerabilities (Klasik sunucu taraflı zafiyetlerin istismarı)
Bypassing authentication (Kimlik doğrulamayı atlatma)
Virtual host brute-forcing (Sanal ana makine brute-forcing (kaba kuvvet) saldırısı)
SSRF
Connection state attacks (Bağlantı durumu saldırıları)
Host headerın ne olduğu ne tür sorunlar çıkarabildiğini anladıktan sonra örneklerimize bakalım.
İlk örneğimiz başka bir kullanıcının şifresini yenileyerek hesabını ele geçirmek olacak. Öncelikle normal bir sistemin nasıl çalıştığını düşünelim. Şifre değiştirme işlemleri temelde iki şekilde gerçekleşiyor, eğer şifrenizi biliyorsanız sisteme giriş yapar ve profil kısmından yeni şifrenizi girip şifrenizi değiştirebilirsiniz.
Başka bir yöntem olarak da giriş ekranında bulunan şifremi unuttum kısmına mail adresinizi ya da kullanıcı adınızı girerek size gelen linke tıklayarak şifrenizi değiştirebilirsiniz.
Bir saldırgan olarak tabii ki de hedefimizde olan kişinin şifresini bilmiyoruz. Bunun için hedefimizin kullanıcı adını kullanarak kendi adına bir şifre yenileme bağlantısı oluşturacağız. Örnek labımızda carlos kullanıcısının şifresini değiştirmemiz ve hesabına erişmemiz gerekiyor.
Konumuz host header saldırısı olduğu için şifre sıfırlama ekranında host header değerini değiştirip nasıl sistemi kendimize uygun şekilde kullanabiliriz bunu düşünmemiz gerekiyor. Öncelikle şifremi unuttum kısmına kendi kullanıcı adımızı girip arka tarafta nasıl bir istek gönderiliyor inceleyelim.
Şifre değiştirme işlemi yaparken arka tarafta yukarıdaki gibi bir istek gönderiliyor. Bu istek wiener kullanıcısının mail adresine şifre sıfırlama maili gönderilmesini sağlar.
Mailde bulunan linke tıklayınca parametre olarak oluşturulmuş token değerini kontrol ederek şifre sıfırlama işlemi gerçekleşir. Şifre sıfırlama ekranına carlos yazdığımızda da carlos kullanıcısının mailine böyle bir mail gönderiliyor. Bizim burada yapmamız gereken carlos kullanıcısının token değerini ele geçirip şifresini sıfırlamak.
Daha önce gösterdiğim şifre sıfırlama isteğindeki host header değeri alınıp, şifre sıfırlama linki olarak kullanılıyor.
Eğer host header değerini maipüle eder ve kendimizin sahip olduğu bir hedefe bu token değerini gönderebiliriz.
Senaryo gereği carlos kullanıcısı kendisine gelen bütün maillerde bulunan linklere tıklıyor. Kendisine göndereceğimiz şifre yenileme bağlantısını ziyaret edecek ve bize token değeri ulaşmış olacak.
Host header değerini değiştirip kendi sahip olduğumuz sunucun adresini giriyoruz ve isteği gönderiyoruz. Sunucu üzerinde gerçekleşen istemleri kontrol ediyoruz ve parametre olarak gelen token değerini görebiliyoruz.
Token değerini alıp tarayıcı üzerinden şifre değişikliği yapabiliriz.
URL'i ayarlayıp carlos kullanıcısının şifresini değiştirebiliriz. Şifre değiştirme işleminden sonra değşitirdiğimiz şifre ile carlos kullanıcısı olarak giriş yapıp soruyu çözebiliriz.
Bu örneğimizde host header değerini mainpüle ederek web cache sistemiyle diğer kullanıcıları etkileyecek bir örnek lab çözeceğiz. Öncelikle web cache nedir kısaca ondan bahsedelim.
Web cache dediğimiz şey sık kullanılan web içeriklerinin (HTML sayfaları, resimler, JavaScript dosyaları vb.) kopyalarını geçici olarak saklayan bir sistemdir. Bu sayede, aynı içeriğe tekrar erişim gerektiğinde sunucunun yeniden veri göndermesine gerek kalmadan bu önbellekten hızla yanıt alınabilir. Web cache, hem sunucu yükünü azaltır hem de kullanıcıların daha hızlı deneyim yaşamasını sağlar.
Web cache bir içerik saklarken key-value şeklinde işlem yapar. Key değeri olarak istek gönderilen url ve parametreler seçilir. Value değeri olarak ise bize döndürülen cevap (response) kullanılır.
Bizim burada yapmamız gereken şey web cache üzerinde zararlıı kod içeren bir sayfa saklamamız gerekiyor. Bunun için öncelikle sayfaların nasıl cache alındığına bakalım.
Bir sistemin nasıl cache alındığını anlamak istiyorsak temel olarak iki yöntemi vardır.
Birincisi gelen cevabın süresine bakarak bir azalmanın olup olmadığına bakılabilir.
Dönen cevap üzerinde çeşitli header değerleri bize bu durum ile ilgili bilgi verebilir. ( X-Cache, Cache-Control vb.
Yukarıdaki örnekte gördüğümüz gibi web cache tarafında https://orneksite.com/anasayfa
adresine gitmek istediğimizde web cache tarafından bize saklanan yukarıdaki değer döner ve Web Cache poising saldırısını yapmış oluruz.
Öncelikle isteklerimizi atmadan ve başlıkları kontrol etmeden önce parametre olarak rastgele bir değer ekliyoruz ki web cache tarafında index sayfasının yerine başka bir şey saklanmasın.
https://labId.h1-web-security-academy.net?param=1
adresine istek attığımızda X-Cache değerinin miss olduğunu görüyoruz, ikinci bir istek gönderdiğimizde X-Cache değeri hit oluyor. Bu da demek oluyor ki ikinci istekten sonra istek attığımız sayfa web cache tarafından saklanmış oluyor.
Cache mekanizmasını öğrendikten sonra nasıl soruyu çözüceğimize bakalım. Soruda bizden istenen şey cache'i zehirleyip ana sayfada document.cookie diye bir pop-up çıkarmamız bizden bekleniyor.
Konumuz host header saldırıları olduğu için host değerinin dönen cevap üzerinde olup olmadığını kontrol edelim.
Dönen cevap üzerinde host değerini görebiliyoruz. Önceki örneklerde yaptığımız gibi host değerini manipüle ederek istediğimizi yapabilir miyiz diye denemeler yapalım.
Host değerini değiştirdiğimizde hata aldık. Host header değerini eski haline getirip ikinci bir host değeri ekleyebilir ve rastgele bir değer girip isteği gönderelim.
İkinci bir host değeri girdiğimizde sistemde beklenmedik durumlara yol açabildik ve host değeri üzerinden manipüle edebildik.
İsteğimizi gönderirken kullandığımız host değeri alınıp direkt bir şekilde src parametresine verildiği için parametre içinden kaçmaya çalışabiliriz.
Yukarıdaki host değeriyle parametrelerden kaçabiliriz. İki defa isteği gönderdikten sonra ana sayfa cache olarak saklanır. Buradan sonra tarayıcıdan sayfaya yenilediğimizde soruyu çözmüş oluyoruz.
Bu örneğimizde iste host header değerini manipüle ederek ağ içi tarama yapacağız. Öncelikle daha önce olduğu gibi bir web sitemiz var ve herhangi bir giriş bilgisine sahip değiliz. Soruda bize 192.168.0.0/24 IP aralığında bulunan ağ içi bir admin paneli olduğunu söylüyor. Bu panele ulaşıp carlos kullanıcısını silmemiz bizden isteniyor.
Öncelikle soruda host header değerinin zafiyetli olduğunu kanıtlamamız gerekiyor. Web sitesinin Burp Suite içinde bulunan Collaborator ile zafiyeti kanıtlayacağız.
Öncelikle Burp Suite ile ana sayfaya oluşturulan bir isteği yarıda kesiyoruz ve host header değerini seçip sağ tıklayarak "Insert Collaborator payload" seçeneğine tıklıyoruz. Bu sayede host değerimizi değiştirmiş oluyoruz.
İsteği bu şekilde gönderiyoruz sonrasında üst kısımda bulunan Collaborator sekmesine tıklıyoruz. Poll now butonuna bastıktan sonra başarılı bir şekilde isteklerin atıldığını görüyoruz.
Repeater üzerinden gönderdiğimiz istek başarılı bir şekilde bize ulaştı. Demek oluyor ki host header değeri üzerinde gerekli kontroller yapılmamış ve hedef olarak gösterilen yerlere istek atıyor.
Bizden istenen ise 192.168.0.0/24 aralığında bir admin paneli bulmak. Bunun için az önce repeater üzerinde düzenlediğimiz isteğin Intrudera göndermek ve host değerini değiştirmek.
İsteği bu şekilde düzenliyoruz ve payload olarak 0-255 arasındaki sayıları ayarlıyoruz. Yapılan istekler sonucunda bir tane Ip adresi diğer adreslere göre farklı bir status code döndürüyor.
Ana sayfaya host değeri olarak 192.168.0.145 ile istek attığımızda bizi /admin dosyasına yönlendiriyor ve bize dönen cevap üzerinde aşşağı kısımlara indiğimizde bize kullanıcı silme ile ilgili bir form karşımıza çıkıyor.
/admin/delete sayfasına csrf ve kullanıcı adını parametrelerini ekleyerek bir post isteği gönderelim ve soruyu çözelim.
Post isteğini düzenleyip carlos kullanıcısını siliyoruz ve soruyu çözmüş oluyoruz.