Hüseyin Altunkaynak Kişisel Blog

Malware Analizi - 03

Malware Analizi

Malware Analizi serisinin ilk bölümüne ulaşmak için: Malware Analizi - 01

Analiz

RegShot

Bu eğitimde bir keylogger programını analiz edeceğiz. Analizimize ilk olarak Registry kayıtları ile başlıyoruz. Keyloggerı çalıştırmadan önce RegShot programını açıp kayıt defterinin bir görüntüsünü alıyoruz. Ardından keyloggerı çalıştırıyoruz. Ekrana herhangi bir şey gelmiyor, ama keyloggerın davranışını bildiğimiz için arkaplanda çalışacağını biliyoruz. Kısa bir aranın ardından kayıt defterinin ikinci görüntüsü alıyoruz ve karşılaştırıyoruz. Kayıt defteri üzerine eklenen yeni keyler, yeni değerler ve modifiye edilen değerleri bize listeliyor.

RegShot02

Bu satırlardan ilgilimizi çekenleri inceleyelim.

  • HKLM\SOFTWARE\Microsoft\Security Center\Svc\Vol
    • Windows güvenlik merkezindeki uyarılar ile ilgilenen \Svc kaydının altına yeni bir key ekliyor. Buradaki amaç bize güvenlik duvarı tarafından hiçbir uyarı gösterilmemesidir. Zararlımız kendini yavaş yavaş açığa çıkartmaya başladı.
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools: “00000002”
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr: “00000001”
    • Bu iki kayıt ise Kayıt Defteri ve Görev Yöneticisini disable etmek için eklenmiş olan değerlerdir.
  • HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run\DirectX For Microsoft® Windows: “C:\\Windows\\Temp\\dxvr.exe”
    • Burada ise sistem her açıldığında otomatik olarak başlamak için \Run keyi altına kendisini DirectX programı değeri olarak ekliyor. Bu arada keylogger çalıştığında yeni bir dosya oluşturduğunu da teyit etmiş olduk. Üstelik simgesini de DirectX Diagnostic Tool (dxdiag.exe) un simgesi olarak değiştirmiş.
  • HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\SystemRestore\DisableSR: “00000001”
    • Sistemin geri yükleme yapmasını engellemek için \SystemRestore altındaki \DisableSR değerini değiştiriyor.
  • HKLM\SOFTWARE\Microsoft\Security Center\cval: 0x00000001
    • “User Account Control” tarafından verilen bir uyarı olan “Bu programı gerçekten çalıştırmak istiyor musunuz?” sorusunu atlamak için değiştirilmiştir. Kullanıcının hiçbir şeyden şüphelenmemesi lazım :)

FakeDNS

fakedns

Zararlımız ilk aşamada hiçbir yere bağlanmaya çalışmıyor. Tetiklenmek için bir zamanı bekliyor olabilir ya da hiç öyle bir özelliği olmayabilir. Bunu ilerleyen aşamalarda kullandığı API’leri de inceleyerek daha da derine inip analiz edeceğiz.

Strings - 01

strings02

Bu satırlardan bizim için önemli olanları inceleyelim.

  • 00000050 This program must be run under Win32
    • Programın DOS HEADERındaki uyarı mesajıdır.
  • 000002F8 UPX0
  • 00000320 UPX1
    • Programın UPX ile packlendiğini gösteriyor. İlerleyen aşamalarda unpacking işlemine değineceğiz.
  • 0007C174 KERNEL32.DLL
  • 0007C181 ADVAPI32.DLL
  • 0007C18E COMCTL32.DLL
  • 0007C19B GDI32.DLL
  • 0007C1A5 OLEAUT32.DLL
  • 0007C1B2 USER32.DLL
    • Program tarafından import edilen DLL dosyalarımız.
  • 0007C1BE LoadLibraryA
  • 0007C1CC GetProcAddress
  • 0007C1DC VirtualProtect
  • 0007C1EC VirtualAlloc
  • 0007C1FA VirtualFree
  • 0007C208 ExitProcess
  • 0007C216 RegCloseKey
  • 0007C224 ImageList_Add
  • 0007C23A GetDC
    • Program tarafından kullanılan fonksiyonlar. Programımız packlendiği için kullanmış olduğu diğer fonksiyonları şu an göremiyoruz ama bu hiç göremeyeceğimiz anlamına gelmiyor :)
  • Strings aracımız en altta Unicode stringleri de bulduğunu söylüyor. Biraz inceledikten sonra şimdilik bizim için hiçbir şey ifade etmediğini anlıyor ve bu kısmı atlıyoruz.

DiE (Detect it Easy)

Zararlımız packlendiği için içerisindeki stringleri alırken fazla başarılı olamadık. Zararlımız hakkında işimize yarayacak bilgiler bulmaya devam etmek için zararlıyı DiE programına veriyoruz.

die02

Zararlımızın UPX ile packlendiğini doğruluyoruz. Bunun üzerine upx toolu ile zararlımızı unpacking işlemine tabi tutmamız gerekiyor. Upx toolumuzun olduğu dizine gidip cmd üzerinden unpacking işlemini gerçekleştiriyoruz.

upx01

C:\Users\Win7\Desktop\Program\upx-3.95-win64> upx.exe -d ..\..\malware.exe -o ..\..\unpacked_malware.exe

die03

Unpack ettiğimiz zararlımızı tekrar DiE ye verdiğimizde unpack işleminin başarılı bir şekilde olduğunu görüyoruz. Şimdi string çıktılarına tekrar bakalım.

Strings - 02

strings03

Şimdiki çıktımız biraz daha anlamlı oldu. Unicode kısmında çok fazla anlamlı stringler belirdi. Bu çıktımızı da biraz inceleyelim.

  • 000CA426 st:araweb.info
  • 000CA436 sa:agpano.com
    • İki tane URL gözüme çarptı. Remnux üzerinde çalıştırdığım FakeDNS programına araweb.info nun düştüğünü farkettim. Başlarda pek dikkatimi çekmemişti ama sonradan stringler içinde bu URLleri görünce zararlımız tarafından internet üzerindeki bu adreslere veri göndermek ya da almak için istek yapıldığını anlamış olduk.
    • fakedns02
  • 000797A6 chat
  • 000797AB exefile
    • Zararlıyı unpack etmeden önce incelediğimizde unicode kısmında görmüş olduğumuz stringler burada karşımıza çıktı. Daha da ilginci sonraki iki satırda \Temp altında iki tane dosya yolunun çıkmasıydı. Buüyük ihtimalle yukarıdaki chat ve exefile zararlının dosya export ederken kullandığı belirteçlerdi.
  • 000797B4 \Temp\dxvr.exe
  • 000797C3 \Temp\dxvr.txt
    • Bu iki dosya hakkındaki şüphemizi doğrulamak için \Temp altını bi kontrol edelim.
    • strings04
    • Aslında RegShot ile kayıt defteri değişikliklerini incelerken bunu farketmiştik ama dosyayı fazla incelemedik. Dosyanın özelliklerine baktığımızda yetkilerinin Administrator olduğunu farkediyoruz. Kendisine dxdiag.exe nin simgesini de eklemiş. Administrator yetkileri ile de çalıştığı için son kullanıcı açısından kendisininin silinmemesi gereken bir program olduğu mesajını veriyor, fakat durum hiç de göründüğü gibi değil. Şimdilik bu dosyamızı masaüstüne alalım, analizimizin ilerleyen safhalarında yardımcı olacaktır.
  • 00079860 reg add “HKLM\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List” /v”
  • 00079A78 reg add “HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore” /v “DisableSR” /d
    • Kayıt defterinde yapılan değişiklikleri incelerken bu değerlerde oynama yapıldığını farketmiştik. Bu stringlerle de teyit etmiş olduk.
  • 000002F8 .text
  • 0000031F `.data
  • 00000348 .tls
  • 00000370 .rdata
    • DOS HEADER dan hemen sonra gelen bu başlıklar aslında zararlımızın unpacked olduğunu gösteriyor. Packlenmiş olan bir programda bu bölümler olmaz.

PEview

Zararlımız hakkında baya bi bilgi sahibi olduk, fakat dosya formatı olan PE ile alakalı hiç inceleme yapmadık. PEview aracı ile önceden bulduğumuz çoğu bilgiyi doğrulayacağız ve dinamik analize geçmeden önce elimize daha fazla bilgi geçmiş olacak. İncelemeye başlayalım.

peview02

İncelemeye ilk olarak unpacking işlemine soktuğumuz malware.exe den başlıyoruz. Strings ve DiE dan aşina olduğumuz UPX0 ve UPX1 leri burada görüyoruz. Zararlımız packlendiği için pek fazla bilgi içermiyor. İncelememize unpacked_malware.exe üzerinden devam edelim.

IMAGE_DOS_HEADER

peview03

Bu bölüm eski sistemlere uyumluluk açısından eklenmiştir.

peview04

Bu bölümde dikkat etmemiz gereken bir tek yer var, asıl programın çalışacağı kısmın File Offset’i.

File Offset: Programın disk üzerindeki konumunun adresidir.

Adres Türleri

İlerleyen bölümlerde üzerinde sıklıkla duracağımız, sürekli karıştırılan bir noktayı aydınlatalım. PE dosya formatını incelerken 3 farklı adres türünden bahsedeceğiz.

  • File Offset: Dosyadaki elemanların disk üzerinde bulunduğu adrese verilen isimdir.
  • VA (Virtual Address): Dosya hafızaya yüklenip tüm hizalamalar yapıldıktan sonra elimizde olan bir elemanın adresine verilen isimdir.
  • RVA (Relational Virtual Address): Dosya hafızaya yüklendikten sonraki başlangıç adresi (ImageBase) ile aradığımız elemanın oraya olan uzaklığıdır.

MS-DOS Stub Program

Bu bölüm de bir önceki bölüme bağlı olup MS-DOS olan bir sistemde ekrana yazılacak mesajın bulunduğu bölümdür. Üzerinde fazla durmaya gerek yok.

IMAGE_NT_HEADERS

peview05

Bu bölüm asıl programımız hakkında genel bilgi veriyor. Dikkat ettiyseniz IMAGE_DOS_HEADER kısmında bulmuş olduğumuz File Offset ilk satırda kendini gösterdi.

  • Signature kısmında IMAGE_NT_SIGNATURE stringi var. Bu string dosyanın PE dosyası olduğunu belirtiyor.
  • IMAGE_FILE_HEADER kısmı bizim için çok önemli bilgiler içeriyor. Açıklama kısımlarından referans alarak sırasıyla gidelim.
    • peview06
    • Machine: Programın çalışabileceği ortamı gösteriyor. x86 sistemlerde çalışabilirmiş.
    • Number of Sections: Data kolonunda verilen 0008 değeri kadar SECTION olduğundan bahsediyor. Program çalışma anında bu değeri referans alarak parse etme işleminin bittiğini anlıyor. Soldaki menüden SECTION kısımlarını sayarak teyit edebiliriz.
    • Time Date Stamp: Programın ne zaman linklendiği ile ilgili bilgi veriyor. Bu kısım istenildiği zaman değiştirilebilir.
    • Size of Optional Header: IMAGE_OPTIONAL_HEDAER kısmının Data kolonunda verilen 00E0 değeri kadar uzun olduğunu söylüyor. Programın düzgün çalışması için gereken bir değerdir.
    • Characteristic: Bu kısımdaki başlıklarda programın türü hakkında bilgiler veriyor.
      • IMAGE_FILE_EXECUTABLE_IMAGE: Çalıştırılabilir dosya olduğunu gösteriyor.
      • IMAGE_FILE_32BIT_MACHINE: 32BIT makinede çalışabileceğini gösteriyor.
      • NOT!: İncelediğimiz dosya bir DLL dosyası olsaydı IMAGE_FILE_DLL diye bir kısım olacaktı.
  • IMAGE_OPTIONAL_HEADER bölümü isminin azizliğine uğramış opsiyonel gibi görünen ama hiç de öyle olmayan bir bölümdür. Ne ki, içerisinde programı debug ederken yardımcı olacak bir çok kısım barındırmaktadır.
    • Address of Entry Point: Çalıştırılabilir dosyaların başlangıç noktasının RVAsını gösterir. Genellikle .text sectionında bir yer tutar.
    • Image Base: PE formatının yükleneceği adresi bu kısma yazar. Genel olarak 32 bit exe için bu kısımda 0x00400000 (4MB) bulunur. Eğer programda ASLR açık değilse program çalışmaya bu adresten başlar. Bütün programların bu adresten başlamak isteyeceğini varsayarsak nasıl karışmıyor diye bir soru gelebilir. Dosya içinde bulunan Relocation bilgisi ile dosya farklı bir adresten itibaren yüklenir.
    • Section Alignment: Bu değer bölümlerin yüklenirken nasıl bir sıralamaya uyacağını gösterir.
    • File Alignment: Bölümlerin diskte hangi değerin katlarına uygun olarak sıralanacağını belirtir.
    • Size of Image: Dosyadaki bölümlerin toplam boyutunu tutar.
    • Size of Headers: PE headerın ve section tablosunun boyutunu tutar.

peview09

Sol menüdeki SECTION .idata içerisinde programın çalışması için import edilen DLL dosyaları ve bu dosyaların içerisinde hazır bulunup import edilen fonksiyonların listesi var. String analizi yaparken zaten bu stringlere ulaşmıştık ama biraz dağınıktı, burada ise adresleri ile birlikte bulunuyor. İmport edilen her fonksiyon program tarafından kullanılmayabilir. Bu durumu dinamik analizi yaparken inceleyeceğiz, fakat bütün fonksiyonları incelemekten ziyade bir zararlı yazılımı zararlı yapan API’lere odaklanacağız. Bir zararlı yazılım tarafından kullanılabilecek ve bizim açımızdan tehlike arz eden fonksiyonların bir listesini bölüm sonunda vereceğiz.

Buraya kadar her şey anlaşıldıysa can alıcı bir noktaya daha değinmek istiyorum. Dikkatinizi sol menüdeki SECTION’lardan .rsrc ye çekmek istiyorum. Bu bölüm bir PE dosyasının kaynaklarını içerir. Kaynaklar ise örneğin ikonlar, menüler, diyaloglar, sürüm bilgisi, yazı tipi bilgisidir, fakat aynı zamanda isteğe bağlı herhangi bir şey olabilir. Dikkatli olunmaması halinde zararlı yazılımımızı çok kolay ele verebilir.

peview07

SECTION .rsrc yazan yerin solundaki +’ya basınca karşımıza uzun bir liste çıkıyor. Yukarıda bahsettiğimiz kaynaklardan herhangi biri olabilir, fakat aşağılarda EXEFILE adında ilgimizi çeken bir kaynak var.

peview08

Burada programın içindeki kaynaklarda bir exe dosyası daha var. \Temp altına atılan dxvr.exe dosyası buradan export edilip yüklenmiş olabilir. Bu dosyayı export edip dxvr.exe ile karşılaştıralım. Export edebilmek için alanında kendini kanıtlamış olan ResHacker adlı toolumuzu kullanacağız.

ResHacker (Resource Hacker)

reshacker02

ResHacker toolumuzu açıp soldaki listeden EXEFILE’ı seçtikten sonra içerisindeki CHAT yazısına sağ tıklayıp Save *.bin resource seçeneğine tıklayıp dosyamızı chat.exe adıyla masaüstüne kaydediyoruz.

reshacker03

chat.exe yi export edince dxvr.exe ile simgelerinin aynı olduğunu fark ediyoruz. Simgelerinin aynı olması içeriğinin aynı olacağı anlamına gelmiyor, biz de hemen dosyaların MD5Hashini aldık. Bir de ne görelim, iki dosyanında hashi aynı :) Program çalıştıktan sonra kaynaklarının içerisindeki çalıştırılabilir dosyayı dxvr.exe adı ile export edip Administrator yetkileri ile çalışmasını sağlıyor. Daha dinamik analize geçmeden elimizde hatırı sayılır bilgi oldu. Dinamik analize geçmeden önce dxvr.exe’ye aynı adımları uygulayıp elle tutulur bir şeyler çıkıyor mu kontrol edelim.

dxvr.exe

dxvr01

Dosyamızı DiE’ye verince bize UPX ile packlendiğini söylüyor. Hemen unpacking işlemine sokup PEview ile incelemeye devam edelim.

C:\Users\win7\Desktop\Program\upx-3.95-win64> upx.exe -d ..\..\dxvr.exe -o ..\..\unpacked_dxvr.exe
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2018
UPX 3.95w       Markus Oberhumer, Laszlo Molnar & John Reiser   Aug 26th 2018

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
    689152 <-    265216   38.48%    win32/pe     unpacked_dxvr.exe

Unpacked 1 file.

dxvr02

Dosyamızı PEview ile incelerken import edilen WININET.DLL gözümüze çarpıyor. Import Address Tableda bu DLLden import edilen fonksiyonu buluyoruz. InternetGetConnectedState fonksiyonu internet bağlantımızın olup olmadığını sorguluyor. Kurmuş olduğumuz Virtual Network internete çıkmadığı için bazı fonksiyonlar tetiklenmemiş olabilir. Büyük olasılıkla bu yüzden Wiresharktan uygulamaya dair bir bağlantı yakalayamadık. Elimizde yeterince bilgi oldu sanırım. Zararlı yazılımların kullandığı takdirde bizim için sıkıntı çıkarabilecek DLL ve içerdikleri fonksiyonları inceleyelim.

all tags