Derin bir nefes alın, çayınızı kahvenizi hazırlayın, bu yazı çok uzun ve sıkıcı olacak, kafalarımız da allak bullak. Örneklendireceğim HTTP trafikleri yine 2 sanal makine (biri Windows 2008 diğer XP Pro) arasındaki iletişimi gösteriyor.
Önce IIS tarafında eksik bileşenleri yükleyelim
Önce IIS tarafında eksik bileşenleri yükleyelim
ve Default Web Site'ı "Windows Authentication" ile kimlik doğrulaması yapılacak şekilde yapılandıralım
IIS hazır. Şimdi IIS sunucu ile aynı domaindeki XP istemci bilgisayardan default web site'a erişip trafiği inceleme zamanı. Eğer web sitesini sunucunun hostname'i ya da FQDN dediğimiz domaindeki tam adıyla çağırmazsanız, bu IP'nin Active Directory'de kayıtlı SPN'i olmadığı için aşağıdaki ekran görüntüsündeki gibi kullanıcı adı/parola kutucuğuyla karşılaşırsınız -ki bu da istemediğimiz birşey- ve Kerberos Authentication kullanılmaz,onun yerine NTLM Authentication kullanılır.
Bizim istediğimiz ise şu; web sunucusunun korumalı alanına ulaşmaya çalışalım ama web sunucu kullanıcı bilgilerimizi arka tarafta browser'dan alsın, bizi böyle kutucuklarla uğraştırmasın. Bunun için web sitesine, siteyi barındıran sunucu ismiyle ve Kerberos Authentication protokolüyle erişiyoruz
Sıra arka tarafta cereyan eden trafiği incelemeye geldi.
192.168.227.133 istemci (XP Pro)
192.168.227.128 sunucu (Windows 2008) IP adresleri
Kerberos
Klasik 3-way handshake'den sonra istemci XP bilgisayardan ilk HTTP GET Request sunucuya gönderiliyor
Sunucu, istemciye gönderdiği HTTP Response'da "güzel kardeşim bu sayfaya elini kolunu sallayan erişemez, authentication diye birşey var ayıp oluyor, Kerberos destekliyorsan devam edelim, NTLM destekliyorsan bana bi zahmet kullanıcı adı/parola gönder ( 1 Numara ) , ikisini de yapmam diyorsan ya da vazgeçtiysen bu sayfayı gösterebilirsin ( 2 Numara) " der. "WWW-Authentication" header'daki "Negotiate" terimi NTLM ve Kerberos'u kapsayan bir protokol olarak düşünülebilir.
Bunun üzerine istemci aynı web sitesine erişme isteğini tekrarlar ama bu defa InitializeSecurityContext() fonksiyonuyla NegTokenInit (istemciden sunucuya gönderilen negotiation token) denen bir initialization token oluşturur,bu tokenı base64 ile kodlanmış şekilde "Authorization" header'ı içinde gönderir.
Bu HTTP Request'i taşıyan pakete Wireshark ile daha detaylı bakarsak ( aynı bilgiyi Fiddler da gösterir ), Authorization Header'da Kerberos-5 kullanıldığını görebiliriz. Ayrıca token içinde istemcinin desteklediği güvenlik mekanizmaları,domain adı, sunucu adı gibi bilgiler de bulunur.
NegTokenInit tokenını Authorization header içinde alan web sunucu Authorization Header'daki NegTokenInit tokenini decode eder (base64 decode), güvenlik mekanizmalarını kontrol eder ( MechType) daha sonra MechToken verisini paketten çıkarır ve gss_accept_security_context() fonksiyonu ile bu token'i doğrulamaya çalışır. gss_accept_security_context() foniksiyonu "GSS_S_COMPLETE" değeri döndürürse ne ala, sunucu istemciye HTTP 200 koduyla istediği sayfanın kodlarını iletir, ama fonksiyon "GSS_S_CONTINUE_NEEDED" sonucu verirse sunucu, istemciden doğrulamayı yapmak için gerekli tüm veriyi alana kadar istemciye 401 Unauthorized koduyla cevap gönderir. Bu Kerberos Authentication'da pek rastlanmayan bir durum. İstemci de, sunucunun 401 koduyla gönderdiği cevabın "WWW-Authenticate" header'ındaki negTokenTarg (negotiation Token returned by target) 'ı alır sunucu "GSS_S_COMPLETE" sonucu gönderene kadar eksik veriyle birlikte "Authorization" header'da gönderir. Aşağıdaki ekran görüntüsü sunucunun cevabını gösteriyor
Fonksiyon, yukarda belirtilen iki sonuç dışında sonuç verirse - ki bu yüksek ihtimalle hata anlamına gelir - istemciye erişimin engellendiğine dair bir cevap döndürür. Bu karman çorman hadisenin adı ise "SPNEGO Token Handshake".
Kerberos'la NTLM arasındaki bir fark da şu, Kerberos ihtiyacı olan bilgiyi tek seferde bu yukardaki ekran görüntüsünde görülebileceği gibi uzunca bir tokenla alırken NTLM bu bilgileri alana kadar istemciye 401 Unauthorized cevabı gönderir. Yani Kerberos'da trafik
istemci -- (HTTP Request) --> sunucu
istemci <-- ( 401 Unauthorized ) -- sunucu
istemci -- (HTTP Request / Authorization Header ) -->sunucu
istemci <-- (HTTP Response 200 OK) -- sunucu
şeklinde cereyan eder.
İncelemek isteyenler Pcap (Packet Capture) dosyasını buradan indirebilir, wireshark'la inceleyebilir.
NTLM
Kerberos'u yazarken dağıldım, NTLM'i bir başka gün anlatacağım.İlgili Yazılarım
HTTP - Nass oluyor da oluyor? 3-way-handshake
HTTP - Nass oluyor da oluyor? HTTP Headerlar ve HTTP Mesaj Yapısı
HTTP - Nass oluyor da oluyor? HTTP Basic Authentication
HTTP - Nass oluyor da oluyor? HTTP Digest Authentication
HTTP - Nass oluyor da oluyor? HTTPS - HTTP over SSL
Hiç yorum yok:
Yorum Gönder