Desmitificación de técnicas de ransomware usando ensamblados.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 después de un ataque ransomware, a menudo leemos sobre cómo el ataque utilizó una combinación de diferentes tipos de archivos junto con una variedad de técnicas.
Entonces, ¿qué significa todo esto en realidad? En esta serie, lo desglosaremos todo usando el .Net marco de software para mostrar cómo se hacen posibles estas capacidades de ransomware.
En mi anterior serie de tres partes sobre Malware Payloads and Beacons, el foco estaba en Metasploit Marco de Pruebas de Penetración. Nosotros usamos su ya confeccionado medidor de medición carga útil de malware para mostrar varias técnicas del atacante. El primer articulo 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ó categorías y tipos de cargas útiles junto con algunas técnicas de manipulación en memoria. El parte final de esa serie se centró en las técnicas de evasión y mitigación.
En esta serie, crearemos nuestros propios archivos de carga útil individuales (también conocidos como ensamblajes) aprovechando .Net entorno de software, pero con un enfoque en el ransomware. Comenzaremos por desglosar las capacidades de ransomware y malware en técnicas de ejemplo individuales para comprender cómo funcionan por sí mismas. Algunas de estas técnicas individuales son, en última instancia, las que se combinan en una sola carga útil de ransomware malicioso con un efecto a menudo devastador.
Técnica 1: Descargadores, goteros y cargadores
Comenzamos por observar cómo el ransomware o el malware pueden conectarse fuera de 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, tenerlo cargado en la memoria).
A continuación se muestra un ejemplo de .Net aplicación de línea de comandos (consola) que:
- Actúa como un descargador mediante la descarga de otra aplicación ejecutable remota (putty.exe) desde Internet
- Deja caer la aplicación descargada en un temp carpeta en el disco en la computadora
- Cambie el nombre de la aplicación a putty_new.exe
- Ejecuta automáticamente la aplicación descargada en el equipo para que se cargue en la memoria

Cuando se utiliza la puesta en escena de carga útil, lo que significa tener varios archivos maliciosos haciendo cosas diferentes, el Stager (pequeña carga útil inicial) puede convertirse en el descargador y también, vagamente, el gotero para el escenario (principal carga útil 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 operacional.
A descargador es responsable de la extracción de una carga útil de una fuente remota, como un servidor 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.
A gotero, por otro lado, es el principal responsable de entregar o dejar caer una carga útil en un sistema de víctimas. Por lo tanto, un descargador también puede ser un gotero, pero un gotero puede no ser necesariamente un descargador porque un gotero ya puede tener la carga útil maliciosa incrustada en él como archivos ejecutables portátiles (PE) o DLL. Estos tipos de archivos se analizarán más adelante. Los goteros se utilizan comúnmente en los ataques; ejemplos populares son los ataques a la cadena de suministro Solarwinds y Kaseya. Ambos involucraron el uso de software de agente de proveedor comprometido utilizado como droppers para cargas útiles maliciosas. Este último, siendo utilizado por el ReVil ransomware grupo.
A cargadora es responsable de configurar el sistema de la víctima para ejecutar otra carga útil maliciosa, especialmente en el caso de cargas útiles de solo memoria. En este caso, la configuración significa garantizar la asignación de espacio de memoria necesaria a menudo mediante la inyección de una DLL en el espacio de memoria de otro proceso y luego configurar los permisos de memoria correctos. A continuación, el cargador lanza la carga útil o ejecuta los subprocesos necesarios.
Técnica 2: EXE cargando un archivo DLL
Las cargas útiles de ransomware pueden estar en forma de un archivo EXE o un archivo DLL. A continuación, nos fijamos en cómo un archivo ejecutable de Windows, también conocido como archivo EXE, puede cargar lo que se conoce como archivo de biblioteca de vínculos dinámicos (DLL) para aprovechar el código que contiene.

EXE y una DLL son dos tipos de .Net ensamblajes 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: EXE o DLL .Net montaje. Estos dos tipos de archivos permiten que el código de programación de computadoras sea ejecutado (EXE) en un sistema Windows o almacenado 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 pedir prestado el mismo libro de una biblioteca en diferentes momentos para leer su contenido. En la segunda parte de esta serie, exploraremos estos dos ensamblajes con más detalle en relación con el .Net. marco de software.
Por ahora, aquí hay un ejemplo muy sencillo para demostrar el uso de estos dos tipos de .Net ensamblados: un ejecutable (EXE) que ejecuta su propio código y luego carga y lee código externo de un archivo DLL. Luego, el ejecutable pasa alguna entrada al código DLL cargado. Finalmente, la DLL utiliza la entrada recibida del 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 demuestra la relación entre EXE y una DLL .Net asambleas. Este tipo de relación es utilizado 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.
La siguiente imagen muestra el código de programación tanto para EXE como para DLL en el ejemplo anterior. El código se escribe usando el lenguaje de programación C #, que es uno de los lenguajes soportados por .Net. En la imagen, las referencias del código DLL están resaltadas para el énfasis:

Las DLL son un medio eficaz de escribir un fragmento de código una vez de una manera que luego puede ser utilizada muchas veces por diferentes ejecutables como una biblioteca compartida o dinámica. Como resultado de esto, también es muy utilizado 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 estas .Net asambleas.
Técnica 3: Recon y lanzamiento viviendo de los binarios terrestres
Continuamos con una combinación de técnicas importantes: la capacidad de recopilar información útil sobre un sistema de destino (Discovery) y al mismo tiempo lanzar otros binarios o ejecutables en ese sistema (Spawning). En la imagen aquí, nuestro ejecutable personalizado inicial lanza un ejecutable nativo o binario en el sistema Windows objetivo, mostrando un ataque de Living off the land (LotL).

El ejemplo muestra nuestra aplicación C# inicial ejecutándose y luego procediendo a recopilar información útil sobre el sistema de destino, que se muestra en el texto verde en la salida. Observe la información de la unidad que se recopila. Esta información puede ser aprovechada por el ransomware para apuntar a archivos en estas unidades y luego ser exfiltrada antes del cifrado para una demanda de rescate generalmente elevada.
La aplicación continúa iniciando un ejecutable del sistema externo: la línea de comandos de Windows (cmd.exe) ejecutable. A continuación, la aplicación personalizada pasa algunos comandos de Windows a Windows cmd.exe proceso para mostrar (mostrado en texto rojo), en este caso la información de versión del sistema Windows. En beneficio de este artículo, la aplicación C# personalizada muestra el resultado de las acciones que realiza así como información sobre el proceso iniciado. Esta capacidad de lanzar otras aplicaciones externas también es útil para iniciar procesos de víctimas y 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 web para pasar datos de ida y vuelta, 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 utilizados por un programa malicioso o carga útil. Se puede usar para ofuscar partes del código, como URL de devolución de llamada o un archivo. Tal técnica se muestra a continuación en nuestro programa independiente C#.

En este ejemplo específico de aplicación, el código toma algún texto que en este caso es la URL”https://listener.malware.bad”, lo convierte en una matriz de bytes de computadora y luego ejecuta el algoritmo de codificación base64 en los bytes para convertirlo al texto ASCII alfanumérico de”AHR0CHM6LY9SAXN0ZW5LCI5TyWX3YXJLLmJHza==” que se muestra debajo de la sección codificador de la pantalla de la aplicación anterior. Este proceso se puede revertir programáticamente para recuperar el texto original como se muestra en la sección decodificador. Al hacerlo, la URL se oculta a plena vista y no se puede determinar de inmediato lo que es: una URL maliciosa.
Técnica 5: Cifrado
Por último, nos fijamos en el cifrado. Encriptar archivos en un sistema comprometido es de lo que ransomware se ha convertido en sinónimo. De nuevo, esta es una capacidad legítima para asegurar los datos en reposo que, como la mayoría de las otras técnicas, se ha utilizado con fines maliciosos en ransomware.
En el siguiente ejemplo, tenemos una aplicación de cifrado C#. Primero hace una copia del archivo destinado al cifrado y luego encripta la copia, dejando intacto el original.

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

El cifrado es una de las principales técnicas utilizadas por el ransomware y constituye la base para mantener sistemas comprometidos para obtener un rescate. 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 de la serie el 22 de mayo
El próximo artículo explorará la .Net marco de software y 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.
Más información acerca de cómo la Segmentación de confianza cero de Illumio puede ayudarle a contener las brechas de ransomware.