Post124 nn

Creando un Ransomware desde 0 con Python


12063705 10207273024561428 59106377850244238 n
Felipe Barrios

Introducción


Antes de comenzar a escribir, espero que no mal interpreten mis intenciones de libre enseñanza, se que es un peligroso este tipo de artículos y que en manos equivocadas puede causar daño a personas y organizaciones, por este motivo, decidí aclarar que mi intención es poner este conocimiento solo para causar el bien a pesar de que suene utópico, por otra parte, quiero que sepan que los ciberdelincuentes ya saben esta información y que nosotros que nos dedicamos a proteger los activos de información, somos mas ignorantes en este tema, por lo que a mi me parece mas una igualación de conocimientos que un descuido.

A mi juicio, creo que es más peligrosa la desinformación que existe de este tema, he visto que grandes empresas intentan vender soluciones, causando pánico, mostrando que este tipo de programas son amenazas avanzadas y que solo ellos pueden solucionar, para mi todo lo que he visto hasta ahora de publicaciones de este Malware, son puros profetas con delirios de Mesías que intentan vender, mas que enseñar como se hace este tipo de programas(como dice el viejo dicho, en el país de los ciegos el tuerto es rey). Pienso que es mejor conocer como funciona la enfermedad, para poder desarrollar una cura efectiva. Espero que la información y pruebas de concepto les sirvan y puedan solucionar sus problemas o sed de conocimiento.

Para los que no conocen de lo que estoy hablando, se estarán preguntando ¿Que es un Ransomware? Y para mi la respuesta es súper simple, un ransomware es un programa que cifra datos de una computadora y después pide una recompensa monetaria a cambio de la clave para recuperar los archivos, es algo así como un secuestro, pero de información. Si no quedaste conforme te recomiendo leas el siguiente enlace https://es.wikipedia.org/wiki/Ransomware

Como dice un viejo amigo, dos cucharadas y a la papa.

Ingredientes:

  • Necesitamos una maquina virtual, si no sabes como instalar una te dejo estos artículos que escribí hace un tiempo.

1-PREPARANDO EL ENTORNO VIRTUAL PARA COMENZAR A PROGRAMAR EN PYTHON.

2-PREPARANDO EL ENTORNO VIRTUAL PARA COMENZAR A PROGRAMAR EN PYTHON.

3-PREPARANDO EL ENTORNO VIRTUAL PARA COMENZAR A PROGRAMAR EN PYTHON.

  • Una maquina Linux, si no sabes como hacerlo te dejo este otro articulo.

INSTALANDO UN IDE PARA PROGRAMAR EN PYTHON Y SISTEMA OPERATIVO UBUNTU

  • Saber algo de programación en  Python

  • Ganas de aprender

Diagrama de lo que se pretende enseñar


Paso 1:

Se crea un código que cifre datos de una computadora, escogí hacerlo en python por su versatilidad y facilidad de aprendizaje.

Paso 2:

Se debe infectar una maquina con el código, en este ejemplo no voy a mostrar ningún vector de ataque para hacerlo mas simple y decidí instalarlo directamente en la computadora.

Paso 3:

Al infectar la maquina, esta busca ciertos directorios que nosotros le indiquemos, va a cifrar con una contraseña aleatoria y cuando este todo listo las va a enviar a un servidor Web. El servidor Web va a recibir un Id y un password, lo va a guardar en una base de datos.

Paso 4:

La maquina infectada va a tener solo un script para recuperar los archivos cifrados y se le va a solicitar un pago.

Paso 5:

El usuario paga por medio de bitcoin.

Paso 6:

Se procede a ejecutar el script con la contraseña obtenida después del pago.

Desarrollo de Ransomware en Python

Para escribir este código me base en una versión de OpenRansomware y modifique algunas cosas. De todas maneras les dejo el código fuente original en el siguiente link:

https://github.com/Speed09/OpenRansomware (El código no funciona, tiene varios errores, pero me sirvió para hacer este artículo, así que todos los créditos para el)


Para comenzar abrimos nuestro editor de texto favorito en mí caso gedit y escribimos lo siguiente:


De la línea 4 a la 10 se encuentran las librerías necesarias para ejecutar el código.

La función Linux() contiene lo siguiente:

En la línea 13 se pregunta si el usuario que ejecuto el script es sudo, para los que no están familiarizados con este termino les comento que, El programa sudo (del inglés super user do ) es una utilidad de los sistemas operativos tipo Unix, como Linux, BSD, o Mac OS X, que permite a los usuarios ejecutar programas con los privilegios de seguridad de otro usuario (normalmente el usuario root) de manera segura, convirtiéndose así temporalmente en súper usuario.

En la línea 14, si la afirmación de la línea 13 es correcta y el script se ejecuto con usuario sudo, se agrega el directorio root a la lista de archivos a cifrar, esto podría ser muy grave si no se tienen controles de seguridad para entrar como sudo a maquinas de producción , ya que podríamos arriesgarnos a que se cifren otros programas necesarios para que funciones un SO, les comparto una imagen para saber que otros archivos o programas se pueden cifrar y hacer de esto, una verdadera pesadilla.


Arquitectura de un sistema en linux


En la línea 17 se genera una cadena de texto de letras y números, si lo comprobamos en la consola interactiva de Python nos entregara lo siguiente:


En la Línea 18 se genera una clave aleatoria de largo 30 con caracteres y números



En la línea 25 se ejecuta la función encargada de enviar la clave y el ID a nuestro servidor receptor.

En la línea 26 se ejecuta la función que recorre la lista de directorios que le dimos anteriormente y las va cifrando.

En la línea 27 se ejecuta la función que deja las indicaciones a la victima para sepa que hacer en caso de que quiera pagar por el rescate.

En la línea 28 se ejecuta la función que esta encargada de dejar el script que es capaz de descifrar los archivos secuestrados.

Ahora debemos agregar al código las funciones necesarias para secuestrar el computador de la victima:

Función sendCred()


La Línea 31 se define la función y se espera recibir 3 parámetros que anteriormente cargamos en el script, primero la URL del servidor recolector de victimas, la clave generada anteriormente y el ID de la maquina. Luego de tener estos parámetros se prepara la petición que se va a realizar al servidor recolector.

En la línea 32, se preparan los parámetros que se van a recibir por método POST.

En la línea 33 al estar todo listo y formateado, se envía la petición HTTP y nos comunicamos con el servidor.

En la línea 34 se lee la respuesta del servidor.

En la línea 35 se verifica si la petición HTTP tuvo un error en la entrega, si es así, se cierra el programa y no se sigue adelante.

Función crypt()


En la línea 38 se define la función cryp() y se solicita dos parámetros para poder realizar la tarea de cifrar, el primero es la lista con los directorios y el segundo es la clave que se genero dinámicamente.

En la línea 40 y 41 se verifica y la variable directorio recibida como argumento es del tipo objeto Lista, si no es así, se entrega un mensaje y se cierra el programa.

En la línea 43 se recorre la lista de directorio una por una, si no sabes de bucles en Python, te recomiendo les el siguiente articulo https://cybersecuritylaboratory.wordpress.com/2016/09/26/bucle-while-y-for/

En la línea 44 se ingresa al directorio entregado por el ciclo for.

En la línea 45 se comprime todo lo que esta en esa carpeta.

En la línea 46 se eliminan todos los archivos de la carpeta visitada.

En la línea 47 se eliminan todos los directorios de la carpeta visitada.

En la línea 48 se cifran el archivo encrypted.tar y se transforma a formato gpg

En la línea 49 se elimina el archivo comprimido encrypted.tar y se deja solamente el archivo el archivo encrypted.tar.gpg

En la línea 50 nos devolvemos un directorio.

Función howto()



En la línea 53 se define la función y se esperan 3 argumentos, los directorios, la dirección de bitcoin y el precio a pagar.

De la línea 54 a la 61 se crea la variable txt que contiene las indicaciones a seguir después de ser infectado. Para no confundir a nadie, la nomenclatura += sirve para concatenar texto.

En la línea 62 se crea un documento llamado recuperar-mis-archivos.txt.

En la línea 63 se escribe lo que esta dentro de la variable txt, en el documento recuperar-mis-archivos.txt

En la Línea 64 se cierra el puntero del documento.

En la Línea 65 y 66 se copia este texto en cada carpeta que fue infectada.

Función DecryptGen()


En la Línea 69 se declara la función para descifrar los archivos secuestrados, recibe como argumento los directorios cifrados.

De la Línea 71 a 85 se escribe el código fuente necesario para descifrar los directorios secuestrados.

En la línea 86 se crea el archivo decrypt.py

En la línea 87 se escribe el archivo con el codigo fuente.

En la línea 88 se cierra el puntero.

Si no manejas el manejo de archivos en Python te recomiendo leer este articulo https://cybersecuritylaboratory.wordpress.com/2016/10/20/manejo-de-archivos-en-python/



La línea 91 colocamos en forma de lista los directorios que queremos cifrar, en este caso están todos en español, el sistema operativo que estoy usando esta configurado de esa manera. Si no sabes que es una lista y como se manipulan en Python te recomiendo leer este articulo https://cybersecuritylaboratory.wordpress.com/2016/09/06/agrupacion-de-datoslistastuplasdiccionarios/

Directorios a cifrar



En línea 92  dentro de las comillas simples, escribimos nuestra dirección de Bitcoin.

En la línea 93 dentro de las comillas simples, escribiremos el precio que se debe pagar por los datos.

En la línea 94 dentro de las comillas simples, escribiremos la Url de nuestro servidor donde estamos guardando las contraseñas de los computadores infectados.


En la línea 97 se pregunta la maquina en la que se esta ejecutando este script es de SO Linux, si la respuesta es si, se ejecuta la función Linux(), si no sabes de estructuras de control y funciones en Python, te recomiendo leas los siguientes artículos:

https://cybersecuritylaboratory.wordpress.com/2016/09/15/estructuras-de-control-if-else-y-elif/  o/y https://cybersecuritylaboratory.wordpress.com/2016/10/04/funciones-en-python/

En la Línea 99 se pregunta si el SO es Windows, si la respuesta es correcta se envía un mensaje y se el script deja de funcionar, terminando el programa. Cabe señalar que estas validaciones están por si se quiere hacer que este script sea multiplataforma.

En la línea 101 se ejecuta si el SO es distinto a Windows y Linux, envía un mensaje en pantalla y termina el programa.

Preparando el Servidor recolector de computadores secuestrados.

Lo primero que debemos hacer es instalar en una maquina los siguientes componentes, yo voy usar la misma maquina virtual para ahorrar trabajo, pero ustedes lo pueden hacer en cualquier otro servidor:

Instalar Servidor Apache:

sudo apt -get updatesudo apt -get install apache2

Instalar Servidor Mysql

sudo apt-get install mysql-server

Instalar PHP5

sudo apt-get install libapache2-mod-php5 php5 php5-mcrypt php5-mysql

Ya teniendo los componentes listos, vamos a crear una base de datos para almacenar los datos recibidos por las víctimas.

Escribimos en la Terminal el comando mysql


Luego procedemos a crear la base de datos:

mysql> CREATE DATABASE ransomware_db;


Procedemos a utilizar esta base de datos para crear una tabla:

mysql> USE ransomware_db;


Creamos la tabla donde guardaremos los registros:

mysql> CREATE TABLE victimas (ID int NOT NULL AUTO_INCREMENT,
IDD varchar(35),
PASS varchar(35),
PRIMARY KEY (ID));


Ya creada la base de datos, procedemos a crear un programa que reciba los datos y los guarde. Para eso entramos a el directorio /var/www/ o /var/www/html   y creamos un archivo llamado datosvictima.php


De la línea 2 a la línea 5 se llenan las variables con los datos de conexión a mysql.

La línea 6 y 7 del código, se reciben por método POST, las variables (id y clave) que se generaron en la victima y que se enviaron al cifrar su maquina.

La línea 9 se prepara la conexión con la base de datos.

En la línea 11 se comprueba si se puedo obtener una conexión con la base de datos anteriormente creada.

En la línea 14, se prepara la consulta SQL que guarda los registros id y clave enviado por la victima.

En la Línea 15 se comprueba que se guardaron correctamente los datos y se envía un OK. Al script cuando realiza la petición HTTP.

La línea 17 se ejecuta si es que algún error ocurrió al ejecutar la Quero.

La línea 20 cierra la conexión con la Base de datos.

 Ejecución del ransomware.py

Para ejecutar  el script abrimos la Terminal y escribiendo lo siguiente:

python ransomware.py

Si todo sale bien, nos debería entregar un resultado parecido a este:


Verificamos en alguna de las carpetas señaladas en la lista si se encuentran los siguientes archivos. En mi caso todo salio bien.


Procedo a abrir el archivo recuperar-mis-archivos.txt y confirmo que todo esta bien:


Ahora para volver a recuperar nuestros archivos necesitamos la clave que genero el programa automáticamente, para esto nos vamos a nuestra base de datos y escribiremos la siguiente Query

SELECT * FROM victimas


Copiamos esa clave y buscamos el archivo llamado decrypt.py


Ejecutamos el archivo con el siguiente comando:

python decrypt.py


Y vemos que el script nos solicita ingresar la contraseña:

Nos va a pedir varias veces que ingresemos la contraseña, este proceso se repite según la cantidad de directorios cifrados tengamos.


El resultado final debería verse de la siguiente manera:


Confirmamos que todo se decifro correctamente:


Y con esto damos por finalizada la prueba de concepto.

Para los perfeccionistas que siempre encuentran algo malo en el código, se que es súper mejorable y me disculpo por eso, pero decidí hacerlo simple, para que cualquier persona lo pueda entender.

Le doy las gracias al Pato por motivarme a escribir de este tema.

Por recomendación de Jaime, dejo los link para que puedan descargar el código fuente escrito por mí y así, puedan hacer sus propias pruebas de concepto. Les recomiendo lo ejecuten en una maquina virtual y por favor no hagan daño con este conocimiento.

Link proyecto: https://gist.github.com/anonymous/ac8b5cc1eca260376cd6925dd078aaba

Para Dudas, Consultas, Reclamos, Felicitaciones: [email protected]



Artículos que te pueden interesar

Charly face
Juan Cruz Vazquez
ha comentado hace 3 meses

ya no esta el codigo en Git Hub