Bu yazıda zararlı yazılımın ne olduğu ve türlerinden bahsedip, Malware analiz tekniklerinden biri olan Statik analizi anlatacağım. İlerleyen süreçte dinamik analiz kısmı da gelecektir.
Malware Analizin Amacı Nedir?
Malware analizin amacı anlayacağınız üzere zararlı yazılımı analiz ederek zararlı yazılım hakkında bilgiler sağlamaktır. Hedefi genel olarak zararlının amacı nedir, ne yapıyor, sistem üzerinde sızmak istediği ve zarar vermek istediği bölüm neresidir gibi soruları cevaplamaktır. Tabii bunları kendi ağınız içinde kontrol altına alarak tespit etmeniz gerekecektir.
Malware Analiz Teknikleri
Çoğu zaman zararlı yazılımı analiz ettiğinizde, sadece çalıştırılabilir (executable) zararlı yazılıma sahip olabilirsiniz ve bu kodlar insan tarafından okunamaz kodlar olabilir. Bu kodları anlamlandırabilmek için çeşitli araçlar ve püf noktalar bulunuyor. Resmin tamamını görmek ve analiz etmek için bizlere bu araçlar gerekecek.
Zararlı yazılım analizine iki temel yaklaşım vardır: Static ve Dynamic. Statik analiz zararlıyı çalıştırmadan incelemeye dayanır. Dinamik analiz ise zararlıyı kendi iç ağında çalıştırarak incelemeye dayanır. İki teknik de kendi içinde basit (Basic) ve gelişmiş (Advanced) olarak ikiye ayrılır.
Basit Statik Analiz (Basic Static Analysis)
Zararlı yazılımı çalıştırmadan incelemeye dayanır. Basit statik analiz, zararlı dosyaları tespit eder ve yazılımın işlevi hakkında bilgi verir. Basit statik analiz genelde etkisiz geliştirilen zararlı yazılımlar için kullanılır. Önemli bilgileri gözden kaçırabilir.
Basit Dinamik Analiz (Basic Dynamic Analysis)
Basit dinamik analiz, Zararlı yazılımı çalıştırarak sistem üzerindeki davranışını gözlemler. Zararlı yazılım sanal makinalar üzerinden incelenmeli aksi taktirde kendi sistemine hasar verebilir. Basit Statik ve basit dinamik analiz de analistler programlama tekniklerini bilmeden kullanırlar ve bunlar çok efektif değildir. Önemli bilgileri kaçırmaya neden olabilir. Önemli bilgileri kaçırması beraberinde risk de getirmektedir.
Gelişmiş Statik Analiz (Advanced Static Analysis)
Gelişmiş Statik Analizde, zararlının içeriğini öğrenmek için disassembler vb. bir araç içinde çalıştırılarak ve kaynak kodları incelenerek zararlı yazılımın ne yaptığı öğrenilir. Gelişmiş statik analiz, basit statik analize göre daha detaylı bilgiler verir fakat gelişmiş statik analiz için dissambley, kodlama, windows sistemi başta olmak üzere birçok bilgi gerekir.
Gelişmiş Dinamik Analiz (Advanced Dynamic Analysis)
Gelişmiş dinamik analizde, Malware çalıştırılarak yazılımın içeriği ve ne yapmak istediği öğrenilir. Bu yöntemle yazılım çalıştırılır ve yazılım hakkında çok detaylı bir inceleme yapılır. Bu teknik, Malware analizinde diğer yollar kullanılarak temiz ve kullanılabilir bilgi alınamadığı zamanlarda çok yararlıdır.
Malware Tipleri
Malware analizinde kullanılan teknikleri açıkladık fakat bazı yerlerde tahmin yürütmeniz de gerekebilir. Tahmin yürütmeniz için ise Malware tiplerini bilmek sizlere fayda sağlayacaktır. Malware tipini bilmek, analiz yaparken Malware özelliklerinden faydalanarak kategorisini tahmin edebilmenize olanak sağlayacaktır. Çoğu kötü amaçlı yazılımın dahil olduğu kategoriler şu şekildedir:
Backdoor: Backdoorlar sistemde çalıştığında kötü niyetli bir kişinin bilgisayara bağlanmasını sağlarlar ve saldırganın uzaktan sistemde kod çalıştırmasına olanak sağlarlar.
Botnet: Backdoor’un daha geniş çaplısı diyebiliriz. Botnetler ile bir komutu birden fazla bilgisayarda çalıştırabiliriz.
Downloander: Çalıştığı sisteme saldırganın istediği zararlı yazılımı indirir ve sisteme yükler.
Information-Stealing Malware: Çalıştığı sistemde kullanıcıya ait kritik bilgileri alarak saldırgana gönderir. şifreleri vb. bilgileri. Keyloggeri bu kategoride sayabiliriz.
Launcher : Bu zararlı program, çalıştığı sistemde başka bir zararlı yazılımı çalıştırır.
Rootkit : Genelde diğer zararlı yazılımlar ile birlikte kullanılır. Zararlı yazılımı gizleyerek kurbanın zararlıyı fark etmemesini sağlar.
Scareware : Bu yazılım tamamen kullanıcıyı korkutarak ona bir şeyler satmaya çalışır. Örneğin bir antivirus programı gibi görünür ve eğer bu antivirüsü almazsa bilgisayarının zarar göreceğini söyleyerek kullanıcıyı korkutur ve yazılımı almasını amaçlar.
Spam-sending malware : Saldırgan bu Malware ile hedef makineyi kullanarak spam gönderme işlemi gerçekleştirir. Saldırgan bu yol ile gelir elde edebilir.
Worm : Bu malware kendini kopyalar ve bütün sisteme yayılır. Stuxnet bu kategoriye girer.
Tabii zararlı yazılımlar birçok özellik içerebilirler. Bir malware birden fazla kategoriye ait özellik bulundurabilir.
Statik Analiz
Bu bölümde konuyu;
— Antivirüs araçları kullanarak yazılımdaki kötü niyetliyi bulma
— Hash kullanarak zararlı yazılımları doğrulamak
— Dosyanın fonksiyonlarından, başlığından ve yazı tipinden bilgi toplamak
başlıkları altında ele alacağım.
Antivirüs ile Tarama
Antivirüs programları bir bakıma zararlı yazılımları engelleyebilirler fakat tam anlamıyla mükemmel çalışmazlar. Antivirüsler, veri tabanlarındaki kod parçaları üzerinde tarama yaparak, malware davranışları ve hash eşleştirme ile zararlı yazılım olup olmadığını kontrol eder. Buradaki problem ise saldırgan kolaylıkla kodda değişiklik yaparak programın imzasını değiştirerek antivirüslerden kaçınabilir. Nadir görülen ve daha önce hiç benzeri bulunmayan zararlı kodlar da antivirüsten rahatça geçer çünkü veri tabanına kayıtlı değillerdir.
Virustotal gibi siteler malware için çoğu antivirüs programında tarama yaparak sonuçları gösterir.
Hashing ile
Zararlı yazılımın hashini alarak bu aldığınız unique hashi online olarak taratıp zararlı olup olmadığını kontrol edebilirsiniz ve bu hashi paylaşarak zararlı olduğunu bildirebilirsiniz. WinMD5 gibi uygulamalar ile hashini alabilir ve taramasını yapabilirsiniz.
Stringler ile
Stringler ile zararlı hakkında birçok bilgi alabiliriz. Bu nedenle Stringler bizim için önemli bir rol oynar. Bir program stringi ile yazılımın ne iş yaptığını, hangi mesajları yazdırdığını, URL bağlantılarını ya da kopyalanan dosyaların yolunu öğrenebiliriz. Stringler ASCII ve Unicode formatında bulunabilir. Bu nedenle bunları da çözümlememiz gerekebilir.
Strings kullanarak yazılıma string taraması yapabiliriz. strings, ASCII ve Unicode stringleri içinde arama yaptığında analiz yapmadan direkt olarak 3 veya daha fazla harfli kelimeleri döndürüyor. Bazen string taraması memory adres ve CPU talimatları gibi şeyler döndürebilir. Bunların filtrelemesini kullanıcıya bırakır. Eğer string gereğinden kısa ve bir anlamı yoksa büyük ihtimalle anlamsızdır.
Yukarıdaki resimde görüldüğü gibi bir yazılımın string değerlerini görüyoruz. Birlikte analizini yaparak programın amacını öğrenelim. Bu değerleri analiz etmeye kısa ve anlamsız olanlarını elemekle başlıyoruz. Bunlar büyük ihtimalle işimize yaramayacak olanlardır. Geriye kalan satırları numaralandırıp ele alırsak, 1 ve 2 numaralı stringler yüksek ihtimalle windows fonksiyonlarıdır. Bu kanıya birleşik şekilde bulunan iki kelimenin baş harflerinin büyük olmasından varıyoruz. Bu windows fonksiyonları da işimize yaramayacağından eliyoruz.
3. seçeneğe bakınca DLL uzantılı bir dosya olduğunu görüyoruz. Bu dosyanın işimize yarayacağını düşünüp bir kenara alıyorum. Cebimizde kalsın. 4. seçeneğe baktığımızda ise karşımıza bir IP adresi çıkıyor. Zararlının kullandığı IP adresinin bu olduğunu düşünüyoruz ve son olarak 5. seçeneğe bakınca herşey yerine oturuyor. En çok işimize yarayacak bu kısımda zararlının bir DLL uzantısı kullanarak mail gönderdiğini öğreniyoruz.
Email loglarını inceleyerek diğer kullanılan DLL ler de incelenebilir. Fakat dikkat edilmesi gereken asıl konu zararlıların her zaman DLL dosyaları olmadığıdır. Zararlı yazılım, DLL dosyasını da kullanabilir.
Paketlenmiş ve Gizlenmiş Malware
Malware yazarları, zararlının tespit edilmesini zorlaştırmak için paketleme ve gizleme yollarına başvurur. Her iki teknik de bizleri analiz yaparken oldukça zorlayacaktır.
Zararsız yazılımlar genellikle birçok string içerirler. Gizlenmiş veya paketlenmiş zararlılar ise çok az string içerirler. Eğer zararlıyı analiz etmeye başlarsanız elinizde inceleme yapacağınız pek bir string yok ise büyük ihtimalle bu zararlı paketlenmiş veya gizlenmiştir ve bunu detaylı araştırmak için statik analiz yeterli olmayacaktır.
Dosyaları Paketleme
Paketlenmiş yazılım çalıştığında arka tarafta küçük sarmalayıcı (wrapper) program çalışarak paketlenmiş yazılımı açıp, paketlenmemiş şekilde çalıştırır. Paketlenmiş programı statik olarak analiz etmek istediğimizde ulaşabileceğimiz tek veri sarmalayıcı program olacaktır ve sadece onu analiz edebiliriz.
Resimde de gördüğünüz gibi orijinal dosyada verilere ulaşmamız mümkünken sağ taraftaki sarmalayıcı (wrapper) programa baktığımızda herhangi bir veriye ulaşmamız statik analiz araçları ile çok mümkün değildir.
PEID ile paketleyiciyi analiz etmek
Paketlenmiş dosyayı analiz etmek için bir yol bulunuyor. Bu da PEID programı ile gerçekleştiriliyor. Paketleyicinin veya derleyicinin tipini öğrenmek için PEID programı kullanılabilir. Bu bilgi analizi daha kolay bir hale getirir.
PEID programını kullandığımızda, dosyanın UPX 0.89.6–1.02 veya 1.05–2.90 tarafından paketlendiğini söylüyor. UPX hakkında detaylı bilgi ileri kısımlarda anlatılacaktır.
Bir program paketlenmişse, analiz edebilmek için paketi açmak gerekir. Paket açma işlemi oldukça komplex ve kapalı birşeydir. UPX oldukça popüler ve kullanımı basit bir programdır. Örneğin UPX kullanarak bir paketi açmak aşağıdaki gibidir.
upx -d PackedProgram.exe
NOT: Birçok PEID programında zafiyet bulunmaktadır. Örneğin PEID 0.92 versiyonu buffer overflow zafiyeti içermektedir. Akıllı bir malware yazarı, malware içine bu zafiyeti sömürecek kodda ekleyebilir. Bu nedenle kullandığınız PEID versiyonunun son sürüm olmasına dikkat edin.
Çalıştırılabilir Dosya Formatları
Şimdiye kadar dosya formatına bakmadan çalışan araçları inceledik. Analizde dosya formatları da oldukça önemli olabiliyor. Dosya formatları programların fonksiyonları hakkında bilgileri ortaya çıkarabiliyor.
Taşınabilir yürütebilir dosya (The Portable Executable) formatları, Windows programları, kodları ve DLL’leri tarafından kullanılmaktadır. PE (The Portable Executable) dosya formatı, windows işletim sistemi yükleyicisinin sarılmış yürütülebilir kodu yönetmesi için gerekli bilgileri içeren bir veri yapısıdır. Şuan Windows’ta yürütülebilen hemen hemen bütün dosyalar PE formatındadır.
PE dosyaları kod hakkında bilgi ve kütüphane fonksiyonları hakkında bilgiler içeren header ile başlar. PE header, malware analisti için harika haberler içerir.
Bağlantılı kütüphaneler ve fonksiyonları
İmport ile bir program birçok farklı programın fonksiyonlarını kullanabilir. Linking ile birçok program ile bağlantı kurulabilir. Kütüphane kodları statik, dinamik ve çalışma zamanında (runtime) linking edilebilir. Kütüphane kodlarının nasıl bağlandığı bizim malware’i anlamamızda çok kritiktir çünkü bu bilgi bize PE dosya headeri ile kütüphane kodunun nasıl bağlandığını gösterir. Sıradaki bölümde bunun için kullanılan araçları tartışacağız.
Statik, Çalışma Zamanında ve Dinamik Linking
Statik linking, kütüphane linking için en az kullanılan metottur. Genellikle linux ve unix sistemlerde kulllanılır. Bir kütüphane statik olarak zararlıya bağlandığında, kütüphanenin bütün kodları zararlıya kopyalanır ve zararlının kendi kodu olup olmadığını ayırt edemezsiniz. PE headerı da bu bilgiyi içermez.
Çalışma zamanında linking de genelde kullanılan yollardan biridir. Özellikle paketlenmiş ve gizlenmiş zararlılar da çok kullanılır. Program çalıştığı gibi kütüphaneler eklenmez. Sadece gerekli fonksiyonlarda çağrılırlar. Dinamik Linking de olduğu gibi sadece işi olduğunda gelir.
Birkaç Windows fonksiyonu, programın headerında belirtilmeyen kütüphanelere erişmesine olanak tanır. Bunlar LoadLibrary ve GetProcAdress’dir. Bunlar zararlının sistemdeki herhangi bir kütüphaneye erişmesine izin verirler. Bu, fonksiyonlar kullanıldığında zararlının nasıl bir linking yaptığını öğrenemeyeceğimiz anlamına geliyor.
Bütün metotlar içinden dinamik linking en çok kullanılan metot ve malware analistler için en ilgi çekici yöntemdir. Dinamikte, program kütüphaneyi çağırdığında hangi fonksiyon ile çalıştırıldığını öğrenmiş oluyoruz.
Dependecy Walker ile Dinamik Linking Fonksiyonlarının Keşfi
Dependency Walker programı, dosyanın sadece dinamik olarak bağlantılı olan fonksiyonlarını gösterir.
Yukarıdaki resimde Dependecy Walker programının arayüzü bulunuyor. PAYLOAD.EXE adında bir zararlı eklediğim arayüzde bazı numaralar bulunmakta. 1 Numara zararlımızın adını veriyor bizlere. 2 Numara ise import ettiği DLL dosyalarını bizlere gösteriyor. Herhangi birine tıkladığınızda, 3 numarada bu DLL dosyasının import ettiği fonksiyonlar resimdeki gibi gözükür. Bu kısmı detaylı inceleyerek zararlının amacını anlayabiliriz. Örneğin bizim zararlımız dosya kopyalama ve yeni bir directory oluşturma işlemleri gerçekleştiriyor. 4 numaralı bölüm ise DLL dosyamızın import edebileceği fonksiyonları gösteriyor. Burası bizim için en önemsiz yer. Son olarak 5 ve 6 numaralı bölümler ise zararlı çalıştıktan sonra yüklenecek olan DLL dosyalarını ve oluşacak hataları listeliyor.
Bir programın DLL dosyaları programın bütün işlevi hakkında bilgi verir. Aşağıdaki tabloda bazı DLL dosyaları ve açıklamaları bulunuyor.
PE Dosya Başlığı ve Bölümleri
PE (The Portable Executable) dosya başlıkları, içe aktarılan fonksiyonlardan çok daha fazla bilgi aktarabilir. Başlıklar, dosyalar hakkında metadatalar da içerir. Dosya başlıklarının bölümlerini dikkatlice incelediğimizde çok önemli bilgilere ulaşabiliriz. PE dosyasının en ilgi çekici bölümlerini ele alacak olursak;
.text Bölümü CPU’nun yürüttüğü talimatları içerir. Sadece bu bölüm execute edilebilir ve kod içeren tek bölüm olmalıdır.
.rdata Bölümü ise genelde import ve export bilgilerini içerir. Bu bilgilere Dependency Walker ve PEview ile ulaşılabilir. Bu bölüm aynı zamanda diğer read-only verileride bir program kullanarak depolayabilir.
.data Bölümü program hakkındaki genel verileri içerir. Hangi verinin programın neresine erişebileceği gibi bilgileri içerir.
.rsrc Bölümü execute dosyasının kullandığı fakat kabul etmediği kaynakları içerir. İkonlar, fotoğraflar, menüler gibi.
Yukarıdaki tablodan PE dosyasının diğer bölümleri hakkında bilgi alabilirsiniz.
PEview ile PE dosyalarını incelemek
PE (The Portable Executable) dosya formatlarının başlıkları içinde çok ilginç bilgilere ulaşılabilir. PEview aracını kullanarak bu bilgileri daha yakından inceleyeceğiz.
Yukarıdaki görselde PEview aracının arayüzü görülmektedir. 1 numaralı kısımda PE başlığının (header) ana parçaları görülmektedir. IMAGE_FILE_HEADER seçili olduğundan dolayı vurgulu olarak gözükmektedir. İlk iki seçenek yani IMAGE_DOS_HEADER ve MS-DOS-Stub Program tarihsel şeylerdir ve bizim için ilgi çekici bilgiler içermezler. IMAGE_NT_HEADERS ise NT (Windows NT Startup File) başlığını gösterir. Bu bölümün altındaki kısımlara bakacak olursak, Signature yani imza kısmı sürekli aynıdır. İşimize yarar bir bilgi alamayız. IMAGE_FILE_HEADER kısmına geldiğimizde görselde ekranın sağ tarafındaki bilgiler görülüyor. 2 numaralı alanda dosya hakkında basit bilgiler veriliyor. 3 numaralı alanda ise bu dosyanın ne zaman derlendiğini görebiliriz. Bu malware analizi için oldukça önemli bir bilgidir.
Örneğin derlenme tarihi eski ise bu bize bunun eski bir atak olduğunu gösterir ve antivirüs programlarının bu yazılımın imzasını içerebileceğini anlıyoruz. Eğer derlenme zamanı yeni bir tarih ise bu da bize tam tersi bir bilgi sağlar.
Bunun yanında bazı hatalara düşmemek gerekir. Bütün Delphi programları 19 Haziran 1992 derleme tarihini kullanır. Bu tarihli bir derleme tarihine sahip program görürseniz bu büyük ihtimalle delphi programıdır ve bu programın gerçek derlenme zamanını bilmediğimiz anlamına gelir. Malware yazarları rahatlıkla derleme zamanını değiştirebilir yani anlamsız bir derleme tarihi görürseniz bu büyük ihtimalle sahte bir tarihtir.
IMAGE_OPTİONAL_HEADER bölümü birkaç önemli bilgi içerir. Örneğin programın bir GUI program veya konsol program olup olmadığını buradan anlayabiliriz.
En ilginç bilgileri IMAGE_SECTION_HEADER bölümlerinden alabiliriz. Bu bölümler PE dosyasının her bir bölümünü açıklarlar.
Görselde 1 numaralı kısıma bakarsak Virtual Size bölümünde processin yüklenme süresinde hafızada ne kadar alan tahsis edilmiş bunu öğrenebiliriz. 2 numaralı kısımda ise programın diskte ne kadar büyüklükte alana sahip olduğunu gösterir. Bu iki değeri karşılaştırdığımızda neredeyse aynı değeri vermeliler. Ufak farklılıklar normaldir. Farklılık olması durumunda ise bazı durumlar ortaya çıkabilir.
Örneğin virtual size, Size of Raw Data değerinden büyük olursa buradan dosyanın hafızada diskten daha fazla yer ayırttığını anlarız. Bu da bize dosyanın paketlenmiş olabileceğini gösterir.
Fakat aradaki dosya boyutunda fark göremezsek bu bizi yanıltmasın çünkü bu dosyanın zararlı olmadığı anlamına gelmez sadece paketlenmemiş olduğu anlamına gelir.
Referanslar:
Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software