İlk yazıda trojanların, kullanıcıdan habersiz işlemler yapabildiğini ve makinelerde arka kapı(backdoor) açabileceğini belirtmiştik. Kullanıcıdan habersiz ekran görüntüsü alıp, mail atma ve key logger örneklerini yapmıştık. Şimdi backdoor kavramına bakalım.

Makineler, portlar üzerinden çeşitli protokolleri kullanarak iletişim sağlarlar. Her port, makineye giriş için bir kapıdır. Her kapı da güvenlik için bir risktir. Bu nedenle firewall kurulumlarında yazılan ilk kural “Any-Any-Any Traffic-Drop” kuralıdır. Öncelikle, güvenlik için bütün kapılar kapatılmaktadır. Sonra kontrollü olarak, hangi makinelere hangi kapılardan erişileceğine dair kurallar yazılır. Backdoor, fark edilmeden bu kapıları açıp, kullanmak veya açık olan kapılardan fark edilmeden geçip, o kapıyı her türlü işlemi gerçekleştirmeye uygun hale getirmektir. Yani genel olarak, kullanıcı fark etmeden, bir takım işlemler yapabilecek şekilde kullanıcının makinesine erişecek yollar açmaktır. Portları kullanarak makinelerde nasıl arka kapı açılabileceğine bakalım şimdi…

Örnek olarak, trojanımız çalıştığı makinede her sistemde mutlaka açık olan HTTP(80) portunu dinlemeye alacak. Ufak bir client uygulama geliştirerek, trojanın çalıştığı makinelere, HTTP portu üzerinden komutlar gönderecek ve gönderdiğimiz komutların resultlarını yakalayacağız. Trojan tarafında yapılacak işlemleri daha iyi anlayabilmek için öncelikle trojanın çalıştığı makineleri yöneteceğimiz client uygulamayı geliştirelim. Client uygulamanın aşağıdaki gibi basit bir görüntüsü olsun.

Sol tarafta trojanın çalıştığı makineler listelenecektir. İlgili makineye sağ tıklayıp, komut vereceğiz ve verdiğimiz komutun neticesinde ilgili makinede yapılan işlemlerin sonuçlarını sağ tarafta görüntüleyeceğiz. Uygulama basit bir Windows Application. SplitContainer kontrolü ile formu iki parçaya böldük. Sol tarafta trojanın çalıştığı makineleri listelemek için TreeView kontrolü kullandık. Sağ tarafta sonuçları yazdıracağımız bir Label kontrolü var. Komut vermek için kullanacağımız, mouse sağ tık menüsü için MenuStrip kontrolü kullandık. Trojan çalışan makineleri, uygulamadan bağımsız, ayrı bir threadde dinleyebilmek için BackgroundWorker kontrolü kullandık. Şimdi başlayalım…

Öncelikle elimizde herhangi bir IP’ye komut gönderebileceğimiz bir metodumuzun olması lazım:

Metod, parametre olarak geçeceğimiz IP’ye sahip makineye, 80 portu üzerinden, UDP protokolünü kullanarak, command parametresi ile geçeceğimiz komutu gönderecek. Komutu gönderdiğimiz makine bizi dinliyor olacak.

Komut göndermenin yanında, trojanın çalıştığı makinelerden gönderilen veriyi yakalamak için client uygulamamızın çalıştığı makinenin 80 portunu da dinlememiz lazım. Aynı zamanda o makineler de bizi dinliyor olacak. Öncelikle metodu verelim ve sonra Türkçe’ye tercüme edelim:)

Dinleme işlemi uygulamadan farklı bir threadde çalışmalıdır. Multi-threading mantığına bir ara bakabilirsiniz:) lisStarted değişkeni true olduğu sürece döngüdeki işlemler yapılacak. Yani biz abort edene kadar thread çalışacak. İlk satırlarda herhangi bir IP’den 80 portu üzerinden gelecek tüm trafiği dinlemeye alıyoruz. Veriyi alırken, veriyi gönderenin kimliğini de(IP adresi ve Port numarası) almak için bir EndPoint tanımlıyoruz. ReceiveFrom metodu ile, 80 portu üzerinden gelen veriyi data değişkenine, gönderen bilgisini ise Remote değişkenine aktarıyoruz. Gönderen bilgisi ve gelen data elimizde olduğuna göre şimdi bu datayı işleyelim.

&AND&” benim belirlediğim bir seperatordur. Trojanın çalıştığı makineye komut gönderdiğimde, makineden gelen cevabın hangi komutun cevabı olduğunu anlamak için kullanacağım. Trojanın çalıştığı makine bize, “GönderilenKomut&AND&KomutunCevabı” şeklinde bir data gönderecektir. Seperatöre göre split ettiğimde komut ve komuttan dönen veriye elde etmiş olacağım. Birazdan yazacağımız “get info” komutunu bir makineye gönderdiğimde “GETINFO&AND&KomutunCevabı” şeklinde makineden cevap dönecektir. İlk bölüm ile makineden hangi komutun cevabının geldiğini elde ediyoruz. Komut GETINFO ise formun sağ tarafına, gelen cevabı yazdırıyoruz. GETINFO değil ise trojan çalışan makineler, default olarak sürekli IP adreslerini gönderdikleri için IP adresini sol taraftaki TreeView kontrolüne ekliyoruz.(Default olarak sürekli IP bilgisi gönderilmesini trojanı yazarken biz sağlayacağız.) Trojan, herhangi bir makinede çalıştığı anda, IP bilgisi client uygulamamızdaki TreeView’e eklenecektir. WriteToLabel ve AddNode metodlarını, uygulama ve dinleme işlemleri farklı threadlerde çalıştığı için, dinleme işleminin yapıldığı threadden, uygulamanın çalıştığı threaddeki kontrollere erişebilmek için kullanıyoruz. Bir threadden, başka bir thread içerisinde yer alan kontrol üzerinde doğrudan işlem yapmak istediğinizde hata alırsınız. Windows Application geliştirme ile ilgili bir durumdur.

Bu metodlar ile Label kontrolüne yazma ve TreeView kontrolüne node ekleme işlemini gerçekleştirmiş oluyoruz. Dinleme işleminin yapıldığı threadi, backgroudworker içerisinde start ediyoruz. Çünkü dinleme işlemimiz windows uygulamasından ayrı olarak, arka planda çalışacaktır.

TreeView’in MouseClick olayını yakalayarak, TreeView’deki herhangi bir node’a sağ tıklandığında menü açılmasını sağlıyoruz. Sonra menüden ilgili komuta tıklandığında seçilen makineye ilgili komutun gönderilmesini sağlıyoruz.

Client uygulamamızda yapmamız gereken son bir işlem kaldı. Uygulamayı çalıştırdığımızda ve kapattığımızda yapılacaklar. Uygulamayı çalıştırdığımızda TreeView’e ilk Node olarak Computers adında bir node ekliyoruz ve BackgroundWorker‘ı çalıştırıyoruz.

Biz uygulamayı kapatsak da trojanımız çalıştığı makinelerde çalışmaya devam edecektir. Client uygulamayı kapatıp açarsak trojanın çalıştığı makine, bize en son gönderdiğimiz komutun cevabını dönecektir. Bunu önlemek ve default olarak trojanın sadece makine IP’sini bize göndermesini sağlamak için uygulamayı kapatırken bütün makinelere boş komut gönderiyoruz. Dinleme yapılan threadı kapatıyor ve BackgroundWorker objesini dispose ediyoruz.

Client uygulamamız böylece hazır. Şimdi trojanımıza gelelim. Trojanımız iki ayrı threadde sürekli dinleme ve cevaplama yapacak. Sürekli cevaplama yapacak thread aşağıdaki gibidir:

Burada ki IP, client uygulamamızın çalıştığı makinenin IP’sidir. Tabi kod içerisine böyle açıktan yazmıyoruz. Exe decompile edildiğinde açık adresimizi vermiş oluruz:) İlk yazıda anlattığım gibi registrye kriptoloyarak yazıp, okumalıyız. message değişkenine default olarak makinenin IP’sini atadık. Herhangi bir komut alınmadığı sürece, client uygulamaya sürekli makinenin IP’si gönderilecek. Makinenin IP’sini aşağıdaki şekilde elde edebiliriz.

Sürekli dinleme yapacak thread ise aşağıdaki gibidir:

Trojan, yüklü olduğu makinelerde 80 portunu dinlemeye alıyor. Trojanın aldığı datalar, client uygulamamızdan gönderdiğimiz komutlardır. Eğer aldığımız data boş ise default olarak client uygulamaya makinenin IP adresini gönderiyoruz. Makine “get info” komutunu almış ise client uygulamaya “GETINFO&AND&GetSystemInfoMetodundanDonenDeger” gönderilecektir. GetSystemInfo metodunun içeriği aşağıdaki gibidir:

Görüldüğü gibi trojan, çalıştığı makine ile ilgili domain, user, MAC adresi, açık portlar gibi kritik bilgiler de dahil bütün bilgileri göndermektedir. Metod içerisinde kullandığımız diğer metodlar aşağıdaki gibidir:

GetRAMCapacity:

ObjectQuery kullanılarak makine hakkındaki bütün donanımsal bilgiler elde edilebilir.

GetExternalIP:

External IP’yi bulmak için whatismyip.com gibi bir siteyi okuyup, içerikten IP’yi çekebiliriz. Ancak, response’da bir çok HTML içerik olacağı için biraz sıkıntılı bir işlem. Bu metodda kullandığım site response’da sadece external IP değerini dönüyor.

GetMACAddress:

GetOpenPorts:

Son olarak Main metodumuzu aşağıdaki şekilde düzenleyelim:

StartSending();
StartListening();
System.Windows.Forms.Application.Run();

Sonuç olarak, client uygulamayı çalıştırdığımızda trojanın çalıştığı bütün makineler listelenecektir. Sağ tıklayıp Get Info komutu verdiğimizde, ilgili makinenin bilgilerini elde edeceğiz.

Tabi ilk yazıda anlattığımız, konsol uygulama olan trojanın konsol ekran görünmeden çalışması için gerekli olan kodlar da eklenmelidir. Şimdi test edelim. Trojanı iki makinada çalıştırdım. Client uygulamada görüntü aşağıdaki gibi:

İlk makineye sağ tıklayıp Get Info tıklıyorum.

İkinci makineye sağ tıklayıp Get Info tıklıyorum:

Burada basitçe bilgileri aldık sadece. Ancak geliştirmemize göre yapacaklarımızın sınırı, trojanı yükleyebildiğimiz makinenin kullanıcısının makinede ve networkte ki yetkileri ile sınırlıdır sadece. Mesela trojanı yüklediğimiz makinede arka planda Command Prompt veya Shell’i açabiliriz. Client uygulamamızdan da cmd veya shell komutları gönderip, makinede çalıştırarak istediğimizi yapabiliriz.

Network Programing ile uğraşmış olanlar buradaki eksiklikleri fark etmiştir:) İletişim UDP protokolü üzerinden datagram olarak yapılıyor. A sınıfı local IP kullanılmış. Yani client-server mantığında çalışan bu uygulamalar sadece local networkte çalışır. İnternet ortamında çalışabilmesi için iletişimin TCP protokolü üzerinden stream olarak yapılması gerekir. Hadi iletişimi TCP protokolüne taşıdık diyelim. Ancak günümüzde, bilgisayarların çoğu bir router arkasında. Dolaysı ile NAT’lanmış yada sabit IP kullanan makinelerle ancak bu şekilde iletişim sağlanabilir. Bir kablosuz ağa bağlı 10 makine de, internete aynı IP ile çıkıyor. Bu IP’ye komut gönderdiğimizde, arkasındaki 10 makineden hangisi olduğu nasıl anlaşılacak? Firewall de kullanılıyor ise büyük ihtimal TCP dinlemesi yapmamıza da izin vermeyecek. Bu sorunları da sonraki yazıda inceleyelim.

Reklamlar