Trojanlar, bulaştıkları makinelerde, kullanıcıların haberi olmaksızın işlemler gerçekleştiren casus yazılımlardır. Casus yazılımın kullanılabilmesi için Brad Pitt’in Truva filminde olduğu gibi Truva Atı’nın kaleden içeriye sokulması gerekmektedir. Bilgisiz kullanıcıların dikkatsizliği veya sosyal mühendislik yöntemlerinden istifade ederek trojanlar kurbanların makinelerinde çalıştırılabilir. Trojanlar, çoğunlukla “faydalı bir program gösterme” yoluyla yayılmaktadır. Örnek olarak, bedava sunulan güzel bir ekran koruyucusu veya makinenize virüs bulaştığı uyarısından sonra, virüsü temizlemek için indirmeniz istenen ücretsiz bir program ya da çok kullanılan lisanslı bir programın crackinin trojan olma ihtimali yüksektir.
Zararlı yazılımlar, kullanıcılar tarafından “virüs” olarak genellense de, trojan-virüs-solucan(worms) birbirinden farklı uygulamalardır.
Brad Pitt’in Truva filmi ile sinemaya aktarılan mitolojideki Truva Atı’ndan ismini alan trojanlar, bulaştığı makinelerde arka kapılar açan, kullanıcılar fark etmeden bir takım işlemler yapan programlardır. 1990’ların sonlarına doğru Subseven, NetBus gibi trojanlar oldukça popülerdi. Trojanlar, kendilerini yayamazlar. Kurbanların makinelerinde tek tek çalıştırılması gerekir. Trojanlar, çalıştırıldığında, kullanıcının silmekte tereddüt edeceği bir isim ile makinede kullanıcının hemen fark edemeyeceği bir lokasyona kendisini kopyalar. Makine restart edildiğinde otomatik başlatılması için de registrye kayıtları girilir.
Biyolojik virüslere benzetildiği için “virüs” olarak adlandırılan programlar, makinelere değil word, excell, pdf gibi dosyaların yapısına bulaşır. Virüslü dosyayı açtığınızda virüs, erişebildiği tüm dosyalara kendini bulaştırabilir. Bazı programların çalışmasını engelleme, bulaşan dosyada bazı işlemleri gerçekleştirmeyi engelleme, aşırı bellek tüketimi ile makineyi kilitleme, dosyaları silme gibi zararlar verebilir. Dosya yapısında taşındığı için hızlı yayılırlar. Son zamanların en popüler virüslerinden CryptoLocker virüsünü el alırsak, bulaştığı makinede database dosyaları gibi önemli dosyaları buluyor ve dosyaları şifreleyerek kullanılmaz hale getiriyor. Sonrasında, virüsü bulaştıran, kurban ile irtibata geçerek bir miktar para karşılığında dosyayı açacak şifreyi veriyor. Ki bu da tamamen insafına kalmış. Parayı alıp şifreyi vermeyebilir de…”Parayı elden verirken yada hesaba yatırırken yakalatırım” diye düşünüyorsanız bitcoin bugünler için var:) Yakın zamanda ülkemizde de yaygın bir CryptoLocker saldırısı oldu. Özellikle TTNET abonelerini hedef alan saldırıda, birçok insana tutarı oldukça yüksek fatura bilgisi TTNETten geliyormuş gibi gönderildi. Mail ekinde yer alan rar dosyasını, indirip, açanlar kötü bir sürprizle karşılaştı:)
Solucanlar, zarar verme ve yayılma açısından virüslere benzemektedir. Ancak virüsler gibi yayılmak için kullanıcıya gerek duymazlar. Kendi kendine çalışabilen ve kendi kendini kopyalayıp, networkte yayabilen programlardır. Ağ trafiğini yoğunlaştırarak networkte yavaşlamaya sebep olabilirler.
Şimdi ufak bir trojan yazalım. Trojanlar, makinelerde kullanıcı fark etmeden çalışan,yürütülebilir(.exe) dosyalardır. Bir console uygulaması geliştireceğiz. Uygulama çalıştığında, kullanıcı farkında olmadan, belirli periyotlar ile kurban makinede ekran görüntüsünü alıp, bize mail atacak.
Microsoft Office Services adıyla bir console uygulama oluşturuyoruz. Öncelikle mail gönderme işlemini yapacak class’ı ekliyoruz. Mail gönderme için Gmail’i kullanıyorum. Mail gönderme class’ı aşağıdaki gibidir:
Config dosyasından, host, username, password, from ve to bilgilerini çekip, subjecti kurban bilgisayarın adı ve aktif kullanıcı bilgisi olan, ekran görüntüsü attachment olarak eklenmiş bir mail gönderiyoruz.
Şimdi ekran görüntüsünü alalım. Ekran görüntüsünü alacak class’ımız aşağıdaki gibidir:
Bitmap nesnesini kullanarak ekran görüntüsünü alıyor ve Jpg olarak, AppData/Local/Temp klasörüne, “screen_ GününTarihi” adıyla kaydediyoruz.
Console uygulamada main metodunda, ekran görüntüsü alıp, mail göndermeyi test edelim. Main metoduna aşağıdaki kodları ekleyelim:
string screenShot = ScreenShot.GetScreenShot();
SendMail.SendEMail(null, screenShot);
Uygulamayı çalıştırdığımızda, siyah konsol ekran görünecektir. Ekran görüntüsü alınıp, mail gönderildikten sonra işlem sonlanacak ve siyah ekran kapanacaktır. Ancak hem konsol ekranın görünmemesi gerekiyor hem de uygulamanın arka tarafta belirli periyotlarla sürekli çalışması gerekiyor. Konsol ekranını gizlemek için Windows’un user32.dll ve kernel32.dll API’lerini kullanacağız. Belirli periyotlarla ekran görüntüsünün mail atılması için de Timer kullanacağız. Ekran görüntüsünü aşağıdaki gibi belirli aralıklarla mail olarak gönderebiliriz.
Timer’ın Interval değerini 1 dakika olarak ayarladık. 1 dakika aralıklar ile tanımlanan işlemler gerçekleştirilecektir. GC.KeepAlive() metodu ile Garbage Collector’ın Timer nesnesini silmesinin önüne geçiyoruz. Önce ekran görüntüsünü alıp Temp klasörüne kaydediyoruz. Ekran görüntüsü kayıt edilmiş ise dosyayı mail olarak gönderiyoruz. Sonra Temp klasörü altındaki, maille gönderdiğimiz ekran görüntüsü dosyasını siliyoruz. Şimdi siyah konsol ekranın görünmesini engelleyelim. Uygulamanın Main metodunu aşağıdaki gibi düzenleyelim:
user32.dll API’sinin ShowWindow ve kernel32.dll API’sinin GetConsoleWindow external metodlarını import ediyoruz. SW_HIDE değişkenini konsol ekranın nasıl görüntüleneceğini belirtmek için kullanacağız. GetConsoleWindow metodu ile konsol ekranı elde ediyoruz. ShowWindow metoduna 0 parametresini geçerek konsol ekranı görünmez yapıyoruz. Daha sonra trojanımıza başka özellikler de ekleyeceğimiz için ekran görüntüsü alıp, mail atma işlemini bir Thread içerisinde çalıştırdık. Bu ayarları yaptıktan sonra uygulamamızı çalıştırıyoruz.
Trojanımız hazır. Uygulamanın config ve exe dosyasını alıp, herhangi bir makinede çalıştırdığımızda 1 dakika aralıklar ile ekran görüntüsü mailimize gelecektir.Uygulama çalışırken konsol ekran görünmeyecektir.
Uygulama çalışıyor. Ancak bazı eksik noktalar gözünüze çarpmıştır. Uygulamanın çalışması için uygulama dosyasını, kurban makineye manuel kopyalamak gerekiyor. Oysa exe tıklandığında uygulama, kendini kurban makineye kopyalamalı. Makine kapatıldığında veya restart edildiğinde uygulama da sonlanacaktır. Yani trojan etkisiz kalacaktır. Bir başka eksik, uygulama, mail göndermek için config dosyasından değerler okuyor. Çalışması için config dosyasının da kopyalanması gerekiyor. Üstelik config dosyasında, mail hostuna login için kullandığımız username ve password’u, clear text olarak tutuyoruz:) Fark edilmesi durumunda, kurbana trojan yükleyelim derken mail hesabımızı vermiş oluruz:) Ayrıca bu exe dosyasını kurban makinelerde nasıl çalıştıracağız? Kullanıcıların çoğu bilmedikleri exe dosyalarına tıklamıyorlar.
Şimdi bu eksiklikleri tamamlayalım. Öncelikle, uygulama dosyasına tıklandığında, exe dosyası kendisini makinede bir klasöre kopyalamalı. Shutdown/restart durumlarından sonra uygulamanın otomatik başlaması sağlanmalı.
Yukarıda görüldüğü gibi exe dosyası, kendisini AppData klasörü altına OfficeService.exe adıyla kopyalıyor. Sonra kurban makineye kopyaladığımız exe dosyasını çalıştırıyoruz. Restart/shutdown durumlarında uygulamanın, login olan kullanıcıdan bağımsız otomatik başlaması için registry’de Local Machine altında Windows/Run altına kayıt atıyoruz ve tıklama ile çalışmış exe dosyası processini kill ediyoruz. Main metodunda, konsol ekranı gizleyen, ShowWindow metodunun altına CopyExe metodunu ekleyelim. Böylece, bu eksikliği giderdik.
Şimdi, mail göndermede config dosyasına olan bağımlılığımızı ortadan kaldıralım. Bunun için yine registry’i kullanacağız. Mail göndermek için config dosyasından aldığımız host, username, password gibi bilgileri registry’e yazacak ve kullanırken config dosyasından değil registry’den okuyacağız. Ancak bu bilgileri registry’e clear text olarak yazmak risklidir. Bu nedenle öncelikle bu değerleri encrypted hale getirip, registry’e encrypted değerleri yazacağız. Registry’den okurken decrypted ederek kullanacağız. Öncelikle host, username, password bilgilerimizi encrypted hale getirecek metodu yazıp, kullanarak encrypted değerlerimizi elde edelim.
Kriptolamak istediğimiz text ve password’u metoda geçiyoruz. Kriptolanmak istenen texti, MD5 algoritması ile kriptolanmış password değerini key olarak kullanarak 3DES algortiması ile kriptoladık. Bu kodu trojanın içerisine yazmıyoruz. Çünkü, trojanın yüklendiği makinede sadece, registry’den okunması gereken değerlerin encrypted karşılığının ne olduğunu öğrenmek için kullanacağız. Kurban makinede registry’e, kriptolanmış bu değerleri key-value şeklinde yazacağız. Şimdi, bu metodu kullanarak kurban makinenin registry’sine yazacağımız host, username, password, to ve from bilgilerinin kriptolanmış değerlerini öğrenelim.
Kurban makinede registry’e, password değerini key ve encrypted text değerini value olarak yazacağız. Şimdi registry’e değerlerimizi yazmaya başlayalım. SetRegistry metodu içerisinde ilgili değerleri registry’e yazıyoruz.
Böylece parametrelerimiz, kurban, uygulama dosyasına tıkladığında registry’e kaydedilecektir. Kurban makinenin registry’si aşağıdaki gibi görünecektir:
Şimdi SendMail classında kullanılan değerleri registry’den çekebiliriz. Ama önce registry’den alacağımız kriptolanmış değerleri decrypt edecek metodu yazmamız gerekiyor. Cryptography classı içerisine yazdığım Decrypt metodu aşağıdaki gibidir:
Artık parametreleri registry’den çekip, decrypt edip kullanalım.SendMail classımız aşağıdaki gibi olacaktır.
Bu eksikliği de gidermiş olduk. Son olarak bu trojanı nasıl yayabiliriz? Trojanlar, daha çok sosyal mühendislik ile yayılmaktadır. Bu uygulamanın, kullanıcı için işe yarar, ihtiyaç duyulan bir uygulama olduğunu inandırmanız gerekiyor. İsmini bsplayer.exe olarak değiştirip bir player uygulama dosyası gibi yayabilirsiniz. Yada setup.exe olarak isimlendirip, bir site üzerinden “x programının setup”ı diyerek yayabilirsiniz. Şimdi trojanınızı çalıştırıp aşağıdaki kontrolleri yapalım:
- AppData altına exe dosyası kopyalandı mı?
- TaskManager’dan çalışan tek process olup olmadığına bakın. İki process çalışıyor görünüyor ise ilk tıklamada çalışan processi kill etmemişsinizdir. Process’e sağ tıklayıp, Properties’den hangi path’teki processin çalıştığını görebilirsiniz.
- Registry’e ilgili değerler yazıldı mı?
- Test ettiğiniz makineyi restart ederek, makine açıldığında uygulama otomatik çalışıyor mu?
Çalışmada sorun yok ise şimdi, trojanımız anti-virüslerden geçiyor mu bakalım. http://www.virustotal.com sitesi üzerinden bu testi yapabiliriz. Exe dosyasını siteye upload ederek taramayı başlatıyoruz. Test sonucu aşağıdaki gibidir:
Görüldüğü gibi 57 antivirüsten sadece 2 tanesine takılmış. Avira trojan olarak, Norman KeyLogger olarak yakaladı. Programın içerisinde henüz paylaşmadığım Key Logger kodları da olduğu için iki anti virüs dosyayı yakaladı. Eset, F-Secure, Fortinet, Kaspersky, McAfee, Microsoft, Panda gibi yaygın antivirüsler uygulamamızı neden zararlı olarak algılamadı? Öncelikle mevcut hali ile programda yapılan işlemler zararlı olarak algılanabilecek işlemler değil. Dosya kopyalamak, registry’e kayıt atmak, screenshot almak, mail ile jpg dosyası göndermek sıradan işlemlerdir. Antivirüsler, zararlı yazılım olarak tespit edilmiş dosyaların analizini yaparak, veritabanlarında bu dosyaları zararlı yazılım olarak imzalıyorlar. Kurulu oldukları makinelerde, imza veritabanında kayıtlı bir dosya aktifleştirilmeye çalışıldığında, antivirüs bu dosyayı tanır ve engeller. Bizim geliştirdiğimiz trojan henüz fırından yeni çıktığı için yayılmış, bilinen ve zararlı olarak imzalanmış bir dosya değil. Ancak her anti virüs programı reverse engineering ile dosyaları analiz de ediyor. Key Logger kodlarını, isimlerini saydığım yaygın anti virüsler neden algılamadı tam anlayamadım. Bu, sanırım virustotal sitesinden kaynaklanıyor. Çünkü uygulama dosyasını Eset kurulu bir ortama kopyalamaya çalıştığımda, trojan olarak yakalanıp,siliniyor.
Güvenlik üzerine devam edeceğiz.