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:
- Geniş erişim: Bir GPO tek bir değişiklikle yüzlerce bilgisayara ya da kullanıcıya ulaşır.
- Yüksek yetki: Computer Configuration tarafındaki ayarlar, betikler ve zamanlanmış görevler
SYSTEMbağlamında çalışır. - Meşru görünüm: GPO değişiklikleri günlük yönetimin parçasıdır. Dikkatle izlenmezse olağan bir değişiklikten ayırt edilemez.
- Kalıcılık: Ayar GPO’da durduğu sürece, makine temizlense bile bir sonraki yenilemede geri gelir.
- Herkese açık okuma: Bir GPO’nun tanımı ve dosyaları, etki alanındaki her kimliği doğrulanmış kullanıcı tarafından okunabilir. Bu, tasarım gereğidir, çünkü istemciler kendi ayarlarını okuyabilmelidir.
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.
- 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. - SYSVOL (System Volume) içindeki politika klasörleri: File Explorer’da
\\bakicubuk.tech\SYSVOL\bakicubuk.tech\Policiesyoluna gidiyoruz. Her GPO bir GUID (Globally Unique Identifier) adlı klasör olarak listelenir.PolicyDefinitionsklasö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 giripUserya daMachinealtındaki dosyalara bakabiliyoruz. - GPO nesneleri: Active Directory içinde GPO’lar
groupPolicyContainertü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.
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).
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:
- Klasör ve dosya ayrı nesnelerdir. Bir klasöre ad eklemek klasör üzerinde
AddFile, bir dosyayı silmek ya da adını değiştirmek dosyanın kendisi üzerindeDELETEolarak kaydedilir. Process Nameboştur,Process ID0x4‘tür. Bu, işlemin ağ paylaşımına gelen bir SMB (Server Message Block) isteği olarak çekirdekteki sürücü tarafından yapıldığını gösterir. Olay hangi program sorusunu değil, hangi hesap sorusunu cevaplar.- Olay kaynak makineyi göstermez.
4663olayında kullanıcının hangi bilgisayardan bağlandığı yoktur. Bunu5145(ağ paylaşımı nesnesine erişildi) olayı verir, ancak o olay içinAudit Detailed File Sharedenetim alt kategorisini açmak gerekir.
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:
- Olayda iki farklı GUID vardır.
DNiçindeki{...}değeri GPO’nun GUID’idir veGet-GPO -Guidile kullanılır.Objectaltındaki ayrıGUID:satırı ise AD (Active Directory) nesnesinin kendiobjectGUIDdeğeridir veGet-GPOile çalışmaz. İkisini karıştırmayın. - Olay neyin değiştiğini söylemez.
5136yalnızca GPO’nunversionNumberdeğerinin arttığını gösterir. Duvar kağıdı stilinin mi, başka bir ayarın mı değiştiği olayda yer almaz. Ayrıntı için SYSVOL’daki ilgili GPO klasörüne veGroup Policy Resultsraporlarına bakmak gerekir.
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:
- GPO yazma yetkilerini sınırlayın.
Edit settingsyalnızca küçük bir GPO yönetim grubunda olsun. Düzenli olarakGet-GPPermissiontaramasını çalıştırıp çıktıyı karşılaştırın. - GPO’nun işaret ettiği her yolu GPO kadar koruyun. Paylaşım ve NTFS izinleri
Readile sınırlı olsun. Yazma yalnızca yönetici gruplarında olsun. Gerekmedikçe logon betiklerini SYSVOL dışındaki paylaşımlarda tutmayın. Group Policy Creator Ownersgrubunu boş tutun ya da çok küçük tutun. Bu gruptaki bir hesap yeni GPO oluşturup kendi GPO’sunun sahibi olur.- OU’larda
Link GPOsyetkisini denetleyin. GPMC’de OU’yu seçip Delegation sekmesine bakın. Yetkiyi yalnızca ihtiyacı olan gruplara verin. - GPO içine parola koymayın. Yerel yönetici parolaları için Windows LAPS (Local Administrator Password Solution) kullanın. SYSVOL’da
cpasswordtaraması yapın. Default Domain PolicyveDefault 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.- 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.
- Düzenli tarama yapın. PingCastle ve Purple Knight gibi araçlar GPO izinlerini,
cpasswordkalı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
- Okuma açık, yazma kapalı olmalıdır. Keşif engellenemez ama yazma yetkisi sıkı tutulabilir.
- GPO yetkisi, kapsadığı en yüksek yetkili hesabın yetkisi kadar kritiktir. Bir GPO’da yazma yetkisi vermek, o GPO’nun kapsadığı tüm kullanıcı ve bilgisayarlar üzerinde yetki vermektir.
- GPO tek başına bir güvenlik sınırı değildir. GPO’nun işaret ettiği paylaşımlar, betikler ve hizmetler de zincirin parçasıdır. Zincirin en zayıf halkası, en az korunan paylaşımdır.
- Tespit, önlemden önce gelir.
5136,5137,5141,4663ve4670olayları açık değilse bir GPO değişikliği hiçbir iz bırakmadan geçer. - Düzenli denetim şarttır. Bir izin bir kez doğru verilmiş olabilir. Üç yıl sonra aynı izin hala doğru mudur?
Get-GPPermissiontaramasını takvime bağlayın.
7. Özet ve Sonraki Bölüm
- 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.
- 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.
cpasswordiçeren eski GPP dosyaları, MS14-025 sonrasında da SYSVOL’da kalabilir.findstrile taramak ve bulunan parolaları değiştirmek gerekir.- GPO’nun işaret ettiği paylaşımdaki gereğinden geniş yazma izni, GPO’nun kendisi kadar risklidir. Bu izin
4663ile izlenebilir. - GPO değişiklikleri
5136, yeni GPO’lar5137ve silinen GPO’lar5141olayı olarak görünür.Directory Service Changesdenetimi açık değilse bu olaylar hiç oluşmaz. Get-GPPermissionile 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 |

