(FUD) Malware Development – 3

Bu yazıda AES şifreleme algoritmasından ve Python ile nasıl AES şifreleme algoritmasını kullanacabileceğimizden bahsedeceğim. Böylelikle zararlı yazılımımızın iletişimini şifreleyebilecek hale gelebileceğiz. Ayrıca bir önceki yazımda bahsettiğim gibi yazılımımıza reverse shell ekleyeceğiz. “Reverse shell”de olabilecek bir problemin nasıl çözüleceğini en son olarak göreceğiz.

AES Şifreleme Algoritması

AES şifreleme algoritması, blok verileri bir anahtar aracılığı ile şifreleme yapmamızı sağlayan bir simetrik şifreleme algoritmasıdır. Verileri bloklar halinde kullanan AES şifreleme algoritmasını kullanmak için şifreleyeceğimiz veri block-size’ın tam katı uzunluğa sahip olmak zorundadır. Aynı şekilde kullanacağımız anahtar 128, 192 veya 256 bit uzunluğunda bir anahtar olmak zorundadır. Ancak bizler her zaman için belli uzunluklara sahip anahtarlar ve veriler kullanmayız. Peki yine de AES şifreleme algoritmasını kullanmak istiyorsak ne yapmalıyız ? Bu durumlarda verinin uzunluğunu block-size’a uygun hale getirmek için “padding” işlemi uygulayabiliriz.

Padding, mesajın başına, ortasına veya sonuna veri ekleme işlemidir. Ancak bu işlemi yaparken dikkatli olmalıyız, eklediğimiz veriler rastgele olmamalı. Aksi takdirde deşifreleme işlemi sırasında bu veriden kurtulamayız ve şifrelenen veriyi anlamlandıramayız.

Yukarıda bahsettiğim gibi anahtarlar da belli uzunluklara sahip olmalıdır ancak anahtarları anlamdırma gibi bir zorunluluğumuz olmadığı için sha-256 gibi hash-ing algoritmalarını kullanarak anahtarlarımızın uzunluğunu uygun bir hale getirebiliriz.

AES şifreleme algoritmasını yazılımımızın iletişimini şifrelemek için kullanacağız. Bu yüzden önce AES ile şifreleme ve deşifreleme işlemleri gerçekleştirebilmemiz gerekiyor. Ben bu işlemleri yapmak için bir class yazmayı ve yazılım içerisine bu class’ı import etmeyi yazılımı karmaşık hale getirmemek için gerekli görüyorum.

Şifreleme Sınıfı:

Öncellikle ihtiyacımız olan modülleri import etmemiz gerekiyor. Import etmeden önce pip install pycryptodome komutu ile yükleme işlemini gerçekleştirmeyi unutmayın.

(FUD) Malware Development - 3 Riftsec

Class’ımızın constructorında anahtarı alalım ve uzunluk problemini bir hash algoritması ile halledelim.

(FUD) Malware Development - 3 Riftsec

Anahtar için uzunluk problemi halletik ancak veri için “padding” işlemi uygulayabileceğimiz bir metoda ihtiyacımız var. “padding” adlı bir private metot yazalım. (dışarıdan padding’e erişmeye ihtiyacımız olmayacak bu yüzden private olması kullanım açısından daha iyi olacaktır.) Ayrıca class’a dair statik olmayan herhangi bir şeye erişim sağlamayacağımız için statik olarak tanımlayacağım.

(FUD) Malware Development - 3 Riftsec

Artık uzunluk problemleri halledebiliriz. Şimdi encrypt ve decrypt metotlarını yazalım.

(FUD) Malware Development - 3 Riftsec

Burada yukarıda bahsetmediğim “iv” değişkenini göreceksiniz (18.satır). “iv” Initialization Vector olarak bilinir. Rastgele block-size kadar veri oluşturur, böylece şifreleme işlemimiz daha güvenli gerçekleşir.

(FUD) Malware Development - 3 Riftsec

Sifreleme sınıfının tamamı: https://pastebin.pl/view/7cea2878

Artık şifreleme ve deşifreleme yapabileceğimiz bir class’ımız var. Bu class’ı hem sunucu tarafında hem de istemci tarafında import edelim. Bu class’ı kullanarak iletişimimizi şifreleyeceğiz. 

Her zamanki gibi ilk olarak import işlemimizi yapıyoruz.

(FUD) Malware Development - 3 Riftsec
(FUD) Malware Development - 3 Riftsec

Import ettikten sonra yukarıda yazmış olduğumuz class’ın encrypt ve decrypt metotlarını kullanabilmek için her 2 tarafta da “Sifreleme” objesi oluşturuyoruz. Bu objeleri oluştururken aynı anahtar ile oluşturmamız gerekiyor.

Elimizde bir “Sifreleme” objesi olduğundan artık şifreleme ve deşifreleme işlemlerini gerçekleştirebiliriz. Sürekli conn.send(self.crypto.encrypt(“message”)) yazmak yerine bir metot yazalım.

(FUD) Malware Development - 3 Riftsec
(FUD) Malware Development - 3 Riftsec

send ve recv metotları sayesinde encoding-decoding ve şifreleme-deşifreleme işlemlerini sürekli bir şekilde yapmaktan kurtulduk. Bu 2 metodu aşağıdaki gibi kullanacağız:

(FUD) Malware Development - 3 Riftsec
(FUD) Malware Development - 3 Riftsec

Harika! Elimizde iletişimi şifreli olan bir yazılımımız var. Bir sonraki adımımız sistemi kontrol etmek. Bunu sağlamak için “shell”e erişmemiz gerekiyor. İlk yazımda anlattığım sebeplerden ötürü “reverse shell” bağlantısı sağlayacağız.

Shell’e erişmek için bir Python modülünü kullanacağız her zamanki gibi öncelikle modülümüz import edelim.

(FUD) Malware Development - 3 Riftsec

Import ettikten sonra daha önce yazmış olduğumuz start metoduna gidelim.

(FUD) Malware Development - 3 Riftsec

Sunucudan gelen komutları kullanıp, outputu sunucuya yollayacağımız için standard input, standard output ve standard error’u yönlendirmemiz gerekiyor. Bunu 44.satırda stdin, stdout ve stderr değerlerini değiştirerek sağlıyoruz. Input olarak ise yine 44.satırdaki parametre olarak datayı veriyoruz. Böylece Sunucudan gelen komutun outputu “output_bytes” adlı değişkende saklanabiliyor. Şimdi sıra bu outputu Sunucuya yollamakta. Bunu 45.satırda gerçekleştiriyoruz.

Peki ya outputu olmayan bir komut gelmiş ise ne olacak? (Örneğin “cd” komutu) Maalesef bu durumda Sunucu tarafı hala bir output beklediği ve istemci tarafı da bir şey yollamadığı için Sunucu tarafı artık bir şey yapamaz hale geliyor. Bu durumu çözebilmek için “cd” gibi komutları birer “if” ile kontrol etmeli ve herhangi bir şey beklememeliyiz. Ayrıca istemci tarafında da bu kontrolleri gerçekleştirmeli ve herhangi bir şey yollamaya çalışmamalıyız. Çünkü artık sunucu bu komutlar için bir yanıt beklemiyor.

“cd” gibi sistemsel komutları olduğu gibi standard input olarak shell’e iletirsek cross-platform bir yazılıma sahip olamayız. Python içerisinde bulunan “os” modülü sayesinde sistemsel komutları yerine getirir isek Windows üzerinde compile edince Windows’ta, Linux üzerinde compile edince Linux’ta, MacOS üzerinde compile edince Mac’te çalışabilecek bir yazılımımız olur. Yani cross-platform bir yazılıma sahip olabilmek için tek yapmamız gereken aynı kodu farklı bilgisayarlar içerisinde derlemek olur. Ancak bu yazı serisinde biz daha çok Windows ile ilgileneceğimiz için böyle bir şey yapmaya ihtiyacımız yok, direkt olarak Windows komut satırı komutları ile istediğimizi yapacağız. Sadece “cd” gibi komutları hali hazırda ayırdığımız için onları “os” modülü aracılığı ile sisteme ileteceğiz.

(FUD) Malware Development - 3 Riftsec
(FUD) Malware Development - 3 Riftsec

Bir sonraki yazıda yazılımımıza çok işimize yarayacak özellikler ekleyeceğiz. (Örneğin download, upload, screenshot) Kendinize iyi bakın, sağlıcakla kalın.