4 Haziran 2012 Pazartesi

HTTP - Nass oluyor da oluyor? HTTP Digest Authentication

Basic Authentication'da kullanıcı adı/parola bilgisinin header'larda Base64 algoritması ile karışık hale getirilerek gönderildiğini görmüştük. Basic Authentication'daki bu zaafiyetin giderilmeye çalışıldığı "Digest Authentication" da ise işleyiş şu şekilde;
İstemci, Digest Authentication gerektiren kaynağa erişmek için istekte bulunur;

Web sunucu bu isteği yanıtlarken yine "WWW-Authenticate" Header'ı kullanır ama Basic Authentication'daki header'dan farklı olarak algorithm değeri, tek-kullanımlık "nonce" değeri, qup (Quality of Protection) değerlerini barındırır.
Kullanıcıya kullanıcı adı/parola göndermesini sağlayacak kutucuk gösterilir.

Daha fazla devam etmeden elimden geldiğince teknik detaya girmeye çalışayım.
Digest Authentication challange/response mekanizmasıyla çalışır. Bu yöntemde gizli bilgi/veri doğrudan iletişim hattı üzerinden gönderilmez.İletişimin her iki ucu tarafından belirlenen (istemci ya da sunucu) değerler kullanılarak değişik algoritmalardan geçirildikten sonra karşı tarafa gönderilir. Karşı tarafta aynı yöntemle ve aynı değerlerle hesaplama yapar ve istemcinin gönderdiği değerle sunucunun hesapladığı değerler birbirine eşit olursa buradan istemcinin gönderdiği gizli bilgi (parola)'nın doğru olduğu anlaşılır. Bu bir paragraflık laf kalabalığı pek anlam ifade etmemiştir sanıyorum. Digest authentication'da iletişim hattından gönderilen bu değer (parola değil dikkat edin, şifrelenmiş parola gibi düşünebilirsiniz ama aslında şifrelenmi parola da değil bu)
RFC 2617'e göre digest (gizli değer,parola diye bahsettiğimiz bilgi) şu şekilde hesaplanmalıdır (kaynak HTTP: The Definitive Guide);
Eğer "qop" yani Quality of Protection değeri "auth" veya "auth-int" ise ( ki örneğimizde "auth" );
response=MD5(MD5(A1):nonce:noncecount:clientnonce:qop:MD5(A2))
Eğer "qop" yani Quality of Protection değeri belirtilmemişse;
response=MD5(MD5(A1):nonce:MD5(A2))
  • A1 nedir diye soracak olursanız;
Algoritma "MD5" ise A1=user:realm:password
Algoritma "MD5-sess" ise A1=MD5(user:realm:password):nonce:clientnonce
  • A2 nedir derseniz,yine qop değerine göre değişkenlik gösteriyor
qop değeri "auth" ise veya belirtilmemişse A2 şu şekilde hesaplanır;
A2=request-method:digestURI
qop değeri "auth-int" ise HA2 şu şekilde hesaplanır;
A2=request-method: digestURI:MD5(body)
İşte istemci yani biz,yani tarayıcımız sunucuya kullanıcı adı/parola bilgisini göndermeden önce parolayı , sunucunun gönderdiği nonce,realm,qop gibi değerlerini de kullanarak yine sunucu tarafından belirtilen algoritmaya sokar ( MD5) ve sunucuya sadece 32 karakterlik MD5 hashi gönderir.
Bu da gösteriyor ki istenen her kaynak (sayfa,resim ve dosya) için istemci tarafından üretilen "nonce counter" ve kaynak URI'si farklı olacağından üretilecek ve gönderilecek response yani digest değeri farklı olacak ama aslında her seferinde gönderilen parola aynı. Örnek üzerinden giderek devam edelim, istemci sunucunun Authentication istediğini biliyor artık, ne tip bir Authentication protokolünü istediğini (digest) ve desteklediğini de, göndermesi gereken digest'i (ya da response'u) hesaplayabilmek için gerekli bilgileri de sunucudan aldı. Aşağıdaki gibi bundan sonraki göndereceği ilk istekte response değerini hesaplayarak sunucuya gönderecek
Hesaplama şu şekilde
qop="auth" değerine sahip olduğu için 
A2=method:digestURI
MD5(A2)=MD5(GET:/)=71998C64AEA37AE77020C49C00F73FA8

A1=username:realm:password=test:Digest:KotuParola1234
MD5(A1)=MD5(test:Digest:KotuParola1234)=7001525B84999D8F859224F01412FC1F

response=MD5(MD5(A1):nonce:nonceCount:clientNonce:qop:MD5(A2))
response=MD5(7001525B84999D8F859224F01412FC1F:+Upgraded+v1a582d3b1ca3fe346a209018077aa9e0254ee19c25a42cd01770f1e54092b62d48f74a77b0963931d6ea81b6dad648fc223aa8e2e61505a9c0f2a:00000001:2a906babdaebc48c9c652cb229b53929:auth:71998C64AEA37AE77020C49C00F73FA8)=507E7D2CFFF049AE71F7B785C4369F90
Web sunucusu da istemcinin gönderdiği Request header'lardan nonce,noncecount,clientnonce,qop,realm gibi bilgileri , Active Directory'den de kullanıcı parolası bilgilerini edinir, aynı algoritmalarla MD5 hash değeri üretir, sunucunun ürettiği response değeri istemcinin gönderdiği response değerine eşitse kullanıcı doğru kullanıcı adı/parola bilgisi göndermiş demektir.Kimlik doğrulaması bu şekilde yapılır.
Bilindiği gibi artık MD5 tek başına güvenli bir algoritma değil ve MD5 hash değerinden kaynak metinin kolaylıkla elde edilebileceğini biliyoruz, bu sebeple kulanıcı adı,realm,parola değerlerinin MD5 hash'inin digest ya da response değeri olarak gönderilmesi yerine bu değerlerle birlikte nonce değerleri de algoritmaya dahil edilerek ihtimaller azaltılmış. Aşağıdaki ekran görüntüsünde yine ücretsiz online MD5 decrypter'lardan biri gösteriliyor, bu tip araçlarda hash veritabanı büyüklüğü ne kadar fazla ise decrypt etme olasılığı o derece yüksek olur.
Ben bu blog yazısı için hazırladığım ortamda Default Web site'a Digest Authentication açık iken (enabled), web sunucusunu barındıran pc üzerindeki bir yerel hesapla (local Administrator) erişemedim. Microsoft'un dökümanları bu protokolün kullanımı için Active Directory varlığını gerekli kılıyor.
Özetlemek gerekirse, Digest Authentication'da Basic Authentication'daki gibi credential denen kullanıcı adı/parola bilgisinin Base64 gibi kolay decode edilebilen algoritmalarla gönderilmesi gibi bir durum söz konusu değildir ve gönderilen response değerinden parolanın elde edilmesi ihtimali düşüktür. Ama yine de Digest-Authentication replay-attack denen saldırı türüne açıktır. Basic Authentication'da olduğu gibi SSL kullanımı ile bu tip dinlemeler engellenebilir.





İ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 Windows Authentication
HTTP - Nass oluyor da oluyor? HTTPS - HTTP over SSL

Hiç yorum yok:

Yorum Gönder