• 29/04/2024 12:50

Dificultar un reversing con packers

(origen) Adrián Rodríguez Jul 29, 2019 , ,
Tiempo estimado de lectura: 5 minutos, 34 segundos

En el artículo de hoy se va a ver cómo los packers dificultan el reversing de un malware haciendo perder mucho tiempo a los analistas y complicando su tarea.

Este tipo de técnicas impiden, incluso a un analista, ver el código real del malware debido a la complejidad que introduce al análisis, porque dificulta la identificación del comportamiento de la amenaza y aumenta bastante el tiempo requerido del análisis.

A continuación, se va a explicar qué es un packer, qué tipos existen y además, cómo funcionan.

¿Qué es un packer?

Esta respuesta es muy sencilla de responder, un packer no es más que un mero “empaquetador” o “compresor”, cuya función radica en disminuir considerablemente el tamaño de un ejecutable, por tanto, viene muy bien en según qué entornos. Cabe destacar que el uso de estos compresores “en principio” no están relacionados a técnicas dañinas. Más adelante se comprobará que esta definición en el presente está incompleta, pero en origen, nació para cumplir con esta función.

El uso de este tipo de compresores se debe a que los conocidos como 7-Zip, WinRAR o WinZIP realizan su función, pero de forma mínima o incluso a veces aumentando el tamaño del fichero que se quiere comprimir.

Además, otro de los motivos por los que se usan los packers en ejecutables legítimos es para proteger los mismos contra la piratería informática, es decir, se protegen contra una posible copia del software. El motivo es sencillo, los packers no solo comprimen sino que, además, en función del tipo, tienen una serie de características adicionales que los hacen muy útiles para otros servicios. Es aquí donde está la clave de la línea roja de usarlo en malware.

Imaginen por un instante que se ha creado un malware y se está prácticamente convencido que va a ser detectado por los motores antivirus (AV), porque existen varios que realizan tareas similares. Pues de forma adicional a la acción de ofuscarlo y realizar otro tipo de técnicas, se usa un packer que empaquetará el malware y esconderá el comportamiento de éste. De esta forma, se matan dos pájaros de un tiro, por un lado, es más fácil saltarse los AV, y por otro se le complica la vida a los analistas que vayan a reversear el ejecutable, ya que lo primero que deberán hacer es “desempaquetarlo”, es decir, eliminar el packer y recuperar el ejecutable de memoria para obtener el código ensamblador y, así, poder analizar el comportamiento.

Una nota a tener en cuenta es que “desempaquetar” un malware no es para nada sencillo y puede llegar a requerir de bastante tiempo en función del packer. Este hecho significa tiempo, que es oro cuando hablamos de malware, porque cuanto mayor tiempo esté una amenaza sin detectar más infecciones provoca.

Otro punto importante a destacar es que la mayoría de los packers bien hechos hoy día incluyen subrutinas de detección de entornos virtuales para evitar ser analizados, lo cual significa que, a menos que la máquina virtual del análisis dinámica este perfectamente preparada, el análisis no se realizará con éxito. Para saber más sobre evasión malware puede leer el post https://hacking-etico.com/2019/04/22/metodos-de-evasion-de-una-sandbox/.

¿Qué
tipos de packers existen y cómo funcionan?

Existen tres tipos de packers diferenciados:

EmpaquetadoresCryptersProtectores

Los tres tipos tienen en común blindar una primera capa de
protección sólida alrededor de la carga útil del malware o software benigno.

Para el malware suelen usarse los dos primeros, mientras que
para proteger al software legítimo de copia se usan los protectores.

Tanto los empaquetadores como los crypters funcionan de forma parecida, de forma que una vez que el malware se ejecute, el payload malicioso se desempaquete/desencripte en memoria y haga las funciones para las que fue diseñado.

Un packer funciona de la siguiente forma, comprimiendo o
encriptando el ejecutable:

Pasa el ejecutable original a una subrutina del
packer para comprimirlo/encriptarlo.Almacena en una nueva sección del nuevo
ejecutable los datos comprimidos/encriptados.Crea un apéndice de descompresión para
desencriptar o descomprimir el ejecutable.En tiempo de ejecución se llama al apéndice de
descompresión para que realice su funcionalidad y descomprima la sección
empaquetada.El archivo ejecutable original se carga en
memoria.

De esta explicación se puede extraer que, por norma general,
los packers suelen ser autoextraíbles y, como se adivina en la imagen, tienen
su propia cabecera PE, lo cual quiere decir que pueden añadir metadatos propios
junto con algunas imágenes para ocultarse de los AV.

Existen packers que van un poco más allá de esta funcionalidad y atacan directamente a la tabla de las direcciones de importaciones (IAT: Import Address Table). Lo que hacen es ofuscar la IAT de forma que resuelva dinámicamente las importaciones. Esto quiere decir que cuando un analista intenta desempaquetar el malware se encuentra que le faltan elementos en la IAT o que está ofuscado, por lo cual debe reconstruirla para analizar correctamente el ejecutable. Este trabajo requiere de una alta cualificación en este campo y de mucho tiempo, por lo que es especialmente complicado desempaquetar este tipo de packers.

En este caso, es el apéndice quien intercepta las llamadas a
la API y las redirecciona a la API de Windows, es decir, hace las veces de
proxy. A su vez, traduce las llamadas desde la API al apéndice para que de esta
forma las pueda usar el código del ejecutable.

Adicionalmente a estos dos tipos de packers, existe un tercer tipo de empaquetador de tipo protector que es más común encontrarlo en software comercial para protegerlo de la piratería. Estos packers suelen tener en común el uso de algoritmos criptográficos potentes (RSA, AES, curvas elípticas, etc) que cifran el código, los datos y los recursos adicionales como las librerías y protegen incluso el código de protección con técnicas polimórficas para evitar el reversing. Algunos, incluso, emulan en la memoria la carga del ejecutable para que nada quede en disco o virtualizan las direcciones de memoria, amén de implementar todo tipo de técnicas anti-debugging y anti-reversing para asegurarse la ejecución en un entorno seguro.

¿Cuáles
son los packers más usados?

Los packers más usados en el último año han sido los de tipo
Allaple Polymorphic packer vna” que
es un tipo de empaquetador automático con un motor polimórfico que va generando
diferentes versiones de un malware de forma increíblemente sencilla.

Llama la atención el uso de cerca de un 12,5% de UPX, que es
un empaquetador que incluso puede instalarse en Linux o Microsoft para
des/empaquetar y que está bastante visto a día de hoy y no es complejo de
reversear. También destaca la presencia del packer chino NsPack que es capaz de
reducir en más de un 55% el tamaño de un ejecutable, aunque como UPX, está
estudiado y existen soluciones en el mercado como el plug-in NsPack Unpacker
que a su vez va integrado en alguna que otra solución como PE Explorer.

En contraste con años atrás donde UPX era el más usado, como ya se ha mencionado, a día de hoy se eligen otras opciones con motores polimórficos, que van instalando en las víctimas diferentes versiones del mismo malware para evitar ser detectados por los motores AV o, al menos, retrasar todo lo posible este hecho para infectar al mayor número posible de dispositivos.

¿Qué
herramienta usar para detectar packers?

Para detectar packers existen multitud de herramientas en
Internet, entre las cuales están RDG Packer Detector y PEiD por destacar
alguna.

La primera tiene una interfaz algo más elaborada que la segunda, aunque PEiD posee más funcionalidades, pero ambas son buenas opciones:

La primera, muestra la detección del packer y la posible, porque hay ocasiones en las que no detecta ningún empaquetador, pero existe la posibilidad que haya alguno gracias al análisis heurístico realizado.

La segunda opción, PEiD, tiene una interfaz más básica, pero no por ello es peor, debido a que ambas opciones tienen la posibilidad de introducir las firmas de packers que se quieran. En este caso, para PEiD se han encontrado las siguientes:

https://handlers.sans.org/jclausing/userdb.txthttps://raw.githubusercontent.com/ynadji/peid/master/userdb.txt

Una es de SANS y otro de Github, las cuales pueden usarse reemplazando el fichero de texto que se usa a modo de base de datos por estos.

Como se observa en la imagen, ambos softwares han detectado
sin problemas el packer de tipo UPX.

Las ventajas de uno y otro dependerán del punto de vista de cada persona, pero PEiD es una muy buena opción porque no sólo identifica el tipo de packer, sino que además es capaz de averiguar el OEP (Original Entry Point) que es el punto de entrada del ejecutable en la memoria, así como desempaquetar el ejecutable.

Para ello hace uso del plugin Snaker’s Generic Unpacker que ya integra. Por tanto, es una gran ventaja ya que ahorra tiempo de análisis y permite ir más rápido en caso de poder desempaquetar el packer, hecho que no ocurre en todas las ocasiones.

En el caso concreto de los UPX, como se ha mencionado ya, están bastante vistos y con la propia herramienta de UPX se pueden des/empaquetar tanto en Linux como Microsoft.

Una vez desempaquetados ya se podrá seguir con el análisis,
pero se ha ahorrado un tiempo que puede llegar a ser muy valioso.

En caso de no poder desempaquetar de forma automática, los pasos a seguir serían abrir el ejecutable con un debugger como OllyDBG y, una vez encontrado el OEP real, usar algún plugin adicional para extraer el payload de la memoria del equipo.

Conclusión

En este artículo se ha visto una introducción sobre los
packers, que tipos existen y como funcionan. Además, se ha hecho un repaso de
los empaquetadores más usados en el último año y se han visto herramientas con
las que detectarlos e incluso desempaquetarlos de forma automática.

Venga a ustedes!!


Artículo de Adrián Rodríguez publicado en https://hacking-etico.com/2019/07/29/dificultar-un-reversing-con-packers/