Protocolo IRC en Cuckoo Sandbox

Durante el mes de Noviembre hemos estado añadiendo soporte a nuestra sandbox para que pueda interpretar el tráfico IRC y cuando un malware se comunica mediante este protocolo obtengamos información en nuestro informe, como son los mensajes que envía el cliente de irc y los mensajes que envía el servidor.

El día del fin del mundo, según los Mayas, se publicó la versión 0.5 de Cuckoo Sandbox, donde los desarrolladores de Cuckoo han añadido soporte para el protocolo IRC en el que hemos estado trabajando, por lo que si os bajáis esta versión ya dispondréis de esta funcionalidad.

A continuación me gustaría comentaros los ficheros que se han desarrollado o modificado para extraer el protocolo IRC de un flujo de tráfico TCP:

lib/cuckoo/common/irc.py«: Librería que dado un flujo TCP extrae los mensajes IRC del cliente por un lado y del servidor por otro. Para recoger estos mensajes (tanto cliente como servidor) se ha desarrollado una serie de funciones (se ha basado el desarrollo en la gramática descrita en el RFC en el punto 2.3.1):

_unpack(self, buf): Recibe un flujo TCP y extrae los mensajes IRC. Es la función que implementa la gramática y la que utilizan las mayoría de funciones públicas de la librería.

getClientMessages(self,buf): Como parámetro recibe un flujo TCP y devuelve un diccionario con los mensajes del cliente. El diccionario tiene tres campos, command, params y type.

  • command: Comando IRC.
  • params: Parámetros que lleva el comando.
  • type: Tipo de mensaje que depende de quien es el emisor. Puede ser client ó server. En este caso tendrá el valor client.

getClientMessagesFilter(self,buf,filters): Como parámetros recibe un flujo TCP y una lista con los comandos de cliente que no se tendrán en cuenta; vamos que se filtrarán (para evitar mensajes que puedan ser muy ruidosos). Como resultado devuelve un diccionario con los mensajes de cliente. Como en la función anterior tiene tres campos el diccionario.

getServerMessages(self,buf): Como parámetro recibe un flujo TCP y devuelve un diccionario con los mensajes del servidor. El diccionario tiene cuatro campos, prefix, command, params y type.

  • prefix: Campo donde el servidor indica el verdadero origen del mensaje.
  • command: Comando IRC.
  • params: Parámetros que lleva el comando.
  • type: Puede ser client/server. En este caso de tipo server.

getServerMessagesFilter(self,buf,filters): Como parámetros recibe un flujo TCP y una lista con los comandos de servidor que no se tendrán en cuenta, vamos que se filtrarán (para evitar mensajes que puedan ser muy ruidosos). Como resultado devuelve un diccionario con los mensajes de servidor. Como en la función anterior tiene cuatro campos el diccionario.

isthereIRC(self,buf): Como parámetro recibe un flujo TCP y devuelve True si hay mensajes IRC y False en el caso de que no hayan.

modules/processing/network.py”(): En este fichero se ha añadido soporte para procesar las peticiones IRC en Cuckoo y como es lógico usa la librería irc.py.

data/html/sections/network.html”: En este fichero se ha añadido código para que el informe muestre la información de la comunicación IRC. Como se ve debajo se muestra el comando irc, sus parámetros y el tipo de mensajes (cliente o servidor, dependiendo de quien lo envía).

Una vez lanzamos el análisis encontraremos en nuestro informe en la sección network algo como:

Y una vez desplegado se verá:

Como siempre espero que os sea de utilidad y cualquier error en la extracción que detectéis no dudéis en comentármelo.

Comments

  1. Pensaba que IRC ya ni se utilizaba…

  2. Sí que se utiliza sí ;-)