Windows DPAPI ve Active Directory: Kullanıcı Parolasını Ele Geçirme Yöntemi

Tekrardan selamlar, bugün windows dpapi , windows credentials gibi yapılardan bahsedip DPAPI tarafından şifrelenmiş bir windows credential dosyasını çözerek active directory ortamında yetkili bir kullanıcıyı ele geçirme sürecini sizlere aktaracağım, keyifli okumalar dilerim!

Windows DPAPI ve Active Directory: Kullanıcı Parolasını Ele Geçirme Yöntemi

DPAPI(Data Protection API) Nedir?

Temel olarak "DPAPI" işletim sistemi seviyesinde veri koruma hizmeti sunan bir API'dir. Kullanıcı veya sistem düzeyinde hassas verileri şifrelemek ve çözmek için kullanılır. Fakat DPAPI kavramı ilk olarak nasıl ortaya çıkmıştır ona bir göz atalım.

Microsoft® Windows® 2000 ile birlikte, işletim sistemi bir veri koruma uygulama-programlama arayüzü (API) sağlamaya başlamıştır.Veri koruma prensibiyle çalışan DPAP'ı, kullanıcı ve sistem süreçlerine işletim sistemi düzeyinde veri koruma hizmetleri sağlayan bir çift fonksiyon çağrısı olarak nitelendirebiliriz.(CryptProtectData / CryptUnprotectData). Burada İşletim sistemi düzeyinde derken "işletim sisteminin kendisi tarafından sağlanan ve herhangi bir ek kütüphane gerektirmeyen bir hizmeti" kastediyoruz aslında.Veri koruma işletim sisteminin bir parçası olduğundan, her uygulama artık DPAPI'ya gerekli fonksiyon çağrıları dışında herhangi bir özel şifreleme koduna ihtiyaç duymadan verileri güvence altına alabilir.



Password Based Data Protection Service

DPAPI parola tabanlı bir veri koruma hizmetidir. Koruma sağlamak için bir parola gerektirir. Elbette bunun dezavantajı, DPAPI tarafından sağlanan tüm korumanın sağlanan parolaya dayanmasıdır. DPAPI kullanıcılar için koruma sağlamaya odaklandığından ve bu korumayı sağlamak için bir parola gerektirdiğinden, mantıksal olarak koruma için kullanıcının oturum açma parolasını kullanır.Fakat bu durumun dezacantajı ise "aynı kullanıcı oturumu altında çalışan tüm uygulamaların, DPAPI ile şifrelenmiş verilere erişebilme potansiyeline sahip olmasıdır."

Örneğin, bir uygulama şifrelenmiş bir veriyi şifre çözme işlemi için DPAPI'a gönderdiğinde, bu işlem başarılı olur çünkü oturum açma kimlik bilgileri doğru bir şekilde eşleşir.

Bu durum, kötü niyetli veya güvenilmeyen bir uygulamanın, aynı kullanıcı oturumunda çalışan diğer uygulamalar tarafından korunan verilere erişebilmesi riskini taşır.Kısacası bu durum, oturum açma kimlik bilgilerinin bir güvenlik sınırı oluşturduğu anlamına gelir. Kullanıcının güvenlik bilincine sahip olması ve yalnızca güvenilir uygulamaları çalıştırması bu riski azaltabilir. Ayrıca, DPAPI, her uygulamanın ekstra entropi eklemesine izin verir, böylece bir uygulama kendi koruma mekanizmasını biraz daha güçlendirebilir. Bu, farklı uygulamalardan kaynaklanan erişim riskini sınırlamak için ek bir güvenlik katmanı sağlar.

DPAPI'ın Veri Koruma Sürecindeki Anahtar Yönetimi (Masterkey)

DPAPI, veri şifreleme işlemlerinin temelini oluşturmak için MasterKey adı verilen güçlü bir anahtar oluşturur. 

MasterKey, doğrudan kullanıcı tarafından belirlenen parolayla değil, paroladan türetilen bir şifreleme anahtarıyla korunur.

DPAPI, paroladan bir anahtar oluşturmak için Password-Based Key Derivation (PBKDF2) adı verilen standart bir kriptografik işlem kullanır.

Bu işlem, paroladan bir şifreleme anahtarı türetmek için bir "salt" (rastgele veri) ve iterasyon sayısı gibi ek güvenlik önlemleri kullanır.

Türetilen bu anahtar, Triple-DES algoritmasıyla MasterKey'i şifreler ve bu şifrelenmiş MasterKey, kullanıcının profil dizininde saklanır.

Masterkey Nasıl Kullanılır?

MasterKey, doğrudan veri şifreleme veya şifre çözme işlemleri için kullanılmaz. Bunun yerine:

MasterKey, bir uygulamanın korumak istediği veri için geçici bir symmetric session key (simetrik oturum anahtarı) oluşturmak için kullanılır.

Oturum anahtarı oluşturulurken:

  • MasterKey,
  • Rastgele bir veri,
  • Ve uygulamanın sağladığı ekstra bir entropi (isteğe bağlı olarak eklenebilen bir güvenlik bileşeni) bir araya getirilir.

En sonunda oluşturulan bu oturum anahtarı, uygulamanın verisini şifrelemek için kullanılır.

Peki Oturum Anahtarı Saklanıyor mu?

Tabii ki hayır,oturum anahtarı hiçbir zaman saklanmaz. Bunun yerine, DPAPI, oturum anahtarını tekrar oluşturmak için gerekli olan rastgele veriyi şifrelenmiş veriyle birlikte bir opaque data BLOB (şifrelenmiş, formatı belli olmayan veri yapısı) içinde saklar. Bu yapı şifrelenmiş veri ve session key(oturum anahtarı) oluşturmak için kullanılan rastgele veri gibi bilgileri içerir.

Encrypt / Decrypt Süreci 

Uygulamalar ya düz metin verilerini DPAPI'ya iletir ve opak bir korumalı veri BLOB'u geri alır ya da korumalı veri BLOB'unu DPAPI'ya iletir ve düz metin verilerini geri alır. Korumalı veri BLOB'u opak bir yapıdır, çünkü şifrelenmiş verilere ek olarak DPAPI'nın korumayı kaldırmasına olanak tanıyan veriler de içerir.

Opaque Structure (Şeffaf Olmayan Yapı):

  • Bu yapı "opaque" (şeffaf olmayan) olarak tanımlanır, çünkü geliştiriciler bu yapının içeriğini anlamak veya analiz etmek zorunda değildir.
  • DPAPI, veri şifrelerken veya şifre çözerken gerekli tüm bilgileri bu BLOB içinde saklar.
  • Geliştiriciler sadece bu BLOB'u alır, saklar ve gerektiğinde DPAPI'ye geri vererek şifre çözme işlemini yapar.

Bir uygulama, şifrelenmiş veriyi (data BLOB) DPAPI'ye verdiğinde:

  • DPAPI, BLOB içindeki rastgele veriyi ve MasterKey'i kullanarak oturum anahtarını(session key'i) yeniden türetir.
  • Türetilen bu anahtar, verinin şifresini çözmek için kullanılır.
  • Böylece, şifrelenmiş veri tekrar düz metin (plaintext) haline gelir.

Unutmamamız gereken önemli bir nokta ise, DPAPI'nin yalnızca verilere kriptografik koruma uyguladığıdır. Korunan verilerin hiçbirini depolamaz; bu nedenle DPAPI'yı çağıran uygulamalar korunan veriler için kendi depolama alanlarını uygulamalıdır.

Unutmayalım,DPAPI'ın veri saklama sorumluluğu yoktur:

  • DPAPI yalnızca veri şifreler veya şifre çözer; şifrelenmiş veriyi saklamaz.
  • Yani, protected data BLOB’u saklama sorumluluğu tamamen uygulama geliştiricilere aittir.
  • Geliştirici bu BLOB’u kendi tercihine göre bir veritabanında, dosya sisteminde veya başka bir depolama yönteminde saklamalıdır.
  • DPAPI, sadece bu veri yapısını oluşturur ve gerektiğinde kullanır.

Session Key (Symmetric Key)

Masterkey bölümünde de bahsettiğim üzere Session Key, uygulama verilerinin şifrelenmesi ve şifresinin çözülmesi için kullanılan gerçek simetrik anahtardır. DPAPI oturum anahtarını türetmek için basit bir işlem kullanır.

Recovery Key

Kullanıcı bir Parola Sıfırlama Diski (Password Reset Disk) oluşturduğunda üretilir.

Kullanıcının mevcut parolası, 2048-bit RSA anahtar çiftinin açık anahtarı ile şifrelenir.

Mevcut parola daha sonra genel anahtarla şifrelenir ve kullanıcının profilinde saklanırken, özel anahtar aslında herhangi bir çıkarılabilir medya olabilen PRD'de(Password Reset Disk) saklanır ve daha sonra bellekten kaldırılır. Özel anahtar yalnızca PRD'de saklanır ve başka hiçbir yerde saklanmaz, bu nedenle bir kullanıcının PRD'yi güvenli bir yerde tutması önemlidir.

MasterKey’in Süresi ve Şifre Değişiklikleri

MasterKey her üç ayda bir yenilenir ancak eski anahtarlar saklanır. Kullanıcı parolası değiştirildiğinde ise tüm MasterKey'ler yeni parolayla tekrar şifrelenir.

Domain Ortamında Key Backup Ve Geri Yükleme 

Master Key'in Yedeklenme Süreci : 

DPAPI, bir bilgisayar bir Active Directory (AD) domain'ine üye olduğunda yedekleme işlemi için ek bir mekanizma sağlar. Bu mekanizma, kullanıcının Master Key’inin yedeklenmesini ve gerektiğinde kurtarılmasını sağlar.

Master Key'in Şifrelenmesi:

  • Master Key oluşturulduğunda, DPAPI bir RPC (Remote Procedure Call) üzerinden domain controller (DC) ile iletişim kurar.

  • Domain-Wide Public/Private Key Pair:
    • Domain controller, yalnızca DPAPI için kullanılan bir açık/özel anahtar çiftine sahiptir.
    • DPAPI istemcisi, domain controller’dan bu açık anahtarı alır ve Master Key’i bu açık anahtar ile şifreler.
  • Şifrelenmiş Master Key, kullanıcı parolası ile korunan yerel Master Key’in yanına yedek olarak saklanır.

Periyodik Güncelleme:

  • Domain'e bağlı bir cihaz, belirli aralıklarla domain controller ile iletişim kurarak Master Key'in yedeğini günceller.
  • Bu işlem, kullanıcının parolasını sıfırlaması gerektiğinde gizli verilere erişimin sağlanması amacıyla yapılır.

Master Key'in Kurtarılma Süreci : 

  • Kullanıcı Parolasıyla Erişilemeyen Durumlar:

    • Kullanıcının oturum açma parolası sıfırlandığında veya unutulduğunda, DPAPI yerel olarak depolanan Master Key’e erişemez.
    • Bu durumda, DPAPI yedek Master Key’i kullanır.
  • Domain Controller ile İletişim:

    • DPAPI, yedek Master Key’i almak için domain controller’a gizlilik ve kimlik doğrulama koruması olan bir RPC çağrısı gönderir.
    • Domain controller:
      • Kendi özel anahtarıyla yedek Master Key’i çözer.
      • Çözülmüş Master Key’i DPAPI istemcisine geri gönderir.
  • Koruma ve Gizlilik:

    • Bu işlemler sırasında, verilerin gizliliğini ve güvenliğini sağlamak için RPC çağrıları tamamen korumalıdır.

Master Key'in İki Kopyası: 

  • Birinci Kopya: Kullanıcı parolasıyla korunan Master Key.
  • İkinci Kopya: Domain controller’ın açık anahtarıyla şifrelenmiş yedek Master Key.
    • Bu kopya, tüm Windows 2000 ve sonraki sürümlerdeki domain controller'lar tarafından tanınır ve çözülür.
    • Windows 2000 domain controller’lar, bu işlemi gerçekleştirmek için bir simetrik anahtar kullanır.

DPAPI Secrets (DPAPI İle Korunan Veriler)

DPAPI'ın, hem kullanıcı hem de sistem verilerini korumak için kullanıldığından bahsetmiştik. Şimdi DPAPI ile korunan verileri maddeler halinde inceleyelim:

KULLANICI TARAFINDA : 

  • Windows Credentials (kaydedilen RDP şifreleri, kullanıcı parolaları vs...)
  • Internet Explorer ve Chrome giriş bilgileri
  • Uzak Masaüstü Bağlantı Yöneticisi parolaları
  • Dropbox senkronizasyon bilgileri

SİSTEM TARAFINDA : 

  • Scheduled tasks (Zamanlanmış Görevler)

  • Azure sync accounts (Azure senkronizasyon hesapları)

  • Wifi passwords

Buraya kadar uygulamaya geçmeden önce sizlere teorik kısımda DPAPI hakkında teorik bilgiler vermeye çalıştım, öncelikle söylemem gerekirse DPAPI konusu oldukça detaylı bir konu o yüzden bütün teknik detaylara bu yazıda yer veremedim fakat önemli kilit kavramları olabildiğince sizlere aktarmaya çalıştım, şimdi ise DPAPI Abuse senaryolarını değerlendireceğiz, DPAPI kavramından bahsettim fakat bir de bir attacker gözünden DPAPI ile nasıl bir kullanıcı bilgisi ele geçirilir onu göreceğiz bir domain ortamında, yavaştan attack kısmına geçelim.

DPAPI ATTACK SENARYOLARI

Şimdi DPAPI'ın nasıl kötüye kullanılabildiğinden bahsedelim, öncelikle abuse senaryolarını 3 kategoride anlatıp daha sonra örnek bir uygulamaya geçeceğim.

1) Local User

Kurban olarak hedef sisteme erişim durumunda: secrets şifresini çözmek için SharpDPAPI gibi bir araç çalıştırabilir veya DPAPI'yı kurban olarak programlı bir şekilde kullanmak ve verilerin şifresini çözmek için kendi programınızı yazabilirsiniz. 

Kurbanın Master Key'lerine ve parolasına erişim durumunda: Kurbanın Master Key'lerine ve parolasına erişiminiz olması durumunda, anahtarları alabilir ve şifre çözme işlemini çevrimdışı olarak gerçekleştirebilirsiniz.

Kurbanın ana bilgisayarına SYSTEM olarak erişim durumunda: LSASS'ta şifrelenmemiş Master Key'leri arayabilirsiniz.

Kurbanın CREDHIST veya Master Key'lerine erişim durumunda: Kurbanın parolasını brute force ile zorlayabilirsiniz.

2) Domain User

Kurban olarak hedef sisteme erişim durumunda: secrets şifresini çözmek için SharpDPAPI gibi bir araç çalıştırabilir veya DPAPI'yı kurban olarak programlı bir şekilde kullanmak ve verilerin şifresini çözmek için kendi programınızı yazabilirsiniz. 

Kurbanın Master Key'ine ve kurbanın parolasının NTLM hash'ine erişim durumunda: Key'leri alabilir ve çevrimdışı olarak şifre çözme işlemini gerçekleştirebilirsiniz.
Kurbanın ana bilgisayarına SYSTEM olarak erişim durumunda: LSASS'ta şifrelenmemiş Master Key'leri arayabilirsiniz.
Domain'e Domain Admin olarak erişim ve kurbanın Master Key'lerine erişim durumunda: DPAPI backup key'i alabilir ve key'lerin şifresini çözebilirsiniz.

3) Machine Accounts

Kurban olarak hedef sisteme erişim durumunda: secrets şifresini çözmek için SharpDPAPI gibi bir araç çalıştırabilir veya DPAPI'yı kurban olarak programlı bir şekilde kullanmak ve verilerin şifresini çözmek için kendi programınızı yazabilirsiniz. 

Örnek Senaryo

Öncelikle çözmüş olduğum lab'ın önceki aşamaları da var fakat ben sadece konumuzla ilgisi olduğu için dpapi abuse senaryosunun olduğu kısmı göstereceğim.

Bu senaryoda bir DPAPI master key kullanarak şifreli bir kullanıcı hesabının Credential Store dosyasından şifreleri çözme adımlarını inceleyeceğiz. Amacımız, C.Neri kullanıcısını kullanarak C.Neri_adm kullanıcısının parolasını ele geçirmektir.

Önceden elde etmiş olduğum "C.neri" kullanıcısının bilgileriyle evil-winrm ile hedef sisteme bağlanıyorum(Hedef domainde Kerberos Authecantation kullanılıyor):

Şimdi işe elde ettiğimiz kullanıcının SID değerini öğrenmek ile başlayalım. SID dediğimiz kavram(İşlem Tanımlayıcısı), 
kullanıcının Windows ortamında tanımlanması için gereken eşsiz bir kimlik numarasıdır.Kullanıcının SID bilgisini
öğrenmek için "whoami /user" komudunu kullanabiliriz:

SID değerini öğrenmek istememizin sebebi, masterkey dosyasına erişmek istememizdir. Çünkü masterkey dosyaları bir domain cihazda "C:\Users\\AppData\Roaming\Microsoft\Protect\" dizini altında tutulur.

Elimizde artık SID değeri de olduğuna göre masterkey dosyamızı bulalım fakat şunu unutmamakta fayda var, masterkey dosyaları GUID(Global Unique Identifier)'ler ile temsil edilir. GUID, her bir dosya veya anahtar için eşsiz bir kimlik sağlar. Bu, her kullanıcının anahtarlarını benzersiz bir şekilde tanımlamayı ve ayırt etmeyi mümkün kılar. Windows'un şifreleme ve güvenlik sistemlerinde, her şifreleme anahtarı için GUID kullanarak, her anahtarın doğru şekilde ilişkilendirildiği ve yönetildiği garanti edilir.

Görselde de gördüğünüz üzere ihtiyacımız olan masterkey dosyasını bulduk, guid formatında başka bir dosya daha var evet fakat o dosyanın kırılmadığını gördüğünüzde işimize yaramadığından emin olabilirsiniz, zaman kaybetmemek adına zaten önceden bulmuş olduğum ihtiyacımız olan masterkey dosyasını belirtiyorum.

Masterkey dosyasını bulduğumuza göre evil-winrm komudu olan "download" ile masterkey dosyasını kendi makineme aktarıyorum.

Şimdi kendi makinemizde bu masterkey dosyasını decrypt edelim, ben bunu yaparken impacket-dpapi aracını kullanacağım fakat teorik kısımda da bahsettiğim gibi siz "SharpDPAPI" gibi araçları tercih edebilirsiniz.

Yukarıda gördüğünüz üzere masterkey dosyasının decrypt key'ine başarıyla ulaşmış olduk. Buradaki parametreleri açıklayalım:

masterkey parametresi ile decrypt için masterkey dosyası kullanacağımızı belirttik.

-file parametresi ile masterkey dosyamızı verdik.

-sid parametresi ile önceden elde ettiğim kullanıcının "SID" değerini verdik.

-password parametresi ile de elde ettiğim kullanıcının parolasını verdik.

Decrypt key'i elde ettik. Daha sonra hedef makinede "C:\Users\C.Neri\AppData\Roaming\Microsoft\Credentials" dizininde bulunan "Windows Credential Store" dosyasını keşfediyoruz. Credential Store dosyaları, "C:\Users\\AppData\Roaming\Microsoft\Credentials" dizininde saklanır ve genellikle  kullanıcı adı, parola, hedef uygulama veya sunucuya ait kritik bilgileri içerir. Bu dosyalar ise DPAPI (Data Protection API) kullanılarak şifrelenir. İşte bu bilgiyi göz önünde bulundurduğumuz zaman bu dosyayı çözebileceğimizi farkedebiliriz.

Credential File'ı kendi makineme aktardıktan sonra yine impacket-dpapi aracını kullanarak daha önce elde ettiğimiz decrypt key ile birlikte credential file'ı kırıyoruz:

Gördüğünüz üzere gerekli enumeration'ları yaptıktan sonra sırayla ilerledik, önce dpapi decrypt key'ini ele geçirdik daha sonra da credential store dosyasını ele geçirdik ve bu dosyayı başarılı bir şekilde çözerek bizden daha yetkili bir hesabın parolasını ele geçirmiş olduk.

Önce Windows'un DPAPI teknolojisinden bahsedip ilgili kavramları önemli yerlerle birlikte açıklamaya çalıştım ve daha sonrasında konunun daha da pekişmesi için sizlere örnek bir lab çözümü yapmak istedim. Umarım faydalı olmuştur. Sonraki yazılarımda görüşmek dileğiyle. Mutlu yıllar dilerim...

References : app.hackthebox.com/machines/vintage & https://tierzerosecurity.co.nz/

Ben Talha 19 yaşındayım. Adli Bilişim Mühendisliği okuyan ve Siber Güvenlik Mühendisi/Uzmanı olmak isteyen bir öğrenciyim. Red Team,Pentest, Offensive Security alanında çalışıyorum.Yeniliklere ve kendimi geliştirmeye açık birisiyim. Burada öğrendiklerimi ve bildiklerimi yazıya dökerek hem sizleri bilgilendireceğim hem de bilgilerimi tazeleyip bilgilerime bilgi katacağım.