Ejecutando un binario mediante la técnica RunPE

La técnica conocida como RunPE la podemos encontrar descrita con varios nombres diferentes como: RunPE, Dynamic Forking, process replacement o process hollowing. También he visto que se refieren a ella como “process zombie”, pero después en otras fuentes mencionan diferencias que podéis leer aquí [5].

Durante los últimos meses hemos observado desde el laboratorio de malware que algunos “bichos”conocidos la implementan, por ejemplo como hancitor[1].

En esta entrada no vamos a explicar la técnica en detalle, ya que con un simple búsqueda en Google por los términos RunPE, Dynamic Forking o Process Hollowing, encontraréis información muy buena sobre la técnica [2][4].

Por tanto, el objetivo de la entrada es ver como un analista cuando se encuentra con un malware que utiliza esta técnica puede obtener el código del malware para analizarlo posteriormente (el código inyectado). Para probarlo, durante esta entrada hemos utilizado el código que podéis encontrar aquí [3]. Como podréis ver está sacado de una entrada del foro “www.rohitab.com” que se referencia como comentario en el mismo código fuente.

Una vez compilado, lo primero que hacemos es probar el código y lo lanzamos de la siguiente manera:

$ runpe.exe «C:\windows\system32\svchost.exe» «C:\Users\john\Desktop\Bintext.exe»

Esto lo que hará será arrancar suspendido un proceso “svchost.exe”, realizará una llamada a la función “NtUnmapViewOfSection()” sobre el proceso “svchost.exe” y después mapeará el binario bintext.exe (en un caso real sería el código del malware lo que se copiaría) sobre la estructura del “svchost.exe”. Si arrancamos un visor de procesos veremos como lo que hay arrancado es el “svchost.exe”, aunque será bintext.exe lo que realmente se ha arrancado:

En esta situación, para obtener el binario malicioso lo que deberá hacer el analista será utilizar un debugger y “anclarse” (attach) al proceso. Después utilizaremos el plugin “OllydumpEx[6] (el plugin tiene versión para ollydbg, idapro o x64dbg) para realizar el volcado del proceso.

 

No modificaremos ninguna opción ya que lo que detecta el plugin es el nuevo binario alojado. Como vemos, con esta técnica será sencillo obtener el código inyectado sobre el proceso svchost.exe. En este caso cuando hagamos el volcado veremos que el binario tendrá el icono de bintext.exe:

Si ejecutamos el binario volcado se nos mostrará el bintext.exe directamente.

Un aspecto importante para los analistas es que cuando se encuentren con malware que utiliza como  proceso “huésped” al svchost.exe se fijen en si lleva asociados servicios. Normalmente todos los binarios svchost.exe llevan uno y el lanzado por el malware no lo llevará. Una manera sencilla de verlo sería con el propio ProcessHacker[7]:

Este sería el ejemplo de un proceso normal que sí que tiene la pestaña “Services”. En cambio en el que hemos creado mediante RunPE no veremos la pestaña “Services”:

El malware como ya habréis podido intuir, utiliza esta técnica porque cuando miras el proceso y sus características es un proceso totalmente legítimo, aunque realmente está ejecutando otro proceso. Podéis ver en la imagen como nos está indicando que está la firma verificada por Microsoft, por lo que podríamos llegar a pensar que todo está bien.

Como siempre espero que os ayude en vuestros análisis esta información.

Referencias:

[1] https://blog.didierstevens.com/2016/11/02/maldoc-with-process-hollowing-shellcode/
[2] http://www.adlice.com/runpe-hide-code-behind-legit-process/
[3] https://github.com/jholgui/malware/blob/master/RunPE.cpp
[4] https://www.trustwave.com/Resources/SpiderLabs-Blog/Analyzing-Malware-Hollow-Processes/
[5] https://www.malwaretech.com/2014/12/zombie-processes-as-hips-bypass.html
[6] https://low-priority.appspot.com/ollydumpex/
[7] http://processhacker.sourceforge.net/