Monthly Archives: November 2010

Construír e instalar Firesheep en GNU/Linux Ubuntu 10.10

Introducción.

Firesheep es un plugin de Firefox que permite fácilmente secuestrar sesiones HTTP en ciertas condiciones y de ciertas aplicaciones web gracias a que estas utilizan el protocolo seguro de transporte HTTPS únicamente durante la autenticación, transmitiendo el resto de la información plana permitiendo que otros usuarios se apoderen de la información de la sesión de usuario y puedan acceder a sitios como Facebook, Twitter y blogs de WordPress entre otros con las credenciales del usuario afectado.  Esto es notoriamente grave en las inalámbricas públicas que pueden ser accedidas sin autenticación alguna.

La solución a esta debilidad de las aplicaciones web será entonces utilizar el protocolo HTTPS durante toda la sesión del usuario, no sólamente durante la autenticación como estas aplicaciones afectadas hacen actualmente.  Como protección desde el lado del usuario es posible utilizar plugins como HTTPS Everywhere que obligan al navegador a utilizar el protocolo HTTPS todo el tiempo que se acceda a determinados sitios web.  De igual manera han aparecido aplicaciones que prometen detectar y combatir el uso de Firesheep en las redes y con las que estaré experimentando próximamente.

Actualmente este plugin puede descargarse para Firefox bajo Windows y OSX, la versión para Linux no se encuentra actualmente disponible, sin embargo como el proyecto es de código abierto es muy fácil obtener el código y compilarlo para esta plataforma tal y como se describe a continuación.

Construír el software.

Instalar git.

El cliente de git es necesario para acceder al código fuente del plugin que se encuentra almacenado en un repositorio de GitHub.

$ sudo aptitude install git-core

Obtener el código fuente.

$ mkdir /tmp/firesheep && cd /tmp/firesheep

$ git clone https://github.com/codebutler/firesheep.git

$ cd firesheep

$ git submodule update –init

Instalar las dependencias.

Estos paquetes son necesarios para la construcción del plugin a partir de su código fuente.

$ sudo apt-get install autoconf libtool libpcap-dev libboost-all-dev libhal-dev xulrunner-1.9.2-dev

Construír el plugin.

$ ./autogen.sh

$ make

Instalar el software.

Desde Firefox elija la opción de abrir un archivo (CTRL+O).

File > Open File…

Y seleccione el archivo /tmp/firesheep/firesheep/build/firesheep.xpi.

Usar el software.

Una vez activado el plugin este puede visualizarse como una barra lateral mediante View > Firesheep o la combinación de teclas CTRL+SHIFT+S.

Firesheep en Ubuntu 10.10

Firesheep en Ubuntu 10.10

Su uso es muy sencillo, simplemente presione el botón Start capturing y espere a que la aplicación capture la información de las sesiones en la red, las cuales aparecerán en la barra lateral situada al lado izquierdo.

Enlaces.

Transformaciones gráficas con Processing

Introducción.

Este fin de semana me tomé un rato para jugar con Processing, esta vez con las transformaciones gráficas que hacía tiempo estaba postergando por mis múltiples actividades pereza.

Como en todos los demás lenguajes, en Processing es posible trasladar un objeto sumando valores a sus respectivas coordenadas.  Processing además facilita esto con un método mas elegante, en lugar de trasladar las coordenadas del objeto se traslada el orígen del plano y se grafica con referencia a este orígen.  Esta técnica no sólo es útil para trasladar sino que también puede utilizarse para rotar y escalar los graficos.

Estas modificaciones alteran la matriz de transformación actual, esto quiere decir que afectarán igualmente a las invocaciones posteriores.  Para limitar esto se utilizan las funciones pushMatrix y popMatrix que permiten almacenar y posteriormente recuperar las matrices de transformaaciones originales.

Implementación.

Traslación.

Como mencioné, la técnica consiste en trasladar el orígen del plano a la nueva coordenada.

translate(nuevoX, nuevoY);

Y desde allí generar el grafico con coordenadas respecto al orígen.

rect(-ancho/2, -alto/2, ancho, alto);

Con este ejemplo se obtendrá un rectángulo cuyo centro será (nuevoX, nuevoY).

Rotación.

El ángulo de rotación se indica en radianes (ver radians) y su rango de valores va desde 0 hasta 2*PI.

rotate(angulo);

La rotación realiza el traslado del orígen así que se hace necesario ubicarla en su posición final como se mencionó antes.

Escalamiento.

El índice de escalamiento se indica como un número real (1.5 = 150%) y sus valores van desde 0 hasta infinito.

scale(nivel);

Igual que con la rotación, con el escalamiento se hará necesario ajustar la ubicación del grafico trasladándolo como se mencionó inicialmente.

Demostración.

Demostración de transformaciones con Procesing

Demostración de transformaciones con Processing

En este sketch de demostración se pueden utilizar las transformaciones mencionadas mediante las siguientes teclas.

Flechas del cursor
Ubicación del puntero del ratón
Movimiento del carro
qTerminar el sketch (aplicación)
rReiniciar el sketch
s, dGirar la imagen
a, zManipular el nivel de acercamiento
wMostrar el rectángulo de la imagen
eMostrar el grafico de la imagen

Enlaces.

Degradar PHP 5.3 a 5.2 en GNU/Linux Ubuntu 10.10

Para degradar PHP 5.3 a la versión 5.2 en GNU/Linux Ubuntu 10.10 se debe realizar el mismo procedimiento que se mencionó antes con la versión 10.04 del sistema operativo pero con una modificación del script utilizado.

Es necesario reemplazar el nombre de la versión Lucid Lynx de Ubuntu por la actual Maverick Meerkat en la siguiente línea.

grep 'main restricted' /etc/apt/sources.list|grep -v "#"| sed s/lucid/karmic/g | sudo tee /etc/apt/sources.list.d/karmic.list > /dev/null

De esta manera.

grep 'main restricted' /etc/apt/sources.list|grep -v "#"| sed s/maverick/karmic/g | sudo tee /etc/apt/sources.list.d/karmic.list > /dev/null

Descargue el script modificado y continúe con las instrucciones mencionadas en el artículo anterior.

Si desea instalar el módulo de Apache correspondiente ejecute el siguiente comando y no acepte la versión 5.3 para que sea instalada la anterior.

$ sudo aptitude install libapache2-mod-php5

The following NEW packages will be installed:

libapache2-mod-php5{b}

0 packages upgraded, 1 newly installed, 0 to remove and 20 not upgraded.
Need to get 0B/3,105kB of archives. After unpacking 8,704kB will be used.

The following packages have unmet dependencies:
libapache2-mod-php5: Depends: php5-common (= 5.3.3-1ubuntu9.1) but 5.2.10.dfsg.1-2ubuntu6.5 is installed and it is kept back.

The following actions will resolve these dependencies:

Keep the following packages at their current version:
1)     libapache2-mod-php5 [Not Installed]

Accept this solution? [Y/n/q/?] n
The following actions will resolve these dependencies:

Install the following packages:
1)     libapache2-mod-php5 [5.2.10.dfsg.1-2ubuntu6.5 (karmic-security, karmic-updates)]

Accept this solution? [Y/n/q/?] y

The following NEW packages will be installed:
libapache2-mod-php5

0 packages upgraded, 1 newly installed, 0 to remove and 20 not upgraded.
Need to get 2,643kB of archives. After unpacking 6,189kB will be used.
Do you want to continue? [Y/n/?] y

Instalar un firewall personal en GNU/Linux Ubuntu 10.10

Introducción.

A pesar de las apariencias iniciales, Ubuntu si incluye un firewall sólo que este no incluye reglas ya que por defecto no vienen servicios abiertos.  El firewall incluído es Netfilter y para él se incluye además una herramienta que facilita su administración llamada Uncomplicated Firewall (ufw).

Esta herramienta es muy sencilla de usar, sin embargo es de línea de comando y esto en algunas ocasiones la hace mas compleja de utilizar.  Para esto se incluye en los repositorios de Ubuntu a gufw el cual es un front-end grafico para ufw.

Instalación y ejecución de gufw.

$ sudo aptitude install gufw

Para ejecutarlo acceda a la aplicación a través de los siguientes menúes.

System > Administration > Firewall Configuration.

Funcionalidades de gufw.

En la ventana inicial de la aplicación es posible activarlo y desactivarlo, definir las políticas generales de entrada y salida, y las reglas o excepciones específicas.

Ventanan inicial de gufw

Ventanan inicial de gufw

Generalmente la política utilizada es nada entra-todo sale, es decir, se confía en el uso que las aplicaciones de la máquina va a hacer de la red.  Una aproximación mas segura sería la mas restrictiva de nada entra-nada sale pero sería necesario especificar uno a uno los sitios a los cuales se realizará conexión (incluyendo los sitios web!) así como efectivamente será necesario hacerlo para las conexiones entrantes.

Las reglas pueden crearse utilizando tres aproximaciones que van desde la mas simple en la que se eligen aplicaciones o servicios predefinidos, pasando por una intermedia en la que es posible especificar puertos y o eligiendo una opción avanzada con la cual no solo es posible elegir puertos sino que también es posible establecer rangos de direcciones IP.

Creación de reglas con gufw

Creación de reglas con gufw

También es posible verificar el registro del servicio del cual puede determinarse su nivel de profundidad.

Registro de eventos con gufw

Registro de eventos con gufw

Conclusión.

Existen otras soluciones de firewall para Linux mas elaboradas que ufw (como por ejemplo Zentyal, antes ebox), sin embargo su combinación con gufw es suficiente para las necesidades de filtrado de la mayoría de los escritorios.

Enlaces.

Cifrado y descifrado asimétrico con RSA utilizando C#/Mono

Introducción.

En criptografía, RSA (Rivest, Shamir y Adleman) es un sistema criptográfico de clave pública desarrollado en 1977. En la actualidad, RSA es el primer y más utilizado algoritmo de este tipo y es válido tanto para cifrar como para firmar digitalmente.

La seguridad de este algoritmo radica en el problema de la factorización de números enteros. Los mensajes enviados se representan mediante números, y el funcionamiento se basa en el producto, conocido, de dos números primos grandes elegidos al azar y mantenidos en secreto. Actualmente estos primos son del orden de 10200, y se prevé que su tamaño aumente con el aumento de la capacidad de cálculo de los ordenadores.

Como en todo sistema de clave pública, cada usuario posee dos claves de cifrado: una pública y otra privada. Cuando se quiere enviar un mensaje, el emisor busca la clave pública del receptor, cifra su mensaje con esa clave, y una vez que el mensaje cifrado llega al receptor, este se ocupa de descifrarlo usando su clave privada.

Se cree que RSA será seguro mientras no se conozcan formas rápidas de descomponer un número grande en producto de primos. La computación cuántica podría proveer de una solución a este problema de factorización.

Tomado del artículo RSA de Wikipedia.

Implementación.

La aplicación de demostración de esta técnica requiere del uso de por lo menos los siguientes namespaces.

using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;

Proveedor del servicio de cifrado RSA.

El núcleo de la implementación es el objeto RSACryptoServiceProvider que realiza las labores de cifrado/descifrado de información.

public static RSACryptoServiceProvider rsa;

Establecer los valores iniciales del servicio.

En este punto se establecen los valores iniciales de configuración del servicio, los cuales son en su mayoría opcionales, y se instancia el objeto mencionado anteriormente.

const string CONTAINER_NAME = "ContenedorRSA";
CspParameters cspParams;
cspParams = new CspParameters(1);	// PROV_RSA_FULL
cspParams.Flags = CspProviderFlags.UseDefaultKeyContainer;
cspParams.KeyContainerName = CONTAINER_NAME;
// Instanciar el algoritmo de cifrado RSA
rsa = new RSACryptoServiceProvider(cspParams);

Generar las llaves.

En esta etapa se crea una pareja de llaves: pública y privada, para las labores de cifrado.  Estas se almacenan por conveniencia en formato XML en los archivos llave_publica.xml y llave_privada.xml correspondientemente.

// Generar y almacenar la llave pública
writer = new StreamWriter(@"llave_publica.xml");
string publicOnlyKeyXML = rsa.ToXmlString(false);
writer.Write(publicOnlyKeyXML);
writer.Close();
// Generar y almacenar la llave privada
writer = new StreamWriter(@"llave_privada.xml");
string publicPrivateKeyXML = rsa.ToXmlString(true);
writer.Write(publicPrivateKeyXML);
writer.Close();

Cargar las llaves.

Una vez que han sido creadas y almacenadas las llaves, estas no deben ser creadas nuevamente.  Para su uso se cargan desde los correspondientes archivos XML y se asocian con el proveedor de cifrado.

// Cargar y asociar la llave pública al proveedor de cifrado
StreamReader reader = new StreamReader(@"llave_publica.xml");
string publicOnlyKeyXML = reader.ReadToEnd();
rsa.FromXmlString(publicOnlyKeyXML);
reader.Close();
// Cargar y asociar la llave privada (y pública) al proveedor de cifrado
StreamReader reader = new StreamReader(@"llave_privada.xml");
string publicPrivateKeyXML = reader.ReadToEnd();
rsa.FromXmlString(publicPrivateKeyXML);
reader.Close();

Cifrar la información.

Para realizar el cifrado de los datos es necesario contar con la llave pública del destinatario.

cargarLlavePublica();
// Convertir el texto a cifrar (plano) a su representación en bytse
byte[] textoPlanoBytes = System.Text.Encoding.UTF8.GetBytes(textoPlano);
// Realizar el proceso de cifrado
byte[] textoCifradoBytes = rsa.Encrypt(textoPlanoBytes, false);
// Convertir el mensaje cifrado a su representación en cadena
string MensajeCifrado = Convert.ToBase64String(textoCifradoBytes);

Descifrar la información.

Para descifrar los datos y obtener el mensaje original es necesario contar con la llave privada del destinatario del mensaje.

cargarLlavePrivada();
// Convertir el texto cifrado a su representación en bytse
byte[] textoCifradoBytes = Convert.FromBase64String(textoCifrado);
// Realizar el proceso de descifrado
byte[] textoPlanoBytes = rsa.Decrypt(textoCifradoBytes, false);
// Convertir el mensaje descifrado a su representación en cadena
string MensajeDescifrado = System.Text.Encoding.UTF8.GetString(textoPlanoBytes);

Aplicación de demostración.

Aplicación de demostración del uso del algoritmo

Aplicación de demostración del uso del algoritmo RSA

$ gmcs "/out:RSASample.exe" "/r:/usr/lib/mono/2.0/System.dll" /t:exe "RSASample/Main.cs"

Enlaces.