REMCOS RAT – .NET Unpacking

REMCOS es un software de acceso y control remoto comercial escrito en C++ y Delphi, tiene amplia documentación y soporte en su sitio. -PoC Remcos Remote Control Administration of remote systems –

https://breaking-security.net/remcos/

Sus primeras apariciones en malpedia fueron en 2017, teniendo una mayor visibilidad en los medios y la comunidad en 2020. Sus TTP fueron bien documentadas y ampliamente registradas, dejare fuentes de investigación interesantes al final del artículo.

https://malpedia.caad.fkie.fraunhofer.de/details/win.remcos

BitDefender publicó recientemente detalles sobre una campaña asociando a REMCOS, entre las tecnicas a destacar:

  • Mapping DLLs into the address space and resolving functions in the mapped file instead of the conventional LoadLibrary + GetProcAddress function calls
  • Hosting payloads on Imgur and employing a custom steganography algorithm to encode and decode data
  • Multiple layers of code injection to hide malicious actions behind seemingly legitimate processes

La muestra que vamos a tratar hoy tiene distintas composiciones o capas, a lo largo del informe se van a detallar los pasos que fuimos dando hasta llegar a obtener finalmente malware REMCOS. 

En principio vamos observar un binario que utiliza como compilador .NET, a medida que avanzamos con en el análisis iremos dando con indicios que nos van a confirmar la existencia de otros binarios. Esta práctica es común a la hora de entregar piezas de malware conocidas, ayuda a evadir controles de AV/ERD. Hay que tener presente que esas capas adicionales también pueden utilizar packers que dificulten aún más el análisis. 

Al final del informe se podrá comprender de qué forma se preparó a REMCOS para ser entregado, teniendo cómo resultado los portables ejecutables utilizados, cifrado de comunicaciones al c2 y posibles funcionalidades del malware no observadas en otro tipo de análisis. 

La muestra la descargamos directamente desde AnyRUN al azar, el decoder lo obtuvimos del colega dark0pcodes a quien quiero agradecer por darme animos a escribir esta entrada y tomarse el tiempo para responder mis dudas sobre el tratamiento de este caso que vamos a compartir. Pueden encontrar mas sobre sus investigaciones en su web https://darkopcodes.wordpress.com/, tambien dejare un enlace de su Workshop en ekoparty2020 “Threat Intelligence, the Malware Analysis Way”.

La información del archivo que vamos a tratar es la siguiente:

Filename: sake.exe
MD5: 83c72a4a182bf4f77cb143fce1559006
SHA256: 3908ede26aad1fc2a1db9d3a26a017549b40ebc7d73d731fcb5691aab82b830f
Magic: sake.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
Sandbox1: VT
Sandbox2: AnyRUN

Para el análisis vamos a utilizar las siguientes herramientas:

Detect-It-Easy: – Detect It Easy, or abbreviated “DIE” is a program for determining types of files.
pestudio: – is to spot artifacts of executable files.
dnSpy: is a debugger and .NET assembly editor.
x64dbg: An open-source x64/x32 debugger for windows.
Megadumper (.NET): Dump native and .NET assemblies.
HxD: View / Editor Hexadecimal Windows.
TSCD: TSCD Hex Dump
Decrypt: REMCOS RAT settings (Script)

Pueden encontrar estás herramientas y más en el Toolkit de Indetectables

Inicialmente abrimos el documento con pestudio y Detect-It-Easy , que nos va a proveer de datos mínimos en los strings y el tipo de packer que puede estar utilizando -o no-. Es recomendable comparar entre herramientas rápidamente y obtener de ellas lo realmente necesario para tener una idea inicial del archivo.

Imports, Strings, Libreries other dats: “selfbot.exe” / volcano.dat”

El resto de los strings son ilegibles o bien forman parte del método de compilación, por lo que comparamos con Detect Easy y HxD antes de abrir el debugger.

Detect- It Easy .NET Compiler

La última revisión rápida la podemos llevar a cabo con un editor hexadecimal y luego pueden optar por ejecutar la muestra sin conexión a internet o bien utilizar dnSpy para un debug, en nuestro caso vamos por esta ultima opción.

ACLARACIÓN: No estamos relevando comunicaciones en esta instancia, aunque si lo desean pueden utilizar INetSim o FakeNet para simular trafico, capturarlo y analizarlo con CapTipper .

Ya tenemos establecido que el método de compilación es .NET y encontramos más información sobre posibles .exe o .dat , esa información la mostró inicialmente pestudio.

Una buena idea sería intentar identificar la cabeceras del PE en este caso “MZ” en ASCII / “4d 5a” en Hexadecimal o bien “UPX” que también fue mostrado anteriormente.

Primera sección “4d 5a o MZ”
En la seccion 00000430 se puede observar “erotic.dat” y seguido “4d 5a o MZ”
Seccion 000053e0 se vuelven a ver los strings “4d 5a o MZ”

En esta instancia procederemos a ejecutar sake.exe con dnSpy y tratar de confirmar si existe más de un ejecutable en este archivo inicial.

dnSpy – Resources

Confirmamos entonces que la información previa que habiamos obtenido corresponde a resources del archivo inicial.

Resources – View dnSpy.
0x00000364: planet.resources‎ (37082 bytes, Embedded, Public)
0x00000439: erotic.dat‎ = 36864 bytes

0x00009444: poorcharm.resources‎ (6364 bytes, Embedded, Public)
0x0000951B: volcano.dat‎ = 6144 bytes

Lo que más resalta a simple vista en la siguiente imagen es la construcción de los arrays(GetResource) seguido de (CreateInstance) para terminar de cargar en un nuevo objeto. En la siguiente ejecución se puede observar cómo se van a utilizar los strings “name” y “key”. (tambien existe un XOR)

Secciones interesantes del Main()

Procedemos a establecer 2 Breakpoints(BP) en las (lineas 22 y 32) secciones que nos parecieron más interesantes, la idea es poder dummpear los procesos a medida que avanzamos y entender cómo se comporta la muestra.

BP con dnSPy en la linea 22 y 31

La primer ejecución nos evidencia cómo utiliza los strings que observamos anteriormente. Es importante activar MegaDumpper para que registre cada ejecución. (botón derecho sobre cualquier PID de interés opción: “NET Dumper” y creara una carpeta llamada Dumps).

Primer BP ejecutado, evidenciando la utilización de name / key.

En la segunda ejecución y trás dumpear nuevamente el proceso con MegaDumpper obtenemos una DLL. (belong.dll MD5: 0332CE0C766F4412F539462C1E4DA63D), con este nuevo elemento se deben repetir los pasos anteriores (pestudio, detect-it-easy,hxd, dnSpy)

(belong.dll MD5: 0332CE0C766F4412F539462C1E4DA63D)
belong.dll MD5: 0332CE0C766F4412F539462C1E4DA63D desde dnSpy Decode Base64 Strings

Nos resta una última ejecución con dnSpy que terminaria creando el proceso selfbot.exe en el path “c:\user\user\appdata\roaming\selfbot.exe” cómo así también \AppData\Roaming\Screens\.

Este ultimo BP termina de crear el file selfbot.exe

MegaDumper habrá registrado los siguientes procesos durante todo el flujo de ejecución. Deben mantenerlo en activo desde el primer BP que establecimos anteriormente.

Procesos registrados por MegaDumper

Finalmente obtuvimos selfbot.exe que termina utilizando UPX como packer.

Ultimop ejecutable utilizando UPX como packer.

En esta entrada no vamos a cubrir el unpacking de UPX, con localizar el Jump Tail y establecer un BP en esa instancia pueden posteriormente utilizar Scylla y OllyDumpEx. (Recuerden que al abrirlo desde x64dbg el entrypoint debe estar situado en PUSHAD.)

Tail Jump , se debe establecer un BP y Ejecutarlo para posteriormente utilizar Scylla y OllyDumpEx

Si lograron el parchado con éxito les quedara un binario con strings mucho más claros. Se pueden apreciar los comandos que utiliza REMCOS para sus operaciones.

binario final de REMCOS unpack UPX

Por último renombrar este archivo a “remcos.exe” y ejecutar extractor.py para extraer el C2 al cual se comunica la muestra.

extractor.py https://github.com/dark0pcodes/remcos_rat_decoder

Obtenemos los siguientes valores:

b’transcendentalistschool[.]com[:]37845[:]hackedbysakegang|@@Sake@@5@@\x01@@\x01@@\x00@@\x00@@\x00@@\x00@@
6@@sake.exe@@sake@@\x00@@0@@remcos_dblkdlqwgt@@1@@6@@logs.dat@@\x01@@\x00@@\x01@@60@@\x00@@@@5@@6@@S
creens
@@\x00@@\x00@@\x00@@\x00@@\x00@@\x00@@\x00@@\x00@@\x00@@5@@6@@audio@@\x00@@0@@0@@@@\x00@@\x01@
@0@@\x00@@1@@sake@@sake@@’

Fuentes:

2017-12-22 – MALSPAM USES CVE-2017-0199 TO DISTRIBUTE REMCOS RAT

Remcos RAT Revisited: A Colombian Coronavirus-Themed Campaign

Malware Analysis – .NET Unpacking Channel: MalwareAnalysisForHedgehogs

Eko2020​ Workshop | Felipe Duarte: Threat Intelligence, the Malware Analysis Way

Commodity .NET Packers use Embedded Images to Hide Payloads

x64dbg | UPX Unpacker

FakeNet Genie: Improving Dynamic Malware Analysis with Cheat Codes for FakeNet-NG

Autor: malwargsecurity

malwargsecurity un proyecto personal, sin fines de lucro y destinado la comunidad.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s