Ransomware

Simge Karahan
3 min readDec 9, 2020

Ransomware diğer adlarıyla fidye yazılımı, şantaj virüsü nedir? Fernet ile Python’da Ransomware nasıl oluşturulur?

Photo by Michael Geiger on Unsplash

Bu virüs bilgisayarınıza bulaştığında dosyalarınızı kilitler. Diğer virüsler gibi kendini gizlemeye çalışmaz, aksine sizinle iletişime geçer. Eğer ödeme yapmazsanız dosyalarınızın silineceğini söyleyerek size şantaj yapar. Saldırgan kendi kimliğini açığa çıkarmamak için bu ödemeyi bitcoin ile ister.

Python ile bir ransomware uygulaması yapmak için Fernet kullanılabilir. Fernet simetrik bir şifreleme/şifre çözme sistemidir, kriptografi kütüphanesinin içinde bulunur.

Verileri şifrelemek ve şifresini çözmek için bir anahtar gereklidir. Bu anahtar gizli olmalıdır, bu yüzden anahtarı paylaşmak için bir güvenlik mekanizması gereklidir. Anahtar oluştururken “generate_key” kullanılır:

from cryptography.fernet import Fernet
import base64
key = Fernet.generate_key()

Anahtar random bir değerdir, “generate_key” ifadesinin her çağırılışında farklı anahtar üretilir. Burada döndürülen Fernet anahtarı iki 16 baytlık anahtar içerir. Bunlardan biri imza anahtarı diğer ise şifreleme için kullanılan anahtardır. Ve bunlar sıralı şekilde birleştirilerek 32 baytlık bir değer oluşturur. Bu anahtar daha sonra base64 için kullanılır. Sonuç olarak bu anahtar 44 baytlık bir dize şeklinde olur.

Mesaj şifrelemek için, oluşturulan anahtar kullanılarak bir Fernet nesnesi oluşturulur ve şifreleme fonksiyonu çağırılır. Burada string türünde olan mesaj dizisi, bayt dizisine dönüştürülürken utf-8 yöntemi kullanılır.:

msg = "message for encryption".encode('utf-8')
token = Fernet(key).encrypt(msg)

Şifre çözmek için, yine bir Fernet nesnesine ihtiyaç vardır, şifre çözmek için kullanılan anahtar şifrelemek için kullanılan anahtarla aynı olmalıdır:

decoder = Fernet(key).decrypt(token)

Fernet tokenları süresi dolan bir mesajın test edilmesine izin veren bir timestamp (zaman damgası) içerir. Bu işlem, time to live (ttl) parametresi eklenerek yapılır Eğer bir ttl değeri eklenmezse token’ın zaman kontrolü yapılmaz.

decoder = Fernet(key).decrypt(token, <ttl>)

Python ile Ransomware yapımı için gerekli kütüphaneler:

-import os: işletim sisteminde dosyaları manipüle etmek için gerekli

-from os.path import expanduser: sistemde root dizini için gerekli

-from cryptography.fernet import Fernet ve base64: fernet için gerekli

Fernet ile anahtar oluşturmak için yukarıda anlatılan şekilde kod yazılır. Key, dosyaların şifresi için, cryptor ise şifreleme içindir:

  • read_key fonksiyonu: Şifre çözme işlemi için dosyadaki anahtarı okuma işlemini gerçekleştirir. “keyfile_name” parametresi anahtarı içeren dosyanın yolunu temsil eder. (‘rb’ : read + byte)
  • write_key fonksiyonu: Dosyaya anahtar yazma işlemini gerçekleştirir. (‘wb’: write + byte)
  • crypto_root fonksiyonu: Dosya sisteminin en başından başlayarak tüm dosyalarda “os.walk” fonksiyonu sayesinde dolaşır, eğer şifreli değillerse dosyaları şifreler. Root yolunun yanındaki “_” işareti anlık dizini ifade eder ve files ile dosyalar temsil edilir. “absoulute path” ifadesi, root dizininden başlayıp diğer tüm alt dizinlerde dosyaları bulmak için gereken tüm ayrıntıları ifade eder. Eğer uzantı hedef dosya sisteminde yoksa [-1] ile dizinin en son elemanı olarak atanır.
  • crypt_file fonksiyonu: Dosyalardan verileri okur. Şifreleme ve şifre çözme işlemlerindeki sonuçlar için dosyanın başına gider ve yeni verileri ekler.
  • Parser argümanı sayesinde sürekli bir dosya yolu değiştirme işlemi yapılmasına gerek kalmaz. Parserla kodu değiştirmeden farklı girdiler verebiliriz.
  • Aşağıdaki kodlar komut satırından ‘decrypt’ girildiğinde ya da ‘encrypt’ girildiğinde yapılacak şifreleme işlemleri içindir:

Yani özetle, Ransomware’da dosyalar okunur ve anahtar ile şifrelenir. Anahtarı bilmeyen kurban bilgisayar bu şifrelenen dosyalara ulaşamaz, şifreyi öğrenmek için şantaja maruz kalır.

Kodların github kaynağına ulaşmak isterseniz buraya bakabilirsiniz.

--

--