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 –
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.
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.
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.
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.
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.
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)
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.
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).
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)
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\.
MegaDumper habrá registrado los siguientes procesos durante todo el flujo de ejecución. Deben mantenerlo en activo desde el primer BP que establecimos anteriormente.
Finalmente obtuvimos selfbot.exe que termina 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.)
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.
Por último renombrar este archivo a «remcos.exe» y ejecutar extractor.py para extraer el C2 al cual se comunica la muestra.
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
FakeNet Genie: Improving Dynamic Malware Analysis with Cheat Codes for FakeNet-NG