STMCTF'19 Write-Up Forensics Travel
Selamlar, bu yazımda STMCTF’19 yarışmasında sorulan Forensics
kategorisinden Travel
isimli sorunun çözümünü anlatacağım.
Soru dosyası : ubuntu16044x64.zip
Soruda ubuntu16044x64
isminde bir zip dosyası verilmiş. Zip dosyasını extract ettiğimizde içinden ubuntu16044x64.mem
isimli bir linux memory imaj dosyası çıkıyor. İmaj dosyasını açıp incelemek için volatility isimli araçtan yararlanalım. Volatility aracı memory imajlarını incelemek için geliştirilmiş bir araçtır. Gui ve konsol tabanlı sürümleri mevcuttur. Bu yazımda konsol tabanlı sürümü kullanacağım. Volatility aracı memory imajlarını incelerken profil dosyalarını kullanır. Windows sistemler için profil dosyaları sistem sürümüne göre hazır durumda volatility ile beraber gelmektedir. Fakat linux sistemler için hazır profil dosyaları volatility ile birlikte gelmediği için kendi profil dosyamızı oluşturmamız gerekir. Eğer bu profil dosyası oluşturulmazsa analizi gerçekleştirmemiz mümkün değildir. Profil dosyası canlı sistem üzerinden elde edilir. Öncelikle memory imajı verilmiş sistemi sanal ortama kurmamız gerekir. Sistemi kurarken kernel sürümü ve sistem versiyonu bilgisi memory imajı alınmış sistem ile aynı olmalıdır. Aksi takdirde doğru profil dosyası oluşturulmamış olacaktır ve analiz yapılamayacaktır. Profil dosyası, içerisinde iki dosya barındıran zip uzantılı bir dosyadır. Bu iki dosya System.map
ve module.dwarf
dosyalarıdır. Linux sistemi kurduğunuzda System.map
dosyası isminde kernel sürüm bilgisi de olacak şekilde /boot
dizini altında bulunur. Yaklaşık olarak 3-10 MB boyutlarında metin tabanlı bir dosyadır. Module.dwarf
dosyası ise hazır bir şekilde linux içinde bulunmaz. dwarfdump
isimli araç ile birlikte linux içerisinde oluşturulması gerekir.
Not : Yazının uzamaması için profil dosyası oluşturma aşaması yazılı olarak ifade edilmiştir.
Profil Dosyasının Hazırlanması :
1 - Profil dosyası hazırlanacak sistem üzerine dwarfdump
aracı kurulur.
2 - Volatility aracı indirilir ve volatility/tools/linux
dizini altına geçilir. Bu dizinde make
komutu ile module.dwarf
dosyası oluşturulur.
3 - /boot
altındaki system.map dosyası kopyalanarak ismi System.map
olacak şekilde oluşturulan module.dwarf
dosyası ile tek bir zip dosyası haline getirilir ve profil dosyası hazır duruma gelmiş olur.
Profil dosyası hazırlandıktan sonra analiz aşamasına geçilebilir. Analizi yapabilmek için oluşturulan profil dosyası(Ubuntu16044.zip) ../volatility/volatility/plugins/overlays/linux/
dizini altına kopyalanır.
Analiz aşamasının ilk adımı olarak profil dosyası ismini volatility içerisinden öğrenelim. Aynı zamanda profil dosyasını doğru yere kopyaladığımızdan da emin olmuş olalım.
Uygulanan Komut : sudo python2.7 vol.py --info | more
Profil ismini öğrendikten sonra volatility pluginleri ile birlikte prosesleri incelemeye başlayalım.
Uygulanan Komut : sudo python2.7 vol.py --profile=LinuxUbuntu16044x64 -f ubuntu16044x64.mem linux_pslist
Listelenen prosesleri incelediğimizde 3 farklı PID numarasına sahip python prosesi olduğunu görüyoruz.
Çalıştırılan python proseslerine ait python scriptlerini tespit edelim.
Uygulanan Komut : sudo python2.7 vol.py --profile=LinuxUbuntu16044x64 -f ubuntu16044x64.mem linux_enumerate_files | grep .py
İsimleri benzer olan 3 farklı python scriptini tespit etmiş olduk. Python scriptlerinin içeriğini görmek için export edelim. Export işlemi esnasında -i parametresiyle bir önceki komut çıktısında bulunan dosyaya ait inode number
verilmelidir.
Uygulanan Komut : sudo python2.7 vol.py --profile=LinuxUbuntu16044x64 -f ubuntu16044x64.mem linux_find_file -i 0xffff98c379e337c0 -O part1.py
Uygulanan Komut : sudo python2.7 vol.py --profile=LinuxUbuntu16044x64 -f ubuntu16044x64.mem linux_find_file -i 0xffff98c379e35110 -O part2.py
Uygulanan Komut : sudo python2.7 vol.py --profile=LinuxUbuntu16044x64 -f ubuntu16044x64.mem linux_find_file -i 0xffff98c379e300e8 -O part3.py
Sırasıyla 3 farklı python scriptini kaydettikten sonra kaynak kodları inceleyelim.
Her bir python scriptinin içinde base64 encoded data olduğunu görüyoruz.
Base64 encoded dataları decode ettiğimizde koordinatlar karşımıza çıkıyor.
Koordinat bilgileri sırasıyla haritaya flag değerini yazıyor. Bunun için gmplot
isimli bir araçtan yararlanalım. Gmplot aracıyla flagi haritaya yazdırmak için bir python scripti hazırlanmalıdır.(flag_draw.py) Bu python scripti çalıştırıldığında harita html uzantılı olarak oluşturulur. Html dosyasını browser ile açtığımızda flag değerini harita üzerinde görebiliriz.(my_map.html)
Flag değerini elde etmiş oluyoruz.
STMCTF{KEEPCALMANDSENDMETHEFLAG}
Yazımı okuduğunuz için teşekkürler, bir başka yazıda görüşmek dileğiyle..