Dificultar un reversing con packers

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.

zip

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:

  • Empaquetadores
  • Crypters
  • Protectores

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.

packers

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

  1. Pasa el ejecutable original a una subrutina del packer para comprimirlo/encriptarlo.
  2. Almacena en una nueva sección del nuevo ejecutable los datos comprimidos/encriptados.
  3. Crea un apéndice de descompresión para desencriptar o descomprimir el ejecutable.
  4. En tiempo de ejecución se llama al apéndice de descompresión para que realice su funcionalidad y descomprima la sección empaquetada.
  5. 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.

OFUSCAR IAT

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:

RDG Packer
RDG Detector

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:

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.

PEiD

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.

PEiD OEP

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.

Windows UPX

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!!