Site icon Baki ÇUBUK

Group Policy Serisi Bölüm 6: Saldırgan Gözünden Group Policy

Merhaba

Beşinci bölümün sonunda duvar kağıdı paylaşımındaki bir izin hatasının GPO’yu (Group Policy Object) nasıl uygulanmış ama çalışmıyor durumuna getirdiğini gördük. Bu bölümde aynı düzeneğe tersten bakıyoruz: izin yanlış yöne kaydığında, yani ihtiyaç duyulandan fazla yetki verildiğinde ne olur? Group Policy, bir etki alanındaki yüzlerce makineye aynı anda, çoğu zaman SYSTEM yetkisiyle ayar ve kod ulaştırabilen bir mekanizmadır. Bu yüzden saldırgan için de çok değerli bir araçtır.

Bu bölüm bir saldırı rehberi değildir. Amacımız, savunmacı olarak Group Policy çevresindeki zayıf noktaların nerede olduğunu, standart bir kullanıcının bunları nasıl keşfedebildiğini, hangi kayıtların tutulduğunu ve bunların nasıl kapatıldığını görmektir. Uygulama kısmında laboratuvarda yalnızca zararsız örnekler kullanıyoruz: bir duvar kağıdının değiştirilmesi, izin listelerinin okunması ve olay kayıtlarının incelenmesi.

1. Group Policy Neden Saldırganın Hedefidir?

Bir saldırgan etki alanında yetki yükseltirken ya da kalıcılık sağlarken şu özelliklerden yararlanır:

Savunma açısından ana fikir şudur: Bir GPO’yu değiştirebilen kişi, o GPO’nun kapsadığı tüm hesapların ve makinelerin yetkisini devralır. Bu yüzden GPO yazma yetkisi, kapsadığı en yüksek yetkili hesap kadar korunmalıdır.

2. Saldırı Yüzeyi Haritası

Group Policy çevresindeki başlıca zayıf noktalar aşağıdaki tabloda toplanmıştır. Bu bölümde ilk dört satırı laboratuvarda inceliyoruz.

Zayıf Nokta Nasıl Oluşur Etkisi Bu Bölümde
Herkese açık okuma ile keşif SYSVOL (System Volume) paylaşımı ve GPO (Group Policy Object) nesneleri kimliği doğrulanmış her kullanıcıya okunur Saldırgan hangi ayarların, betiklerin ve paylaşımların kullanıldığını öğrenir Adım 1
GPP (Group Policy Preferences) içindeki cpassword Eski sürümlerde Preferences ile yerel yönetici parolası, servis hesabı parolası SYSVOL’daki XML (Extensible Markup Language) dosyasına şifrelenip konurdu Şifreleme anahtarı herkese açık olduğu için parola çözülebilir Adım 2
GPO’nun işaret ettiği kaynağa yazma izni Duvar kağıdı, logon betiği ya da yazılım dağıtım paylaşımına gereğinden geniş yazma izni verilir O kaynağı kullanan tüm hesaplara içerik ya da kod dağıtılır Adım 3
GPO üzerinde fazla yetki Bir hesap ya da grup GPO’da Edit settings ya da daha yüksek izne sahiptir GPO’nun kapsadığı tüm hesaplar ve makineler üzerinde kod çalıştırılabilir Adım 4
OU (Organizational Unit) üzerinde Link GPOs yetkisi Bir hesaba OU’da GPO link etme yetkisi devredilmiştir Saldırgan kendi kontrolündeki bir GPO’yu o OU’ya bağlayabilir Bölüm 6 sonu, güvenlik notları
Group Policy Creator Owners ve geniş delegasyon Bu gruba gereğinden fazla hesap eklenir Hesap yeni GPO oluşturabilir ve oluşturduğu GPO’nun sahibi olur Bölüm 6 sonu, güvenlik notları
Domain controller’a ya da etki alanı köküne bağlı GPO Default Domain Policy ya da Default Domain Controllers Policy üzerinde değişiklik yapılır Etkisi tüm etki alanına ya da tüm domain controller’lara yayılır Bölüm 6 sonu, güvenlik notları

3. Laboratuvar Ön Koşulu: Duvar Kağıdı Düzeneğini Yeniden Kurmak

Bölüm 5‘in sonunda isteğe bağlı temizlik komutlarını çalıştırdıysanız U - Satis - Duvar Kagidi GPO’su ve Wallpaper paylaşımı silinmiştir. Bölüm 5‘teki Adım 1, 2 ve 4’ü yeniden uygulayabilirsiniz. Aşağıdaki komutlar aynı düzeneği tek seferde, bu kez doğru izinlerle kurar. Temizliği yapmadıysanız bu adımı atlayıp Get-GPInheritance ile Satis OU’sunda (Organizational Unit) U - Satis - Duvar Kagidi bağlantısının durduğunu doğrulayın.

Domain controller’da Run as administrator (Yönetici olarak çalıştır) açılmış bir PowerShell penceresinde:

New-Item -Path "C:\Shares\Wallpaper" -ItemType Directory -Force | Out-Null

Add-Type -AssemblyName System.Drawing
$bmp = New-Object System.Drawing.Bitmap 1920, 1080
$g = [System.Drawing.Graphics]::FromImage($bmp)
$g.Clear([System.Drawing.Color]::FromArgb(17, 24, 39))
$font = New-Object System.Drawing.Font("Segoe UI", 72, [System.Drawing.FontStyle]::Bold)
$sf = New-Object System.Drawing.StringFormat
$sf.Alignment = [System.Drawing.StringAlignment]::Center
$sf.LineAlignment = [System.Drawing.StringAlignment]::Center
$alan = New-Object System.Drawing.RectangleF 0, 0, 1920, 1080
$g.DrawString("bakicubuk.tech", $font, [System.Drawing.Brushes]::White, $alan, $sf)
$bmp.Save("C:\Shares\Wallpaper\wallpaper.png", [System.Drawing.Imaging.ImageFormat]::Png)
$g.Dispose(); $bmp.Dispose()

New-SmbShare -Name "Wallpaper" -Path "C:\Shares\Wallpaper" -FullAccess "Administrators" -ReadAccess "GG_Satis"

New-GPO -Name "U - Satis - Duvar Kagidi" | Out-Null
Set-GPRegistryValue -Name "U - Satis - Duvar Kagidi" -Key "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System" -ValueName "Wallpaper" -Type String -Value "\\W25DC\Wallpaper\wallpaper.png" | Out-Null
Set-GPRegistryValue -Name "U - Satis - Duvar Kagidi" -Key "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System" -ValueName "WallpaperStyle" -Type String -Value "4" | Out-Null
$gpo = Get-GPO -Name "U - Satis - Duvar Kagidi"
$gpo.GpoStatus = "ComputerSettingsDisabled"
New-GPLink -Name "U - Satis - Duvar Kagidi" -Target "OU=Satis,OU=Kullanicilar,OU=LAB,DC=bakicubuk,DC=tech" | Out-Null

Get-SmbShareAccess -Name "Wallpaper"
Get-GPInheritance -Target "OU=Satis,OU=Kullanicilar,OU=LAB,DC=bakicubuk,DC=tech"

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
C:\Shares\Wallpaper Duvar kağıdı dosyasının durduğu klasör Sunucunuzdaki paylaşım klasörü
-FullAccess "Administrators" Paylaşımda tam yetki alan grup Paylaşımı yöneten yönetici grubunuz
-ReadAccess "GG_Satis" Paylaşımda yalnızca okuma yetkisi alan grup Duvar kağıdını görecek kullanıcı grubunuz
\\W25DC\Wallpaper\wallpaper.png GPO’nun (Group Policy Object) işaret ettiği UNC (Universal Naming Convention) yolu Kendi sunucu adınız, paylaşım adınız ve dosya adınız
WallpaperStyle değeri 4 Duvar kağıdı yerleşimi. 4 Fill, 2 Stretch, 0 Center İstediğiniz yerleşimin kodu
U - Satis - Duvar Kagidi GPO’nun adı Kendi adlandırma kuralınız
OU=Satis,OU=Kullanicilar,OU=LAB,DC=bakicubuk,DC=tech GPO’nun bağlanacağı OU’nun (Organizational Unit) DN (Distinguished Name) değeri Kendi kullanıcı OU’nuzun DN değeri

Bu bloktaki GpoStatus satırı hata verirse, GPO’yu GPMC’den (Group Policy Management Console) açıp Details sekmesinde GPO Status değerini Computer configuration settings disabled yapabilirsiniz. Bu, GPO’nun yalnızca kullanıcı ayarlarını işlemesi içindir ve Bölüm 5‘teki durumla aynıdır.

New-SmbShare komutu paylaşım oluşunca Name, ScopeName, Path ve Description sütunlu kısa bir tablo yazdırır. Get-SmbShareAccess çıktısında BUILTIN\Administrators için Full, BAKICUBUK\GG_Satis için Read görünmelidir.

İstemcide nihat.cubuk ile oturum açıp duvar kağıdının geldiğini doğruluyoruz. Bölüm 5‘te gördüğümüz masaüstü görüntüsü burada da aynıdır. Duvar kağıdı gelmiyorsa Bölüm 5‘teki sorun giderme sırasını izleyin.

4. Uygulama: Savunmacının Bildiği, Saldırganın da Öğrendiği

Adım 1: Standart bir kullanıcı ile keşif

Önce saldırganın ilk elde ettiği şeyi canlandırıyoruz: yetkisiz, standart bir etki alanı kullanıcısı. İstemcide nihat.cubuk ile oturum açıyoruz. Hiçbir yönetim aracı kurmadan, Windows’un kendi araçlarıyla neleri görebildiğine bakıyoruz.

  1. Uygulanan GPO’lar: Komut isteminde gpresult /r /scope user çalıştırıyoruz. Kullanıcının hangi GPO’ların kendisine uygulandığı, hangilerinin filtrelendiği ve hangi güvenlik gruplarının üyesi olduğu görünür.
  2. SYSVOL (System Volume) içindeki politika klasörleri: File Explorer’da \\bakicubuk.tech\SYSVOL\bakicubuk.tech\Policies yoluna gidiyoruz. Her GPO bir GUID (Globally Unique Identifier) adlı klasör olarak listelenir. PolicyDefinitions klasörü bir GPO değildir, Bölüm 2’de gördüğümüz merkezi şablon deposudur (Administrative Templates şablon dosyaları burada durur). Bir GPO klasörüne girip User ya da Machine altındaki dosyalara bakabiliyoruz.
  3. GPO nesneleri: Active Directory içinde GPO’lar groupPolicyContainer türünde nesnelerdir. PowerShell ile standart kullanıcı bile bu nesneleri sorgulayabilir.

Üçüncü madde için istemcide, kullanıcı olarak PowerShell açıp şu komutu çalıştırıyoruz:

$arama = [adsisearcher]"(objectClass=groupPolicyContainer)"
$arama.PropertiesToLoad.AddRange(@("displayName","name","versionNumber","gPCFileSysPath"))
$arama.FindAll() | ForEach-Object {
    [pscustomobject]@{
        Ad      = $_.Properties["displayname"][0]
        Guid    = $_.Properties["name"][0]
        Surum   = $_.Properties["versionnumber"][0]
        Yol     = $_.Properties["gpcfilesyspath"][0]
    }
} | Format-Table -AutoSize -Wrap

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
groupPolicyContainer AD’de (Active Directory) her GPO’nun (Group Policy Object) nesne türü Değiştirmeyin
displayName, name GPO’nun (Group Policy Object) görünen adı ve GUID’i (Globally Unique Identifier) Değiştirmeyin
gPCFileSysPath GPO dosyalarının SYSVOL’daki (System Volume) yolu Değiştirmeyin
versionNumber GPO’nun kullanıcı ve bilgisayar sürümünü tek sayıda tutar, Bölüm 5’teki Revision değerinin kaynağıdır Değiştirmeyin
-AutoSize -Wrap Sütunları içeriğe göre daraltır ve uzun yolları kesmeden alt satıra sarar Dar bir pencerede sütun yine kayboluyorsa Format-List kullanın

Çıktıda laboratuvardaki tüm GPO’ların adları, GUID’leri, sürüm sayıları ve SYSVOL yolları listelenir. Listede Default Domain Policy, Default Domain Controllers Policy, üç Satis GPO’su ve Seamless SSO Settings bulunur. Sonuncusunu Entra Connect serisinde Seamless SSO’yu (Single Sign-On) yapılandırırken Microsoft Entra Connect oluşturmuştur, sizin ortamınızda yoksa şaşırmayın. Bu komut yönetici yetkisi gerektirmez.

Pencere dar kalırsa PowerShell sığmayan sütunları gizler. Bu yüzden Surum sütununu uzun olan Yol sütunundan önce aldık.

Surum sütununu okumak: Bu sayı düz bir sayaç değildir. Active Directory, GPO’nun kullanıcı sürümünü ve bilgisayar sürümünü tek bir sayıda tutar. Sayının üst 16 biti kullanıcı sürümü, alt 16 biti bilgisayar sürümüdür. Kullanıcı sürümünü bulmak için sayıyı 65536’ya bölüp tam kısmını alırız. Bilgisayar sürümü ise sayıdan kullanıcı sürümü × 65536 çıkarılarak bulunur. Örneğin U - Satis - Duvar Kagidi için 131072 = 2 × 65536 olduğundan kullanıcı sürümü 2, bilgisayar sürümü 0’dır. GPO’yu bu bölümde yeniden kurarken iki kayıt değeri yazdık (Wallpaper ve WallpaperStyle), sürüm de 2 oldu. Satis GPO’larının bilgisayar sürümü 0’dır, çünkü yalnızca kullanıcı ayarları içerirler. Seamless SSO Settings için 196614 değeri ise kullanıcı sürümü 3, bilgisayar sürümü 6 demektir.

GPMC’de ve Get-GPO çıktısında gördüğümüz AD Version ve Bölüm 5‘teki Revision değerleri bu sayıdan türetilir. Bir GPO’da ayar değiştiğinde bu sayı artar. Aşağıda Adım 4’te göreceğimiz 5136 olayında değişen özelliğin neredeyse her zaman versionNumber olmasının nedeni budur.

Not: Bu keşif bir güvenlik açığı değil, Group Policy’nin çalışma biçimidir. İstemciler kendi GPO’larını okuyabilmek için bu bilgilere erişmek zorundadır. Savunma, bilginin saklanması değil, GPO içine parola, anahtar ve kimlik bilgisi koymamak ve GPO’ların yazma izinlerini sıkı tutmaktır. Saldırgan ne kadar çok şey görürse görsün, yazamıyorsa etkisi sınırlı kalır.

Adım 2: SYSVOL’da unutulmuş parolaları aramak (cpassword)

Windows Server 2008 ile gelen GPP (Group Policy Preferences), yerel yönetici hesabı oluşturma, zamanlanmış görev ve servis tanımlama gibi işlerde parola girmeye izin veriyordu. Bu parola SYSVOL’daki XML (Extensible Markup Language) dosyasına cpassword alanı olarak, AES (Advanced Encryption Standard) ile şifrelenmiş biçimde yazılırdı. Sorun, şifreleme anahtarının Microsoft tarafından herkese açık yayımlanmış olmasıdır. Yani SYSVOL’u okuyabilen her kullanıcı bu parolayı çözebilirdi. Microsoft bu özelliği MS14-025 güncelleştirmesiyle (2014) kaldırdı, ancak güncelleştirme öncesinde oluşturulmuş dosyalar kendiliğinden silinmez. Eski bir ortamda bu dosyalar yıllarca kalabilir.

Savunmacı olarak yapacağımız şey, ortamımızda bu dosyalardan kalıp kalmadığını aramaktır. Domain controller’da ya da herhangi bir etki alanı bilgisayarında:

findstr /S /I cpassword "\\bakicubuk.tech\SYSVOL\bakicubuk.tech\Policies\*.xml"

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
findstr /S /I Alt klasörlerde (/S) büyük küçük harf ayırmadan (/I) metin arar Değiştirmeyin
cpassword Preferences’ın parola alanının adı Değiştirmeyin
\\bakicubuk.tech\SYSVOL\bakicubuk.tech\Policies\*.xml Aranacak SYSVOL (System Volume) yolu ve dosya türü Kendi etki alanı adınız

Temiz bir ortamda komut hiçbir satır döndürmez. Bir satır dönerse, o XML dosyasındaki parolayı hemen değiştirin, çünkü parola zaten ele geçmiş sayılmalıdır. Ardından o Preferences öğesini silip parolayı GPO dışında yönetin (örneğin Windows LAPS (Local Administrator Password Solution) ile yerel yönetici parolaları için).

Uyarı: Bu laboratuvarda cpassword içeren bir dosya oluşturmuyoruz ve bulunsa bile parolayı çözmeyi göstermiyoruz. Konu, parolanın nasıl çözüldüğü değil, ortamınızda bu dosyalardan kalıp kalmadığını bilmektir.

Adım 3: Yazılabilir paylaşım, yani Bölüm 5’teki hatanın tersi

Bölüm 5‘te GG_Satis grubuna yeterli izin vermeyince duvar kağıdı görünmemişti. Şimdi tersini yapıyoruz: GG_Satis grubuna gereğinden fazla izin veriyoruz. Gerçek ortamlarda bu hata genellikle kullanıcılar dosyayı yönetebilsin ya da sorun çıktı, Everyone Full Control yapalım düşüncesiyle ortaya çıkar.

Domain controller’da paylaşıma ve NTFS (New Technology File System) iznine Modify veriyoruz:

Grant-SmbShareAccess -Name "Wallpaper" -AccountName "GG_Satis" -AccessRight Change -Force
$acl = Get-Acl "C:\Shares\Wallpaper"
$kural = New-Object System.Security.AccessControl.FileSystemAccessRule("BAKICUBUK\GG_Satis", "Modify", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.AddAccessRule($kural)
Set-Acl -Path "C:\Shares\Wallpaper" -AclObject $acl
Get-SmbShareAccess -Name "Wallpaper"
(Get-Acl "C:\Shares\Wallpaper").Access | Where-Object IdentityReference -like "*GG_Satis*" | Format-Table IdentityReference, FileSystemRights, AccessControlType

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
-AccessRight Change Paylaşım düzeyinde okuma ve yazma izni Bu hatayı laboratuvar dışında yapmayın
BAKICUBUK\GG_Satis İzin verilen grup, etki alanı adı ile birlikte Kendi NetBIOS (Network Basic Input/Output System) etki alanı adınız ve grup adınız
Modify NTFS (New Technology File System) düzeyinde değiştirme izni Bu hatayı laboratuvar dışında yapmayın
C:\Shares\Wallpaper İzin verilen klasör Kendi paylaşım klasörünüz

Şimdi istemcide nihat.cubuk ile \\W25DC\Wallpaper paylaşımına gidiyoruz. Artık dosyayı yeniden adlandırabilir, silebilir ya da üzerine başka bir resim kopyalayabilir. Zararsız bir deneme olarak, wallpaper.png dosyasının adını wallpaper-yedek.png yapıp aynı klasöre farklı bir wallpaper.png koyuyoruz (bizim örneğimizde kırmızı zeminli, üzerinde bakicubuk.tech yazan bir resim). Ardından GG_Satis grubunun bir başka üyesi ile ya da aynı kullanıcı ile oturumu kapatıp açıyoruz. Kendi resminizin boyutu 1920×1080’den farklıysa Fill yerleşimi onu büyütüp kırpar. Bizim örneğimizde yazının ortada değil sağa kayık ve kenarlarının pikselli görünmesinin nedeni budur. Bölüm 5’te metni merkeze yakın tutma konusunu da bu yüzden vurgulamıştık.

Bu örnekte etki masum bir renk değişikliğidir. Ama aynı mantık bir logon betiğinin, bir yazılım dağıtım paylaşımının ya da bir GPO’nun çağırdığı yürütülebilir dosyanın durduğu klasör için de geçerlidir. Orada klasöre yazabilen kullanıcı, o kaynağı çağıran tüm hesaplar adına kod çalıştırabilir. Bir GPO’nun işaret ettiği her yol, GPO’nun kendisi kadar korunmalıdır.

Şimdi bu değişikliği izlenebilir duruma getiriyoruz. Dosya sistemi denetimini açıp klasöre denetim kuralı ekliyoruz:

auditpol /set /subcategory:"File System" /success:enable /failure:enable
$acl = Get-Acl "C:\Shares\Wallpaper"
$denetim = New-Object System.Security.AccessControl.FileSystemAuditRule("Everyone", "Write,Delete", "ContainerInherit,ObjectInherit", "None", "Success")
$acl.AddAuditRule($denetim)
Set-Acl -Path "C:\Shares\Wallpaper" -AclObject $acl

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
File System Dosya ve klasör erişim denetimi alt kategorisi Değiştirmeyin
/success:enable /failure:enable Başarılı ve başarısız erişimleri kaydeder Başarısızlar çok gürültü yaratırsa yalnızca başarılıyı seçin
Everyone Kimin eylemlerinin kaydedileceği Belirli bir grup izleyecekseniz o grubun adı
Write,Delete Hangi eylemlerin kaydedileceği İzlemek istediğiniz haklar
Success Yalnızca başarılı eylemlerin kaydedileceği Failure ya da Success,Failure

Denetim kuralı artık açık. İstemcide nihat.cubuk ile \\W25DC\Wallpaper paylaşımına dönüp iki yeniden adlandırma yapıyoruz. Önce şu an wallpaper.png adını taşıyan kırmızı resmin adını wallpaper-yedek2.png yapıyoruz. Sonra wallpaper-yedek.png olarak sakladığımız asıl resmin adını yeniden wallpaper.png yapıyoruz. Böylece hem asıl duvar kağıdı yerine geliyor hem de denetlenen iki işlem oluşuyor. Ardından domain controller’da Security günlüğünde 4663 olaylarına bakıyoruz. Tam olayı görmek için Format-List, ekran görüntüsüne sığacak kısa bir özet için aşağıdaki tabloyu kullanabilirsiniz:

Get-WinEvent -FilterHashtable @{LogName="Security"; Id=4663} -MaxEvents 5 | ForEach-Object {
    $x = [xml]$_.ToXml()
    $d = @{}
    $x.Event.EventData.Data | ForEach-Object { $d[$_.Name] = $_.'#text' }
    [pscustomobject]@{ Zaman = $_.TimeCreated; Hesap = $d.SubjectUserName; Nesne = $d.ObjectName; Maske = $d.AccessMask }
} | Format-Table -AutoSize

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
LogName="Security" Denetim olaylarının tutulduğu günlük Değiştirmeyin
Id=4663 Bir nesneye erişim girişimi olayı Dosya silme için 4660 da bakılabilir
-MaxEvents 5 En yeni kaç olayın okunacağı İhtiyacınıza göre artırın
[xml]$_.ToXml() Olayı XML (Extensible Markup Language) olarak açıp alanlara tek tek erişmeyi sağlar Değiştirmeyin
SubjectUserName, ObjectName, AccessMask Olaydaki hesap adı, nesne adı ve erişim maskesi alanları Başka bir alan görmek isterseniz Format-List ile tam olaya bakıp alan adını seçin

Bizim laboratuvarda üç olay oluştu (en yeni olay en üstte listelenir):

Saat Nesne Erişim Anlamı
02:01:22 C:\Shares\Wallpaper\wallpaper.png (dosya) DELETE (0x10000) Kırmızı resim yeniden adlandırılırken dosya üzerinde DELETE hakkı kullanıldı
02:01:22 C:\Shares\Wallpaper (klasör) WriteData (or AddFile) (0x2) Klasöre yeni bir ad (wallpaper-yedek2.png) eklendi
02:01:25 C:\Shares\Wallpaper (klasör) WriteData (or AddFile) (0x2) Klasöre bir ad daha (wallpaper.png) eklendi

Üç olayda da hesap nihat.cubuk‘tur. Bu tabloda üç noktaya dikkat edin:

Denetim kuralının dosyalara gerçekten geçtiğini ayrıca doğrulamak için dosyaların denetim listesine bakıyoruz:

foreach ($d in "wallpaper.png","wallpaper-yedek2.png") {
    "--- $d"
    (Get-Acl "C:\Shares\Wallpaper\$d" -Audit).Audit
}

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
"wallpaper.png","wallpaper-yedek2.png" Denetim listesine bakılacak dosyalar Kendi dosya adlarınız
-Audit Dosyanın SACL’ini (System Access Control List, denetim kurallarını) da okur. Bu anahtar olmadan denetim kuralları gösterilmez Değiştirmeyin
IsInherited Kuralın klasörden miras alınıp alınmadığını söyler Değiştirmeyin

Bizim laboratuvarda sonuç şöyle çıktı:

Dosya Denetim kuralı
wallpaper.png (asıl resim) Yok, Audit altında hiçbir satır dönmedi
wallpaper-yedek2.png (kırmızı resim) Var: Everyone, Write, Delete, Success, IsInherited : True

Bu, DELETE olayının neden yalnızca kırmızı resim için oluştuğunu açıklar. Denetim kuralı olmayan dosyada yapılan işlem kayda girmez. Kuralın neden iki dosyadan yalnızca birine geçtiğini bu laboratuvarda kesin olarak belirlemedik. Çıkarılacak ders şudur: Bir klasöre denetim kuralı koymak, içindeki mevcut her dosyanın denetlendiği anlamına gelmez. Denetimi kurduktan sonra Get-Acl -Audit ile dosyaları kontrol edin ve gerçek bir işlemle deneyip hangi olayların oluştuğunu doğrulayın.

Sorunu düzeltmek için izinleri eski durumuna getiriyoruz. Asıl duvar kağıdını yukarıda zaten yerine koyduk, burada yalnızca izinleri düzeltiyoruz:

Grant-SmbShareAccess -Name "Wallpaper" -AccountName "GG_Satis" -AccessRight Read -Force
$acl = Get-Acl "C:\Shares\Wallpaper"
$acl.Access | Where-Object { $_.IdentityReference -like "*GG_Satis*" -and $_.FileSystemRights -match "Modify" } | ForEach-Object { [void]$acl.RemoveAccessRule($_) }
Set-Acl -Path "C:\Shares\Wallpaper" -AclObject $acl
Get-SmbShareAccess -Name "Wallpaper"

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
-AccessRight Read Paylaşım iznini yalnızca okumaya indirir Değiştirmeyin
-match "Modify" Kaldırılacak NTFS (New Technology File System) kuralını seçer Eklediğiniz hakka göre

NTFS tarafının da temizlendiğini ayrıca doğruluyoruz:

(Get-Acl "C:\Shares\Wallpaper").Access | Where-Object IdentityReference -like "*GG_Satis*" | Format-Table IdentityReference, FileSystemRights, AccessControlType

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
C:\Shares\Wallpaper Denetlenen klasörün yolu Kendi paylaşım klasörünüzün yolu
*GG_Satis* Aranacak grubun adı Kendi grubunuzun adı

Çıktı boştur, çünkü GG_Satis için NTFS kuralı kalmamıştır. Okuma hakkı Users gibi başka bir grup üzerinden geliyorsa onun satırı bu filtrede görünmez.

Adım 4: GPO üzerinde fazla yetki bulmak ve değişikliği izlemek

En kritik zayıf nokta, bir GPO’yu değiştirme yetkisidir. GPMC’de GPO’yu seçip Delegation sekmesine baktığımızda kimin ne yapabildiğini görürüz. Normalde Edit settings ve üstü yalnızca Domain Admins, Enterprise Admins, SYSTEM ve Group Policy Creator Owners gibi yönetim hesaplarında olmalıdır. Başka bir kullanıcı ya da grup burada Edit settings yetkisine sahipse, o hesabı ele geçiren herkes GPO’nun kapsadığı hesaplara ve makinelere ayar ve kod ulaştırabilir.

Önce tek bir GPO’nun izinlerine bakıyoruz. Bu, taramanın neyi okuduğunu görmemizi sağlar:

Get-GPPermission -Name "U - Satis - Duvar Kagidi" -All | Select-Object @{n="Hesap";e={$_.Trustee.Name}}, Permission | Format-Table -AutoSize

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
-Name "U - Satis - Duvar Kagidi" İzinleri listelenecek GPO’nun (Group Policy Object) adı Kendi GPO’nuzun adı
@{n="Hesap";e={$_.Trustee.Name}} Trustee nesnesinden hesap adını çeker Değiştirmeyin. Trustee sütununu doğrudan yazdırırsanız ad yerine nesne türü görünür

Tüm GPO’larda yönetim dışı hesapların sahip olduğu yazma yetkilerini tek komutla listeliyoruz:

Get-GPO -All | ForEach-Object {
    $gpo = $_
    Get-GPPermission -Guid $gpo.Id -All | Where-Object {
        $_.Permission -in "GpoEdit","GpoEditDeleteModifySecurity" -and
        $_.Trustee.Name -notin "Domain Admins","Enterprise Admins","SYSTEM","ENTERPRISE DOMAIN CONTROLLERS"
    } | Select-Object @{n="GPO";e={$gpo.DisplayName}}, @{n="Hesap";e={$_.Trustee.Name}}, Permission
} | Format-Table -AutoSize

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
Get-GPO -All Etki alanındaki tüm GPO’ları (Group Policy Object) listeler Tek bir GPO için -Name kullanın
GpoEdit, GpoEditDeleteModifySecurity GPO’yu değiştirme ve izinlerini değiştirme hakları Değiştirmeyin. GpoApply ve GpoRead yalnızca uygulama ve okuma içindir
"Domain Admins","Enterprise Admins",... Beklenen, meşru yönetim hesapları Kendi ortamınızda yazma yetkisine sahip olması normal olan grupların adları (örneğin bir GPO yönetim grubunuz)

Temiz bir laboratuvarda Group Policy Creator Owners ya da sizin eklediğiniz bir grup dışında sonuç dönmemelidir. Çıktıdaki her satır, bu hesap neden bu GPO’yu değiştirebiliyor? sorusunu cevaplatmalıdır.

Şimdi savunmacının asıl sorusuna geliyoruz: bir GPO değiştiğinde bunu nasıl görürüz? Domain controller’da Directory Service Changes denetiminin açık olduğunu doğruluyoruz, kapalıysa açıyoruz:

auditpol /get /subcategory:"Directory Service Changes"
auditpol /set /subcategory:"Directory Service Changes" /success:enable
auditpol /get /subcategory:"Directory Service Changes"

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
Directory Service Changes AD (Active Directory) nesnelerinde yapılan değişiklikleri kaydeden denetim alt kategorisi Değiştirmeyin
/success:enable Başarılı değişiklikleri kaydeder Başarısız girişimleri de izlemek isterseniz /failure:enable ekleyin

Denetim açıkken bir GPO ayarını değiştiriyoruz. GPMC’de U - Satis - Duvar Kagidi GPO’sunu sağ tıklayıp Edit ile açıyoruz ve Wallpaper Style değerini Fill yerine Fit yapıp kaydediyoruz ya da komutla:

Set-GPRegistryValue -Name "U - Satis - Duvar Kagidi" -Key "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System" -ValueName "WallpaperStyle" -Type String -Value "6"

Ardından Security günlüğünde 5136 olaylarına bakıyoruz:

Get-WinEvent -FilterHashtable @{LogName="Security"; Id=5136} -MaxEvents 2 | Select-Object TimeCreated, Id, Message | Format-List

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
Id=5136 Bir AD (Active Directory) nesnesinin özelliğinin değiştirildiğini gösteren olay Nesne oluşturma için 5137, silme için 5141
-MaxEvents 2 En yeni kaç olayın okunacağı. Tek bir ayar değişikliği versionNumber için iki olay üretir Başka işlemler de olduysa değeri artırın

Olay mesajında Subject altında değişikliği yapan hesabı (Administrator), Object altında DN olarak CN={GUID},CN=Policies,CN=System,DC=bakicubuk,DC=tech biçimindeki GPO nesnesini, Attribute altında ise değişen özelliği (versionNumber) görürüz. GPO’nun adı olayda değil, GUID olarak geçer. Adı bulmak için Get-GPO -Guid kullanılır.

Çıktıda iki olay göreceğiz ve ikisi de aynı Correlation ID değerini taşır. Bunlar tek bir değişikliğin iki yarısıdır: Value Deleted eski sayıyı (bizim laboratuvarda 131072), Value Added yeni sayıyı (196608) gösterir. Sürüm sayısını okumayı Adım 1’de öğrenmiştik: 131072, 2 × 65536 eder, yani kullanıcı sürümü 2’dir. 196608 ise 3 × 65536 eder ve kullanıcı sürümü 3’e çıkmıştır. WallpaperStyle kullanıcı tarafı bir ayar olduğu için artan taraf kullanıcı sürümüdür.

Burada iki önemli ayrıntı var:

GPO’nun GUID’ini ada çevirmek için:

Get-GPO -Guid "00000000-0000-0000-0000-000000000000" | Select-Object DisplayName, Id, ModificationTime

Kendi ortamınıza uyarlarken:

Değer Ne Anlama Gelir Neyle Değiştirilmeli
00000000-0000-0000-0000-000000000000 5136 olayındaki DN satırından alınan GPO (Group Policy Object) GUID’i (Globally Unique Identifier) Olaydaki DN satırında bulunan gerçek GUID (süslü parantezler olmadan). GUID: satırındaki değeri kullanmayın

Çıktıda 259dfad8-... GUID’inin U - Satis - Duvar Kagidi GPO’suna ait olduğunu görürüz. ModificationTime değeri, olaydaki değişiklik zamanına çok yakındır (birkaç saniye farkla).

5. Tespit ve Savunma: Neyi İzlemeli, Neyi Kapatmalı?

Bu bölümde gördüğümüz zayıf noktaların her birinin bir olay ve bir önlemi vardır. Aşağıdaki tablo, SIEM’de (Security Information and Event Management) ya da olay incelemesinde ilk bakacağınız yerleri özetler.

Olay Kimliği Günlük Ne Anlama Gelir Neden Önemli
5136 Security (domain controller) AD (Active Directory) nesnesi özelliği değişti. GPO (Group Policy Object) için groupPolicyContainer nesnesi GPO’nun değiştirildiğini gösterir. Kim, ne zaman, hangi GPO
5137 Security (domain controller) AD’de nesne oluşturuldu Yeni bir GPO oluşturulduğunu gösterir
5141 Security (domain controller) AD nesnesi silindi GPO silindiğini gösterir
4663 Security (dosya sunucusu) Denetimi açılmış bir dosyaya ya da klasöre erişildi GPO’nun işaret ettiği paylaşımdaki dosya ekleme, silme ve yeniden adlandırma işlemlerini gösterir. Kaynak makineyi göstermez, bunun için 5145 gerekir
4670 Security Nesne üzerindeki izinler değişti GPO ya da klasör ACL’sine (Access Control List) yetki eklendiğini gösterir
4688 Security (istemci ve sunucular) Yeni işlem oluşturuldu GPO ile gelen betik ya da görev çalıştığında işlem kaydı oluşur. Komut satırı denetimi açık olmalı

Önlemleri öncelik sırasıyla şöyle sıralayabiliriz:

  1. GPO yazma yetkilerini sınırlayın. Edit settings yalnızca küçük bir GPO yönetim grubunda olsun. Düzenli olarak Get-GPPermission taramasını çalıştırıp çıktıyı karşılaştırın.
  2. GPO’nun işaret ettiği her yolu GPO kadar koruyun. Paylaşım ve NTFS izinleri Read ile sınırlı olsun. Yazma yalnızca yönetici gruplarında olsun. Gerekmedikçe logon betiklerini SYSVOL dışındaki paylaşımlarda tutmayın.
  3. Group Policy Creator Owners grubunu boş tutun ya da çok küçük tutun. Bu gruptaki bir hesap yeni GPO oluşturup kendi GPO’sunun sahibi olur.
  4. OU’larda Link GPOs yetkisini denetleyin. GPMC’de OU’yu seçip Delegation sekmesine bakın. Yetkiyi yalnızca ihtiyacı olan gruplara verin.
  5. GPO içine parola koymayın. Yerel yönetici parolaları için Windows LAPS (Local Administrator Password Solution) kullanın. SYSVOL’da cpassword taraması yapın.
  6. Default Domain Policy ve Default Domain Controllers Policy‘yi olabildiğince az değiştirin. Bunlara yapılan her değişiklik etkisini tüm etki alanına ya da tüm domain controller’lara yayar. Özel ayarlar için ayrı GPO kullanın. Bu iki varsayılan GPO’da yalnızca parola ve kilitleme politikası gibi gerçekten etki alanı genelinde olması gereken ayarlar kalsın.
  7. Yönetim katmanlarını ayırın. Domain Admin hesapları iş istasyonlarında oturum açmasın. Aksi takdirde bir iş istasyonunun GPO’su, Domain Admin kimliğini ele geçirmek için bir yol olur.
  8. Düzenli tarama yapın. PingCastle ve Purple Knight gibi araçlar GPO izinlerini, cpassword kalıntılarını ve riskli delegasyonları raporlar. BloodHound ise bir hesabın bir GPO üzerinde sahip olduğu yetkiyi saldırı yolu olarak gösterir. Bunları kendi etki alanınızda, yetkili olarak çalıştırın.

6. Güvenlik Açısından Bu Bölümün Dersleri

7. Özet ve Sonraki Bölüm

  1. Group Policy, tek değişiklikle çok sayıda hesaba ve makineye ulaştığı için saldırgan için değerli bir araçtır. GPO’yu değiştirebilen kişi, onun kapsadığı hesapların yetkisini devralır.
  2. SYSVOL ve GPO nesneleri her kimliği doğrulanmış kullanıcıya okunur. Bu bir açık değil tasarımdır. Savunma, GPO içine gizli bilgi koymamaktır.
  3. cpassword içeren eski GPP dosyaları, MS14-025 sonrasında da SYSVOL’da kalabilir. findstr ile taramak ve bulunan parolaları değiştirmek gerekir.
  4. GPO’nun işaret ettiği paylaşımdaki gereğinden geniş yazma izni, GPO’nun kendisi kadar risklidir. Bu izin 4663 ile izlenebilir.
  5. GPO değişiklikleri 5136, yeni GPO’lar 5137 ve silinen GPO’lar 5141 olayı olarak görünür. Directory Service Changes denetimi açık değilse bu olaylar hiç oluşmaz.
  6. Get-GPPermission ile yönetim dışı hesapların GPO üzerindeki yazma yetkilerini düzenli olarak taramak, en ucuz ve en etkili savunmalardan biridir.

Sonraki bölüm: Bölüm 7’de GPO’larımızı güvenlik temel ayarlarıyla (Security Baseline) sıkılaştırıyoruz. Microsoft Security Compliance Toolkit ile gelen baseline GPO’larını içe aktarıp mevcut ayarlarla karşılaştırıyor, yaygın sıkılaştırma ayarlarını uyguluyor ve hesap ilkelerini (parola ve hesap kilitleme politikası) ele alıyoruz.

Kısaltmalar

Yazıda geçen kısaltmaların açılımlarını ve kısa açıklamalarını aşağıdaki tabloda bir arada bulabilirsiniz.

Kısaltma Açılımı Açıklama
ACL Access Control List Bir nesne üzerinde kimin hangi izne sahip olduğunu tanımlayan erişim listesi
AD Active Directory Microsoft’un kullanıcı, bilgisayar ve grup gibi nesneleri merkezi olarak yöneten dizin hizmeti
AES Advanced Encryption Standard Yaygın kullanılan simetrik şifreleme standardı
DN Distinguished Name Bir nesnenin AD içindeki tam yolunu gösteren benzersiz ad
GPMC Group Policy Management Console GPO oluşturma, link etme, raporlama ve yönetim konsolu
GPO Group Policy Object Ayarları içeren ve site, domain ya da OU’ya link edilen Group Policy nesnesi
GPP Group Policy Preferences Varsayılan yapılandırma dağıtmak için kullanılan Group Policy bölümü
GUID Globally Unique Identifier Nesneleri benzersiz şekilde tanımlayan 128 bitlik kimlik değeri
LAPS Local Administrator Password Solution Yerel yönetici parolalarını her makine için benzersiz üreten ve yöneten Microsoft çözümü
NetBIOS Network Basic Input/Output System Eski Windows ağ adlandırma sistemi. Etki alanı kısa adı (BAKICUBUK) bu biçimdedir
NTFS New Technology File System Windows dosya sistemi, dosya ve klasör izinlerini tutar
OU Organizational Unit AD içinde nesneleri gruplamak ve GPO link etmek için kullanılan konteyner
SIEM Security Information and Event Management Günlükleri toplayıp ilişkilendiren ve uyarı üreten güvenlik izleme platformu
SMB Server Message Block Windows dosya ve yazıcı paylaşım protokolü
SYSVOL System Volume GPO dosyalarını ve logon script’lerini tutan, domain controller’lar arasında replike edilen paylaşım
UNC Universal Naming Convention Ağ kaynaklarını \\sunucu\paylaşım biçiminde gösteren yol yazımı
XML Extensible Markup Language Yapılandırılmış veri tutmak için kullanılan işaretleme dili

 

Exit mobile version