Eski Windows Server sürümlerinde authentication protokolü olarak NTLM kullanılırken yeni sürümlerde güvenlik sebebiyle Kerberos protokolü kullanılmaktadır.
Kerberos
Kerberos, ticket’lar aracılığı ile istemcinin kimliğini sunucuya/servise doğrulayabilmesini sağlayan kimlik doğrulama protokolüdür.
Kerberos protokolü 88 numaralı port üzerinde çalışmaktadır. TCP ve UDP protokollerini desteklemektedir ancak genellikle TCP protokolü üzerinden çalışmaktadır.
Key Distrubiton Center (KDC): Authentication Service ve Ticket Granting Service olmak üzere iki bölümden oluşur. Client’ın kimliğini doğrulayarak, client’a sunucu/servis ile authentication işlemini sağlayacağı ticketleri sağlar.
Authentication Service: KRB_AS_REQ isteğini veritabanında bulunan bilgiler ile karşılaştırarak kullanıcının kimliğini doğrular.
Ticket Granting Service: KRB_TGS_REQ isteğinde belirtilen servise ait ticket’ı oluşturur.
1) KRB_AS_REQ
Client bu isteği göndererek kullanıcı doğrulamasını yapar.
- pvno: Kullanılan kerberos protokolünün versiyon numarası
- Pre-authentication data (padata): Windows işletim sisteminde bu kısımda timestamp’in kullanıcının parolasının hash’i ile şifrelenmiş hali bulunuyor.
- kdc-options: Opsiyonlar
- cname: Client’ın adı (UPN veya sAMAccountName)
- realm:
- sname: Servis adı (kimlik doğrulama olduğundan krbtgt servisi)
- till: İsteğin geçerlilik süresi
- rtime: Talep edilen yenileme süresi
- nonce: Replay saldırı tespiti için client tarafından oluşturulan sayılar
- etype: İstenilen şifreleme türleri
- addresses: Client’ın adresi
2) KRB_AS_REP
KDC tarafından KRB_AS_REQ isteğine verilen cevaptır. KDC ilk önce KRB_AS_REQ isteğinde padata içerisinde bulunan veriyi kullanıcının parolasının hash’ini kullanarak decrypt eder. Elde ettiği timestamp verisini karşılaştırır. 5 dakikadan büyük ise hata mesajı verilir.
KRB_AS_REP mesajı ile servis bilet isteklerinde kullanılacak olan Ticket Granting Ticket (TGT) gönderilir.
- pvno: Kerberos versiyon numarası
- padata: Pre-authentication data
- crealm:
- cname: Client adı
- ticket: Ticket Granting Ticket (TGT)
3) KRB_TGS_REQ
Bu mesaj ile iletişim kurulacak olan servise ait Service Ticket istenir. Mesajın içerisinde TGT ve istenilen servis belirtilir.
- sname: İstenilen servis adı
- enc-authorization-data: TGT
4) KRB_TGS_REP
KDC bu mesaj ile client’a Service Ticket’ı iletir. Client Service Ticket’ı kullanarak belirtilen servis ile iletişim kurabilir.
- cname: Client adı
- ticket: Service Ticket
5) KRB_AP_REQ
Sunucu, KRB_AP_REQ mesajını aldığında Ticket içerisinde bulunan session key ile authenticator mesajını ve timestamp’i decrypt eder.
6) KRB_AP_REP
KRB_AP_REP içerisinde authenticator mesajı bulunur. Client, KRB_AP_REP mesajını aldığında içeriğini session key yardımı ile decrypt eder. Herhangi bir problem yoksa sunucunun/servisin gerçek olduğu anlaşılır ve bağlantı devam ettirilir.
Active Directory Login İşleminin Wireshark ile İncelenmesi
Kerberos protokolü yeni Windows Server sürümlerinde varsayılan authentication protokolü olarak kullanılmaktadır.
Protokolün daha iyi anlaşılabilmesi için Active Directory login işlemini inceleyelim.
Giden ve gelen paketleri inceleyebilmek için Wireshark aracını Windows Server 2016’a kurmamız gerekiyor.
Giriş işlemindeki paketleri yakalayabilmemiz için giriş işleminden önce Wireshark aracında uygun interface’i seçerek dinleme işlemini yapıyoruz.
Wireshark seçtiğimiz interface üzerinden geçen bütün paketleri göstereceğinden bizim bu paketler arasından kerberos protokolüne ait paketleri bulmamız gerekiyor. Wireshark’ın filtreleme özelliğini kullanarak istediğimiz paketleri daha rahat bulabiliriz.
Wireshark filtreleme kısmına “kerberos” yazarak sadece kerberos protokolüne ait paketleri elde edebilmekteyiz.
Kerberos protokolünün TCP ve UDP protokolleri üzerinde 88 numaralı portta çalıştığını söylemiştik. Port numarası 88 olan paketleri filtreleyerekte kerberos protokolüne ait paketleri elde edebiliriz. Filtre aşağıdaki fotoğraftaki gibi olabilir.
Port numarasına göre filtreleme işleminde daha farklı/fazla paket olduğunu görüyoruz. Bunun sebebi Wireshark üzerinde “kerberos” filtresi ile filtreleme yaptığımızda bize bağlantı kurulmadan önce yapılan TCP üçlü el sıkışma gibi paketlerini göstermemesinden kaynaklanıyor.
İncelemenin zorlaşmaması adına ben “kerberos” filtrelemesini öneriyorum.
Şimdi login işlemini inceleyelim.
Wireshark açık halde client üzerinden Active Directory’e giriş yaparak gerekli olan paketleri elde ediyoruz. Daha sonra Wireshark üzerinden “kerberos” filtrelemesini kullanarak sadece kerberos protokolüne ait paketleri elde ediyoruz.
İlk iki paketi incelediğimizde client KRB_AS_REQ mesajı göndermiş ancak KDC’den KRB_AS_REP mesajı gelmesi gerekirken hata mesajı geri dönmüş.
KRB_AS_REQ mesajını incelediğimizde pre-authentication data (padata) verisi gönderilmemiş. Kerberos protokolünde padata kısmı opsiyonel olduğundan gönderilmesi zorunlu değildir. Ancak Active Directory üzerinde login işleminin gerçekleşmesi için KDC bizden padata verisini (şifreli timestamp verisini) bekliyor.
Client hata mesajını aldığında yeni bir KRB_AS_REQ mesajı oluşturarak KDC’e gönderir. Ancak bu sefer içerisinde timestamp değeri de bulunmaktadır.
Client yeni KRB_AS_REQ mesajını gönderdiğinde KRB5KRB_AP_ERR_SKEW hata mesajını almış.
Bu hata mesajı zaman farkından dolayı kaynaklanmaktadır. Yazımızda belirttiğimiz üzere gönderilen timestamp değeri ile sunucu arasındaki zaman farkı fazla ise güvenlik önlemi olarak hata mesajı gönderilir.
Bir sonraki paketi incelediğimizde Client’ın yeni bir KRB_AS_REQ mesajı gönderdiğini görüyoruz.
Bu sefer hiç bir problem ile karşılaşılmadığından KDC bize KRB_AS_REP mesajını iletmiş. Fotoğraftan görüldüğü üzere bize TGT’i iletmiş.
Daha sonra KRB_TGS_REQ mesajları ile Service Ticket’ların alındığını gözlemliyoruz.
Bu noktada giriş işlemi başarılı bir şekilde tamamlanmış oldu.
Örnek pcap dosyasına buradan ulaşabilirsiniz.
Be First to Comment