Öncelikle RAT (Remote Administration Tool) adlı zararlı yazılımı doğru veya yanlış olabilecek önermelerim ile tanımaya çalışalım.
RAT'lar (Remote Administration Tool) backdoor mantığını ele alır, böylece ağ üzerinden Client, Server'ın isteklerini yerine getirir. Yani kurban bilgisayar, hackerın istediklerini yerine getirir.
Günümüzde ev kullanıcılarını hacklemek için Reverse Shell kullanılır. Yani Server = Hacker, Client = Kurban olur. Port dinlemeyi Hacker yapar.
Sunucularda ise Bind Shell kullanılır. Yani Server = Kurban, Client = Hacker olur. Hacker sunucuya bağlantı kurar.
Günümüzde çoğu açık fixlenebildiği ve fixlendiği için güncellemelerle beraber; genelde sosyal mühendislik ile kullanıcı kandırılır ve zararlı yazılım olan executable kullanıcı tarafından çalıştırılır. Böylece Hacker, kurban bilgisayar ile bağlantı kurmuş olur.
Backdoor'ların mantığını anlamak için örnek 2 program kodlayalım C#.NET'te.
Bu yapacağımız programda;
Server tarafı, kurban bilgisayardan gelen bilgileri ekrana yazdıracak ve sonsuz döngü içinde sürekli komut isteyip Client tarafına gönderecektir Soket üzerinden.
Client tarafı, kurban bilgisayardan gelen komutları gizli bi' cmd.exe uygulamasına input olarak girdirticek ve gelen çıktıları Server'a, yani Hacker'a yollayacaktır. Bildiğiniz üzere cmd.exe üzerinden bir çok sistem fonksiyonu gerçekleştirilebiliyor.
Server;
Ne yaptık? İlk önce TCP ve her IP adresinin bağlanabileceği sadece 4444 portlu bi' Soket oluşturduk. Sonrasında dinlemeye aldık. Daha sonrasında 1 kullanımlık için bağlantı kabul etmek için Socket.BeginAccept kullandık. Bağlantı kabul edildiğinde, Client Soketini Socket.BeginReceive'a yolladık ve o Soket'ten veri almaya başladık. Aldığımız verileri ekrana yazdırdık ve tekrar Socket.BeginReceive ile aynı Soket'ten veri almaya devam ettik. Sonrasında program sonsuz bi' döngüye (!) girdi ve bizden herhangi bi' Command Prompt (cmd) komutu istiyor. Bunu Client'a, yani kurbana yolluyor. Eğer Soket'le bağlantısını keserse 10053 hata kodlu Exception veriyor, bunun MSDN'de anlamı vardır.
Bkz:
https://docs.microsoft.com/en-us/win...-error-codes-2
Client;
Burada ne yaptık? Program Console bi' .NET uygulaması olduğu için ShowWindow API'si ile gizlemek zorunda kaldık. API'yi projeye dahil etmek için P/Invoke kullandık.
0 = Disable
1 = Enable olarak anlamaktadır fonksiyon. Biz 0 ile görünmez hale, yani Disable hale getirdik.
Sonrasında TCP bi' Soket oluşturduk ve Server'a, yani Hacker'a 4444 portundan bağlandık. Daha sonrasında Process class'ı ile cmd.exe'yi başlattık. Process.StartInfo.CreateNoWindow ile ekranın görünmesini engelledik.
Process.StartInfo.RedirectStandardOutput, Process.StartInfo.RedirectStandardInput, Process.StartInfo.RedirectStandardError değişkenlerini true yaptık CLI olan programdan veri alacağımıza dair uyarı bu...
Process.OutputDataReceived için ise delegate oluşturduk, Console'dan gelen veriyi böyle alıcaz. Delegate olan fonksiyonda ise DataReceivedEventArgs.Data'yı, yani Console'daki çıktıyı Server'a, yani Hacker'a yolladık.
Sonrasında da Process.Start ile cmd.exe'yi başlattık ve Process.BeginOutputReadLine ile asenkron çıktı almayı başlattık. Sonrasında da Socket.BeginReceive ile Server'dan, yani Hacker'dan veri almaya başladık ve Soket'i ReceiveHandler fonksiyonuna yönlendirdi. Gelen veriyi Process.StandardInput.WriteLine ile Console'a input olarak yolladık, bu komut çalıştığında CMDHandler fonksiyonu devreye girecek. Sonrasında bi' döngü gibi Socket.BeginReceive ile tekrardan Server'dan, yani Hacker'dan bilgi almaya başladık. Son olarak cmd.exe'nin kapanmaması için Process.WaitForExit kullandık.
Hemen deniyelim;
İlk önce Server programımı başlattım, sonra Client yani virüsü başlattım.
Gördüğünüz üzere rahat bi' şekilde çalışmakta.
...
Yani illa bi' sunucuya ihtiyacınız var. Haberleşmelerde illa bi' taraf Client, bi' taraf Server olur. C&C (Command and Control) taktiğini kullanabilirsiniz. PHP bi' sunucu olur, oraya verilerinizi yollarsınız.
Server kodları:
https://paste.ubuntu.com/p/mJGb6w5tsr/
Client kodları:
https://paste.ubuntu.com/p/2sGYf4CJqk/