BlogUna ricetta a base di Ransomware (Python code) • Exasys Consulenza e sicurezza informatica

19 Marzo 2024

Ogni buona ricetta contiene una lista chiara e ben definita di ingredienti. 
Iniziamo così, conoscendo un po’ di termini e definizioni.

Malware: qualsiasi software costruito per creare danni ad utenti e/o sistemi informativi.
Worm: malware in grado di replicarsi e diffondersi automaticamente.
Ransomware: un tipo particolare di malware che blocca i dati o le funzionalità di un sistema chiedendo un riscatto alla vittima.
Cifratura simmetrica: procedura di codifica/decodifica di dati basata sulla stessa chiave. Conoscendo tale chiave è possibile cifrare e decifrare le informazioni. Sistema rapido ma facile da intercettare poiché basato su una singola chiave di cifratura.
Cifratura asimmetrica: procedura di codifica/decodifica di dati basata su una coppia di chiavi la cui relazione non è facilmente desumibile. Attraverso la chiave pubblica è possibile cifrare le informazioni che solo il possessore della chiave privata può decifrare. Sistema computazionalmente complesso per chi volesse provare ad intercettare le chiavi quindi il preferito dai ransomware.

Sappiamo bene che ogni pietanza ha la sua storia. 
Continuiamo la ricetta con una breve cronologia dei ransomware.

1989: il primo attacco ransomware documentato. Il software era noto come AIDS Trojan o “attacco P.C. Cyborg” e veniva distribuito tramite floppy disk. Agiva nascondendo le cartelle sui computer delle vittime ed il ricatto ammontava a 189 dollari. Un grande difetto: criptava i nomi dei file invece dei file stessi, facile per molti utenti annullare il danno senza pagare un riscatto.
2005: inizia un aumento delle infezioni, concentrato in Russia e in Europa orientale. Entrano in scena i primi ransomware basati su cifratura asimmetrica.
2009: le criptovalute, in particolare il Bitcoin, offrono ai criminali informatici uno strumento più semplice per ricevere i pagamenti illeciti dei riscatti.
2013: l’era aperta dal CryptoLocker è infestata da attacchi ransomware altamente sofisticati basati sulla crittografia che sollecitano il pagamento in criptovaluta.
2017: appare WannaCry, il primo criptoworm autoreplicante ampiamente utilizzato.
Oggi: impossibile contare aziende ed enti pubblici infestati da attacchi ransomware.

Adesso è il momento di preparare il piatto.
Vediamo come si costruisce un ransomware basato su cifratura asimmetrica.

Partiamo da cosa fare: cifrare il disco e predisporre il programma per decifrarlo in presenza del riscatto.
E’ necessario generare un software in grado di criptare il disco a partire da una chiave pubblica ed essere in grado di decriptarlo a partire dalla relativa chiave privata.

Un piccolo esempio in Python di un codice ricorsivo in grado di criptare tutte le cartelle a partire da una chiave pubblica (pubkey):


def encrypt_folder(foldername, pubkey):
# if it’s a folder, encrypt the entire folder (i.e all the containing files)
for child in pathlib.Path(foldername).glob(“*”):
if child.is_file():
print(f”[*] Encrypting {child}”)
# encrypt the file
encrypt(child, pubkey)
elif child.is_dir():
# if it’s a folder, encrypt the entire folder by calling this function recursively
encrypt_folder(child, pubkey)


Esempio di codice di decifratura a partire dalla chiave privata (privkey):


def decrypt_folder(foldername, privkey):
# if it’s a folder, decrypt the entire folder
for child in pathlib.Path(foldername).glob(“*”):
if child.is_file():
print(f”[*] Decrypting {child}”)
# decrypt the file
decrypt(child, privkey)
elif child.is_dir():
# if it’s a folder, decrypt the entire folder by calling this function recursively
decrypt_folder(child, privkey)


Eseguendo il primo script, il sistema cifrerà tutti i file usando la chiave pubblica.
Eseguendo il secondo codice sorgente, il sistema, nota la chiave privata, potrà decifrare tutti i dati.

L’esperienza insegna: è necessario proteggere adeguatamente le chiavi usate per cifrare e decifrare per rendere vani gli sforzi di eseguire il processo di decodifica.

La protezione delle chiavi usate per attaccare i dispositivi è stata un punto debole anche di illustri ransomware: WannaCry non liberava correttamente la memoria RAM dove era possibile ricavare la chiave privata da usare per la decifratura (ovviamente era fondamentale non aver spento il computer dopo l’attacco).

Per ogni dispositivo è necessario, quindi, generare una coppia di chiavi dedicata: la chiave pubblica è utilizzata per criptare i dati, la chiave privata per decifrarli all’occorrenza.

Si pone però un problema: dove nascondere la chiave privata in modo da utilizzarla solo al momento opportuno? Per fare questo, è necessario cifrare anche la chiave privata con una nuova coppia di chiavi: una seconda chiave pubblica ed una seconda chiave privata da condividere solo dopo il pagamento del riscatto.

La vittima di un ransomware, quindi, ha i propri dati cifrati con la chiave pubblica (PUBKEY) e, per riavere i propri dati, ha bisogno della relativa chiave privata (PRIVKEY). Tale chiave è stata però cifrata con la seconda coppia di chiavi (PUBSECRET) e la chiave privata associata (PRIVSECRET) è condivisa solo dopo il pagamento del riscatto.

Ricetta interessante vero? Seguono alcuni preziosissimi link.

https://thepythoncode.com/article/make-a-ransomware-in-python
https://medium.com/@tarcisioma/ransomware-encryption-techniques-696531d07bb9