karlos (Mehmet Demir)

love, hack, eat, sleep, repeat.

BitLocker Forensics: Çözümleme, Live Mount ve Yeni İmaj Aktarımı

Günümüzde dijitalleşmenin hızla artmasıyla birlikte siber güvenlik, artık sadece fiziksel kurumların değil bireylerin de hayatların da kritik bir yere sahip oldu. Evden çalışan bir personel için bilgisayarının içindeki verilerin hassasiyeti, cihazın kendisinin değerinden daha yüksek bir önem arz ediyor. Microsoft, bu ihtiyacı gidermek için TPM teknolojisini kullanarak bilgisayarları yetkisiz erişimden koruyacak ve disklerimizin 3. kişiler tarafından okunmasını önleyecek “Bitlocker” adlı bir çözüm geliştirdi. Bitlocker, bilgisayar açılırken TPM modülü ile diskin şifreleme anahtarını doğrular, eğer doğrulama başarılı olursa disk açılır ve işletim sistemi normal şekilde yüklenir.

Bir cihaz ele geçirildiğinde veya adli inceleme amacıyla disk imajı alındığında, inceleme süreci BitLocker etkin olmayan bir cihazdakinden farklı ilerler. BitLocker ile şifrelenmiş bir diskten alınan imaj, uygun araçlar kullanılarak çözülmeden analiz edilemez. Linux ortamında Dislocker aracı, şifrelenmiş BitLocker disk imajlarını çözmek ve yeni bir imaja aktarmak için etkin bir yöntem sunmaktadır.

İşin manual tarafı ile ilgilenmiyorsanız, alttaki işlemleri tamamen otomatize hale getirdiğim BitUnlocker aracımı kullanabilirsiniz.

Bir RAW disk imajımız olduğunu varsayalım. Bu imaj, TPM’in aktif olduğu ve BitLocker’in çalıştığı bir diskten alınmış.

FTK Imager kullanarak ilgili imajı açtığımızda sistem partitionları doğru bir şekilde görüntülenebilirken, asıl verilerin yer aldığı partition “Unrecognized File System” olarak gözükmektedir. BitLocker ile şifrelenmiş partitionlar, standart NTFS partitionlarından farklı bir signature’a sahip olurlar. BitLocker ile şifrelenmiş bir partition “eb 58 90 2d 46 56 45 2d 46 53 2d” ( X-FVE-FS-) imzası ile başlar.

İlgili imajı çözümleyebilmek ve analize hazır hale getirip yeni bir imaja aktarmak için Linux ortamında kullanacağımız bazı araçlara ihtiyacımız olacak. İmajı dosya sistemine bağlı bir disk gibi tanıtabilmek için “losetup” adlı komutu kullanacağız.

losetup -r -fP --show BitlockerImage.img

İlgili komutun “-r” parametresi imajı read-only (sadece okunabilir) bağlamaya yaramaktadır. Disk incelemeleri sırasında verilerin değiştirilmemesi kritik önem arz etmektedir. Komutun “-f” parametresi imajın bağlanması için boşta olan ilk loop cihazını seçer. Komutun “-P” parametresi, imajın içindeki partitionların taranarak cihaza partitionlarla birlikte mount edilmesini sağlar. Komut çıktı olarak bize hangi loop device’a bağlandığını gösterecektir.

Bir disk imajı içerisinde birden fazla sistem ve veri partitionu bulunabilir. BitLocker, volume bazında çalıştığı için öncelikle hangi partition üzerinde işlem yapacağımızı doğru şekilde belirlememiz gerekir. “Microsoft basic data” tipi partitionlar, kullanıcı verilerini barındıran bölümlerdir ve çözümleme işlemleri bu partitionlar üzerinde gerçekleştirilir.

İşlem yapacağımız partitionu tanımlamak için “fdisk” adlı aracı kullanacağız.

fdisk -l /dev/loop0

İlgili “fdisk” komutuna “-l” parametresiyle, losetup üzerinden bağladığımız loop device adresini sunmamız gerekiyor. Bu komut, imaj içerisindeki partitionların ayrıntılı şekilde listelenmesini sağlar ve üzerinde işlem yapılacak bölümü tespit etmemize yardımcı olur. Bir disk imajında farklı BitLocker anahtarlarıyla şifrelenmiş birden fazla veri partitionu bulunabilir; bu tamamen doğal bir durumdur. Bu blogda incelenen örnek imaj yalnızca tek bir veri partitionu içermektedir. İki ya da daha fazla veri partitionuna sahip senaryolarda da aynı adımlar birebir uygulanabilir.

“Microsoft basic data” tipindeki “/dev/loop0p3” adresi ile işlemlerimize devam edeceğiz. Çözülen disk verilerimizin Read-Only olarak mount edilebilmesi ve yeni bir imaj olarak görüntülenebilmesi için yeni bir mount noktası oluşturmamız gerekmektedir.

mkdir -p /mnt/dislocker1

İlgili imajın işlenebilmesi için gereken ortamı hazırladık. “Dislocker” adlı aracı kullanarak Recovery Key veya User Key yardımıyla imajımızın çözülmesini sağlayacağız.

Eğer bir imajı Recovery Key ile çözeceksek;

dislocker -V /dev/loop0p3 -pxxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx -- /mnt/dislocker1

komutu çalıştırılmalıdır. Burda dikkat edilmesi gereken noktalar, -V parametresine doğru partition loop adresinin sağlanması, -p ile diske ait Recovery Key’in düzgün bir şekilde ve bitişik bir şekilde verilmesi, mount adresinin doğru bir şekilde sunulmasıdır.

Eğer bir imajı User Key ile çözeceksek;

dislocker -V /dev/loop0p3 -uxxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx -- /mnt/dislocker1

komutu çalıştırılmalıdır. Burda dikkat edilmesi gereken noktalar, -V parametresine doğru partition loop adresinin sağlanması, -u ile diske ait User Key’in düzgün bir şekilde ve bitişik bir şekilde verilmesi, mount adresinin doğru bir şekilde sunulmasıdır.

Bu aşamadan sonra eğer imajı yeni bir imaja aktarmak yerine mount ederek incelemek ve içinden dosya alabilmek için “mount” adlı komutu kullanabilirsiniz. Eğer imajı yeni bir imaja aktarmak ve tamamıyla incelemek istiyorsanız bu aşamayı atlayabilirsiniz.

mkdir -p /mnt/dislocker_unlocked

Yeni bir mount noktası oluşturuyoruz.

mount -t ntfs-3g -o loop,ro "/mnt/dislocker1/dislocker-file" "/mnt/dislocker_unlocked"

Eğer live mount ile çalışacaksınız, işlemleriniz bittikten sonra losetup -D komutunu kullanarak ve /mnt/ altındaki klasörleri temizleyerek işleminizi bitirebilirsiniz.

Çözdüğümüz imajı yeni bir imaj dosyasına aktarmak için “dd” komutunu kullanacağız. Bu komutu kullanırken kullanacağımız parametreler imajın bağlı olduğu diskin türüne göre değişkenlik göstermektedir. Güvenlikli bir şekilde sorunsuz şekilde imajı alabilmek ve bunu olduğunca performanslı bir şekilde yapabilmek için parametreleri buna göre ayarlamamız gerekmektedir.

dd if=/mnt/dislocker1/dislocker-file of=UnlockedImage.img bs=64K status=progress conv=fsync

İlgili komutu kullanırken “if” parametresi aktarımını yapacağımız imajın konumunu, “of” parametresi imajı aktaracağımız konumu, “bs” parametresi aktarım sırasında kullanacağımız blok boyutunu (buna yazının devamında değineceğiz), “status” parametresi ilerlemenin gösterilmesini, en önemli olan “conv=fsync” parametresi ise her yazma işleminde verilerin belleğe çekilmeden direkt diske yazılmasını garanti edilmesini sağlar. Veri kaybı ihtimalini düşürmek için kullanılmaktadır.

Aşağıdaki tabloda imajın cihaza bağlı olduğu diskin türüne göre optimal hız için kullanılması gereken block size boyutlarını bulabilirsiniz. Komutunuzu buna göre düzenlemeniz yeterli olacaktır.

"USB HDD="4M" 
"SATA HDD="8M" 
"USB SSD="1M" 
"SATA SSD="2M" 
"USB NVME="4M" 
"SATA NVME="8M" 

USB HDD için görselde görünen 64 GBlik imajın işlemi tahmini olarak 78 dakika sürecektir.

64 GB = 64 × 1024 MB = 65536 MB
Süre (saniye) = 65536 ÷ 14 ≈ 4681 s
Süre (dakika) = 4681 ÷ 60 ≈ 78 dk

Sonuç olarak elde ettiğiniz imaj dosyasını dilediğiniz gibi incelemeye başlayabilirsiniz.

Tüm bu işlemleri otomatize hale getirmek için yaptığım BitUnlocker aracımı kullanabilirsiniz.

Eğer bir sorunuz olursa LinkedIn üzerinden erişebilirsiniz.