Modern Linux Sistemlerde Bellek Dökümü Alma ve Volatility Profili Oluşturma

Modern Linux sistemlerde varsayılan olarak gelen güvenlik sıkılaştırmalarından dolayı ptrace, /dev/mem, /dev/kmem gibi hafıza dökümü elde etme yöntemleri kullanılabilirlik ve verimlilik açısından yetersiz kalmaktadır. Güvenlik önlemlerine takılmadan başarılı bir bellek dökümü elde edebilmek için sisteme bir kernel sürücüsü yüklemek gerekmektedir. Bu mantıkla çalışan LiME aracı kullanılarak modern Linux sistemlerde tam bir bellek dökümü elde edilebilir. Tabi ki sistem bir sanal makine üzerinde çalışıyorsa sanallaştırma platformunun imkanlarını kullanarak doğrudan bellek dökümünü almak mümkün olabilir.

Elde edilen hafıza dökümünü Volatility ile analiz edebilmek için dökümün elde edildiği Linux sistemin kernel versiyonu için hazırlanmış bir profil kullanılması gerekir. LiME ile bellek dökümü alma ve ilgili sistem için profil oluşturma işlerini otomatikleştiren lmg (Linux Memory Grabber) aracı kullanılabilir. Analiz edilecek sistemin belleğinde ve diskinde yapılacak değişiklikleri asgari düzeyde tutmak adına araçların harici bir belleğe yüklenmesi ve mümkünse profil oluşturma işleminin hedef sistemin bir kopyasında yapılması önerilir.

Örnek olarak 16 GB’lık harici bellek ve REMnux v5 Linux dağıtımı kullanılarak lmg yüklü bir USB bellek hazırlanması, lmg ile bellek dökümü alma ve Volatility profili oluşturma uygulaması aşağıdaki adımlar izlenerek yapılabilir. İşlemler belleği uygun şekilde biçimlendirmeyle başladığından içindeki veriler silinecektir.

1. USB Belleğin Hazırlanması:
İlk olarak USB belleğin sistemde hangi isimle gözüktüğü “dmesg” ve “df” komutları ile öğrenilir.

remnux@remnux:~$ dmesg
……
[  390.696490]  sdb: sdb1
[  390.704676] sd 3:0:0:0: [sdb] No Caching mode page present
[  390.704681] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[  390.704683] sd 3:0:0:0: [sdb] Attached SCSI removable disk
[  392.374387] EXT4-fs (sdb1): mounted filesystem with ordered data mode. Opts: (null)
remnux@remnux:~$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             25286220   4577444  19424220  20% /
udev                    376248         4    376244   1% /dev
tmpfs                   153308       440    152868   1% /run
none                      5120         0      5120   0% /run/lock
none                    383268         0    383268   0% /run/shm
/dev/sdb1             15262640   2319024  12168296  17% /media/f288eaa0-93bf-4b40-b0ea-6606117f3ced

Devamında USB bellek şu adımlar izlenerek NTFS olarak biçimlendirilir. Disk istenilirse ext4 olarak da biçimlendirilebilir. Ext4 ile daha iyi performans almak mümkün olsa da alınan imajlar Linux dışında bir sisteme kopyalanırken dosya sisteminin tanınmamasından kaynaklanacak zorluklar yaşanabilir.

root@remnux:/home/remnux# umount /media/f288eaa0-93bf-4b40-b0ea-6606117f3ced/
root@remnux:/home/remnux# parted /dev/sdb mklabel msdos
Warning: The existing disk label on /dev/sdb will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? Yes                                                              
Information: You may need to update /etc/fstab.                          

root@remnux:/home/remnux# parted /dev/sdb mkpart primary ntfs 1 15G
Information: You may need to update /etc/fstab.                          

root@remnux:/home/remnux# mkntfs -Q /dev/sdb1
Cluster size has been automatically set to 4096 bytes.
Creating NTFS volume structures.
mkntfs completed successfully. Have a nice day.

“cd /opt/“ ve “git clone https://github.com/halpomeranz/lmg.git” komutları ile lmd projesi indirilir. Daha sonra USB bellek mount edilip, lmg betiği içerisine kopyalanıp, çalıştırma izni verilir.

root@remnux:/opt# mkdir /media/usb
root@remnux:/opt# mount /dev/sdb1 /media/usb/
root@remnux:/opt# cp lmg/lmg /media/usb/
root@remnux:/media/usb# chmod +x lmg

İndirilen LiME projesi USB bellekteki lime dizinine kopyalanır.
root@remnux:/media/usb/# mkdir lime
root@remnux:/media/usb/lime# tar xzvf /home/remnux/Desktop/lime-forensics-1.1-r17.tar.gz
doc/
doc/LiME_Documentation_1.1.pdf
src/
src/disk.c
src/lime.h
src/main.c
src/Makefile
src/Makefile.sample
src/tcp.c

lmg projesiyle beraber gelen yama uygulanır.

root@remnux:/media/usb/lime# cd src/
root@remnux:/media/usb/lime/src# cp /opt/lmg/lime-Makefile.patch .
root@remnux:/media/usb/lime/src# patch < lime-Makefile.patch
patching file Makefile

Profil oluşturmak için gerekli olan dwarfdump dosyaları kopyalanır.

root@remnux:/media/usb# tar -xzvf /opt/lmg/static-dwarfdump.tgz
dwarfdump/
dwarfdump/dwarfdump-i686
dwarfdump/dwarfdump.conf
dwarfdump/dwarfdump-x86_64

Son olarak “git clone https://github.com/volatilityfoundation/volatility.git” komutu ile Volatility Framework de USB belleğe indirilerek bellek hazırlanmış olur.

2. Hedef Sistemin Bellek Dökümünün Alınması:

Hazırlanan USB bellek hedef sisteme takılıp lmg betiği çalıştırılır.

root@remnux:/media/usb# ./lmg
Try to build LiME kernel module? [N|y] y
make -C /lib/modules/3.0.0-32-generic/build M=/media/usb/lime/src modules
make[1]: Entering directory `/usr/src/linux-headers-3.0.0-32-generic’
  CC [M]  /media/usb/lime/src/tcp.o
  CC [M]  /media/usb/lime/src/disk.o
…….
…….
make[1]: Leaving directory `/usr/src/linux-headers-3.0.0-32-generic’
  adding: module.dwarf (deflated 90%)
  adding: boot/System.map-3.0.0-32-generic (deflated 75%)

Terminalde VOLATILITY_PLUGINS çevre değişkeni, yeni oluşturulan Volatility profilinin değerine eşitlenerek profil Volatilitiy’e tanıtılır.

root@remnux:/media/usb# export VOLATILITY_PLUGINS=./capture/remnux-2014-09-17_09.39.37/

Bu şekilde eklenen profil görülebilir.

root@remnux:/media/usb# ./volatility/vol.py –info |grep Linux
Volatility Foundation Volatility Framework 2.4
Linuxremnux-2014-09-17_09_39_37-profilex86 – A Profile for Linux remnux-2014-09-17_09.39.37-profile x86
linux_banner               – Prints the Linux banner information
linux_yarascan             – A shell in the Linux memory image

Elde edilen bellek dökümü ve oluşturulan profil ile bir Volatility komutu çalıştırılarak doğrulama yapılması tavsiye edilir. Örnekte bellek dökümünün alındığı anda sistemde çalışan süreçler linux_pslist komutu ile başarıyla listelenmiştir.

root@remnux:/media/usb# ./volatility/vol.py -f capture/remnux-2014-09-17_09.39.37/remnux-2014-09-17_09.39.37-memory.lime –profile=Linuxremnux-2014-09-17_09_39_37-profilex86 linux_pslist

Volatility Foundation Volatility Framework 2.4
Offset     Name                 Pid             Uid             Gid    DTB        Start Time
———- ——————– ————— ————— —— ———- ———-
0xee4c8000 init                 1               0               0      0x2e5f6000 2014-09-17 11:48:55 UTC+0000
0xee4c8cd0 kthreadd             2               0               0      ———- 2014-09-17 11:48:55 UTC+0000
…………

0xe29fe680 kworker/0:0          1698            0               0      ———- 2014-09-17 13:34:39 UTC+0000
0xef6b3340 lmg                  1718            0               0      0x1c43d000 2014-09-17 13:39:36 UTC+0000
0xe3f78cd0 insmod               1984            0               0      0x1c439000 2014-09-17 13:40:07 UTC+0000
0xe2830cd0 kworker/0:3          1985            0               0      ———- 2014-09-17 13:43:52 UTC+0000