Post

VHDX İncelemelerinin Otomasyonu

🇹🇷 VDI ortamlarındaki VHDX tabanlı kullanıcı profillerinin adli analizini (forensic analysis) Velociraptor sanal istemcileri kullanarak nasıl otomatize edebileceğinizi öğrenin. Binlerce profili dakikalar içinde analiz etmenin yöntemlerini keşfedin.

VHDX İncelemelerinin Otomasyonu

Bu yazı, InfoGuard blogunda yayınlanan orijinal makalenin Türkçe çevirisidir.

Giriş

Citrix gibi Sanal Masaüstü Altyapısı (Virtual Desktop Infrastructure - VDI) platformlarının kullanıldığı büyük ölçekli ortamlarda, olay müdahale (incident response) uzmanları için saldırının ilk gerçekleştiği noktayı tespit etmek oldukça zorlayıcı olabilir. Bazı kurulumlar “altın imaj” (golden image) geri yüklemesiyle kalıcı olmayan (non-persistent) oturumlar kullansa da, birçok ortamda kullanıcı verileri uzak dosya sunucularında saklanmaya devam eder. Bu profillerin standart klasörler yerine Sanal Sabit Disk (Virtual Hard Disk - VHDX) dosyaları içinde saklanması yaygın bir uygulamadır.

Bu VHDX dosyaları; NTUSER.DAT kayıt defteri kovanları (hives) ve uygulama çalıştırma izleri gibi değerli adli bilişim kanıtlarını (forensic artefacts) içerir. Ancak bunları binlerce kullanıcı profili için manuel olarak incelemek, ölçeklenebilirlik açısından imkansız hale gelir.

Bu blog yazısında, tercih ettiğimiz DFIR aracı olan Velociraptor’u kullanarak VHDX tabanlı kullanıcı profillerinin adli analizini otomatize etme yöntemini tanıtacağız. Amacımız, adli veri bütünlüğünden (forensic integrity) ödün vermeden incelemeleri verimli ve güvenilir bir şekilde ölçeklendirmektir.

VHDX Nedir?

Virtual Hard Disk v2 (VHDX), kendi bölüm düzenine (partition layout) ve dosya sistemine sahip sanal bir sabit disk sürücüsünü temsil eden bir dosya formatıdır. VDI ortamlarında gezgin profil (roaming profile) ve NTUSER.DAT kayıt defteri kovanı gibi bireysel kullanıcı verilerini depolamak için yaygın olarak kullanılır.

Adli bilişim açısından bakıldığında VHDX dosyaları; UserAssist aracılığıyla uygulama çalıştırma kanıtları ve kayıt defteri “run” anahtarları üzerinden kalıcılık (persistence) mekanizmaları gibi kritik verileri barındırır. Her iki veri türü de tipik olarak NTUSER.DAT kovanında bulunur.

VDI platformlarının C:\Users\<KullanıcıAdı>\ içeriğini özel bir VHDX dosyasında saklaması ve her kullanıcı profilini aslında bağımsız bir sanal disk imajı gibi ele alması standart bir protokoldür.

Velociraptor Yaklaşımı

Velociraptor; tehdit avcılığı (threat hunting), kanıt toplama ve kurumsal ortamlarda ölçeklenebilir incelemeler yürütmek için kullanılan modern ve açık kaynaklı bir DFIR aracıdır. Aşağıdaki bağlantı, aracın tanıtımı ve kanıt (artefact) oluşturma detayları hakkında bilgi vermektedir: https://www.infoguard.ch/en/blog/csirt-optimisation-event-log-analysis-recording-dfir

Velociraptor, sanal disk imajlarının doğrudan ayrıştırılmasına izin veren VHDX “accessor” desteğine sahip olsa da, bu kurulum genellikle belirli kullanım durumları için tasarlanmış özel kanıtlar gerektirir (örneğin, bağlı bir VHDX içindeki UserAssist verisini okumak için). Bu durum, her adli kontrol için VHDX yapısını anlayan farklı bir kanıt tasarlanması gerektiği anlamına gelir.

Daha ölçeklenebilir bir yaklaşım ise Windows.Registry.UserAssist veya Windows.Registry.NTUser gibi mevcut Velociraptor kanıtlarını hiçbir değişiklik yapmadan tekrar kullanmaktır. Bu araştırmanın amacı tam da buydu: VHDX tabanlı kullanıcı profillerinde depolanan verileri analiz ederken yerel (native) kanıtları desteklemek.

Bunu başarmak için, ortamlarını belirli bir VHDX dosyasına yeniden eşleyen (remap) sanal Velociraptor istemcileri (virtual Velociraptor clients) kullanıyoruz. Bu yöntem, Velociraptor’un “deaddisk” modundaki çalışma prensibine benzer.

Konsept oldukça basittir: VHDX profillerinin saklandığı dosya sunucusunda sanal bir istemci çalıştırın ve yapılandırmasını bir veya daha fazla VHDX imajını işaret edecek şekilde yeniden eşleyin. Bunun güvenilir bir şekilde çalışması için birkaç teknik adım gerekmektedir. Şimdi bunları tek tek inceleyelim.

VHDX Genel Bakış

Windows.Sys.Users

Windows.Registry.UserAssist gibi kullanıcı kayıt defterini hedefleyen birçok Velociraptor kanıdı, NTUSER.DAT kovanına Windows.Registry.NTUser kanıdı üzerinden erişir. Ancak bu kanıt, sistemdeki kullanıcı profillerinin listesini çıkarmak için Windows.Sys.Users kanıdına güvenir.

Varsayılan olarak Windows.Sys.Users, kullanıcı bilgilerini şu kayıt defteri anahtarından alır:

1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*

Bu mantık uç noktalarda (endpoint) beklendiği gibi çalışsa da, sanal Velociraptor istemcilerinde başarısız olur. Çünkü bu anahtar, VHDX tabanlı profilleri değil, dosya sunucusunun kendi yerel kullanıcılarını yansıtır. Sonuç olarak Velociraptor, VHDX dosyalarının içindeki NTUSER.DAT kovanlarını keşfedemez veya ayrıştıramaz.

Bunu aşmak için iki olası çözümü değerlendiriyoruz:

  1. Sahte kayıt defteri eşlemesi (Fake registry remapping): Sentetik bir ProfileList kovanı enjekte etmek.
  2. Kanıt geçersiz kılma (Artefact override): Windows.Sys.Users kanıdını VHDX keşif mantığını destekleyecek şekilde özelleştirmek.

Sahte Kayıt Defteri Eşlemesi Kullanıcı listeleme sorununu çözmenin bir yolu, sadece dosya sistemini değil, ProfileList kayıt defteri anahtarını da VHDX imajına eşlemektir. Bu anahtarı taklit eden özel bir kovan sağlayarak Velociraptor’un VHDX’teki profilleri yerelmiş gibi “görmesi” sağlanabilir.

Aşağıdaki PowerShell örneğinde şunları yapıyoruz:

  1. Her kullanıcı için geçici kayıt defteri anahtarları oluşturuyoruz.
  2. Standart Windows kullanıcı yapısını simüle etmek için ProfileImagePath değerlerini atıyoruz.
  3. Kayıt defteri kovanını bir .dat dosyasına aktarıyoruz.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Geçici kovan ve nihai dosya yollarını tanımlayın
$tempHivePath = "HKLM\Software\Velociraptor"
$binaryFilePath = "C:/Program Files/Velociraptor/Profile/ProfileList.dat"

# Kullanıcıları geçici kovana ekleyin
reg.exe add "$($tempHivePath)\Brontosaurus" /v "ProfileImagePath" /t REG_EXPAND_SZ /d "C:\Users\Brontosaurus" /f
reg.exe add "$($tempHivePath)\Stegosaurus" /v "ProfileImagePath" /t REG_EXPAND_SZ /d "C:\Users\Stegosaurus" /f
reg.exe add "$($tempHivePath)\Tyrannosaurus" /v "ProfileImagePath" /t REG_EXPAND_SZ /d "C:\Users\Tyrannosaurus" /f

# Kovabı dışa aktarın
reg.exe save $tempHivePath $binaryFilePath

# Geçici kovanı temizleyin
reg.exe delete $tempHivePath /f

Ardından, Velociraptor’a bu dışa aktarılan kovanı orijinal ProfileList anahtarının yerine bağlamasını (mount) söyleyen bir YAML yapılandırması hazırlıyoruz:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- type: mount
  description: 'Registry - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
  from:
    accessor: raw_reg
    prefix: |
      {
        "Path": "/"
        "DelegateAccessor": "file"
        "DelegatePath": "C:/Program Files/Velociraptor/Profile/ProfileList.dat"
      }
      path_type: registry
  "on" :
    accessor: registry
    prefix: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
    path_type: registry

Bu kurulumla, Windows.Sys.Users kanıdına yapılan her çağrı bizim tanımladığımız sentetik girişleri getirecek ve böylece bağımlı kanıtların (örneğin Windows.Registry.NTUser) doğru çalışmasını sağlayacaktır. Ancak bu yaklaşımın sınırlamaları vardır; her yeni kullanıcı eklendiğinde manuel adımların tekrarlanması gerekir. Bu nedenle, küçük ölçekli veya konsept kanıtlama (PoC) testleri için daha uygundur.

Kanıt Geçersiz Kılma (Artefact Override) Daha sağlam ve ölçeklenebilir çözüm, varsayılan Windows.Sys.Users kanıdını geçersiz kılmaktır. Özelleştirilmiş sürüm, standart sistemlerle uyumluluğu korurken, sanal bir Velociraptor istemcisi bağlamında çalışırken VHDX tabanlı profilleri algılayıp listeleme mantığını ekler.

Temel fikir, Velociraptor istemcisinin etiketine (label) dayalı bir koşullu kontrol getirmektir. İstemci belirli bir etiketle (örneğin remapped_profile) işaretlenmişse, kanıt geleneksel kayıt defteri anahtarına güvenmek yerine C:\Users\*\ altındaki NTUSER.DAT dosyalarını tarar.

Aşağıdaki VQL kodu bu mantığı göstermektedir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
LET GetTimestamp(High, Low) = if(condition=High,
        then=timestamp(winfiletime=High * 4294967296 + Low))

// lookupSID() deaddisk analizinde kullanılamayabilir
LET Standard = SELECT split(string=Key.OSPath.Basename, sep="-")[-1] as Uid,
   "" AS Gid,
   LookupSIDCache(SID=Key.OSPath.Basename || "") AS Name,
   Key.OSPath as Description,
   ProfileImagePath as Directory,
   Key.OSPath.Basename as UUID,
   Key.Mtime as Mtime,
   {
        SELECT Mtime
        FROM stat(filename=expand(path=ProfileImagePath))
    } AS HomedirMtime,
   dict(ProfileLoadTime=GetTimestamp(
           High=LocalProfileLoadTimeHigh, Low=LocalProfileLoadTimeLow),
        ProfileUnloadTime=GetTimestamp(
           High=LocalProfileUnloadTimeHigh, Low=LocalProfileUnloadTimeLow)
   ) AS Data
FROM read_reg_key(globs=remoteRegKey, accessor="registry")

// Standart olanı taklit eden, yeniden eşlenmiş VHDX profilleri için kullanıcı listesi
LET VHDXProfile = SELECT
      OSPath.Components[-2] AS Uid,
      OSPath.Dirname AS Directory,
      OSPath.Components[-2] AS UUID,
      OSPath.Components[-2] AS Name,
      "" AS Gid,
      Mtime,
      Mtime AS HomedirMtime,
      "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\" + OSPath.Components[-2] AS Description
    FROM glob(globs="C:/Users/*/NTUSER.DAT")

// Ajanın etiketlerini al 
LET agent_config = SELECT labels FROM config

// Uygun kullanıcı listeleme yöntemini seç
SELECT * FROM if(condition=agent_config.labels=~labelName, then=VHDXProfile, else=Standard)

Bu özelleştirilmiş kanıt yazıldıktan sonra sunucu seviyesinde şu komutla dağıtılabilir:

1
/usr/local/bin/velociraptor —config /etc/velociraptor/server.config.yaml —definitions /etc/velociraptor/artifact_definitions frontend

Bu yapılandırmayla Velociraptor sunucusu, özel kanıdı istemcilere otomatik olarak dağıtacaktır. Bireysel istemci yapılandırmalarını değiştirmeye gerek yoktur. Uygun etiketle başlatılan herhangi bir sanal istemci, VHDX mantığını sorunsuz bir şekilde kullanacaktır.

Yeniden Eşleme Yapılandırması (Remapping Configuration)

Kullanıcı listeleme sorunu çözüldükten sonraki adım, belirli kullanıcı profili yollarını (örneğin C:\Users\Brontomerus) ilgili VHDX dosyalarına bağlayan bir yeniden eşleme yapılandırması oluşturmaktır.

Aşağıda, NTFS “accessor”ı için C:\Users\Brontomerus yolunu belirli bir VHDX dosyasına yönlendiren bir yapılandırma örneği verilmiştir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- type: mount
  description: 'NTFS - Brontomerus'
  from:
    accessor: raw_ntfs
    prefix: |
      {
        "DelegateAccessor": "offset",
        "Delegate": {
          "DelegateAccessor": "vhdx",
          "DelegatePath": "F:/VHDX/Profile_Brontomerus.VHDX",
          "Path":"/1048576"
        },
        "Path": "/Profile"
      }
  "on":
    accessor: ntfs
    prefix: '\\.\C:\Users\Brontomerus'
    path_type: ntfs

Bu eşleme, sanal Velociraptor istemcisinin VHDX dosyasının içeriğine, diskteki gerçek C:\Users\Brontomerus diziniymiş gibi erişmesini sağlar. Tam uyumluluk için benzer eşlemeler file, auto ve registry accessors için de oluşturulmalıdır.

Sanal İstemci Oluşturma

Yapılandırma tamamlandığında, artık sanal bir Velociraptor istemcisi başlatabiliriz. Bu, eşlenen yolları kullanarak VHDX içeriğine yerel bir kullanıcı profiliymiş gibi erişen bağımsız bir Velociraptor sürecidir (process).

Aşağıdaki PowerShell komutu, sanal istemciyi başlatır:

1
Start-Process -FilePath '.\Velociraptor.exe' -ArgumentList '—config client.config.yaml —config.client-writeback-windows="velociraptor_vhdx.writeback.yaml" —config.client-local-buffer-filename-windows="C:\Windows\Temp\velociraptor_vhdx_Buffer.bin" —remap "C:\Program Files\Velociraptor\velociraptor_vhdx_remapping.yaml" —config.client-labels=remapped_profile client' -WorkingDirectory 'C:\Program Files\Velociraptor' -WindowStyle Hidden

Başlatıldıktan sonra sanal istemci, tıpkı standart bir Velociraptor uç noktası gibi davranır ancak dosya sistemi ve kayıt defteri erişimleri VHDX dosyasına yönlendirilir. Bu durum, Sanal Dosya Sistemi (VFS) üzerinden profilin taranabilmesini sağlar.

VFS Tarama

Ayrıca mevcut kanıtların veya diğer profil düzeyindeki kontrollerin çalıştırılmasına olanak tanır.

Mevcut Kanıtlar

Bu sanal istemci kalıcı değildir; sistem yeniden başlatılırsa veya istemci çökerse sürecin tekrar başlatılması gerekir. Neyse ki, bu işlem bu yazının ilerleyen kısımlarında açıklanan kanıt (artefact) kullanılarak yapılabilir.

Ölçeklendirme

Tek bir sanal istemci ile bir kullanıcı profilini başarıyla analiz ettikten sonraki mantıklı adım, bu yaklaşımı ölçeklendirmektir. Gerçek dünyadaki olaylarda genellikle incelenmesi gereken çok sayıda kullanıcı olur. Manuel inceleme verimsizdir, bu nedenle otomasyon ve paralelleştirme şarttır.

Ancak aynı ana makinede (host) birden fazla sanal istemci çalıştırmak performans hususlarını beraberinde getirir. Testlerimizde, her biri yaklaşık 2 GB olan 1.000 kullanıcı profili için üç stratejiyi değerlendirdik:

Hepsini Tek Bir Eşlemede Toplamak

Tüm VHDX dosyalarını tek bir yapılandırma dosyasına yüklemek (yaklaşık 2.6 MB’lık bir YAML dosyası). Teoride verimli olsa da, muhtemelen aynı anda çok fazla VHDX dosyasının açık olması nedeniyle sistem sınırlarının aşılmasına ve istemcinin çökmesine neden oldu.

Ölçeklendirme Kararsızlığı

Bire Bir İstemciler (One-to-One Clients)

Her profil için ayrı bir sanal istemci çalıştırmak. Mantıksal olarak en kolayı bu olsa da, aşırı sistem kaynağı tüketimine ve yüzlerce aktif sürece neden oldu; bu da büyük ölçekli incelemeler için sürdürülebilir değildir.

Gruplandırma (Batching): En Optimize Çözüm

En etkili yaklaşım, her biri 40 profillik bir grubu (batch) yöneten birden fazla sanal istemci başlatmak oldu. Bu yöntem, yükü süreçler arasında dengeler ve sistem kaynaklarının aşırı yüklenmesini önler.

Gruplandırma Stratejisi

Bu yapılandırma ile 1.000 VHDX dosyasının UserAssist verilerini 30 saniyenin altında analiz ettik.

Analiz Sonuçları

Kendi ortamınıza göre optimize edilmiş bir gruplandırma stratejisi kullanın (örneğin, istemci başına 20–50 profil). En uygun grup boyutu, donanım kapasitenize ve VHDX dosyalarının boyutuna bağlı olacaktır.

Kanıtlar (Artefacts)

VHDX tabanlı kullanıcı profillerinin incelenmesini kolaylaştırmak için, yapılandırmadan istemci çalıştırma ve temizlemeye kadar tüm süreci otomatize eden bir Velociraptor kanıt seti geliştirdik. Bu kanıtlar dört ana kategoriye ayrılır:

  1. Sunucu Kurulumu (Server Setup): Tüm yapının çalışmasını sağlar.
  2. Yapılandırma Oluşturucu (Configuration Builder): Sanal istemciler için yeniden eşleme YAML dosyalarını üretir.
  3. Sanal İstemci Çalıştırıcı (Virtual Client Runner): Profil eşlemeleriyle Velociraptor süreçlerini başlatır.
  4. Temizlik Yöneticisi (Cleanup Manager): Sanal istemcileri durdurur ve yapılandırma dosyalarını kaldırır.

Windows.Sys.Users (Override)

Hem geleneksel sistemleri hem de sanal istemcileri destekler. İstemciye atanan etikete (örneğin remapped_profile) bakarak hangi listeleme mantığının kullanılacağına karar verir.

Windows.Vhdx.RemapConfigBuilder

Sanal istemciler için gerekli YAML dosyalarını oluşturur. Kullanıcı profillerini otomatik olarak algılar, gruplara ayırır ve dosyaları diske yazar.

Yapılandırma Oluşturucu Çıktısı

Windows.Vhdx.VirtualClientRunner

Her bir yeniden eşleme dosyası için bir Velociraptor süreci başlatır. Çalıştırıldığında, başarıyla başlatılan tüm sanal istemcileri listeler.

Çalıştırıcı Çıktısı

Windows.Vhdx.VirtualClientRemover

Çalışan sanal istemcileri durdurur ve isteğe bağlı olarak ilgili yapılandırma dosyalarını siler.

Temizleyici Çıktısı

Güvenlik Hususları

Bu araştırmadaki tüm testler, Citrix veya Windows profil yönetimi gibi servisler tarafından aktif olarak yönetilmeyen, çevrimdışı (offline) VHDX dosyaları üzerinde yapılmıştır. Canlı ortamlarda şu riskler göz önünde bulundurulmalıdır:

  • Yazma Çatışmaları: Velociraptor veya işletim sistemi aktif bir VHDX’e yazmaya çalışırsa veri bozulması oluşabilir.
  • Profil Kilitleme: Sanal platformlar kullanım sırasında VHDX dosyalarını kilitleyebilir.
  • Sistem Performansı: Çok sayıda VHDX’in bağlanması ana makineye ciddi yük bindirebilir.

Öneriler:

  • İncelemeleri mümkünse VHDX dosyalarının kopyaları üzerinde yapın.
  • Küçük kullanıcı gruplarıyla başlayın ve batch boyutunu ortamınıza göre ayarlayın.
  • Yüzlerce profil ölçeğine çıkarken sistem kaynaklarını (G/Ç, bellek, dosya tanıtıcıları) izleyin.

Velociraptor Artifact Exchange’de Mevcudiyet

Bu makalede sunulan VHDX Suite kanıt setinin tamamı, Velociraptor kanıtlarını paylaşmak ve sürdürmek için resmi topluluk platformu olan Velociraptor Artifact Exchange üzerinden doğrudan temin edilebilir.

Bu sayede, manuel içe aktarma ile uğraşmadan mevcut Velociraptor kurulumunuza bu kanıtları kolayca kurabilir ve test edebilirsiniz. Exchange üzerinden yayınlanması, bunların DFIR topluluğu tarafından gözden geçirilmiş ve erişilebilir olmasını sağlayarak şeffaflığı ve iş birliğini destekler.

Sonuç

Bu VHDX Velociraptor kanıt seti, VHDX dosyalarında saklanan kullanıcı profilleri üzerinde adli inceleme yürütmek için ölçeklenebilir ve verimli bir yöntem sunar. Analistler, yeniden eşlenmiş ortamlar kullanan sanal istemciler sayesinde UserAssist veya NTUSER.DAT ayrıştırıcıları gibi standart kanıtları hiçbir değişiklik yapmadan kullanabilirler.

Testlerimizde bu yaklaşım, 1.000’den fazla VHDX profilinin bir dakikadan kısa sürede analiz edilmesini sağlayarak VHDX triyajı ile ilişkili zorlukları ve karmaşıklığı önemli ölçüde azalttı.

Bu metodoloji; hız veya adli veri bütünlüğünden ödün vermeden, tanıdık DFIR araçlarını kullanarak yüksek hacimli incelemelerin kapısını aralamaktadır.

VHDX Suite kanıtları artık Velociraptor Artifact Exchange’de yayındadır; böylece uzmanlar bu iş akışını kendi ortamlarında doğrudan deneyimleyebilirler.

This post is licensed under CC BY 4.0 by the author.