Desmitificando las técnicas de ransomware usando ensamblajes .Net: 5 técnicas principales
Los ataques de ransomware prosperan al evadir la detección y luego cifrar los datos en un sistema. En el análisis luego de un ataque de ransomware, a menudo leemos sobre cómo el ataque empleó una combinación de diferentes tipos de archivos junto con una variedad de técnicas.
Entonces, ¿qué significa todo esto realmente? En este serial, lo desglosaremos todo empleando el marco de software .Net para mostrar cómo se hacen posibles estas capacidades de ransomware.
En mi serial anterior de tres partes sobre cargas útiles de malware y balizas, la atención se centró en el marco de pruebas de penetración de Metasploit . Usamos su carga útil de malware meterpreter lista para usar para mostrar varias técnicas de atacantes. El primer artículo examinó cómo se inician las comunicaciones maliciosas, la infraestructura del atacante y el análisis forense de un ataque. El segundo artículo analizó las categorías y los tipos de cargas útiles junto con algunas técnicas de manipulación en memoria. La parte final de ese serial se centró en las técnicas de evasión y mitigación.
En este serial, crearemos nuestros propios archivos de carga útil individuales (también conocidos como ensamblados) aprovechando el marco de software .Net pero con un enfoque en el ransomware. Comenzaremos desglosando las capacidades de ransomware y malware en técnicas de ejemplo individuales para comprender cómo funcionan por sí solas. Algunas de estas técnicas individuales son, en última instancia, lo que se combina en una sola carga útil de ransomware malicioso con un efecto a menudo devastador.
Técnica 1: Descargadores, cuentagotas y cargadores
Comenzamos observando cómo el ransomware o el malware pueden conectarse desde una red infectada. Esta es la capacidad de conectarse a un sistema remoto, descargar cargas útiles adicionales, soltarlo en el sistema comprometido y ejecutarlo (es decir, cargarlo en la memoria).
A continuación se muestra un ejemplo de una aplicación de línea de comandos .Net (consola) que:
- Actúa como un descargador descargando otra aplicación ejecutable remota (putty.exe) de Internet
- Coloca la aplicación descargada en una carpeta temporal en el disco de la computadora
- Cambia el nombre de la aplicación a putty_new.exe
- Ejecuta automáticamente la aplicación descargada en la computadora para que se cargue en la memoria

Cuando se emplea el staging de la carga útil, lo que significa tener varios archivos maliciosos haciendo cosas diferentes, el Stager (pequeña carga útil inicial) puede convertir tanto en el descargador como en el dropper del Stage (carga útil principal más grande). También podría ser el cargador del escenario. Las técnicas empleadas dependerán de la evaluación del riesgo de detección por parte del actor de amenazas, también conocidas como consideraciones de seguridad operativa.
Un descargador es responsable de extraer una carga útil de una fuente remota, como un servidor sitio web o un servidor FTP. Esto suele ser a través de Internet. Por lo tanto, un descargador requerirá que se intente alguna conexión de red para llegar a la fuente remota.
Un cuentagotas, por otro lado, es el principal responsable de entregar o dejar caer una carga útil en un sistema víctima. Por lo tanto, un descargador también puede ser un dropper, pero un dropper puede no ser necesariamente un downloader porque un dropper ya puede tener la carga maliciosa incrustada en él como archivos ejecutables portátiles (PE) o DLL. Estos tipos de archivos se discutirán más adelante. Los droppers se usan comúnmente en ataques; ejemplos populares son los ataques a la cadena de suministro de Solarwinds y Kaseya. Ambos involucraron el uso de software de agente de proveedor comprometido empleado como droppers para cargas útiles maliciosas. Este último es empleado por el grupo de ransomware REvil .
Un cargador es responsable de configurar el sistema de la víctima para ejecutar otra carga maliciosa, especialmente en el caso de cargas útiles de solo memoria. Aquí, la configuración significa garantizar la asignación de espacio de memoria necesaria, a menudo mediante la inserción de una DLL en el espacio de memoria de otro proceso y luego la configuración de las licencias de memoria correctos. A continuación, el cargador inicia la carga útil o ejecuta los subprocesos necesarios.
Técnica 2: Carga EXE de un archivo DLL
Las cargas útiles de ransomware pueden tener la forma de un archivo EXE o un archivo DLL. A continuación, veremos cómo un archivo ejecutable de Windows, también conocido como archivo EXE, puede cargar lo que se conoce como un archivo de biblioteca de vínculos dinámicos (DLL) para aprovechar el código que contiene.

EXE y DLL son dos tipos de ensamblados .Net que contienen instrucciones de código de programación de computadoras e información asociada (metadatos). Estas instrucciones y metadatos se ensamblan juntos en un único archivo resultante: ensamblado EXE o DLL .Net . Estos dos tipos de archivos permiten ejecutar código de programación de computadora (EXE) en un sistema Windows o almacenarlo como un archivo de biblioteca (DLL) que luego puede ser "prestado" y leído por otros archivos. En el caso de una DLL, este proceso es muy parecido a cómo varias personas pueden tomar prestado el mismo libro de una biblioteca en diferentes momentos para leer su contenido. En la segunda parte de este serial, exploraremos estos dos ensamblajes con más detalle en relación con .Net. marco de software.
Por ahora, aquí hay un ejemplo muy simple para demostrar el uso de estos dos tipos de ensamblados .Net : un ejecutable (EXE) que ejecuta su propio código y luego carga y lee código externo de un archivo DLL. A continuación, el ejecutable pasa alguna entrada al código DLL cargado. Por último, el archivo DLL usa la entrada recibida del archivo EXE para mostrar un mensaje al usuario que ejecuta la aplicación. A continuación se muestra el código en acción:

Esta sencilla aplicación también muestra la relación entre EXE y un archivo DLL .Net . Este tipo de relación es empleada legítimamente por muchas aplicaciones y sistemas operativos (bibliotecas compartidas), incluido el propio sistema operativo Windows. Windows empaqueta una gran cantidad de su propio código como DLL para que pueda ser compartido por diferentes aplicaciones.
En la imagen siguiente se muestra el código de programación para EXE y DLL en el ejemplo anterior. El código se escribe con el lenguaje de programación C#, que es uno de los lenguajes compatibles con .Net. En la imagen, las referencias de código DLL se resaltan para enfatizar:

Los archivos DLL son un medio eficaz para escribir un fragmento de código una vez de una manera que luego puede ser empleado muchas veces por diferentes ejecutables como una biblioteca compartida o dinámica. Como resultado de esto, también es muy empleado por muchas familias de malware y ransomware. Técnicas como la carga lateral de DLL y el secuestro de DLL son técnicas maliciosas comunes que aprovechan la relación entre estos ensamblados .Net .
Técnica 3: Reconocimiento y lanzamiento de binarios de vivir de la tierra
Continuamos con una combinación de técnicas importantes: la capacidad de recopilar información útil sobre un sistema objetivo (Discovery) y al mismo tiempo lanzar otros binarios o ejecutables en ese sistema (Spawning). En la imagen aquí, nuestro ejecutable personalizado inicial inicia un ejecutable nativo o binario en el sistema Windows de destino, mostrando un ataque living off the land (LotL).

En el ejemplo se muestra nuestra aplicación inicial de C# en ejecución y, a continuación, se procede a recopilar información útil sobre el sistema de destino, que se muestra en el texto verde de la salida. Observe la información de la unidad que se recopila. El ransomware puede aprovechar esta información para apuntar a los archivos en estas unidades y luego filtrar antes del cifrado para una demanda de rescate generalmente considerable.
La aplicación continúa iniciando un ejecutable del sistema externo: el símbolo del sistema de Windows (cmd.exe) ejecutable. A continuación, la aplicación personalizada pasa algunos comandos de Windows al proceso de cmd.exe de Windows para mostrar (que se muestra en texto rojo), en este caso la información de la versión del sistema Windows. Para obtener los beneficios de este artículo, la aplicación personalizada de C# muestra el resultado de las acciones que realiza, así como información sobre el proceso iniciado. Esta capacidad de iniciar otras aplicaciones externas también es útil para iniciar procesos de la víctima para eventualmente inyectar código malicioso.
Técnica 4: Codificación de datos
Otra técnica útil es la codificación de datos. Este es el proceso de usar un algoritmo para representar datos en una forma diferente. Por ejemplo, un tipo de codificación, base64, se usa legítimamente en algunas solicitudes sitio web para pasar datos de un lado a otro, como la autorización HTTP y la autenticación básica en las llamadas API. Sin embargo, el mismo ejemplo de codificación base64 también puede ayudar a ocultar cierto texto y comandos empleados por un programa malicioso o una carga útil. Se puede usar para ofuscar partes del código, como URL de devolución de llamada o un archivo. Esta técnica se muestra a continuación en nuestro programa independiente de C#.

En este ejemplo de aplicación específica, el código toma un texto que en este caso es la URL "https://listener.malware.bad", lo convierte en una matriz de bytes de computadora y, a continuación, ejecuta el algoritmo de codificación base64 en los bytes para convertirlo en el texto ASCII alfanumérico de "aHR0cHM6Ly9saXN0ZW5lci5tYWx3YXJlLmJhZA==" que se muestra en la sección del codificador de la pantalla de la aplicación anterior. Este proceso se puede revertir mediante programación para recuperar el texto original como se muestra en la sección del decodificador. Al hacerlo, la URL se oculta a simple vista y no se puede determinar de inmediato lo que es: una URL maliciosa.
Técnica 5: Cifrado
Finalmente, analizamos el cifrado. Cifrar archivos en un sistema comprometido es de lo que el ransomware se convirtió en sinónimo. Esta es nuevamente una capacidad legítima para proteger los datos en reposo que, como la mayoría de las otras técnicas, se empleó con fines maliciosos en el ransomware.
En el siguiente ejemplo, tenemos una aplicación de cifrado de C#. Primero hace una copia del archivo destinado al cifrado y luego cifra la copia, dejando el original intacto.

Aquí, el contenido original del archivo original, Data1.txt, se copia en otro archivo, Data1-Encrypted.txt, y luego se encripta este nuevo archivo.

El cifrado es una de las principales técnicas empleadas por el ransomware y constituye la base para pedir un rescate a los sistemas comprometidos. También puede ser útil para ocultar cargas útiles de malware o cargadores en tránsito o en reposo para evadir la detección.
Lea la parte 2 del serial el 22 de mayo
El próximo artículo explorará el marco de software .Net de Microsoft y el lenguaje de programación C # asociado como referencia para algunas de las tácticas y técnicas que se muestran aquí y cómo se facilitan en última instancia.
Obtenga más información sobre cómo Illumio Zero Trust Segmentation puede ayudarlo a contener las infracciones de ransomware.