Invitación peligrosa, o cómo funciona la carga de combate para un correo electrónico de phishing



Recientemente, los especialistas de PT ESC descubrieron un documento en formato Publisher llamado "Invitación 29-30 de noviembre de 2018.pub" (1edd5b6a02ec82cec381c1a1ec74a67e). En este artículo, le diremos cómo un documento de aspecto ordinario se convierte en un troyano, lo que permite a un atacante capturar imágenes de cámaras web, grabar sonido por comando o cuando se detecta una ventana de Skype, ejecutar scripts de PowerShell, tomar capturas de pantalla, copiar archivos de dispositivos multimedia.

Entonces, cuando abre el documento, aparece una ventana con un borrón de documento borroso y una solicitud para incluir el script de Microsoft Publisher.



Después de que el usuario lo enciende, el script integrado en el documento se ejecuta en JavaScript. Se ve así:



El resultado del script será la decodificación de dos archivos, PDF y EXE, de Base64. Ambos archivos se escribirán en C: \ Users \ {Nombre de usuario} \ AppData \ Roaming \ DBFUpdate. En consecuencia, ambos archivos se ejecutarán y el usuario verá dicho trozo en la pantalla del documento:



RAT del cazador de tesoros


Los atacantes usan una RAT de múltiples módulos con un gran conjunto de funciones que proporciona acceso completo a la máquina infectada.

Características del código:

  1. Completamente escrito en C ++ con una gran cantidad de construcciones STL que se usan internamente.
  2. Aplicación de la biblioteca boost, en particular JSON y Archive.
  3. Funciones de depuración (más en la sección sobre stager).

Troyano principal


El troyano principal se fija en la máquina de la víctima y es una plataforma en la que se cargan módulos maliciosos desde C2.

Primero, stager inicializa el directorio de trabajo, que posteriormente almacenará la información recopilada por los módulos, las utilidades necesarias para que los módulos funcionen, etc.



A continuación se muestra la inicialización de las rutas para crear el directorio de trabajo:



Una vez que se han creado los directorios necesarios, el troyano principal recopila información sobre la máquina infectada y la envía al servidor de control.

Troyan está interesado en tales datos:

  • identificador de la versión del sistema operativo en el que se ejecuta el troyano principal;
  • El idioma predeterminado de la interfaz
  • El número de versión principal del Service Pack OS;
  • nombre de la computadora e identificador de la máquina (para obtener detalles sobre cómo obtener un identificador de la máquina, consulte la sección sobre el protocolo de red).

Así es como se recopila la información sobre la máquina infectada:



A continuación, el troyano principal se repara en la máquina infectada mediante la modificación del valor en el registro en HKCU \ Environment \ UserInitMprLogonScript. Aquí se escribe el nombre del archivo ejecutable que se asignó durante la inicialización del directorio de trabajo, en este caso es igual a "DCTHOST.exe". Este método se describe en el blog Hexacorn , y también fue utilizado por APT28 y el grupo Cobalt en su ComDLLDroper.



Y el último paso para inicializar el troyano principal es copiar el archivo ejecutable desde su ubicación actual al directorio de trabajo con el mismo nombre que se seleccionó cuando se inicializó el directorio de trabajo.

Después de inicializar el troyano principal, se lleva a cabo la preparación para recibir comandos. El módulo Core se agrega a la lista de módulos en ejecución, que es el troyano principal. A continuación, se inicia un comando desde el módulo Core con el identificador 0. No hay implementación de este comando en el módulo principal; en cambio, es solo un código auxiliar. El constructor del objeto del módulo Core se presenta a continuación.



Al final, comienzan dos hilos. Uno de los subprocesos inicia un temporizador, que se activa por defecto cada segundo e intenta solicitar un comando de C2.



La segunda secuencia carga bibliotecas adicionales y módulos estándar. Las bibliotecas, como los módulos, tienen un identificador, pero a diferencia de los módulos, los identificadores de la biblioteca son negativos, comienzan en -1, crecen hacia números más bajos. A continuación se muestra una lista de bibliotecas descargadas de C2.



Funciones de depuración del troyano principal


Al comienzo de su trabajo, inmediatamente después de la inicialización, el troyano principal establece un controlador de excepciones a través de SetUnhandledExceptionFilter, que contiene funcionalidades interesantes. Cuando se producen excepciones, caen en el controlador, que escribe el minivolcado de la aplicación, al tiempo que guarda información sobre la excepción. Luego se reinicia solo. En la pantalla, creando un minivolcado:



Protocolo de red


El intercambio entre el software y C2 se lleva a cabo utilizando un protocolo binario auto-escrito. Cada mensaje se describe usando BinPackage (nombre tomado de RTTI). Cada BinPackage es esencialmente un contenedor sobre std :: vector, que almacena el conjunto PackageRecord (se inventa el nombre). PackageRecord es la unidad mínima para almacenar datos.

struct PackageRecord { _DWORD dataId; _DWORD datatype; _DWORD szData; char[] data; }; 

Más sobre los campos de esta estructura:

  • dataId : indica el tipo de registro. O la entrada es un identificador de módulo, o un identificador de comando, o una carga útil.
  • szData : el tamaño de los datos almacenados en el registro.
  • tipo de datos es un tipo de datos.

En total, se registró el uso de tres tipos de datos:
  • Un valor de "0" significa que los datos almacenados en el registro deben interpretarse como DWORD.
  • El valor "1": los datos almacenados en el registro deben interpretarse como una cadena ASCIIZ.
  • El valor "2": los datos almacenados en el registro deben interpretarse como datos cifrados / almacenamiento intermedio sin procesar.


Al enviar BinPackage al servidor de control, se le agrega el identificador de la máquina. El identificador es el GUID de la sección de la que se cortan todos los caracteres especiales. En la figura, obteniendo el identificador de la máquina:



Antes de enviar, todos los registros almacenados en BinPackage se recopilan secuencialmente en un único búfer y se cifran. Para el cifrado, se utiliza la biblioteca WinAES , específicamente AES-128-CBC.

Usando Windows CryptoAPI, se generan dos matrices pseudoaleatorias de 16 bytes. Uno para IV, el otro para la llave. Se realiza el cifrado y los datos cifrados se vuelven a agregar a BinPackage, que contiene el paquete cifrado y consta de tres entradas:

  • registro con ID 0x777: contiene la clave utilizada para el cifrado;
  • registro con ID 0x555: contiene el IV utilizado para el cifrado;
  • registro con ID 0x999: contiene datos cifrados (en general, un registro con este ID indica una carga útil y se usa no solo para almacenar datos cifrados).

Después del final del proceso de encriptación, el BinPackage generado nuevamente se recopila en un único búfer y se envía a través de una solicitud HTTP POST al servidor de gestión 151.80.237.222.



A continuación se muestra un ejemplo de un paquete que contiene información de la máquina:



Y este es un ejemplo de un paquete cifrado con información del sistema:



Módulos


Cada módulo, con la excepción de Core, se carga desde el servidor de control. Todos los módulos se pueden dividir en dos categorías: módulos que se cargan automáticamente y módulos que se cargan a pedido del servidor de control.

Un ejemplo de un paquete que solicita un módulo:



Respuesta a la solicitud del módulo:



Cada módulo tiene una interfaz simple que consta de tres funciones: llamada al cargar el módulo Init, llamada al completar fini, y una función que cambia la configuración del módulo. Cada módulo también tiene una exportación llamada GetModule, que crea un objeto que representa este módulo y lo devuelve al troyano principal. Todos los módulos que descubrimos se lanzan en la memoria mediante carga reflexiva.



Además, los nombres de los módulos se dan en la forma en que están presentes en RTTI como nombres de clase.

Módulo CCore


Este módulo representa la funcionalidad básica y está integrado directamente en el troyano principal. Su constructor se puede ver en la tabla a continuación:
ID del móduloID del equipoDescripción
0 00 0Básicamente, un troyano en lugar de un comando es un trozo, y su propósito exacto no se pudo establecer
1Modificar la configuración del módulo
2Solicitar información de la computadora
3Descargue la utilidad desde el servidor de control
4 4Solicitar listado de un directorio que contiene utilidades
5 5Descargue el módulo y ejecútelo

Módulo CShell


Este módulo proporciona un shell remoto a una máquina infectada. Cuando se inicializa el módulo, se crea el proceso cmd.exe, al que se conectan dos canalizaciones: una para entrada estándar y otra para salida estándar, a través de la cual se reciben y transmiten comandos desde el servidor de control y viceversa. También en este momento, se inicia un subproceso, que toma automáticamente toda la salida y la envía al servidor de control. La figura muestra la inicialización del módulo CShell.


ID del móduloID del equipoDescripción
20 0Enviar comando a shell
1Imprime el archivo. Se lee un archivo, la ruta a la cual se transmite desde el servidor de control, y el contenido de este archivo se carga en el servidor de control
2Obtenga una lista de todos los discos existentes en el sistema. Los datos se envían al servidor de control en formato JSON
3Descargue el archivo del servidor de control. La ruta donde guardar el archivo y los datos se reciben del servidor de control

Módulo CFileSystemBrowser


Este es un módulo pasivo, que a pedido le permite recibir información sobre la estructura del sistema de archivos. Así es como ocurre la inicialización del módulo CFileSystemBrowser:


ID del móduloID del equipoDescripción
30 0Obtenga una lista de todos los discos existentes en el sistema. Los datos se envían a C2 en formato JSON
1Obtener listado de directorio. El listado se genera en formato JSON
2Imprime el archivo. Se lee un archivo, la ruta a la cual se transfiere desde C2 y el contenido de este archivo se carga en C2
3Eliminar archivo La ruta al archivo se transfiere desde C2

Módulo CScreenShot


Este módulo le permite tomar capturas de pantalla o capturar imágenes desde una cámara web. Puede hacerlo tanto a pedido como con un período específico en el temporizador.

ID del móduloID del equipoDescripción
4 40 0Tome una captura de pantalla y envíela al servidor de control
1Ejecute un temporizador, después del cual se toma una captura de pantalla de la pantalla de la máquina. Las capturas de pantalla resultantes se empaquetan en BinPackage y se guardan en la carpeta de registros. Los nombres de los archivos se generan utilizando la API GetTempFileName con el prefijo "MS_".
2Obtenga videos de dispositivos disponibles en una máquina infectada
3Capture un marco de la cámara web y envíelo al servidor de control

Módulo CSender


Este módulo no está activado inicialmente. Sube el contenido de la carpeta de registros al servidor de control. Se activa cuando llega una solicitud para cambiar la configuración, que contiene el período de verificación.



Módulo CKeylogger


Este módulo tampoco está activado inicialmente. Se activa cuando llega una solicitud de cambio de configuración que contiene el tamaño del búfer en el que se almacena el registro. La interceptación de entrada se lleva a cabo a través de rawinput . Además, el keylogger monitorea la ventana en la cual el usuario ingresa y registra su título.



Módulo CDictaphone


Este módulo graba el sonido por comando o al detectar una ventana de Skype. Cuando se inicia, inicia un subproceso que enumera todas las ventanas y sus ventanas secundarias en el sistema y busca la ventana entre las clases cuyo nombre de clase es TLiveConversation o TCallMonitorControl. Si se encuentra dicha ventana, comienza la grabación. A continuación se muestra la inicialización del módulo CDictaphone:



Y la ventana de búsqueda de Skype



La grabación se realiza a través del MCI enviando comandos especiales. Así es como se ve el ciclo de escritura del módulo CDictaphone:



Después de cerrar la ventana o de recibir un comando para completar la grabación, los datos recibidos se guardan en una carpeta temporal, después de lo cual se codifica mediante el codificador de MP3 cojo (se considera una utilidad y ya debería estar cargado, no fue posible obtenerlo del servidor de control). El archivo codificado se guarda en la carpeta de registros. Generar un nombre de carpeta es similar a generar nombres para capturas de pantalla.
ID del móduloID del equipoDescripción
7 70 0Comience a grabar y complételo después de 15 minutos.
1Dejar de grabar
2Verificar estado: está grabando en progreso

Módulo CProcessesManager


Este es un módulo pasivo, capaz de devolver una lista de procesos a pedido o finalizar por el PID que se le pasa.


ID del móduloID del equipoDescripción
80 0Devuelve una lista de procesos: sus nombres, PID y el nombre del usuario propietario del proceso.
1Finalización del proceso PID

Módulo de CDownloader


El módulo está diseñado para cargar archivos grandes al servidor de control. Realiza la transmisión de datos por fragmentos, cuyo tamaño se establece por su configuración. El módulo lee datos de un archivo, la ruta a la que recibe del servidor de control, y empaqueta trozos en BinPackage. Para cada BinPackage que contiene el fragmento, se agrega una entrada con el identificador 0x888, que incluye la ruta al archivo. Después de pasar cada trozo, el sueño se realiza durante 5 segundos.

ID del móduloID del equipoDescripción
9 90 0Trozo, no se pudo establecer el valor exacto
1Realiza la transferencia de una gran cantidad de datos (0x500000 bytes), después de lo cual mide el tiempo dedicado a la transferencia y envía este valor a C2
2Descargar un archivo de una máquina

Módulo CPS


Este módulo le permite ejecutar scripts de PowerShell.


ID del móduloID del equipoDescripción
100 0Recibe un script de PowerShell de C2 y lo ejecuta

Módulo CDeviceMonitor


Un módulo pasivo que monitorea los dispositivos multimedia conectados y copia archivos de ellos. Utiliza mensajes de difusión WM_DEVICECHANGE para detectar la conectividad del dispositivo. Después de conectar el dispositivo al servidor de control, se envía información sobre cuándo se conectó el dispositivo, su etiqueta de volumen y la ruta al dispositivo. El código utilizado para obtener la ruta al dispositivo es muy similar a este. Todos los archivos se copian en la carpeta de registros. Los nombres se generan de la misma manera que para las capturas de pantalla. El archivo fsIndex.dat se crea por separado, en el que se encuentra el diccionario serializado con boost :: archive. Este diccionario almacena las rutas originales a los archivos que se copiaron y sus hash MD5. A continuación se muestra el recibo de DevicePath:



Como epílogo, varias recomendaciones:

  • No es necesario abrir archivos adjuntos en cartas de destinatarios desconocidos, y mucho menos incluir un script de Microsoft Publisher.
  • No es menos peligroso hacer clic en los enlaces de las cartas de remitentes desconocidos. El sitio donde va puede alojar malware que se descargará automáticamente a su PC.
  • Debe actualizar regularmente el software, especialmente Microsoft Windows y Microsoft Office, que cerrará el acceso a una amplia gama de malware.

Source: https://habr.com/ru/post/es432172/


All Articles