Análisis de malware
Un estudio de caso de ladrones de información: Parte I
diciembre 3, por Souhail Hammou
Introducción:
Un ladrón es un tipo de malware que busca contraseñas almacenadas en la máquina y las envía de forma remota (por ejemplo, correo, HTTP) a un atacante. La mayoría de los ladrones utilizan una interfaz web para facilitar la navegación de los datos, especialmente si el número de víctimas objetivo es importante. La interfaz web de Pony, por ejemplo, ofrece estadísticas sobre los datos robados y de qué aplicaciones procede la información.
¡Conviértete en un ingeniero inverso certificado!
Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender
Estadísticas de la interfaz web de Pony.
La mayoría de las credenciales a las que se dirige el malware Pony son cuentas FTP y billeteras Bitcoin. También puede robar datos de Firefox, Chrome e Internet Explorer. El constructor Pony deja al atacante la posibilidad de determinar qué aplicaciones (llamadas complementos) son de mayor interés. Así es como se ve la interfaz del constructor:
Constructor de ladrones de ponis
Como veremos más adelante en el análisis, cada complemento no es más que una función especializada en robar información y almacenarla en el espacio de direcciones virtuales.
Un primer vistazo a la muestra de malware:
La muestra con la que trabajaremos durante este análisis estaba alojada en el dominio «heritageibn.com» que estuvo activo hace unos días, pero lamentablemente está inactivo en este momento. El panel Pony (interfaz web) estaba alojado en el mismo sitio web y requería una combinación de inicio de sesión/contraseña para ingresar. Dado que la interfaz web está fuera del alcance de este artículo, mantendremos nuestros ojos enfocados en la muestra cuyo nombre le cambié a: Pony.exe.
Puede descargar el ejemplo desde el enlace proporcionado en la sección Referencias al final de este artículo.
Las mejores prácticas de análisis de malware dictan que analicemos el malware en un entorno seguro. En otras palabras, usaremos una máquina virtual Windows 7 de 32 bits para ejecutar y analizar la muestra del ladrón de Pony.
Los programas maliciosos generalmente vienen empaquetados y, como habrás notado en la anterior del constructor Pony, una opción incluye el empaquetado UPX del ejecutable. Como ya sabrá, los archivos comprimidos UPX son los archivos más fáciles de volcar. De hecho, el empaquetador UPX ofrece un servicio para descomprimir cualquier ejecutable empaquetado con UPX a menos que se hayan realizado modificaciones en el código fuente del empaquetador o en el ejecutable mismo. Abramos el ejecutable en un editor hexadecimal y veamos si podemos reconocer alguna cadena familiar que indique que la muestra fue empaquetada con UPX (es decir, se eligió la opción de empaquetado):
Ahora está claro que se utilizó UPX para empaquetar el archivo. Por lo tanto, podemos proceder a desempaquetar la muestra. Hay dos maneras de hacerlo.
El primer método sería descargar el empaquetador UPX de Internet y luego usar la opción -d (descomprimir) para descomprimir el archivo.
El problema con este método es que el atacante podría simplemente modificar una letra de una de las cadenas UPX y, como resultado, el comando -d no podría descomprimir el archivo. Esto se debe a que la herramienta se confundiría al analizar el archivo de destino.
El segundo método consiste en descomprimir el archivo mientras lo depura. Cuando el código auxiliar UPX descomprime el archivo completamente en la memoria, saltará al OEP (Punto de entrada original) y luego comenzará a ejecutar el código del ladrón de Pony. En tal caso, volcar el ejecutable es fácil, especialmente cuando se trata de UPX, que no implementa ningún truco anti-dumping.
No analizaremos esos detalles ya que el desembalaje está fuera del alcance de este artículo. En su lugar, trabajaremos en el ejecutable descomprimido del ejemplo.
Ahora que tenemos el ejecutable descomprimido, comencemos primero por desechar sus cadenas. Aquí hay algunas cadenas que se pueden volcar fácilmente usando OllyDbg, IDA Pro o cualquier herramienta de volcado de cadenas.
En realidad, hay una gran cantidad de cadenas y no pude encapsularlas todas en una sola imagen, así que intenté mostrar las más interesantes. ¡Puede notar claramente que se accede a las claves de registro de Firefox para leer o escribir! También puedes notar que Pony apunta a carteras de Bitcoin, lo cual es realmente peligroso si posees bitcoins y realizas transacciones. Según bitcoin.it, un archivo wallet.dat contiene los siguientes detalles:
- pares de claves para cada una de las direcciones del propietario
- transacciones realizadas desde/hacia las direcciones del propietario
- Preferencias del usuario
- clave predeterminada
- reservar llaves
- cuentas
- un número de versión
- Grupo de claves
Desafortunadamente, no podremos revisar todas las aplicaciones a las que apunta el ladrón de Pony porque hay muchas y requiere tiempo y esfuerzo revisarlas una por una. En cambio, nos interesará cómo se comporta el malware, cómo cifra los datos y cómo los envía al CC.
El punto de entrada:
El punto de entrada de la muestra desempaquetada está en 00410EBF.
Empezamos notando una especie de prólogo antes de ejecutar la instrucción en 00410ED2. De hecho, este prólogo se encuentra en la mayoría de las funciones de Pony y es realmente fácil de entender.
XOREDX,EDX; poner a cero EDX
XOR EAX,EAX
XOR EDX,EDX
presione 00410ED2; empujar la dirección de la rutina real para llamar
NOP
CVX; FC = 0
NOP
JB CORTO 00410ED1
NOP
RETEN ; pop la dirección y la ejecución va a 00410ED2
Después de que la ejecución regrese de 00410E45, se llama a ExitProcess, así que entremos en 00410E45 y veamos qué hace.
Construyendo una tabla de importación personalizada:
Además de la IAT (tabla de direcciones de importación) predeterminada, el ejemplo construye una segunda tabla de importación que utilizará en muchas rutinas durante su ejecución. Esta tabla tiene un formato personalizado y su función se llama usando este método: CALL DWORD PTR DS:[ Dirección ]. Las funciones se importan desde las siguientes DLL:
- ole32.dll
- crypt32.dll
- advapi32.dll
- shell32.dll
- netapi32.dll
- kernel32.dll
- msi.dll
- pstorec.dll
- userenv.dll
El bucle que realmente llena la tabla con funciones se llama para cada biblioteca. La misma función también es responsable de llamar a LoadLibrary para obtener un identificador del módulo cargado antes de llamar a GetProcAddress.
La tabla que se llena comienza en una dirección estática y se encuentra en: 004153C5.
Ajustando el token de proceso:
Durante este paso, Pony intenta ajustar los privilegios del proceso para poder realizar sus tareas. Los privilegios que intenta agregar el malware son los siguientes:
- SeSuplantarPrivilegio
- Privilegio SeTcb
- SeCambiarNotificarPrivilegio
- Privilegio SeBackup
- SeRestorePrivilegio
- SeAumentarCuotaPrivilegio
- Privilegio SeAssignPrimaryToken
Estos privilegios se agregan uno por uno al token mediante:
- Llamar a LookupPrivilegeValueA para buscar el LUID del privilegio.
- Llamar a OpenProcessToken con TOKEN_ADJUST_PRIVILEGES para el proceso actual.
- Finalmente, llamamos a AdjustTokenPrivileges para agregar el privilegio al token de proceso.
El ladrón también parece llamar a la función GetUsernameA, para obtener el nombre de usuario asociado con el hilo actual y luego almacenar el puntero de cadena en una dirección estática: 00418681.
Accediendo al registro:
En esta parte, Pony comienza a usar objetos de flujo OLE y continuará usándolos en sus otras tareas. Un objeto de flujo se crea usando la función: CreateStreamOnHGlobal . Esta función devuelve un puntero a una estructura que se puede utilizar para almacenar datos de cualquier tipo.
El acceso directo a la estructura de la secuencia no es una buena práctica, por lo que OLE32 ofrece una función para obtener un puntero a los datos almacenados reales: GetHGlobalFromStream .
Por lo tanto, el malware crea dos objetos de flujo, cada uno para algún tipo de datos que conoceremos más adelante en esta sección. Luego continúa para abrir la clave de registro:
«HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionDesinstalar»
En Windows, si desea desinstalar un programa, por ejemplo, deberá acceder a la utilidad Agregar o quitar programas desde el Panel de control . Lo interesante de la clave de registro anterior es que la utilidad Agregar o quitar programas en realidad la usa para obtener todos los detalles sobre las aplicaciones que se muestran al usuario.
Lo que hace Pony es recorrer todas las subclaves de la clave anterior usando RegEnumKeyExA y luego verificar si esa subclave contiene los dos valores: «UninstallString» y «DisplayName». El primer valor es la ruta al ejecutable responsable de desinstalar el software y el segundo es el nombre del software que se mostrará. Si estos valores realmente existen, lee su contenido y almacena cada uno en una secuencia OLE. Ahora está claro que las dos secuencias se usan para almacenar dos tipos diferentes de datos, una secuencia se usa para almacenar valores «UninstallString» y la otra se usa para valores «DisplayName». Después de recorrer todas las subclaves, cada una de las secuencias se copia en una ubicación de memoria independiente (asignada dinámicamente), luego, los punteros se almacenan en 0041506E (cadenas UninstallString) y en 00415072 para las cadenas «DisplayName». Finalmente, se liberan los arroyos.
Ya que no vamos a profundizar en cómo Pony roba datos de cada tipo de software, ya que cada uno es único. Voy a mostrarles un pequeño ejemplo en el que el ejemplo utiliza «UninstallString» («DisplayName» también se usa para otro software objetivo del ladrón).
En este ejemplo, Pony apunta al software CuteFTP. Itera a través de todas las cadenas de desinstalación buscando la subcadena CUTEFTP ya que se sabe que este programa tiene en realidad una subcadena CUTEFTP en su UninstallString. Si la subcadena no se encontró en ninguna de las cadenas, simplemente significa que el software no está instalado en la máquina.
Descifrando la clave de cifrado:
La clave de cifrado que se utiliza para cifrar los datos que se comunican al servidor CC se cifra mediante un algoritmo muy simple.
00410522 MOV EAX,DWORD PTR SS:[EBP+8]
00410525 Y EAX,EAX
00410527 JZ CORTO 00410535
00410529 JMP CORTO 00410530
0041052B DEC BYTE PTR DS:[EAX]
0041052D DEC BYTE PTR DS:[EAX]
0041052F INC EAX
00410530 CMP BYTE PTR DS:[EAX],0
00410533 JNE CORTO 0041052B
00410535 SALIR
00410536 RETIN 4
La cadena cifrada «dcdclc{B3456» se convierte en «babajay@1234». El cual será utilizado, como veremos más adelante, en el cifrado.
Descifrando una lista de palabras:
Una lista de palabras cifradas se descifra en tiempo de ejecución y el ladrón la utilizará más adelante. El cifrado también es muy débil.
00402E5F EMPUJE EBP
00402E60 MOV EBP,ESP
00402E62 EMPUJAR EDI
00402E63 MOV EDI,DWORD PTR SS:[EBP+8]
00402E66 JMP CORTO 00402E74
00402E68 JMP CORTO 00402E6E
00402E6A XOR BYTE PTR DS:[EDI],01; descifrando
00402E6D INC EDI
00402E6E PTR BYTE CMP DS:[EDI],0
00402E71 JNE CORTO 00402E6A
00402E73 INC EDI
00402E74 CMP BYTE PTR DS:[EDI],0
00402E77 JNE CORTO 00402E68
00402E79 POPEDI
00402E7A SALIR
00402E7B RETIN 4
La lista de palabras se almacena en 00417F27, después de descifrarla contiene algunas de estas palabras: samantha, michelle, david, eminem, scooter, asdfasdf, etc.
Conclusión:
En esta primera parte, echamos un vistazo a lo que hace Pony antes de empezar a robar los datos. ¡Qué claves de registro lee y por qué! También hemos visto que descifra una cadena, que aparentemente es una clave, y una lista de palabras que se utilizará en algún tipo de fuerza bruta. La imagen aún no está completa, por eso en la segunda parte responderemos estas preguntas:
¡Conviértete en un ingeniero inverso certificado!
Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender
Recursos:
Enlace al ejemplo: https://goo.gl/dC62wM