Unidad 42 análisis técnico: Seaduke

Unidad 42 análisis técnico: Seaduke

0
Created On 09/26/18 13:44 PM - Last Modified 07/19/22 23:07 PM


Resolution


Reimprima de la unidad 42.

 

A principios de esta semana, Symantec publicó un mensaje de blog detallando un nuevo troyano utilizado por la familia ' Duke ' de malware. Dentro de esta entrada de blog, se mencionó una carga útil que contenía una función denominada ' forkmeiamfamous '. Mientras realizaba algunas investigaciones en línea, la unidad 42 fue capaz de identificar la siguiente muestra, que está siendo etiquetada como ' Trojan. Win32. Seadask ' por un número de compañías antivirus.

MD5

A25EC7749B2DE12C2A86167AFA88A4DD

SHA1

BB71254FBD41855E8E70F05231CE77FEE6F00388

SHA256

3EB86B7B067C296EF53E4857A74E09F12C2B84B666FC130D1F58AEC18BC74B0D

Compilar timestamp

2013-03-23 22:26:55

Tipo de archivo

PE32 ejecutable (GUI) Intel 80386, para MS Windows, UPX comprimido

Nuestro análisis ha dado a conocer más detalles técnicos e indicadores sobre el malware en sí que no se mencionan en el correo de Symantec. Estas son algunas de nuestras observaciones:

 

Primera capa de ofuscación

Una vez que el UPX Packer es eliminado de la muestra de malware, se hace rápidamente evidente que estamos tratando con una muestra compilada usando PyInstaller. Este programa permite a un individuo escribir un programa usando el lenguaje de secuencias de comandos de Python y convertirlo en un ejecutable para la plataforma Microsoft Windows, Linux, Mac OSX, Solaris o Aix. El siguiente subconjunto de cadenas que se encontraron dentro del binario UPX-unpacked confirma nuestras sospechas.

  • Sys. Path. Append (r "% s")
  • del sys. Path [:]
  • Import sys
  • PYTHONHOME
  • PYTHONPATH
  • Error en el comando:% s
  • Sys. Path. Append (r "% s?% d")
  • _MEI% d
  • ERROR interno: ¡ no se puede crear el directorio temporal!
  • ADVERTENCIA: el archivo ya existe pero no debe:% s
  • Error al crear el proceso secundario!
  • No se puede GetProcAddress para PySys_SetObject
  • PySys_SetObject

Debido a que la muestra fue escrita en Python originalmente, somos capaces de extraer el código subyacente. Una herramienta como 'PyInstaller extractor' se puede utilizar para extraer los archivos PyC subyacentes presentes en el binario.

 

Figura 1. Archivos de Python extraídos de Seaduke

A continuación, podemos utilizar una herramienta como uncompyle2 para convertir el código de bytes Python en el código fuente original. Una vez completado este proceso, nos damos cuenta rápidamente de que el código subyacente de Python ha sido ofuscado.

 

Figura 2. Código de Python ofuscado

 

Segunda capa de ofuscación

Rastreando a través del código ofuscado, identificamos una sentencia ' exec (ZxkBDKLakV) ', que presumiblemente ejecutará algún código Python. Rastreando más, descubrimos que esta cadena se genera mediante la adición de un número de cadenas a la variable ' ZxkBDKLakV '. Finalmente, encontramos que después de crear esta cadena, se descodifica en Base64 y posteriormente se descomprimirá con la biblioteca zlib.

 

Figura 3. Segunda capa de ofuscación identificada

El siguiente código simple de Python se puede utilizar para eludir esta capa de ofuscación:

Marcador de sintaxis de Crayon v 2.6.6

importar sys, re, Base64, zlib

 

Si Len(Sys. argv) ! = 2:

  Imprimir "uso: Python% s [archivo]"% __file__

  sys. salida(1)

 

f = Open (sys. argv [1], ' RB ')

FData = f. Read ()

f. Close ()

 

# Configure esto en consecuencia

variable = "ZxkBDKLakV"

 

regex = "% s \ + = ([a-Za-z0-9] +) \n"% variable

out = ""

para x in re. FindAll (regex, FData):

  regex2 = "% s = \" ([a-Za-z0-9 \ + \/] +) \ ""% x

  para x1 en re. FindAll (regex2, FData):

  hacia fuera + = x1

 

o = Base64. b64decode (hacia fuera)

imprimir zlib. descomprimir (o)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

importar Sys, re, Base64, zlib

 

Si Len(Sys. argv) ! = 2:

    imprimir "uso: Python% s [archivo]" % __file__

    sys. salida(1)

 

f = abierto(Sys. argv[1], ' RB ')

FData = f. read()

f. Close()

 

# Configure esto en consecuencia

variable = "ZxkBDKLakV"

 

regex = "% s \ + = ([a-Za-z0-9] +) \n" % variable

out = ""

para x in re. FindAll(regex, FData):

    regex2 = "% s = \" ([a-Za-z0-9 \ + \/] +) \ "" % x

    para x1 en re. FindAll(regex2, FData):

        hacia fuera + = x1

 

o = Base64. b64decode(haciafuera )

imprime zlib. descomprimir(o)

[tiempo del formato: 0,0038 segundos]

El código Python restante todavía parece estar ofuscado, sin embargo, la funcionalidad general se puede identificar.

 

Carga útil final

Como podemos ver a continuación, casi todos los nombres de las variables y los nombres de las clases han sido ofuscados usando cadenas únicas largas.

 

Figura 4. Ofuscación descubierta en la carga útil final

Utilizando un poco de intelectual y buscar/reemplazar, podemos empezar a identificar y cambiar el nombre de la funcionalidad dentro del malware. Se puede encontrar una copia limpia de este código en GitHub. Una de las primeras cosas que notamos es una gran burbuja de datos codificados en Base64, que además se descomprimirá con zlib. Una vez que Decodificamos y descomprimimos estos datos, somos premiados con un objeto JSON que contiene datos de configuración para este malware:

 

Figura 5. Datos comprimidos codificados en Base64/zlib

 

Marcador de sintaxis de Crayon v 2.6.6

{

  "first_run_delay": 0,

  "Keys": {

  "AES": "KIjbzZ/ZxdE5KD2XosXqIbEdrCxy3mqDSSLWJ7BFk3o =",

  "aes_iv": "cleUKIi + mAVSKL27O4J/UQ = ="

  },

  "autoload_settings": {

  "exe_name": "LogonUI. exe",

  "app_name": "LogonUI. exe",

  "delete_after": false

  },

  "host_scripts": ["http://monitor.SYN [.] CN/RSS. php"],

  "árbitro": "https://www.Facebook.com/",

  "user_agent": "SiteBar/3.3.8 (servidor de marcadores; http://sitebar.org/) ",

  "key_id": "P4BNZR0",

  "enable_autoload": false

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

{

    "first_run_delay": 0,

    "Keys": {

        "AES": "KIjbzZ/ZxdE5KD2XosXqIbEdrCxy3mqDSSLWJ7BFk3o =",

        "aes_iv": "cleUKIi + mAVSKL27O4J/UQ = ="

    },

    "autoload_settings": {

        "exe_name": "LogonUI. exe",

        "app_name": "LogonUI. exe",

        "delete_after": false

    },

    "host_scripts": ["http://monitor.SYN [.] CN/RSS. php"],

    "árbitro": "https://www.Facebook.com/",

    "user_agent": "SiteBar/3.3.8 (servidor de marcadores; http://sitebar.org/) ",

    "key_id": "P4BNZR0",

    "enable_autoload": false

}

[tiempo del formato: 0,0023 segundos]

Este objeto de configuración proporciona una serie de pistas e indicadores sobre el propio malware. Una vez identificados estos datos, comenzamos a trazar la ejecución del malware desde el principio. Cuando el malware se ejecuta inicialmente, se determina en qué sistema operativo se está ejecutando. Si se ejecuta en un sistema que no sea Windows, vemos una llamada al método ' forkmeiamfamous ' infame. Este método es responsable de configurar una serie de configuraciones específicas de UNIX y de bifurcar el proceso.

 

Figura 6. Ejecución principal de malware

Continuando a lo largo, descubrimos que este malware tiene la capacidad de persistir utilizando una de las siguientes técnicas:

  1. Persistencia a través de PowerShell
  2. Persistencia mediante la clave ejecutar registro
  3. Persistencia a través de un archivo. lnk almacenado en el directorio de inicio

El malware se copia a un nombre de archivo al que se hace referencia en la configuración JSON.

 

Figura 7. Técnicas de persistencia

Después de que el malware se instala, comienza a hacer peticiones de red. Todas las comunicaciones de red se realizan sobre http para esta muestra en particular; sin embargo, parece que también soporta https. Cuando el malware realiza la conexión inicial de salida, se utiliza un valor de cookie específico.

 

Figura 8. Solicitud HTTP inicial realizada

En realidad, este valor de cookie contiene datos encriptados. Los datos codificados en Base64 se analizan desde el valor de la cookie (el relleno se agrega según sea necesario).

EBJhZTlKiqN8nYWejKh7UpDycPlcrGMEcTE =

A continuación se muestran los datos descodificados resultantes.

\x10\x12ae9J\x8a\xa3 | \x9d\x85\x9e\x8c\xa8{R\x90\xf2p\xf9\\\xacc\x04q1

Los datos subyacentes tienen las siguientes características.

 

Figura 9. Estructura de datos de cookies

XORing el primer caracter único contra el segundo caracter identifica la longitud de la cadena aleatoria. Usando el ejemplo anterior, recibimos lo siguiente.

Primer carácter: ' \x10 ′

Segundo carácter: ' \x12 ′

Longitud de la cadena (16 ^ 18): 2

Cadena aleatoria: ' AE '

Datos encriptados: ' 9J \ X8A \ xa3 | \x9d\x85\x9e\x8c\xa8{R\x90\xf2p\xf9\\\xacc\x04q1 ′

Finalmente, los datos encriptados se encriptan usando el algoritmo RC4. La clave se genera concatenando la cadena aleatoria usada previamente con la nueva, y tomando el hash SHA1 de estos datos.

 

Esta misma clave se utiliza para desencriptar los datos de respuesta proporcionados por el servidor. El servidor intenta imitar una página HTML y proporciona datos codificados en Base64 dentro de la respuesta, como se muestra a continuación.

 

Figura 10. Respuesta del servidor

Los datos encontrados dentro de las etiquetas de la respuesta HTML se unen y se elimina el espacio en blanco. Estos datos se decodifican en Base64 con caracteres adicionales ('-_ ') antes de ser descifrados mediante RC4 utilizando la clave previamente discutida. Después de que se produce la desencriptación, la cadena aleatoria anterior utilizada en la generación de claves se actualiza con la cadena aleatoria. Al hacerlo, los atacantes han asegurado que no se puede descifrar ninguna sesión http individual sin ver la sesión anterior. Si los datos descifrados no producen datos JSON apropiados, Seaduke lo descartará y entrará en un ciclo de sueño.

De lo contrario, estos datos JSON se analizarán para los comandos. Se han identificado los siguientes comandos en Seaduke.

Comando

Descripción

CD

Cambiar directorio de trabajo a uno especificado

Pwd

Regresar actual directorio de trabajo

Cdt

Cambiar directorio de trabajo a% Temp%

Autoload

Instalar malware en la ubicación especificada

migrar

Migrar procesos

clone_time

Clonar archivo timestamp Information

descargar

Descargar archivo

execw

Ejecutar, comando

Obtener

Obtener información sobre un archivo

subir

Cargar archivo en la dirección URL especificada

B64Encode

Base64-codifique los datos del archivo y el resultado de vuelta

Eval

Ejecutar código Python

set_update_interval

Actualizar temporizador de sueño entre las solicitudes de red principales

self_exit

Terminar malware

Seppuku

Terminar y desinstalar malware

Para que los comandos ' self_exit ' o ' Seppuku ' se ejecuten correctamente, los atacantes deben proporcionar un argumento secundario de ' YESIAMSURE '.

 

Conclusión

En general, Seaduke es bastante sofisticado. Mientras está escrito en Python, el malware emplea una serie de técnicas interesantes para cifrar datos a través de la red y persistir en el equipo de la víctima. Los clientes de Wildfire están protegidos contra esta amenaza. Además, Palo Alto Networks categoriza correctamente la URL utilizada por Seaduke como maliciosa.



Actions
  • Print
  • Copy Link

    https://knowledgebase.paloaltonetworks.com/KCSArticleDetail?id=kA10g000000ClluCAC&lang=es&refURL=http%3A%2F%2Fknowledgebase.paloaltonetworks.com%2FKCSArticleDetail