08 Kasım 2017

Bir Zararlı Yazılımın Anatomisi - Bölüm 1

Zararlı yazılımlar gittikçe önemi artan ve savunanlar tarafından en az bilinen güvenlik tehditlerinden birisi. Mevcut bir zararlı yazılımı internette örneklerinin yayınlandığı bir siteden indirerek, uygun ve güvenli bir laboratuvar ortamı kurarak statik ve dinamik analiz yapabilirsiniz. Ancak biz zararlı yazılımın en net ve etkili biçimde anlaşılması ve anlatılabilmesi için böyle bir yazılımın geliştirilmesi ve sonuçlarının test edilmesi yöntemini seçtik.

Zararlı yazılım örneğimiz görünürde bir fatura pdf dosyası gibi davranacak, ancak arka planda bir sunucudan asıl çalıştıracağı payload’u çekerek bu payload’u çalıştıracak. Buradan sonrası payload’un amacının ne olduğuna bağlı olacak.
İlerlemeden önce böyle bir makaleyi neden geliştirdiğimizi ve değerlerimizi ifade etmemiz lazım.

AHLAKİ SORUMLULUK

Bu makalede bir zararlı yazılımın, üstelik de bazı yönlerden çok ileri tekniklerle geliştirilmesini anlatmamızın sebebi savunan tarafa bu bilgilerin hemen hemen hiçbir kaynakta net ve anlaşılır biçimde aktarılmamasıdır. Saldırı yöntemini saldırgan kadar iyi anlayamayan bir savunan çaresiz kalacak, güvenlik ürün satıcılarının anladıkları ve dillerinin döndüğü kadar anlattıkları vaatler doğrultusunda satın almalar yapacak, ama yine de zararlı yazılımların hışmından kurtulamayacaktır. Zararlı yazılımların hışmına herkes uğramaktadır ve tamamen engellenmeleri çok zor olabilir, ancak zararlının amacını, daha ne kadar sisteme bulaşmış olabileceğini ve tam olarak neleri yapmış olabileceğini anlayamamak da ayrıca kahredici olmaktadır. Savunanların da saldırganlar kadar ileri teknik bilgiye sahip olabilmeleri için bu araştırmayı gerçekleştirdik ve sizlerle paylaşıyoruz. Güvenlik alanına merak salan ancak yaşı genç olan arkadaşlarımızın da başlarını belaya sokmamalarını güvence altına almak için kodun aslında basit, ancak kopyala yapıştırla birşeyler yapmak isteyecek birinin işini zorlaştıracak kısımlarını yayınlamıyoruz. Bu nedenle bu arkadaşlar için biraz daha olgunlaşıncaya kadar okumaya devam etmelerini ve faydalı olabilmeleri için sabırla çalışmaya devam etmelerini tavsiye ediyoruz. Zira burada onlar için hızlı bir heyecan yolu sunmuyoruz, bu yolu arayanlar için şu araçla şöyle saldırılır tarzı makaleler zaten çok miktarda var.

HAZIRLIKLAR

Uygulamamızı bir Console Application proje şablonu seçerek geliştirmeye başlıyoruz.


Application type’ı Windows application olarak değiştirelim, çünkü uygulama çalıştığında bir konsol görmek istemeyeceğiz. Ayrıca Empty project kutusunu seçelim, çünkü Visual Studio şablonunu kullanmayacağız.


Projemize bir kaynak dosyası ekleyelim.


Projemize drop ederek açacağımız sahte bir fatura pdf dosyasını resource olarak ekleyeceğiz. Bunun için Add / Resource menüsünü açalım.
Import menüsünden Fatura.pdf dosyasını import edeceğiz.


Resource type’ı olarak RCDATA’yı belirtiyoruz. RCDATA kaynak tipi ham (raw) formatta bir dosyanın uygulamamızını .rsrc section’ına eklenmesini sağlayacak.



Resource referansı olarak IDC_RCDATA1 referansı VS tarafından atanıyor.


Uygulamamızın VS kurulu olmayan farklı bilgisayarlarda VC++ runtime kütüphaneleri bulunmadığı durumlarda da çalışabilmesi için kullandığımız bu VC++ runtime fonksiyonlarını statik olarak linklememiz lazım. Bunun gerçekleşebilmesi için VS’da aşağıdaki ayarı yapmalıyız.


Uygulamamızın bir PDF dosyası olduğu numarasının daha inandırıcı görünebilmesi için uygulamamıza PDF icon resource’unu ekliyoruz.


UYGULAMA STRATEJİMİZ

Uygulamamızda izleyeceğimiz yol ana hatları ile şu şekilde olacak:

  • Anti-Debug Önlemi: Bir binary debugger ile dinamik analiz yapılmasını zorlaştırmak için anti-debug yöntemlerinden bir tanesini uygulayacağız. Biz bir division by zero (sıfırla bölme) hatası oluşturacağız ve bu hatayı da uygulama içinde ele alacağız. Ancak debugger’ı kullanan analist bu hatayı ele almak üzere uygulamaya devretmeyi akıl edemezse ilerleyemeyecek. Bir başka yöntem de tabiki uygulamanın hata aldığı noktayı yamalayarak pasifize etmek. Bu örnek sadece konuya örnek olması için kullanılacaktır, bir analist için farkında olunması gereken daha pek çok anti-debug yönteminden söz edilebilir. Bunlardan bazı örnekleri daha sonra paylaşacağız.
  • Daha Önce Bulaştık mı Kontrolü ve Kalıcılığın Sağlanması: Zararlı yazılım bir Windows sistem üzerine daha önce yerleşti mi yerleşmedi mi kontrolünü bu sistem üzerinde bırakacağı izleri arayarak yapabilir. Bunlar bir dosya, registry kaydı gibi nesneler olabilir. Ancak burada izlenecek strateji saldırganın hayal gücüne kalmış, bir kullanıcı da oluşturabilir, diskin veya file system’in kullanılmayan bir alanına tek bir bit’te bırakabilir. Uygulama daha önce bulaşmadığı bir sistem üzerinde çalışıyorsa kalıcılığını sağlamak için kendini farklı bir isimde ve farklı bir dizine kopyalayacak. Daha sonra sistem her tekrar başlatıldığında tekrar hayat bulabilmek için bir Autorun registry kaydı oluşturacak. Ve son olarak .rsrc section’ında bulunan bir PDF dosyasını diske yazarak bunu görüntüleyecek ve kullanıcıyı aldatma işlevini yerine getirecek. Eğer daha önce bulaştığı bir sistem üzerinde çalıştığını anlıyorsa da sadece sonraki bölümleri işleterek kötülüklerini uygulayacak.
  • Zararlı Payload Sunucusuna HTTP ile Bağlanma ve Payload’un Çekilmesi: Bu adımda Internet Explorer imkanlarını da kullanan API’lerle bir HTTP sunucusuna erişecek ve çekeceğimiz payload’u bellekte bir alana kaydedeceğiz. Internet Explorer imkanlarını kullandığımız için kullanıcının HTTPproxy imkanı da kullanılacak. Eğer bu proxy’de ileri güvenlik önlemleri alınmamış ve trafik zararlı yazılım aktivitesi için izlenmiyorsa yolumuz açık olacak. Bu adımda özel bir gizlenme stratejisi de uygulayacağız. Statik analizde görülebilen import edilmiş kütüphaneler ve fonksiyonları bizim uygulamamızda görülmeyecek çünkü shellcode tekniklerini ve Assemly dilini kullanarak bu fonksiyonu geliştireceğiz. Yani exploit research ve zararlı yazılım know how’ını birleştirecek ve analistin işini zorlaştıracağız. Eğer analist exploit geliştirme alanında bir deneyime sahip değilse dinamik analizde görebileceği bu aktiviteyi anlamlandırmakta epey zorlanacak.
  • İndirilen Payload’un Sistem Üzerindeki Farklı Bir Proses’in Adres Alanında Çalıştırılması: Bu bölüm zararlı yazılımların uyguladığı ileri yöntemlerden birisi olarak görülebilir, çünkü proses listesini izleyen bir kişi zararlı yazılım artık sonlansa bile sistem üzerinde çalışmakta olan bir başka prosesin adres alanında aktif olduğunu çıplak gözle göremeyecektir. Ancak bu Windows işletim sisteminin sağlamış olduğu bir imkandır ve zararlı yazılımı çalıştıran kullanıcının bu injection işlemi için yeterli hakkı olduğu taktirde gerçekten bilinmeyen birşeyin keşfinden ziyade işletim sisteminin sağladığı bir imkanın kötü amaçla kullanılmasından ibarettir. Zararlı yazılımımız bu işlemi de gerçekleştirdikten sonra sonlanacaktır, ancak asıl zararlı aktiviteyi gerçekleştirecek olan payload’umuz bir başka proses’in dünyasında yaşamaya başlayacak ve bizim örneğimizde olduğu gibi bir tünel ile saldırgana sistemin kapılarını açabilecektir.
Sonraki bölümde zararlı yazılım kod bölümlerini açıklamaya başlayacağız.

                                                                                                                                            Sonraki Bölüm >>