viernes, 19 de noviembre de 2010

Enviar un e-mail suplantando la identidad de otra persona.

Nota: Este post nada tiene que ver con hacking, no se realiza nada ilegal.

El protocolo SMTP (Simple Mail Transfer Protocol) se utiliza para intercambiar e-mails. La forma en la que debe comportarse está definida en un estándar, en concreto el RFC 2821.

La anécdota de este protocolo de la capa de aplicación tan común, es que el estándar no especifica que para poder enviar correos electrónicos haya que proporcionar una contraseña. Esto da lugar a realizar cosas como la siguiente:

Supón que tienes dos amigos, Pepe y Juan. Tanto Pepe como Juan como tú tienen cuentas de correo electrónico en el trabajo (por ejemplo). Como sabes cuál es el correo de Pepe y de Juan, puedes enviar un correo a Juan haciéndote pasar por Pepe. Cuando Juan reciba el correo electrónico escrito por tí, verá que el remitente es Pepe. Sin embargo, Pepe no tendrá ni idea de que ese correo ha sido enviado con su e-mail.

¿Curioso verdad? Veamos como hacerlo funcionar:
  
telnet correo.servidor.empresa.es 25

Trying X X X . X X X . X X X . X X X . . .
Connected t o c o r r e o . servidor. empresa . e s .
Escape c h a r a c t e r i s ] .
220 c o r r e o . servidor . empresa . e s ESMTP − SERVIDOR

ehlo correo . servidor . empresa . es

250− c o r r e o . servidor. empresa . e s .
250−PIPELINING
250−SIZE 40480000
250−VRFY
250−ETRN
250−AUTH PLAIN LOGIN
250−AUTH
=PLAIN LOGIN
250−ENHANCEDSTATUSCODES
250−8BITMIME
250 DSN

m a i l from : CorreoDePepe @ servidor.empresa . e s
250 2 . 1 . 0 Ok
rcpt to : CorreoDeJuan @ servidor.empresa . es
250 2 . 1 . 5 Ok
data
354 End data with
>.
>
s u b j e c t : Asunto del correo a enviar
Aquí puedes escribir el cuerpo del mensaje. Para terminar escribe "."
.

250 2 . 0 . 0 Ok : queued a s 55CXXXXX1BA


Nota: Según las restricciones del servidor hemos de reiterar el envío de mensajes ehlo. Esto es debido a que algunos servidores tienen un mecanismo simple para evitar correos de spam, basado en tiempos de espera y reenvíos. Otra posibilidad es enviarse un correo a sí mismo y ya luego el de suplantación de identidad.

Servidores de correo como hotmail, gmail, ... no permiten realizar esta serie de actividades, lo que quiere decir que no implementan el protocolo estandarizado de SMTP, sino un SMTP adulterado. Si lo intentas comprobarás que el protocolo rechaza este tipo de intentos.

Sin embargo, si tienes una cuenta de correo electrónico en la universidad, en el trabajo, ... seguro que podrás ver que efectivamente esto funciona.

sábado, 13 de noviembre de 2010

¿Cómo gestionar la dependencia circular en C++?

La dependencia circular ocurre cuando dos clases se han de incluir la una a la otra. Para que el compilador no emita un error la forma de implementar las clases es la siguiente:

A.h

#ifndef _A_H_
#define _A_H_
#include <string>

class B;  // Declaración forward de la clase B

class A {
public:
  B getBfromA();
  std::string who_are_you();
};

#endif

B.h

#ifndef _B_H_
#define _B_H_
#include <string>

class A;  // Declaración forward de la clase A

class B {
public:
  A getAfromB();
  std::string who_are_you();
};

#endif

A.cpp

#include "A.h"
#include "B.h"

B A::getBfromA() {
  return B();
}

std::string A::who_are_you() {
  return "I am A";
}

B.cpp

#include "B.h"
#include "A.h"

A B::getAfromB() {
  return A();
}

std::string B::who_are_you() {
  return "I am B";
}

main.cpp

#include "A.h"
#include "B.h"

#include <iostream>

int main() {
  A a;
  B b;

  A ab = b.getAfromB();
  B ba = a.getBfromA();

  std::cout << "ab is: " << ab.who_are_you() << endl;
  std::cout << "ba is: " << ba.who_are_you() << endl;
  return 0;
}

Cuando se utiliza dependencia circular hay ciertas prácticas que no se pueden hacer. Supongamos el código A.cpp donde la clase B está declarada pero no definida. Veamos que se puede hacer:
  • Utilizar B como puntero o referencia, por ejemplo:
    class A {
        B *pt;
        B &pt;
    };
  • Declarar funciones o métodos cuyos parámetros o valores devueltos sean clases incompletas.
    class A {
      void f1(B);
      B    f2();
    };
  • Definir funciones o métodos que acepten/retornen punteros/referencias a los tipos incompletos (pero sin usar sus miembros)
    class A {
      void f3(B*, B&) {}
      B&   f4()       {}
      B*   f5()       {}
    };
Lo que no se puede hacer:
  • Utilizar B como clase base:
    class A : B {} // error de compilación
  • Usar B para declarar un miembro.
    class A {
        B m; // error de compilación
    };
  • Definir funciones o métodos usando el tipo B.
    class A {
      void f1(B b) {} // error de compilación
      B    f2()    {} // error de compilación
    };
  • Usar sus métodos o campos, en general intentar referenciar una variable con un tipo incompleto.
    class A {
        B *m;            
        void method()            
        {
            m->someMethod();      // error de compilación
            int i = m->someField; // error de compilación
        }
    };
Bibliografía:
http://www.adp-gmbh.ch/cpp/forward_decl.html
http://stackoverflow.com/questions/553682/when-to-use-forward-declaration

viernes, 12 de noviembre de 2010

Claves WEP

¿Eres usuario de telefónica y tienes contratado ADSL? Si es así, este artículo te puede interesar. Si no, quizás te podría interesar la conclusión final.

Seguro que como no quieres que nadie se conecte a tu router, usarás algún tipo de cifrado. Mucha gente utiliza el cifrado WEP con clave compartida. La clave WEP es un número hexadecimal (base 16) que puede ser de 64 ó 128 bits. ¿Te has preguntado alguna vez cómo se generan estas claves? Lo lógico sería decir que son aleatorias, pero parece que Telefónica no piensa así. Veamos por qué.
Telefónica comercializa básicamente 3 tipos de Routers que son:




ZyxelXavi Comtrend
0013490001380030DA

Según el tipo de Router que tengas, tu contraseña WEP por defecto comenzará por esa letra e irá seguida de los siguientes dígitos que se especifican debajo de cada módem.
Es decir, que si tienes un módem Zyxel, tu clave WEP comienza por:

Z001349

Pero no queda ahí la cosa. Como sabrás tu Wifi tiene un nombre de identificación, también llamado SSID. Por ejemplo un típico SSID por defecto de telefónica es el prefijo "WLAN_" seguido de un número hexadecimal. Por ejemplo 8B, dando como resultado el SSID:

WLAN_8B

Esto quiere decir que esos dos dígitos hexadecimales se ponen al final de la clave WEP, por lo que en el ejemplo anterior tenemos que la clave WEP es:

Z001349XXXX8B

Las equis que aparecen son los únicos 4 dígitos hexadecimales que se generan de forma aleatoria. Lo que quiere decir que realizar un programa que utilizando la fuerza bruta que encuentre la combinación de 4 dígitos que completa la clave WEP no es tan costoso computacionalmente.

Solución:

- ¿Cambiar la clave WEP por defecto? Sería aconsejable, pero esta solución no hace tu conexión segura. Los packets sniffers utilizados para averiguar claves WEP utilizan un mecanismo más potente para averiguar claves. No le importa que tu router sea de Telefónica, de ya.com, etc.

Una solución es habilitar en el router el MAC filtering y añadir las direcciones MAC de las tarjetas de red de aquellos dispositivos (pc's, portátiles, móviles, ...)  al router que queremos conectar a Internet. Cuando se habilita MAC filtering un packet sniffer no puede asociarse con nuestro router, por lo que posteriormente no podrá probar ningún tipo de ataque.

Para ello hay que entrar en la página de configuración del Router. Si estás en este Blog probablemente sepas cómo (y si no, pon un comentario).

¿Cómo saber cuál es la dirección de mi tarjeta de red en Linux?

Pues mediante el comando ifconfig.

Obtendrás una salida como la siguiente:

eth0    Link encap:Ethernet  direcciónHW 00:XX:XX:XX:XX:XX 
          ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
          Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:1000
          Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupción:44 Dirección base: 0x8000

El campo de direcciónHW es la dirección de tu tarjeta de Red.

Luego , WEP es un sistema de cifrado seguro, siempre que se configure correctamente.