Bir önceki yazıda Windows işletim sisteminde oturum açma sırasında görevli olan prosesler ve bu proseslerin işlevlerinden konumuz dahilinde bahsedilmişti. Ayrıca oturum açma işlemi sırasında kullanıcı bilgilerinin alınacağı arayüzün kullanıcının karşısına çıkarılması, kullanıcıdan gerekli bilgilerin alınması ve bu bilgilerin LSASS prosesine iletilmesine kadar olan adımlar incelenmişti.

Bu yazıda ise asıl amaç olan parolaların açık bir şekilde elde edilmesinin nasıl mümkün olduğu konusuna değinilecektir. Bu yazı iki bölümden oluşacaktır. Öncelikle LSASS prosesinin parola bilgisini nasıl ele aldığı konusu incelenecek, daha sonra da işletim sisteminin oturum açma mimarisini kötüye kullanan iki aracın (WCE ve Mimikatz) nasıl çalıştığı konusuna değinilecektir.


LSASS ve Windows İşletim Sisteminde Oturum Açma İşlemi


Windows işletim sistemi üzerindeki kullanıcı kimlik bilgileri doğrulanma işlemleri için SSPI (Security Support Provider Interface) adı verilen özel bir mimari tasarlanmıştır. Kimlik doğrulaması ile ilgili tüm çağrılar (call) bu mimari temelinde ele alınır. Böylece hem Windows kimlik doğrulama mekanizmasını koruma altına almakta, hem de kendi kimlik doğrulama mekanizmalarını kullanmak isteyen geliştiricilerin Windows’un kullandığı kimlik doğrulama mekanizmalarının derinliklerine dalmasına gerek kalmamaktadır. Bu mimariyi tasarlayanlar, kimlik doğrulama işlemini istemci üzerinde (local) veya uzak bir sunucu ile istemci arasında (remote) güvenilir olarak gerçekleştirilmesini hedeflemişlerdir. Windows 7 ve Windows Server 2008 R2 mimarisindeki varsayılan kimlik doğrulama sağlayıcıları (Security Support Provider - SSP), sisteme yüklenen DLL’leri kullanarak kimlik doğrulama işlemlerini gerçekleştirirler.

Kimlik bilgisi sağlayıcılarından (CP) geçen kimlik bilgileri Winlogon prosesine eriştiği konusuna değinilmişti. Winlogon prosesi LSASS prosesinin LsaLookupAuthenticationPackage fonksiyonunu çağırarak, bilgisayarın desteklediği bütün kimlik doğrulama paketlerinin (authentication packages) listesini elde eder. Winlogon prosesi, bu sefer LSASS prosesinin LsaLogonUser fonksiyonunu çağırarak, kimlik bilgisi sağlayıcısı (CP) için gerekli olan pakete kimlik bilgileri gönderir. Örneğin, MSV1_0.dll paketine kullanıcı adı ve şifre bilgisini gönderir.

Yerel bir sistem çağrısı ile gerçekleştirilen oturum açma işlemi temel olarak aşağıdaki gibi gerçekleşmektedir.


Kullanıcıdan alınan kimlik bilgileri yukarıda belirtildiği şekliyle ilgili SSP (Security Support Provider) tarafından sağlanan DLL’e aktarılır. Windows 7 ve Windows Server 2008 R2 sistemlerde varsayılan olarak bulunan güvenlik destek sağlayıcıları (SSP) ve kullandıkları DLL’ler şu şekildedir:
  • Credential Security Support Provider - credssp.dll
  • Digest Security Support Provider - digest.dll
  • Kerberos Security Support Provider - kerberos.dll
  • Negotiate Security Support Provider - lsasrv.dll
  • Negotiate Extensions Security Support Provider - negoexts.dll
  • NTLM Security Support Provider - msv1_0.dll
  • PKU2U Security Support Provider - pku2u.dll
  • Schannel Security Support Provider - schannel.dll
Bunların yannda Wdigest.dll, Kdcsvc.dll, Ntdsa.dll, Ntdsapi.dll vs gibi LSA bileşenleri de kimlik doğrulama işlemlerinde görev alır.

İşletim sisteminde kimlik doğrulama paketleri mevcut olduğu halde LSA (Local Security Authority) tarafından belleğe yükleme işleminin gerçekleşmezse bu DLL’ler kullanılamaz. Bu sebeple LSA tarafından bu paketler belleğe yüklenmelidir. LSA, hangi DLL dosyalarını yükleyeceğini kayıt defterindeki “HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages” kaydından alır. Bu kayıtta bulunmayan paketler belleğe yüklenmeyecek ve bu sebeple tercih edilen modda kimlik doğrulamasu gerçekleşmeyecektir.

SSP ve kimlik doğrulama paketleri ile ilgili ayrıntılı bilgi için bakınız:
http://technet.microsoft.com/en-us/library/dn169026(v=ws.10).aspx
http://technet.microsoft.com/en-us/library/dn169016(v=ws.10).aspx
http://msdn.microsoft.com/en-us/library/aa374733(v=vs.85).aspx
Sonuç olarak belleğe yüklenen DLL, kendisine açık olarak gelen kimlik bilgilerini alır ve işler. Yerel bilgisayarda yerel bir hesap için kimlik doğrulama işleminde MSV1_0.dll, etki alanındaki bir bilgisayarda etki alanı hesabı için kimlik doğrulama işleminde ise kerberos.dll kütüphaneleri çağırılabildiği gibi, bir oturum kullanılarak başka sistemlerde de oturum açılması (Single Sign-on) belleğe yüklenen bu kütüphaneler kullanılarak gerçekleştirilir.

Kimlik doğrulama paketleri (authentication packages), bazı fonksiyonları kullanarak, parolayı (veya parolanın özetini) geri döndürülebilir olacak şekilde şifreli olarak saklamaktadır. Örneğin, standart Win32 fonksiyonlarından olan LsaProtectMemory fonksiyonunu kullanarak belirli bir adresten (Buffer) başlayarak belirli uzunluktaki (Buffer Size) bir bellek adres uzayını (memory address space)  şifrelerken, LsaUnProtectMemory fonksiyonu ise aldığı parametrelere göre şifre çözme işlemini gerçekleştirir. Şifreleme işleminde kullanılan anahtarlar, bilgisayar ilk olarak başlatıldığında LSASS prosesi içerisindeki fonksiyonlar tarafından üretilir. LsalnitializeProtectedMemory fonksiyonu bu anahtarı üreterek LsaEncryptMemory  fonksiyonunun kullanımına sunar. Şifrelenen veri, DLL’e göre, parola olabildiği gibi parolanın özeti de olabilir. Örneğin, MSV1_0.dll parolanın LM ve NTLM özet halinin şifresini saklamaktayken, wdigest.dll veya kerberos.dll ise parolanın kendisinin şifreli halini saklamaktadır. Böylece gerekli durumlarda (SSO gerektiren işlemler gibi) bu bilgiler, LSASS tarafından üretilen anahtar yardımı ile açık olarak elde edilebilmekte (parola veya parola özeti olarak) ve kimlik doğrulama işlemlerinde kullanılmaktadır.

Kimlik bilgilerinin bu şekilde (açık veya MSV1_0.dll için özet haline geri döndürülebilir olarak RAM üzerinde şifreli şekilde) saklandığı durumlardan bazıları aşağıdaki gibidir:
  • Bilgisayar başında konsoldayken oturum açıldığında,
  • RDP ile uzak masaüstü bağlantısı yapıldığında,
  • RunAs komutu kullanarak bir işlem gerçekleştirildiğinde,
  • Belirli bir kullanıcı hakkı ile servis çalıştırıldığında, 
  • Kimlik doğrulaması için tasarlanan mimarideki bazı API’leri kullanan uygulamalarla işlemler gerçekleştirildiğinde, vs.
Bu noktadan sonraki konular yazının kapsamı dışında olduğu için değinilmeyecektir. Aşağıdaki resim kimlik doğrulamanın sonraki aşamalar için fikir vermektedir.



Oturum açma işlemini bu yazı için tek bir cümleyle şu şekilde özetleyebiliriz: Oturum açmak için yazdığımız kullancı adı ve parola gibi bilgiler, belleğe (RAM) yüklenen ve kimlik doğrulama işleminde görev alan bazı kütüphane dosyalarında şifreli olarak saklanmakta ve bu bilgiler kimlik doğrulama işlemleri sırasında işlenmektedir. Aşağıdaki resim oturum açma işlemini özetlemektedir:



WCE ve Mimikatz Araçlarının Kullanımı


WCE ve Mimikatz araçları temel olarak RAM’de bulunan kimlik doğrulama paketlerindeki (authentication packages) kimlik bilgilerini (şifreli parola ve parola özetlerini, kullanıcı adı gibi) okur, parolayı (ve MSV1_0.dll için parola özetini) şifreleyen şifreleme anahtarını elde eder ve şifreli parola (ve parola özetini) elde eder.
Bu araçları aşağıdaki bağlantıları kullanarak indirebilirsiniz:
  • WCE:
http://www.ampliasecurity.com/research/wcefaq.html#curversion
  • Mimikatz:
http://blog.gentilkiwi.com/mimikatz

Bu araçları kullanarak oturumlardaki parolaları elde etmek şu şekilde gerçekleşir:
  • WCE:
wce.exe -w
  • Mimikatz:
mimikatz.exe
privilege::debug
sekurlsa::logonPasswords full

Bu araçların kullanılması ile ilgili bir senorya şu şekildedir: SIRKET etki alanındaki bir bilgisayarda, “Kurban” adlı bir etki alanı kullanıcısı ve “Yerel Yonetici” adlı yerel kullanıcı oturum açık durumdadır. Bu senaryoda, RAM üzerinde bu iki kullanıcının oturum açma işlemi sırasında kullanılan kimlik doğrulama paketlerinden (authentication packages) parola bilgilerinin şifresi çözülerek alınabilir. Bu işlemlere ait ekran görüntüleri aşağıdaki gibidir.
  • WCE aracı için:

Not: Bir bilgisayarın da parolası vardır. Ancak bu yazının kapsamı dışında olduğu için bu konuya girilmeyecektir.
  • Mimikatz aracı için:

Yukarıdaki ekran görüntüsünde de görüldüğü gibi iki işlem gerçekleştirilir. Öncelikle yetkilendirme yapılır sonra da DLL enjeksiyonu ile istenen bilgiler elde edilir. Normalde bir kullanıcı sadece yetkisi olduğu bir proses üzerinde geniş yetkiye sahip olur, başka bir hesap (kullanıcı hasabı, servis hesabı ve SİSTEM hesabı dahil) tarafından oluşturulan bir proses üzerinde çok kısıtlı hakları bulunmaktadır. Eğer, SYSTEM kullanıcısının bir prosesine (LSASS.exe gibi) DLL enjeksiyonu gibi kritik bir işlem gerçekleştirilecekse, bu proses üzerinde SeDebugPrivilege yetkisine sahip olunmalıdır. Bu yetkiye sahip olunduktan sonra, sekurlsa.dll kütüphanesi LSASS.exe prosesine enjekte edilerek, yasal fonksiyonları (LsaUnProtectMemory, LsaEncryptMemory vs) kullanır ve kimlik doğrulama paketlerindeki parola bilgileri elde edilir.

Windows üzerinde çalıştırılan Mimikatz uygulamasının sonuçlarının kullanıcı adı ve parola formatında satır satır almak için aşağıdaki betik kullanılabilir:
https://github.com/agguvenligi/araclar/blob/master/parse_mimikatz_result.sh
Not: Windows 7 sistemlerde varsayılan olarak disk üzerinde (SAM dosyasında) LM özetler tutulmamaktadır. Ancak RAM üzerinde bu bilgi bulunmaktadır. Yukarıdaki ekran görüntüsünde “Yerel Yonetici” adlı kullanıcının parolasının LM ve NTLM özetlerinin elde edildiği görülmektedir. WCE aracı kullanılarak da bu bilgi elde edilebilir:


Bir önceki başlıkta LSASS prosesinin adres uzayında kullanıcı parolasını (ve parolasının özetini) şifrelemek için kullanılan anahtar da bulunmakta olduğu belirtilmişti. Bu sebeple LSASS prosesinin dump’ı alınarak aynı mimaride farklı bir bilgisayara aktarılırsa, RAM üzerindeki bilgiler aktarılan makineden de alınabilir. Bu konu ile ilgili örnek bir yazı için bakınız:
http://www.agguvenligi.net/2013/10/procudmp-ve-mimikatz-ile-lsass-icerisinden-oturum-acan-kullanicilarin-parolalarini-elde-etme.html
Not: Bazı sistemler kimlik doğrulama işlemi gerçekleştirirken kimlik doğrulama paketlerinde kimlik bilgilerini saklarlar. Bu sistemlerden birisi de Exchange sunucularıdır. Bu sebeple, sızma testlerinde mimikatz uygulaması Exchange sunucularda çalıştırılırsa, tüm kullanıcıların parola bilgileri açık halde elde edilebilir.

Bu araçların RAM üzerindeki parolaların açık halde elde edebilmeleri haricinde daha bir çok kabiliyeti bulunmaktadır. Ancak diğer kabiliyetler bu yazının kapsamı dışında olduğu için değinilmemektedir. Bu araçların kullanımı için araçların indirildiği sayfalardaki bağlantılar ve aşağıdaki bağlantı sayfası kullanılabilir:
http://danielaelmi.altervista.org/password-cracking-hashes-dumping-brute-forcing-auditing-and-privileges-escalation/

Kaynaklar:

http://www.bilgiguvenligi.gov.tr/microsoft-guvenligi/windows-isletim-sisteminde-oturum-acma-islemi-winlogon.html
http://msdn.microsoft.com/tr-tr/magazine/cc163489(en-us).aspx
http://technet.microsoft.com/en-us/library/ff404303(v=ws.10).aspx
http://blog.bga.com.tr/2013/01/mimikatz-ile-windows-sistemlerde.html
http://blog.opensecurityresearch.com/2012/06/using-mimikatz-to-dump-passwords.html
http://technet.microsoft.com/en-us/library/cc778868(WS.10).aspx
http://www.ampliasecurity.com/research/wce12_uba_ampliasecurity_eng.pdf
http://www.ampliasecurity.com/research/WCE_Internals_RootedCon2011_ampliasecurity.pdf
http://codeidol.com/community/windows/logon/25019/
http://fr.slideshare.net/gentilkiwi/mimikatz-asfws
http://danielaelmi.altervista.org/password-cracking-hashes-dumping-brute-forcing-auditing-and-privileges-escalation/
http://www.blackhat.com/presentations/bh-dc-09/Muckin/BlackHat-DC-09-Muckin-vista-security-internals.pdf

0 comments:

Post a Comment

 
Top