bu açık microsoft passport açığıdır

CHI€F

Kalpsiz
Bu yazı Microsoft Passport`taki bir güvenlik açığını anlatıyor. Yazıda bir kullanıcının Passport hesabını ele geçirme hakkında detaylı bilgi ve örnek kodlar verilecektir.


Orjinali: Chris Shiflett

Fakat tüm bilgiler eğitim amaçlı kullanım içindir. Amaç web üzerindeki güvenliğin detaylı bir analizini yapmak ve bazı yanlış anlamaları ortaya çıkarmak. Şu anki Passport mekanızmasının kullanımında tavsiyelerim ve güvenliğini artırma yolları ile
yazımı bitireceğim.

Altyapı
Microsoft Passport kullanıcıların Internet üzerinde sunulan ve kayıt gerektiren servislere daha kolay erişimi için yaratılan bir mekanizmadır. Amaç kullanıcıların bir Passport için kayıt olmaları ve çeşitli sitelerdeki servisleri, her birinde kayıt olmaya
gerek duymadan (harcanan vakit ve şifrelerin bakımı her zaman sorun olmuşdur) kullanabilmeleridir.
Passport`un ek bir özelliği de Wallet`dır (cüzdan). Bir Wallet`e sahip olduğunuzda kredi kartı bilgilerini ve ek kişisel bilgileri depolayabilirsiniz. Bu katılımcı sitelerde satın alma işlemlerinde kullanılabilir.

Çerezler (Cookies)
Passport basitçe kullanıcının bilgisayarında depolanan cookie koleksiyonudur. Bu cookie`ler kullanıcıyı Passport kulanan bir siteye tanıtır. Passport mekanizmasında sunucudan sunucya haberleşme yoktur, tüm haberleşme kullanıcıya doğrudur.
Bu işlem için ayarlanan çeşitli cookie`ler aşağıdaki gibidir:

isim alanadı güvenli? dizin depolanma
BrowserTest passport.com Hayır / hafıza
MSPVis passport.com Hayır / disk
MSPDom passport.com Hayır / disk
MSPAuth passport.com Hayır / disk
MSPProf passport.com Hayır / disk
MSPSec passport.com Evet /ppsecure disk
MSPRequ login.passport.com Hayır / hafıza
PWSVis wallet.passport.com Evet / hafıza
MSPAuth walletpassport.com Evet / hafıza


Microsoft Internet Explorer 5.5 öncesi sürümler istemci-tarafı scriptlerin o anki web sunucu ile paylaşılmaması gereken cookie`leri görüntüleyebilmesine izin veren bir cookie güvenlik açığı içeriyordu. Passport`un arkasındaki mekanizma tamamen
cookie`lere dayalı olduğu için bu kombinasyonun problemleri ortadadır.

Kriptolama (Encryption)
Bir zincir sadece en güçsüz bağlantısı kadar güçlüdür. Tanıdık geliyormu?
Birşeylerin kriptolanmış olması ile sahte bir güvenlik duygusuna kapılanların çokluğu sizi şaşırtabilir. Yukarıda bahsedilen cookie`lerin bazısı kriptolanmış değerlere sahiptir. Bu yazıda bu değerlerin dekriptolanması ile ilgili birşeye rastlamayacaksınız. Neden? Çünkü bunu yapmak zor ve kesinlikle gereksiz.
Kriptografi çok zevkli bir konu olsada bu yazının amacı Passport gibi bir mekanizmanın nasıl kolaylıkla kırılabileceği. Web sitemize veya web servisimize girmeye çalışan biri genellikle en kolay yolu seçecektir.

Bir kullanıcı Passport kullanan bir siteye girdiğinde sitenin kendisi dekriptolamayı gerçekleştirir. Gerçek kullanıcının sahip olduğu kriptolanmış cookie`lerin aynılarını sunarak o kullanıcının kimliğine bürünmek mümkündür. Birisinin cookie içerisindeki değerleri dekriptolamasındaki tek amaç Passport kullanılan bir site yaratmak olabilir.

HTTP
Detayları (pek çok web geliştirici tarafından dahi) gözardı edilsede yada bilinmesede Web`de gezinen çoğu insan HTTP hakkında bilgi sahibi olmuştur.
Microsoft Passport`u nasıl altettiğimi anlayabilmek için HTTP 1.1 ve onun cookie`leri nasıl kullandığı hakkında temel bir bilgi sahibi olmak gerekli. HTTP`nin bu yazıda bahsedilmeyecek olan pek çok detayı vardır. Tüm tanımlamalar için RFC 2616`ya
danışabilirsiniz.
Basit HTTP senaryosu bir istek ve cevaptan oluşan tek bir transferdir. Kullanıcı web`de gezinirken, Web browser (istemci) kullanıcının ziyaret ettiği sitelere çeşitli istekleri yapar. Web sunucuları da web sayfalarını işleyen browser`a cevaplar döner.
örnek istek:
GET / HTTP/1.1
Host: www.k2labs.org
User-Agent: Mozilla/5.0
Accept: text/xml, image/png, image/jpeg, image/gif, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate, compress, identify
Connection: keep-alive

Bu örnek istek bir MOzilla browser ile http://www.k2labs.org/ adresine yapılmıştır.
Başlıklar (Host, User-Agent, Accept, Accept-Language, Accept-Encoding, Connection) HTTP spesifikasyonunda izin verilen başlıklardan bazılarıdır. Her başlık sunucunun istemci tarafından yapılan isteğe cevap vermesine yardımcı olacak
bilgiler içerir.
örnek cevap:
HTTP/1.1 200 OK
Date: Wed, 01 Aug 2001 22:00:00 GMT
Server: Protoscope 0.0.1
Connection: close
Set-Cookie: k2labs=chris; domain=.k2labs.org; Path=/;
Content-Length: 38
Content-Type: text/html

Protoscope 0.0.1


Örnek cevap web sunucu ve cevap tipi hakkında bazı bilgiler veriyor. Cevapta içerik ve başlıkların birbirinden 2 yeni satır ile ayrıldığını farketmişsinizdir. Bu HTTP`nin transfer davranışını açıklar. Başlangıç bağlantısı yapılıp istek gönderildiğinde cevap gelene kadar bağlantı (zaman aşımı durumu olmadıkça)
açıktır. Webde oturum yönetimini güvenli hale getirmenin zor olmasının sebeplerinden biri her transferin atomik olmasıdır. Örnek HTTP cevaptaki en önemli başlık Set-Cookie başlığı. Örnekte k2labs isminde ve chris değerine sahip bir cookie
yaratılıyor. Set-Cookie başlığındaki diğer tüm bilgiler browser`ın daha sonraki isteklerinin başlıklarında bu cookie`yi bulundurup bulundurmayacağını belirleyen bilgilerdir. Göreceğimiz gibi diğer hiçbir bilgi web sunucuya dönülmez, sadece isim ve değeri sağlanır. Örnekteki cookie, son kullanım değeri (expiration date)
belirlenmediği için diske yazılmayacak ve hafıza da duracaktır. Sadece k2labs.org alt-alanlarına (subdomain) yapılan isteklerde gönderilecek ve dizinde bir sınırlama yok. Yazılacak her cookie ayri Set-Cookie başlıkları ile geçirilir. Bu aşağıda gösterildiği gibi, birden fazla cookie`nin web sunucuya geri sunulması metodlarında çeşitlilik gösterir.
Bilmeniz gereken son bilgi de browser`ın bir istek yaparken web sunucuya daha önceden belirlenmiş cookie`yi nasıl göndereceğidir. Örnek Cookie başlığı:
Cookie: k2labs=chris
Farkedeceğiniz gibi cookie`nin değerinden başka hiçbir bilgi verilmiyor. Diğer tüm bilgiler daha önce bahsettiğim gibi sadece erişim gereksinimlerini belirlemek için.
Eğer birden fazla cookie sunuluyorsa her biri aynı şekilde (isim=değer) listelenir ve biribirinden noktalı virgül ile ayrılır (isim=değer;isim2=değer2). Bu sebeple sadece tek bir Cookie başlığı gönderilir.

Güvenlik Açığı
Microsoft Internet Explorer 5.5 öncesi sürümler cookie`lerde amaçlanan erişim gereksinimlerini tamamen aşan bir güvenlik açığı içeriyor. Etkilenen browser`ların geniş kullanımı (browserwatch.com`a göre yaklaşık olarak %67.6) sebebiyle bu önemli bir açık teşkil ediyor.
Özel yapılandırılmış bir URL ile, bir web sitesi etkilenen browser`a istemci-tarafında çalışan (client-side) script`ler yollayarak normalde okuyamayacağı cookie içeriklerini kendisine yollanmasını sağlayabilir. Bu güvenlik açığı
http://www.peacefire.org/security/iecookies/ adresinde anlatılmaktadır. Bu tip bir URL`ye örnek:
https://www.k2labs.org/reveal.php?.login.passport.com/ppsecure
/ ve ? işaretlerinin encode edilmiş değerlerini kullanarak www.k2labs.org adresindeki bir sayfanın (etkilenen browser`a) .login.passport.com alanadı içerisindeymiş gibi ve /ppsecure dizini altında çalışıyor gibi gösterdik. URL aslında aşağıdaki gibi:
http://www.k2labs.org/reveal.php?.login.passport.com/ppsecure/
Daha önce listelediğimiz Passport cookie`lerini hatırlayacak olursanız, bu bize .wallet.passport.com alanındaki ikisi (PWSVis ve PWSTok) hariç tüm cookie`lere erişim sağlıyor. Diğer ikisi de yukarıdaki örnekte 'login' yerine 'wallet' yazılarak görüntülenebilir.

Etkilenen browserlar bu URL`yi bozuk olarak algılamıyor. İstek doğru host`a gönderildi (www.k2labs.org). Bu tabi ki bizim erişim yapabilmemiz için gerekli.
Diğer bir nokta, browser Passport cookie`lerini içeren HTTP Cookie başlığını dönmeyecektir. Bu yüzden browser`dan Passport Cookie`lerini çıkartmakta bu başlığı kullanamayız ve alternatif bir metod geliştirmemiz gerekli. İşte burda istemci-tarafında çalışan script`ler devreye giriyor.

Client-Side Scripting
Örneklerimde istemci-tarafı scriptler için javascript kullanacağım. Aşağıdaki örnek script yukarıda bahsedilen reveal.php sayfası içerinde kullanılabilir.
Script .passport.com ve .login.passport.com alanlarındaki tüm cookie`leri ortaya çıkaracak ve bu bilgileri kullanıcının web sunucumuza göndermesi için bir URL bağlantısına ekleyecek. Document.cookie formatı isim=değer&isim2=değer2
şeklindedir ve bu bir URL`de istek değeri olarak aşağıdaki gibi kullanılabilir:



Hepsi bir arada
Şimdi bir Passport kullanıcısının cookie`si içerisindeki tüm verilere sahipiz. Bu veriler ele geçirildiğinde cookie`leri kullanacak diğer kişi için bir cookie`lerin alınacağı siteyi hazırlamalıyız. Bir web istemcisi ile taklit işlemi gerçekleştirilebilir
fakat bu gerekli bir adım değil. Cookie`leri yazmak için aynı güvenlik açığından ve istemci-tarafı script işleminden yararlanacağız. MSPSec cookie`sini javascript
(sunucu-tarafı script dili olarak PHP) kullanarak aşağıdaki örnekteki gibi yazabiliriz:


Yazılım HTTP Set-Cookie başlığında olduğu gibi. Bu örnekteki gibi diğer Passport cookie`lerini de yaratabilirsiniz. 3 alan adının her biri için cookie`ler mevcut olduğunda başkasının kimliğine hiçbir kullanıcı ismi ve şifre girmeden sahip olunabilir. Buna kişisel bilgileri görüntüleme, değiştirme ve depolanmış kredi kartı
bilgileri ile alışveriş yapmak da dahil.

Özet
Bu işlemler kolay gibi görünse de başarılı olması için aşağıdaki şartların gerçekleşmesi gerekiyor:
1) Kullanıcı Passport`tan çıkmış olmalı (logout).
2) Taklit edici tamamen farklı bir IP adresine sahip olmalı.
3) Taklit edici farklı bir browser kullanıyor olmalı.
HTTP kullanarak %100 güvenli bir mekanizma yapmak çok zor çünkü HTTP Microsoft gibi üretici firmaların müşterilerine sağlamaya çalıştığı kolaylığı desteklemiyor. Passport`a login olurken 'Sign me in automatically on this computer'
seçeneğini asla işaretlemeyin. Bu çeşitli sitelerde tekrar şifrenizi girmeden otomatik olarak login olmanızı sağlayacak olan MSPSec cookie`sini yaratır. Bu cookie ele geçirildiğinde kullanıcı hesabınız için büyük tehlike yaratır.
Passport`a sadece gereksinim duyan sitelere girmeden önce login olun ve ziyaretiniz bittiğinde hemen logout yapın. Logout işlemi cookie`lerin çoğunu yok eder.
En önemlisi etkilenen browser sürümlerini kullanmamak. Eğer Microsoft Internet Explorer`ın etkilenen bir sürümünü kullanıyorsanız, ve kullanmaya devam etmek istiyorsanız Microsoft bu açık için bir yama çıkardı. Aşağıdaki adresten bu yamayı çekip kurun:
http://www.microsoft.com/technet/security/bulletin/ms00-033.asp

Son Not
Passport mekanizmasında daha pek çok açık bulunacaktır. Bir başkasının kullanıcı hesabını ele geçirmek için Passport kullanılan bir site gibi görünmek belki en kolay yol. Çünkü Passport`un nasıl uygulandığı hakkında bir bilgi gerektirmiyor.
Umarım bu yazıda bahsedilen saldırı şu anki web teknolojisini ve web geliştiricilerin karşılaştığı problemleri daha iyi anlamanızı sağlamıştır.



içinde yazanlar

böle verde bişeye benzesin emeğine sağlık
 

HTML

Üst