Archive

Posts Tagged ‘hacking i2p’

Hoy vengo a hablar de mi libro: Deep Web: TOR, FreeNET & I2P – Privacidad y Anonimato

febrero 15, 2016 9 comentarios
deep-web-tor-freenet-i2p-privacidad-y-anonimatoEl día de hoy ha salido a la venta mi nuevo sobre anonimato y privacidad, el cual ha recibido el nombre de “Deep Web: TOR, FreeNET & I2P – Privacidad y Anonimato“. Se trata de mi tercera obra, la cual nuevamente ha sido publicada por la editorial 0xWORD. Me ha llevado un poco más de 7 meses redactar todo el contenido, tomar capturas de pantalla, realizar las pruebas, aplicar correcciones y ajustes y luego, a la editorial otros pocos meses más en la maquetación e impresión, que por cierto, me ha encantado. El proceso de redactar un libro y esforzarse para que sea lo más claro y ameno posible para el lector lleva tiempo, pero nuevamente ha sido una experiencia muy satisfactoria, especialmente considerando que era un tema sobre el que quería escribir desde hace años y el día de hoy finalmente, he podido ver mi texto publicado. Del mismo modo que con los dos libros de Python que he escrito, mi principal objetivo ha sido intentar  incluir todo el contenido práctico posible, me gusta explicar todo por medio de ejemplos y por ese motivo, en el libro se podrán ver varias configuraciones aplicadas a las principales redes anónimas. También cuenta con un capítulo dedicado a la privacidad en Internet, más enfocado a “usuarios finales”, en el que se explica el uso de algunas VPN disponibles actualmente, complementos para navegadores, buenas practicas enfocadas a la privacidad, etc. Luego, hay un capítulo dedicado exclusivamente a redes I2P, Freenet y TOR respectivamente, el último capítulo es bastante más resumido y en él se habla sobre el uso de otras soluciones similares tales como GNUNet, Hyperboria, CJDNS, YaCy, entre otras.
Este es mi tercer libro y sigo fomentando el habito de investigar, escribir y compartir, algo que llevo haciendo desde hace mucho tiempo y que personalmente me resulta de lo más entretenido, lo hago simplemente porque me apasiona. Como he comentado y seguramente muchos de vosotros os podéis imaginar, redactar un libro con estas características no es fácil, requiere de mucho tiempo y dedicación constante, pero para mi, hacer este tipo de cosas me resulta alentador y una motivación adicional para seguir adelante, especialmente después de volver del trabajo, a veces muy cansado y con poco animo por “perder” tanto tiempo del día sin hacer aquellas cosas que realmente te gustan, por sentir que estás desperdiciando tiempo valioso que podrías emplear en hacer cosas interesantes y que la mayor parte de tu energía se va en cumplir unos objetivos, que realmente no son los tuyos. En fin, seguramente muchos de vosotros sabéis de lo que hablo, pero francamente creo que lo importante es no desistir y continuar buscando alternativas que te puedan ofrecer esa libertad que cualquier persona con un poco de “espíritu hacker” siempre está anhelando.
Podéis adquirir una copia directamente desde  el sitio web oficial de 0xWord y como siempre, si me ves en algún evento o lo que sea y te hace ilusión, te puedo firmar una copia. 🙂
Un saludo y happy hack!

Tahoe-LAFS Sistema de almacenamiento en la nube privado y seguro – Parte 1

junio 30, 2015 6 comentarios

El “cloud storage” o almacenamiento en la nube, se ha vuelto muy popular debido a la flexibilidad y beneficios que aporta a los usuarios. La habilidad de subir documentos a un servicio en Internet y poder acceder a ellos desde cualquier lugar y en cualquier momento, es algo muy atractivo para cualquiera, sin embargo en muchas ocasiones, al utilizar algunos de estos servicios en Internet, los usuarios se exponen a varias amenazas que pueden afectar directamente la confidencialidad e integridad de su información. Es cierto que muchos de los proveedores de los servicios de almacenamiento en la nube intentan asegurar los recursos de sus usuarios de la forma más rigurosa posible, pero en algunos casos, con la excusa de mantener la información de sus usuarios “segura” y confidencial, acceden directamente a dicha información, vulnerando de esta forma su privacidad.
Una buena forma de utilizar estos servicios es por medio del cifrado de los documentos desde el origen y de esta forma, evitar que un tercero tenga acceso directo a la información de los documentos almacenados en la nube, pero aun así, es necesario un registro y posterior entrega de datos personales al proveedor. Para los usuarios de redes anónimas tales como I2P, existe una solución que puede resultar mucho más interesante y que no exige el registro de datos personales ni de ningún tipo, permitiendo de esta forma almacenar documentos de forma distribuida y privada. Dicha solución es Tahoe-LAFS.

Tahoe-LAFS (The Last Authority File Store) es un sistema descentralizado y abierto que se encarga de distribuir los documentos de un usuario por múltiples servidores Tahoe. De esta forma, es posible seguir accediendo a la información de forma transparente aunque uno o varios de los servidores se encuentren caídos o comprometidos por un atacante. Solamente el propietario de los documentos o con los permisos adecuados puede ver sus contenidos, esto en Tahoe es lo que se conoce como “Provider Independent Security”, que es justo lo contrario a lo que suele verse en los principales proveedores de almacenamiento en la nube, ya que en este caso, el proveedor del servicio nunca tendrá acceso ni podrá leer y/o modificar la información de ninguno de sus usuarios. Justo lo opuesto a los proveedores de almacenamiento convencionales.

Funcionamiento básico de Tahoe-LAFS

El funcionamiento de Tahoe-LAFS se basa en el concepto de “Storage Grid”, que no es más que un conjunto de servidores de almacenamiento que se encargan de mantener los documentos de los usuarios del sistema. Un servidor de almacenamiento es simplemente un repositorio de datos, el cual no tiene la habilidad de actuar directamente sobre ellos, solamente se encarga de almacenarlos y brindar acceso a uno o varios “gateway”. Un gateway es un sistema independiente que se encarga de comunicarse con los servidores de almacenamiento y proveer acceso a la información que se encuentra almacenada en ellos por medio de protocolos de comunicación comunes tales como HTTP/S, SFTP o FTP. De esta forma un cliente, se comunicará con un gateway y éste a su vez, se comunicará con los servidores de almacenamiento para permitir el acceso a sus documentos. Un cliente en este caso puede ser un navegador web, un programa que se ejecuta por línea de comandos un cliente SFTP, etc. Tal como se mencionaba anteriormente, los servidores de almacenamiento tienen acceso a la información de sus usuarios y la información que se transfiere entre dichos servidores, el gateway y el cliente, se encuentra cifrada, impidiendo que cualquier “entidad” intermedia pueda manipular directamente los datos transferidos.
El procedimiento de instalación de Tahoe-LAFS se detalla a continuación.

Instalación de Tahoe-LAFS

Para instalar una instancia de Tahoe, es necesario tener Python instalado en el ordenador, preferiblemente la versión 2.7 ya que la última versión de Tahoe no funciona correctamente sobre la versión 3.x de Python. Una vez descargada la última versión estable del proyecto desde el siguiente enlace: https://tahoe-lafs.org/trac/tahoe-lafs se procede a instalar ejecutando el siguiente comando:

>python setup.py build

El comando anterior se encargará de instalar todas dependencias necesarias para poder arrancar correctamente Tahoe en uno de los modos descritos anteriormente (server o gateway) y además, se encargará también de generar un fichero ejecutable en el directorio <TAHOE_INSTALL>/bin.
En el caso de que exista algún problema ejecutando el script anterior, es posible que falte alguna dependencia necesaria en el sistema y no se ha podido obtener de manera automática por algún motivo. En tal caso, es necesario instalar manualmente la dependencia en cuestión, aunque son programas que suelen venir instalados por defecto en las en las últimas versiones de sistemas basados en Debian.

Por otro lado, para verificar la disponibilidad de todas las funciones que incluye Tahoe, se puede ejecutar el script setup.py con el argumento “trail”

>python setup.py trial

En tal caso, se podrán ver por pantalla, cada una de las funciones de Tahoe y si se ha podido comprobar que se encuentran correctamente instaladas y configuradas.

Uso de Tahoe-LAFS

Después de instalar el programa, es el momento de comenzar a utilizarlo y ver cuales son las opciones que se encuentran disponibles a los usuarios. En primer lugar, es posible crear clientes o un storage grid completo, todo esto ejecutando la utilidad “tahoe” que se ha generado automáticamente en el directorio “<TAHOE_INSTALL>/bin” tras ejecutar el proceso de instalación.

El primer paso para comenzar a utilizar el programa, consiste en crear un cliente simple, para ello se ejecuta el siguiente comando:

>./tahoe create-client Node created in ‘/home/adastra/.tahoe’

Please set [client]introducer.furl= in tahoe.cfg!

The node cannot connect to a grid without it.

Please set [node]nickname= in tahoe.cfg

Como se puede apreciar, con el comando anterior se ha creado un cliente simple y se ha creado también el directorio “~/.tahoe”. Tal como se enseña en la salida del comando, se debe establecer la propiedad “introducer.furl” en el fichero de configuración del nodo recién creado (tahoe.cfg) para que de esta forma, sea posible conectar al cliente con un storage grid de servidores.
Para probar las funcionalidades del sistema, existe un storage grid público que se encuentra activo para que los usuarios puedan interactuar con el sistema y opcionalmente con otros usuarios, para encontrar más detalles sobre dicho storage grid, se recomienda ver el siguiente enlace: https://tahoe-lafs.org/trac/tahoe-lafs/wiki/TestGrid
Tal como se explicaba anteriormente, es necesario establecer las propiedades “introducer.furl” y “nickname” en el fichero de configuración del cliente creado anteriormente, para ello se debe editar el fichero de configuración “<TAHOE_INSTALL/.tahoe/tahoe.cfg” y definir los valores adecuados en la sección “[client]”. Ahora bien, los valores de estas propiedades dependerán de si el usuario utiliza el storage grid de pruebas o uno propio. En el caso de utilizar uno propio, se debe indicar el valor del introducer de dicho storage grid en la propiedad “introducer.furl”, en el caso de utilizar el de pruebas, dicho valor se encuentra en el siguiente enlace: https://tahoe-lafs.org/trac/tahoe-lafs/wiki/TestGrid#HowToConnectToThePublicTestGrid

Después de establecer las dos propiedades de configuración anteriores, se puede arrancar el cliente con el siguiente comando.

>./tahoe run ~/.tahoe STARTING ‘/home/adastra/.tahoe’

running node in ‘/home/adastra/.tahoe’

2015-06-21 18:29:16+0200 [-] Log opened.

2015-06-21 18:29:16+0200 [-] twistd 13.2.0 (/usr/bin/python 2.7.6) starting up.

2015-06-21 18:29:16+0200 [-] reactor class: twisted.internet.epollreactor.EPollReactor.

2015-06-21 18:29:16+0200 [-] Listener starting on 37384

2015-06-21 18:29:16+0200 [-] NevowSite starting on 3456

2015-06-21 18:29:16+0200 [-] Starting factory <nevow.appserver.NevowSite instance at 0x7f36175311b8>

2015-06-21 18:29:16+0200 [-] My pid: 13852

2015-06-21 18:29:16+0200 [-] DatagramProtocol starting on 57219

2015-06-21 18:29:16+0200 [-] Starting protocol <twisted.internet.protocol.DatagramProtocol instance at 0x7f3617547d88>

2015-06-21 18:29:16+0200 [-] (UDP Port 57219 Closed)

2015-06-21 18:29:16+0200 [-] Stopping protocol <twisted.internet.protocol.DatagramProtocol instance at 0x7f3617547d88>

Ahora que el cliente se ha ejecutado sin errores, lo primero que hará será conectarse con el “introducer” y obtener un listado de storage servers. Es importante tener en cuenta que con lo anterior, solamente se crea un cliente plano, sin ninguna capacidad de almacenar y compartir archivos de otros usuarios, algo que desde luego, es una de las principales potencialidades del sistema y como se verá en un próximo artículo, no es demasiado difícil de instalar y configurar.

A partir de aquí, el usuario puede interactuar con el grid de varias formas, una de ellas es por medio de una interfaz web muy simple que se levanta automáticamente en el puerto 3456. La siguiente imagen enseña dicha interfaz.

tahoe1Interfaz web del cliente Tahoe.

Como se puede ver, aparece la dirección del “Introducer”, los servidores de almacenamiento conectados y a la izquierda, un panel muy simple para subir directorios o descargar ficheros al sistema de almacenamiento. Cuando se sube un fichero o directorio, automáticamente se generará una URI única del fichero, la cual seguirá el siguiente formato

URI:SSK:xxx:xxxx

Dicha URI debe ser utilizada para acceder al documento y se debe ingresar en el campo de texto de la interfaz web que pone “OPEN TAHOE-URI”.

La interfaz web es solamente uno de los mecanismos disponibles en Tahoe para interactuar con los servidores de almacenamiento, pero no es el único, ya que también es posible interactuar con el grid por medio de los comandos disponibles en la utilidad “tahoe” o incluso también es posible utilizar una API Rest para interactuar con el sistema por medio de peticiones HTTP(S).

El objetivo de esta primera entrada era el de introducir al lector en los conceptos básicos de Tahoe-LAFS y en las próximas dos publicaciones, se hablará sobre configuración avanzada del sistema, creación de un grid, uso de la web api y cómo desplegar Tahoe-LAFS en I2P.

Un saludo y Happy Hack!
Adastra.

Serialización de objetos utilizando la Streaming Library y desarrollo de plugins I2P

mayo 19, 2015 Deja un comentario

En la entrada anterior se ha venido hablado de los beneficios que aporta la Streaming Library si eres un usuario de I2P y quieres automatizar el proceso de crear “peers” descentralizados que, utilizando la red de I2P, puedan comunicarse y transferir información. Esta librería se encuentra escrita en Java y cuenta con todas las características necesarias para poder interactuar con el protocolo I2CP y poder desplegar servicios que utilicen/establezcan puentes de entrada y salida desde la instancia local de I2P. Tal como mencionaba en el artículo anterior, el procedimiento para crear un emisor y un receptor es bastante simple y si el lector alguna vez ha tenido que trabajar con sockets y programación en entornos de red en cualquier lenguaje, rápidamente podrá apreciar que aunque la librería aporta clases nuevas, su funcionamiento es muy similar a los clásicos sockets “servidor” y “cliente”, de hecho, las clases principales de la Streaming library son “wrappers” de las las clases “ServerSocket” y “Socket” de Java, aunque evidentemente implementando toda la lógica necesaria para poder interactuar con I2P.
No obstante, cuando se navega por Internet en busca de información sobre el uso avanzado de está librería normalmente es muy complicado encontrar detalles técnicos que permitan adentrarse en su uso y casi en todos los casos, se implementa el típico ejemplo del servidor “echo”, en el que existe un cliente que actúa como emisor, un servidor que actúa como receptor y el receptor devuelve los mensajes de texto que envía el emisor, funcionando como un servidor “echo” muy simple, no obstante, uno de los principales beneficios con los que cuenta Java, es que tiene un sistema muy potente de serialización de objetos que permite compartir información entre diferentes JVM, algo que potencio enormemente la evolución de tecnologías tales como RMI, CORBA, JINI y posteriormente los tan conocidos EJB en el mundo de J2EE. En este caso, también es posible serializar objetos entre emisores y receptores I2P, lo que supone un abanico de posibilidades enorme a la hora de crear aplicaciones que utilicen la capa de anonimato que aporta I2P a sus usuarios, ya que se pueden crear objetos debidamente preparados para transmitir mucha más información que una cadena de texto. Para los que no lo sepáis, para poder serializar un objeto en Java, dicho objeto, sus atributos y todas las clases padre de las que hereda deben ser serializables también, lo cual se consigue implementando la interfaz “java.io.Serializable”, además, si alguno de los atributos de dicha clase no es serializable, debe utilizarse el modificador de acceso “transient” con el fin de indicarle a la JVM que dicho atributo debe utilizarse únicamente en el contexto de la JVM local y no se debe incluir en el proceso de serialización del objeto.
Dicho esto, queda claro que una de las labores más importantes a la hora de diseñar una aplicación que aproveche los beneficios de la Streaming Library, consiste precisamente en definir una estructura de objetos que contenga todas las relaciones y atributos necesarios para transmitir información entre los túneles de entrada y salida de la instancia de I2P. La estructura de clases en cuestión, además de ser serializable, debe de ser conocida por todos los “peers” que la utilicen, ya que de no ser así, un emisor puede enviar un objeto Java a un receptor, perfectamente serializado, pero dado que el receptor no cuenta el “.class” de la clase, simplemente no sabrá cómo se debe deserializar el objeto. Lo que normalmente se suele hacer, es distribuir un fichero JAR con todos los elementos necesarios en cada uno de los peers, esto quiere decir que aunque la comunicación entre todos los receptores y emisores en I2P sea descentralizada, tienen que haber elementos de comunicación comunes que les permitan comprender los mensajes que se transmiten por sus túneles, exactamente igual que ocurre con las normas que se definen en cualquier protocolo de red con el fin de garantizar la interoperabilidad en las capas de transporte y aplicación. Además de esto, los receptores y emisores deben conocer los “destinations” de las entidades con las que se desean comunicar. Es posible implementar un mecanismo de descubrimiento automático utilizando un servicio oculto en I2P que sea accesible únicamente por aquellas personas que se desean comunicar y en dicho servicio, cada uno podría depositar el “destination” correspondiente a su instancia de I2P con el fin de que otros usuarios puedan enviarse información.

Para el ejemplo de esta entrada, se creará en primer lugar una clase muy simple que funcionará simplemente como un contenedor de información, también conocido en la terminología de Java como un POJO (Plain Old Java Object) el cual simplemente contendrá algunos atributos básicos y una serie de métodos de establecimiento y acceso (setters y getters)

			
package net.privanon.common; 
public class UserInfo implements java.io.Serializable { 
	private String username; 
	private String name; 
	private String lastname; 
	private Integer age; 
	private String privateMessage;	 
	public void setUsername(String username) { 
		this.username = username; 
	} 
			
	public void setName(String name) { 
		this.name = name; 
	} 
	public void setLastname(String lastname) { 
		this.lastname = lastname; 
	} 
	public void setAge(Integer age) { 
		this.age = age; 
	} 
	public void setPrivateMessage(String privateMessage) { 
		this.privateMessage = privateMessage; 
	} 
	public String getUsername() { 
		return this.username; 
	} 
	public String getName() { 
		return this.name; 
	} 
	public String getLastname() { 
		return this.lastname; 
	} 
			
	public Integer getAge() { 
		return this.age; 
	} 
	public String getPrivateMessage() { 
		return this.privateMessage; 
	} 
} 

La clase en si misma no es demasiado interesante, sin embargo representa la piedra angular del proceso de transmisión de datos entre clientes y receptores, ya que contiene los atributos necesarios para obtener/establecer datos y además, implementa la interfaz Serializable, lo que le permitirá “moverse” libremente entre diferentes JVM.
Modificando un poco la estructura del programa receptor visto en el articulo anterior, el resultado final seria el siguiente.

package testing.i2p; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.InputStreamReader; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.ObjectOutputStream; 
import java.io.ObjectInputStream; 
import java.net.ConnectException; 
import java.net.SocketTimeoutException; 
import net.i2p.I2PException; 
import net.i2p.client.streaming.I2PSocket; 
import net.i2p.util.I2PThread; 
import net.i2p.client.I2PSession; 
import net.i2p.client.streaming.I2PServerSocket; 
import net.i2p.client.streaming.I2PSocketManager; 
import net.i2p.client.streaming.I2PSocketManagerFactory; 
import net.i2p.client.I2PSessionException; 
import net.privanon.common; 
			
public class Server { 
    public static void main(String[] args) { 
        I2PSocketManager manager =
			I2PSocketManagerFactory.createManager(); 
        I2PServerSocket serverSocket =
			manager.getServerSocket(); 
        I2PSession session = manager.getSession(); 
	System.out.println(session.getMyDestination().toBase64()); 
        I2PThread t = new I2PThread(new
			ClientHandler(serverSocket)); 
        t.setName("clienthandler1"); 
        t.setDaemon(false); 
        t.start(); 
    } 
			
    private static class ClientHandler implements Runnable { 
        public ClientHandler(I2PServerSocket socket) { 
            this.socket = socket; 
        } 
			
        public void run() { 
            while(true) { 
                try { 
                    I2PSocket sock = this.socket.accept(); 
                    if(sock != null) { 
			    ObjectOutputStream oos = new
			ObjectOutputStream(sock.getOutputStream()); 
			    ObjectInputStream ois = new
			ObjectInputStream(sock.getInputStream()); 
				UserInfo info = null; 
			    while ((info = (UserInfo) ois.readObject()) != null) { 
				      if(info != null && info.getUsername() != null
			&& info.getUsername().equals("Adastra")) { 
						UserInfo response = new UserInfo(); 
				   	        response.setName("unknown"); 
					        response.setLastname("unknown"); 
  					        response.setUsername("unknown"); 
					        response.setAge(0); 
					        response.setPrivateMessage("Send the report
			and close the operation");				 
						oos.writeObject(response);		 
 				       } 
			    } 
			    ois.close(); 
			    oos.close(); 
			    sock.close(); 
                    } 
                } catch (I2PException ex) { 
                    System.out.println("General I2P
			exception!"); 
                } catch (ConnectException ex) { 
                    System.out.println("Error
			connecting!"); 
                } catch (SocketTimeoutException ex) { 
                    System.out.println("Timeout!"); 
                } catch (IOException ex) { 
                    System.out.println("General
			read/write-exception!"); 
                } catch (ClassNotFoundException ex) { 
                    System.out.println("Class Not found
			exception!"); 
                } 
            } 
        } 
        private I2PServerSocket socket; 
    } 
} 

Hay que notar que las principales diferencias se pueden ver en el uso de la clase “UserInfo” que se ha creado anteriormente y la serialización/deserialización de dicho objeto utilizando las clases ObjectOutputStream y ObjectInputStream. En este caso, se deserializa el objeto recibido por el emisor, se realiza una verficación muy simple sobre el nombre del usuario y a continuación, se responde al emisor con un objeto del mismo tipo.

Por otro lado, el receptor por su parte puede tener una estructura como la siguiente:

package testing.i2p; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.InterruptedIOException; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.ConnectException; 
import java.net.NoRouteToHostException; 
import net.i2p.I2PException; 
import net.i2p.client.streaming.I2PSocket; 
import net.i2p.client.streaming.I2PSocketManager; 
import net.i2p.client.streaming.I2PSocketManagerFactory; 
import net.i2p.data.DataFormatException; 
import net.i2p.data.Destination; 
import java.io.ObjectOutputStream; 
import java.io.ObjectInputStream; 
import net.privanon.common; 
			
public class Client { 
    public static void main(String[] args) { 
        I2PSocketManager manager =
			I2PSocketManagerFactory.createManager(); 
        System.out.println("Please enter a Destination:");
        BufferedReader br = new BufferedReader(new
			InputStreamReader(System.in)); 
        String destinationString; 
        try { 
            destinationString = br.readLine(); 
        } catch (IOException ex) { 
            System.out.println("Failed to get a
			Destination string."); 
            return; 
        } 
        Destination destination; 
        try { 
            destination = new Destination(destinationString); 
        } catch (DataFormatException ex) { 
            System.out.println("Destination string
			incorrectly formatted."); 
            return; 
        } 
        I2PSocket socket; 
        try { 
            socket = manager.connect(destination); 
        } catch (I2PException ex) { 
            System.out.println("General I2P exception
			occurred!"); 
            return; 
        } catch (ConnectException ex) { 
            System.out.println("Failed to connect!");
            return; 
        } catch (NoRouteToHostException ex) { 
            System.out.println("Couldn't find host!");
            return; 
        } catch (InterruptedIOException ex) { 
            System.out.println("Sending/receiving was
			interrupted!"); 
            return; 
        } 
        try { 
	    ObjectOutputStream oos = new
			ObjectOutputStream(socket.getOutputStream()); 
   	    UserInfo info = new UserInfo(); 
   	    info.setName("Ad"); 
            info.setLastname("Astra"); 
            info.setUsername("Adastra"); 
            info.setAge(30); 
            info.setPrivateMessage("exposure done. Waiting
			for indications"); 
	    oos.writeObject(info); 
	   ObjectInputStream ois = new
			ObjectInputStream(socket.getInputStream()); 
		UserInfo response = null; 
	    while ((response = (UserInfo) ois.readObject()) != null) {
		      System.out.println("Name: "+
			response.getName()); 
		      System.out.println("Last Name: "+
			response.getLastname()); 
		      System.out.println("Username: "+
			response.getUsername()); 
		      System.out.println("Age: "+
			response.getAge()); 
		      System.out.println("Private message: "+
			response.getPrivateMessage()); 
	    } 
	    ois.close(); 
oos.close(); 
	    socket.close(); 
        } catch (IOException ex) { 
            System.out.println("Error occurred while
			sending/receiving!"); 
        }  catch (ClassNotFoundException ex) { 
                    System.out.println("Class Not found
			exception!"); 
                } 
    } 
} 

Nuevamente, las diferencias más destacables entre el programa emisor del articulo anterior y éste, se centran en la serialización/deserializacion de la clase “UserInfo” por medio de los objetos ObjectInputStream y ObjectOutputStream.

Después de iniciar I2P y de ejecutar tanto el emisor como el receptor, se puede ver el flujo de datos transmitidos entre ambas entidades en la siguiente imagen.

streaming1

 

Aunque ambos programas se ejecutan en la misma máquina y sobre la misma instancia de I2P, el funcionamiento será el mismo en instancias y máquinas separadas.

Otro escenario interesante en el que también se puede utilizar la Streaming Library, es en el desarrollo de plugins que se puedan desplegar directamente desde la consola de administración de I2P. Sobre estas cosas hablaré en un próximo articulo.

Saludos y Happy Hack!
Adastra.

Uso de Streaming Library para aplicaciones en I2P

mayo 6, 2015 2 comentarios

Se ha hablado en varias ocasiones sobre los beneficios que aporta I2P al anonimato y en alguna ocasión se ha hablado sobre cómo crear rutinas simples que permitan acceder a I2P utilizando la librería “Streming Library”, la cual se encuentra escrita en Java. Si quieres hacer cualquier tipo de prueba con Python contra I2P, actualmente hay pocas librerías que realmente te lo permitan y que sean estables. Por lo que he podido apreciar en los foros oficiales de desarrolladores, al parecer las personas clave en el desarrollo de plugins, utilidades y el propio core de la red no muestran mucho interés en desarrollar otra librería en un lenguaje distinto para hacer lo que sobradamente ya hace la Streaming Library y francamente tienen toda la razón del mundo, ya que tienen un “roadmap” con cientos de frentes abiertos y es mucho más interesante crear cosas nuevas y mejorar las existentes que reinventar la rueda. Al equipo de I2P le ha costado muchísimo desarrollar la Streaming Library y la cantidad de errores que se reportaban al principio era enorme, es normal que después del número de horas invertidas y el nivel de estabilidad en el que se encuentra ahora, haya sido declarada como la librería de referencia para crear aplicaciones que requieran el uso del protocolo de control de I2P (I2CP) sobre TCP. No obstante, seguimos con los mismos problemas:

1. Aun sigue siendo poca, muy poca la documentación sobre su uso. Si realmente quieres aprender los elementos clave de la librería, tienes que meterte en los JavaDocs y empezar a crear un mapa mental de como están relacionadas las clases y cómo puedes usarlas.

2. Si eres un desarrollador en Python o tienes alguna herramienta para acceder a la web profunda de I2P aunque sea para consultar “Destinations”. Bueno, lo tienes un poco complicado por lo que comentaba antes. Aunque existe el proyecto python-i2cp (https://github.com/majestrate/python-i2cp) para utilizar directamente el protocolo interno de I2P, pero no avanza al ritmo que se esperaría y aun no funciona correctamente a la hora de consultar un destination. Además, utilizar directamente I2CP está desaconsejado por el equipo de I2P. Nos queda utilizar Jython o la JSR de Java correspondiente para ejecutar código de scripting con Python desde la máquina virtual de Java.

Es este artículo intentaré centrarme en el primer punto y explicaré algunas características interesantes en Streaming library para Java y en un próximo articulo, intentaré explicar algunas alternativas a la hora de acceder a I2P desde Python.

No en todos los casos resulta viable utilizar la Streaming Library de I2P, pero por norma general, cuando se habla de aplicaciones punto a punto, como es el caso de descargas de torrents y cosas similares, resulta bastante conveniente y óptimo utilizar esta librería, de hecho, un ejemplo bastante claro lo tenemos con el proyecto I2PSnark, un cliente bittorrent que utiliza la Streaming Library para descargar y compartir torrents utilizando la red de I2P. El código fuente del proyecto se encuentra licenciado con la GNU/GPL y se está disponible en el siguiente repositorio GitHub: https://github.com/i2p/i2p.i2p/tree/master/apps/i2psnark Si se mira con atención las clases y métodos que se incluyen en el proyecto, es mucho más fácil comprender el funcionamiento de la Streaming Library y cómo utilizarla.

En primer lugar, cualquier rutina de código utilizando esta librería puede funcionar en uno de dos modos, o bien como cliente que consulta “destinations” (un destino en I2P es similar a la combinación de una dirección IP y un puerto) o simplemente como servidor. Las principales clases disponibles en la API son “wrappers” de las clases SocketServer y Socket de Java, aunque evidentemente las clases en la Streaming Library adicionan las funcionalidades necesarias para que todas las conexiones se lleven a cabo utilizando la red de I2P.
Por otro lado, en una instancia de I2P, un programa escrito en Java y utilizando la Streaming Library puede actuar como emisor o receptor (recordar que I2P es una red que basada en paquetes y no en circuitos como TOR), con lo cual desde un programa se puede generar el “destination” para que otros usuarios envíen paquetes a la instancia o se pueden buscar (lookup) destinos y enviarles paquetes. El siguiente código sería la clase más simple que se puede crear utilizando la Streaming Library para crear un emisor.

import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.I2PSession;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory; 

public class Server {
	public static void main(String[] args) {
		I2PSocketManager manager = I2PSocketManagerFactory.createManager();
		I2PServerSocket serverSocket = manager.getServerSocket();
		I2PSession session = manager.getSession();
System.out.println(session.getMyDestination().toBase64());
	}
}

Como se puede apreciar, se crea una instancia de la clase “I2PSocketManager” utilizando la factoría “I2PSocketManagerFactory” y posteriormente se crea un objeto “I2PServerSocket”, el cual será utilizado para atender a las peticiones de otros usuarios en la red de I2P. Finalmente, se pinta por pantalla el destination local del proceso recién iniciado. La clase “net.i2p.data.Destination” cuenta con los métodos “toBase64” y “toBase32” que serán utilizados por el cliente para comunicarse con la instancia de I2P.

El código anterior solamente se encarga de obtener una sesión I2P y pintar por pantalla el destination generado, pero una vez hecho esto, el hilo principal del programa termina. Las siguientes instrucciones que se deben añadir, deben permitir que el proceso se quede en estado de escucha para procesar los mensajes que envían los clientes, para ello la clase I2PThread permite crear un hilo de ejecución ininterrumpido que permitirá al emisor actuar como servidor y recibir mensajes.

import net.i2p.client.I2PSession;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;
import net.i2p.util.I2PThread;
public class Server {
	public static void main(String[] args) {
		I2PSocketManager manager = I2PSocketManagerFactory.createManager();
		I2PServerSocket serverSocket = manager.getServerSocket();
		I2PSession session = manager.getSession();
System.out.println(session.getMyDestination().toBase64());
		I2PThread thread = new I2PThread(new
			ClientHandler(serverSocket));
		thread.setDaemon(false);
		thread.start();
	}
	private static class ClientHandler implements Runnable {
		private I2PServerSocket socket;
		public ClientHandler(I2PServerSocket socket) {
			this.socket = socket;
		}
		public void run() {
			while(true) {
		//Procesar las conexiones de los clientes.
                        }
                }
	}
}

En este caso se crea una nueva clase que procesará los mensajes de los clientes de forma indefinida en un bucle “while true”. En dicho bucle se aceptarán las conexiones de los clientes por I2P y posteriormente, se realizará algún tipo de procesamiento, el cual, típicamente consiste en recibir las conexiones por parte de los clientes y responder a los mensajes.

	while(true) {
		try {
			I2PSocket sock = this.socket.accept();
			if(sock != null) {
				//Receive
				BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
				//Send
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
				String line = br.readLine();
				if(line != null) {
                                    System.out.println(line);
                                    bw.write(line);
			            bw.flush();
				}
				sock.close();
			}
		} catch (I2PException ex) {
		System.out.println("General I2P exception!");
		} catch (ConnectException ex) {
		System.out.println("Error connecting!");
		} catch (SocketTimeoutException ex) {
                System.out.println("Timeout!");
		} catch (IOException ex) {
                System.out.println("read/write-exception!");
		}
       }

Por otro lado, el cliente debe conocer cuál es la dirección (destination) del emisor para poder transmitirle un mensaje y recibir su respuesta. El código necesario en la parte del cliente es mucho más simple, ya que solamente requiere utilizar la clase I2PSocket y conectarse con el destination especificado.

package testing.i2p;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ConnectException;
import java.net.NoRouteToHostException;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;
import net.i2p.data.DataFormatException;
import net.i2p.data.Destination; 

public class Client {
	public static void main(String[] args) {
		I2PSocketManager manager =
I2PSocketManagerFactory.createManager();
		System.out.println("Destination:");
		BufferedReader br = new BufferedReader(new
			InputStreamReader(System.in));
		String destinationString;
		try {
			destinationString = br.readLine();
		} catch (IOException ex) {
			System.out.println("Failed to get the Destination.");
			return;
		}
		Destination destination;
		try {
			destination = new Destination(destinationString);
		} catch (DataFormatException ex) {
			System.out.println("Destination string incorrectly formatted.");
			return;
		}
		I2PSocket socket;
		try {
			socket = manager.connect(destination);
		} catch (I2PException ex) {
			System.out.println("General I2P exception occurred!");
			return;
		} catch (ConnectException ex) {
			System.out.println("Failed to connect!");
			return;
		} catch (NoRouteToHostException ex) {
			System.out.println("Couldn't find host!");
			return;
		} catch (InterruptedIOException ex) {
			System.out.println("Sending/receiving was interrupted!");
			return;
		}
		try {
			//Write to server
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			bw.write("Hello I2P!\n");
			BufferedReader br2 = new BufferedReader(new
		InputStreamReader(socket.getInputStream()));
			String s = null;
			while ((s = br2.readLine()) != null) {
				System.out.println("Received from server: " + s);
			}
			socket.close();
		} catch (IOException ex) {
			System.out.println("Error occurred while
			sending/receiving!");
		}
	}
}

El código anterior es la base para crear cosas mucho más elaboradas, por ejemplo, en lugar de utilizar las clases BufferedReader y BufferedWriter se podría utilizar clases como ObjectInputStream y ObjectOutputStream que permiten enviar objetos serializados (aquellos que extienden de la interfaz java.io.Serializable) y de esta forma, construir aplicaciones muy robustas al interior de I2P. Por otro lado, también se puede utilizar para crear plugins que se puedan desplegar directamente desde la consola de administración de I2P. Sobre estas cosas hablaré en un próximo articulo.

Saludos y Happy Hack!
Adastra.

20 eepsites en la web profunda de I2P que te podrían interesar

febrero 5, 2015 6 comentarios

Este año puede ser muy interesante para I2P ya que por lo que he podido percibir en la red por comentarios en blogs, foros y en varios canales IRC, la gente está comenzando a utilizar más activamente I2P tanto como solución “InProxy” como solución “Outproxy”, especialmente desde la última edición de la CCC celebrada en Hamburgo. Ya os comentaba en la última entrada que 2015 es el año en el que deberías comenzar a pensar en I2P como una buena alternativa a TOR ya que se trata de una red madura y con mucho que ofrecer. Siguiendo esa misma línea, os dejo un listado de eepsites en I2P que a lo mejor resultan de vuestro interés, pero antes de eso, es importante hablar un poco sobre SusiDNS y el sistema de nombrado que utiliza I2P.

Tal como os he explicado anteriormente en una serie de artículos sobre I2P que he redactado hace unos años, el sistema de nombrado que utiliza un router depende de un fichero de texto que vincula un dominio “.i2p” con una dirección en base32 o base64, que es realmente el “destination” del servicio. En I2P no existe un sistema centralizado para resolver la dirección de un destino con su correspondiente dominio “.i2p”, no funciona como el clásico y conocido DNS, todos los hostnames son locales. Este sistema de nombrado se puede gestionar por medio de la aplicación “SusiDNS”, la cual se encuentra instalada por defecto en todos los routers de I2P en la siguiente dirección: http://127.0.0.1:7657/susidns/index. Algunos de los EEPSites que se listan a continuación ya se encuentran incluidos en el sistema de nombrado, sin embargo es posible que algunos no lo estén, por ese motivo es necesario hacerlo manualmente utilizando SusiDNS.

Por otro lado, es posible que una dirección “.i2p” no se encuentre almacenada en el addressbook local y en estos casos, el usuario tiene dos alternativas, o bien adicionar dicha dirección en cualquiera de los addressbook de la instancia local de I2P o utilizar un “jump service” que servirá de proxy entre el cliente y el destino sin necesidad de agregar el dominio y la dirección base32/base64 en el addressbook local. Algunos de los “jump services” más utilizados son los siguientes:

http://i2host.i2p

http://stats.i2p

http://no.i2p

http://i2pjump.i2p

Aclarados estos puntos, se listan algunos “eepsites” interesantes en la red de I2P. De esta forma, podrás comenzar a utilizar I2P, navegar por la web profunda y acceder a contenidos e información que sea de tu interés.

1. I2P Wiki (UGHA).

Una wiki bastante simple pero con buenos recursos sobre otros eepsites en I2P y recursos variados.

URL I2P: http://ugha.i2p/

URL Base32: http://z3f3owc72awbywk4p6qb5l2mxgitvs6ejztggbpn2a3ddmymfjda.b32.i2p

2. INR (I2P Name Registry).

Probablemente es uno de los recursos más interesantes para cualquier usuario que recién está comenzando con I2P. Incluye un directorio de servicios ocultos en I2P que los usuarios registran para que cualquiera pueda acceder a su correspondiente “destination”.

URL I2P: http://inr.i2p

URL Base32: http://joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq.b32.i2p

3. Foro de discusión de ZZZ.

Seguramente es para muchos conocido que el usuario “zzz” es uno de los desarrolladores de I2P y que lleva el proyecto desde el principio y dado que I2P sigue estando en versión “beta”, un buen recurso para conocer las últimas novedades es su foro de discusión, donde cualquiera puede registrarse y abrir un hilo. Es un recurso que te será muy útil para aprender y posteriormente apoyar al proyecto (con código, obviamente).

URL I2P: http://zzz.i2p/

URL Base32: http://ukeu3k5oycgaauneqgtnvselmt4yemvoilkln7jpvamvfx7dnkdq.b32.i2p/

4. Planet I2P.

Sitio dedicado a las últimas novedades en I2P.

URL I2P: http://planet.i2p/

URL Base32: http://y45f23mb2apgywmftrjmfg35oynzfwjed7rxs2mh76pbdeh4fatq.b32.i2p

5. Abusos Judiciales.

España es un país en el que se comenten innumerables atropellos y abusos judiciales y parece ser, que es poco lo que los afectados pueden hacer al respecto. Este servicio oculto no solamente se encuentra en I2P, sino que también se puede encontrar en TOR en la dirección onion http://2dn2dmxt5uwnxz3j.onion/ y su finalidad es exponer los principales abusos judiciales cometidos en España y las medidas legales que pueden aplicar los afectados. Además incluye consejos muy interesantes para protegerse y denunciar querellas falsas, denuncias, multas injustas, etc. Espero que ninguno de vosotros se encuentre nunca en una situación legal delicada, pero si así fuese, este sitio puede resolver algunas de las dudas que puedas tener.

URL I2P: http://abusos.i2p/

URL Base32: http://jnvf5uh4cnw5xv4yjwr5m4mv672ayacdj6lvsqyxkjtbzbuquxgq.b32.i2p/

6. APlus

Se trata de una red social muy simple en la que sus miembros pueden intercambiar mensajes y chatear. Para poder utilizarla, es necesario estar registrado, de lo contrario solamente podrás buscar los usuarios que se encuentran registrados.

URL I2P: http://aplus.i2p

URL Base32: http://h67lym6btfqinjs5ye272fo6uze2uvjk6t7qabibocjedfcv5fva.b32.i2p/

7. Strategic Intelligence Network (SIN)

Un sistema que recolecta y analiza los últimos acontecimientos en cada país del mundo y en base a dicha información, se encarga de generar distintos niveles de “SecCon” (Security Conditions) en cada país. Este sistema es interesante para conocer de primera mano la situación social y política de cada país del mundo y si eres una persona que suele viajar mucho, puedes leer las recomendaciones que incluye para mantener unos niveles de seguridad mínimos tanto en el viaje como en la estancia.

URL I2P: http://sin.i2p

URL Base32: http://tph27jvsnriyy3fcxmg44icunb5ugi3qhue3e7skwn4awp5j5zyq.b32.i2p/

8. GIT Hosting

Si tienes un proyecto de desarrollo de software y te interesa publicarlo en la web profunda de I2P, puedes registrarlo en el sitio git.repo.i2p y realizar su administración utilizando las utilidades de GIT del mismo modo que con cualquier repositorio en Internet.

URL I2P: http://git.repo.i2phttp://pull.git.repo.i2p/http://push.git.repo.i2p/

URL Base32: http://vsd2vtgtuua2vwqsal2mpmxm2b2cpn3qzmqjoeumrrw2p4aot7uq.b32.i2p/w

http://3so7htzxzz6h46qvjm3fbd735zl3lrblerlj2xxybhobublcv67q.b32.i2p/

http://jef4g5vxnqybm4zpouum3lzbl6ti6456q57nbyj5kfyldkempm3a.b32.i2p/

9. eepstatus

Servicio muy similar a INR, se encarga de verificar que los eepsites que se encuentran en el listado se encuentran activos y aquellos que no lo están, tienen una marca roja indicando la última fecha en la que se han visto en linea. Del mismo modo que ocurre con INR, se trata de un listado que se alimenta de sitios registrados por los usuarios de I2P y por un motor de indexación que incluye el servicio, por lo tanto es posible encontrar con servicios ocultos con contenidos inadecuados o ilegales y es importante ser consciente de ello y tomar las medidas oportunas.

URL I2P: http://identiguy.i2p/

URL Base32: http://3mzmrus2oron5fxptw7hw2puho3bnqmw2hqy7nw64dsrrjwdilva.b32.i2p/

10. PasteThis

Servicio similar a PasteBin para I2P. Los textos compartidos pueden ser públicos o privados

URL I2P: http://pastethis.i2p

URL Base32: http://erkqiwnjl7vtysqd3wvddv6tfvnhswarqkbn4blhdlhfxn7cf2ha.b32.i2p/

11. Postman Tracker

Uno de los servicios más conocidos en I2P para subir ficheros torrent en I2P. Es importante tener en cuenta que es posible que algunos de los torrents que se encuentran almacenados, no tengan el contenido que dicen tener. Cuidado, te puedes llevar una sorpresa.

URL I2P: http://tracker2.postman.i2p/

URL Base32: http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/

12. LaWiki

Una wiki en castellano muy completa sobre el uso de I2P y con explicaciones muy detalladas sobre privacidad, anonimato y cuestiones técnicas relacionadas con I2P, TOR, FreeNet, etc. Se recomienda su lectura!

URL I2P: http://lawiki.i2p

URL Base32: ddwc3z7tm6yuvh4mzmqne2ifn7qglbz73zyqxtkewlpzl7kpmqzq.b32.i2p

13. Killyourtv

Se trata de un blog con información técnica bastante útil. Encontraras varios manuales y servicios interesantes. Además, incluye una de las mejores guías que he visto sobre Tahoe, algo de lo que hablaré en un próximo articulo.

URL I2P: http://killyourtv.i2p/

URL Base32: http://aululz24ugumppq56jsaw3d7mkbmcgo7dl2lgeanvpniyk2cbrda.b32.i2p/

14. Shadowlife

Un blog de opinión sobre temas relacionados con anonimato y privacidad. Hace algún tiempo leí algunos artículos sobre anonimato online y offline que me parecieron interesantes, seguramente a ti también.

URL I2P: http://shadowlife.i2p

URL Base32: http://jme44x4m5k3ikzwk3sopi6huyp5qsqzr27plno2ds65cl4nv2b4a.b32.i2p

15. ZeroBin

Similar a PasteThis, pero permite publicar mensajes de forma privada y con una fecha de caducidad. Además tiene la opción de que se auto-destruya después de que el mensaje es leído.

URL I2P: http://zerobin.i2p

URL Base32: http://3564erslxzaoucqasxsjerk4jz2xril7j2cbzd4p7flpb4ut67hq.b32.i2p/

16. Syndie

Syndie es un sistema para la creación y gestión de foros descentralizados en I2P. Es muy popular entre los usuarios.

URL I2P: http://www.syndie.i2p

URL Base32: http://7lm3yzpuejhpl4tt4l7o4ndqlu7hgijohofh7oaydx7q7kelenbq.b32.i2p

17. Postman

Servicio en I2P para crear cuentas de correo electrónico de forma anónima. Es probablemente el servicio más conocido en I2P para este tipo de tareas. Una cuenta en Postman puede ser utilizada en cualquier cliente de I2P para recepción y envío de mensajes de correo electrónico. Fijaros en la sección “Pages” a la derecha, allí se encuentran todas las opciones disponibles en Postman.

URL I2P: http://hq.postman.i2p

URL Base32: http://27ivgyi2xhbwjyqmnx3ufjvc2slg6mv7767hxct74cfwzksjemaq.b32.i2p

18. I2P Find

Del mismo modo que existe el servicio TORFind para la búsqueda de servicios ocultos en TOR, I2PFind es un servicio que permite buscar servicios ocultos en I2P y/o en TOR. Además, cualquiera puede registrar su propio dominio I2P para que sea indexado por el motor de búsqueda.

URL I2P: http://i2pfind.i2p

URL Base32: http://cgkswg5iezxdvfds2p5lgvhfhvd6sv3r72yioarywnwgmiazbw3q.b32.i2p/

19. Ihave2P

Se trata de un sitio oculto que ofrece varios tipos de servicios, como por ejemplo un pastebin con cifrado y mi favorito, servidores proxy del tipo http/https/socks a la clearnet por medio de TOR y/o I2P. Este último en concreto, se encuentra disponible en una dirección distinta (http://ihave2proxy.i2phttp://ginbb7blr6rvgfkuyx7435rakosdilzeduklygrkwaw3dwduntcq.b32.i2p/).

URL I2P: http://ihave2p.i2p

URL Base32: http://s6npkh5hzslijnzohm2om32un4sh4r2urp6hry2fya6oo55ehcyq.b32.i2p/

20. Torrent Finder

Buscador de Torrents en la web profunda de I2P.

URL I2P: http://torrentfinder.i2p

URL Base32: http://mpc73okj7wq2xl6clofl64cn6v7vrvhpmi6d524nrsvbeuvjxalq.b32.i2p/

Una lista de 20 servicios ocultos (eepsites) en I2P que espero que te ayuden a perder el miedo a navegar por este tipo de redes y encontrar cosas (legales) que sean de tu interés.

Un saludo y Happy Hack!
Adastra.

2015, año en el que deberías comenzar a pensar en I2P.

febrero 3, 2015 2 comentarios

TOR es la red anónima más extendida, conocida (y atacada) del mundo y sin duda gran parte de su éxito se debe a que es una red que provee unos buenos niveles de anonimato y privacidad para cualquier usuario en Internet. Sin embargo, para nadie es un secreto que se trata de una red que se ha convertido en el principal objetivo de varios gobiernos y agencias en todo el mundo. Son muchos los que constantemente intentan realizar ataques contra la infraestructura de TOR, la cual se basa principalmente en la gente que “desinteresadamente” decide exponer su máquina como un repetidor y así, hacer que la red sea más grande y difícil de atacar. 2014 ha sido un año complicado para TOR, ya que se han descubierto varios ataques exitosos que han sido admitidos por el equipo del proyecto de los cuales aun no se conoce su impacto real, por este motivo, cuando hablamos de TOR, desafortunadamente ya no podemos hablar de un anonimato fuerte. Hay varias cosas que personalmente me gustan del proyecto, es muy interesante y cuenta con una comunidad de desarrolladores/contribuidores enorme, sin embargo hay otras que las considero no solamente mejorables, sino claro un fallo de diseño que ahora le esta pasando factura al proyecto. No pretendo criticar la arquitectura y diseño de TOR, aun así creo que hoy en día, con la cantidad de “rivales” y entidades con intenciones de romper el anonimato de los usuarios que usan esta red, ya es una cuestión de tiempo que su arquitectura y diseño se vuelvan indefendibles. Mis razones para afirmar esto son las siguientes:

– Red centralizada: Las autoridades de directorio son servidores que se encargan de mantener viva la red, de gestionar y verificar el estado de cada repetidor participante, emitir los ficheros de consenso que son utilizados por los clientes para componer sus circuitos, mantener un registro de “Introduction Points”, “Rendezvous Points” y las tablas de servicios ocultos registrados en la red, entre muchas otras labores de administración que son completamente transparentes para los usuarios. Esto es mucho, pero que mucho poder para ser manejado únicamente 10 ordenadores. Esta claro que un ataque dirigido contra algunos de estos ordenadores (o todos) puede generar un caos en la red y esto es algo que ya ha pasado entre los meses de octubre y diciembre del 2014, en los que se llevaron acabo ataques de DoS distribuidos contra algunas de las autoridades de directorio de TOR. El resultado: Gran parte de la red se mantuvo saturada durante varias horas y era prácticamente imposible acceder a la web profunda de TOR. Ahora bien, no tengo constancia de que existan campañas de APT contra dichos servidores, pero no me extrañaría, es más, hoy en día nadie puede garantizar con un 100% de certeza que todas las autoridades de directorio de TOR están siendo controladas única y exclusivamente por el equipo de TOR.

Red basada en las buenas intenciones: Cuando un cliente de TOR registra su instancia como un repetidor en la red, las autoridades de directorio se encargan de verificar varios parámetros relacionados con el rendimiento óptimo del repetidor y si se trata de una instancia maliciosa basándose principalmente en un mecanismo de listas negras. Sin embargo sino hay ningún problema, el repetidor es incluido en el consenso que emiten las autoridades de directorio cada hora y ahora, alguien que efectivamente no conoces pasa a ser el repetidor de salida del circuito que te permite conectarte con la web profunda de TOR. Tal como lo han demostrado la inmensa cantidad de ataques que se han llevado a cabo en el 2014, las autoridades de directorio de TOR no pueden saber si un repetidor concreto es malicioso hasta que es detectado y reportado, algo que puede tardar meses. Este es un problema que tiene difícil solución, pero que se convierte en una situación particularmente problemática dado que los circuitos en TOR son bidireccionales.

– Circuitos bidireccionales: Cuando un cliente de TOR se conecta a la red, utiliza un circuito compuesto por 3 repetidores, uno de entrada, uno intermedio y uno de salida. Dicho circuito es bidireccional, lo que quiere decir que funciona tanto para enviar como para recibir paquetes de datos para y desde un destino determinado. Este modelo seria desastroso para una red anónima pequeña, pero ese no es el caso de TOR, ya que la cantidad de voluntarios en todo el mundo es enorme, pero tal como comentaba anteriormente cualquiera puede exponer su ordenador como un repetidor en la red y aunque las autoridades de directorio cuentan con rutinas para la detección de repetidores maliciosos, al final se basan en una relación de confianza y si no hay indicios que demuestren lo contrario, las autoridades de TOR se fían de los clientes que registran sus instancias como repetidores de cualquier tipo. Si hablamos de un adversario con suficientes recursos, puede registrar una gran cantidad de repetidores en la red de TOR y controlar gran parte del trafico de los usuarios y dado que los circuitos en TOR son bidireccionales, realizar ataques basados en los tiempos de las peticiones/repuestas, correlacionales y análisis de trafico para identificar a un usuario, es mucho más sencillo de implementar. Imaginaros por un segundo, ¿Qué pasaría si los circuitos fueran unidireccionales? Pues que este tipo de ataques dejarían de ser viables, dado que teóricamente no habría forma de correlaccionar el trafico de un circuito con otro basándose únicamente en las estadísticas, eso sin contar con que para el adversario seria necesario contar con el doble de recursos para controlar dos circuitos distintos. – ¿Únicamente TCP? La red de TOR únicamente soporta protocolos de red basados en TCP, como por ejemplo HTTP, FTP, SSH, etc. Sin embargo, si se utiliza cualquier otro servicio basado en un protocolo de red distinto, como es el caso de DNS, puede existir una fuga de información que posiblemente revelará la identidad del usuario, ya que es trafico que no pasará por medio de TOR. Dicho en otras palabras, si una de tus aplicaciones ejecuta peticiones DNS para resolver una dirección IP o un nombre de dominio, dichas peticiones producirán una fuga de información, es más, si simplemente haces un “ping” contra otra máquina, también se producirá una fuga de información. TOR solamente soporta TCP, y peticiones DNS (UDP) o un simple “ping” (ICMP) pueden arruinar tu anonimato. Si bien es cierto que existen aplicaciones como “torsocks” que permiten hacer un “torify” de de las aplicaciones para que todo pase por medio de TOR, la realidad es que las fugas de información siguen siendo un problema bastante común.

– Servicios ocultos. ¿Cuándo va a terminar de cargar mi página?!

En TOR no solamente existen servicios ocultos del tipo HTTP, los hay de todo tipo (siempre y cuando se basen en TCP), pero independiente del tipo de servicio que usemos siempre hay una característica que es común a todos: Son LENTOS. Alguna vez te has preguntado ¿por qué demonios los servicios ocultos en TOR son tan lentos? Probablemente alguien te habrá dicho que es porque el trafico se replica entre varios nodos, por esos son lentos. Eso es FALSO, los servicios ocultos son lentos no solamente porque existan repetidores de por medio, son lentos porque cada servicio oculto se encuentra registrado en una base de datos (hash) que comparten las autoridades de directorio para mantener un registro de las direcciones onion de cada servicio con su correspondiente “Introduction Point”. Dado que dicho proceso es centralizado y el número de direcciones onion es gigantesco, es perfectamente normal presenciar una demora cuando se solicita acceso a un servicio onion, eso sin contar que para preservar el anonimato en ambas partes (tanto para el cliente como para el proveedor del servicio) existen dos circuitos independientes que se conectan entre si para la transferencia de datos entre cliente y servidor. Todo esto ya os lo contaba en un articulo anterior Ahora bien, es un problema que no tendrá una solución a corto plazo, ya que el tamaño de la red es tan grande que no es de extrañar que las autoridades de directorio se vean colapsadas por la cantidad de peticiones que reciben en picos puntuales del día, así que lo mejor que podéis hacer si navegáis por la web profunda de TOR es respirar profundo y llenaros de mucha paciencia.

Sin embargo no todo en TOR son problemas, eso está claro, ya que sino tuviera las virtudes que tiene nadie la usaría. Una de esas virtudes es la cantidad de usuarios que aportan a la red y el número de personas que crean herramientas, librerías, sitios con documentación, etc. Son aportes que ayudan a todo el ecosistema de la red y que desde luego le han permitido estar en la posición en la que está actualmente. No obstante, existen otras redes anónimas que si bien llevan prácticamente el mismo tiempo de desarrollo que TOR (entre los años 2003 y 2005) no han tenido las repercusiones ni el impacto que ha tenido TOR. Tal es el caso de redes como I2P y FreeNet, siendo la primera la que desde mi punto de vista puede aportar una solución elegante y eficiente a los problemas que he descrito anteriormente en TOR. Seguramente te preguntaras ¿Y por qué I2P no es tan conocido si es tan bueno? Francamente no me lo explico, pero desde mi punto de vista es una cuestión de propaganda y moda, algo que desafortunadamente mueve muchas cosas en la industria de la seguridad y en la informática en general. Creo que I2P no ha llegado a recibir el reconocimiento que se merece porque en los medios solamente se habla de TOR, es el referente de anonimato por excelencia a cualquiera que se lo preguntes! lo cual es una pena. Por ese motivo me he animado a escribir este articulo, hablando de las desventajas que tiene TOR y como una red como I2P puede aportar una solución real.

– Red descentralizada. Ya no hablamos de autoridades de directorio, hablamos de máquinas que se conectan a una red privada en la que todos “hablan el mismo idioma” y no existen entidades que gobiernen el funcionamiento general de la red. Tu te conectas y automáticamente ya eres parte de la red, no necesitas descargarte ficheros con información sobre la red o cosas similares, todos los usuarios son repetidores potenciales y están ahí para construir tus propios túneles de comunicación con otros usuarios. Se acabo eso de depender de 1 o 10 ordenadores para poder navegar en la web profunda o para construir circuitos.

– ¿Buenas intenciones? De eso nada, todos juegan con las mismas reglas. A diferencia de TOR, en I2P no se ruega a nadie que por favor aporte un poco de su ancho de banda y que convierta su instancia de I2P en un repetidor para los circuitos de los usuarios. No, en I2P todos los usuarios que se conectan actúan como repetidores. Esto quiere decir que si te conectas a I2P, una parte de tu ancho de banda será utilizada por otros usuarios en la red, eso si, tu puedes decidir cuanto puedes o quieres aportar. Esto es una característica que en mi opinión es de las más acertadas, ya que hace que los ataques “sybil” sean prácticamente inviables.

– Circuitos en doble sentido y túneles unidireccionales En TOR los túneles que construyen los clientes están compuestos por tres máquinas y dichas máquinas se utilizan para enviar y recibir información. En I2P esto también cambia, ya que no existen los circuitos como tal, en su lugar se crean túneles de comunicación en un solo sentido. Si un emisor quiere enviar un mensaje a un destinatario contará con un túnel compuesto por “x” repetidores que se encargarán de enviar el mensaje y por otro lado, si el emisor quiere recibir mensajes provenientes de la red, contará con otro túnel compuesto por “z” repetidores que se encargarán de recibir el mensaje y enrutarlo. Este modelo es simplemente genial, ya que los túneles pueden contar con un número configurable de repetidores y solamente se encargan de una única tarea que es enviar o recibir datos. Este modelo no solamente dificulta los ataques de análisis de trafico, sino también los ataques de correlación, ya que los túneles de entrada y salida no guardan ningún tipo de relación entre ellos, son completamente independientes y solamente la instancia que ha construido sus túneles sabe cuales son las máquinas que se utilizan para enviar y recibir datos. Por otro lado, a diferencia TOR, todas la comunicación va cifrada en todos los puntos, desde el principio hasta el final, utilizando un proceso de cifrado que en el mundo de I2P se conoce como cifrado “Garlic”.

– TCP, UDP, ICMP, el protocolo que quieras. En I2P no nos limitamos a utilizar protocolo TCP, podemos utilizar cualquier protocolo de red sin temor a perder nuestro anonimato. Esta característica facilita enormemente las cosas a la hora exponer servicios, ya que no solamente no nos limitamos a protocolos conocidos que utilizan TCP, sino a cualquier protocolo de red como UDP. Esta es otra de las razones por las cuales en I2P es posible implementar servicios P2P y descargar torrents y en TOR no.

– Servicios ocultos. Por fin, mi página carga rápido! Los servicios ocultos en I2P no solamente son más eficientes y rápidos, son muchísimo más ricos en términos de funcionalidades, ya que la arquitectura de I2P permite crear sitios web que permitan la ejecución de aplicaciones web 2.0 con Javascript, HTML5, CSS3 y frameworks para mejorar la experiencia de usuario (vease Dojo, NodeJS, AngularJS, etc) de hecho, I2P cuenta con un sistema de plugins que permite desplegar aplicaciones aplicaciones de forma rápida e intuitiva. Tenemos ante nosotros una amplia gama de alternativas que no existen en TOR, eso sin contar con que dado que la red es completamente descentralizada no existen las demoras y molestos retrasos a la hora de acceder a los servicios ocultos en TOR. I2P es un serio candidato a aquellos que buscan privacidad y niveles fuertes de anonimato. Además, para aquellos como yo, que les gusta ver cómo funcionan este tipo de tecnologías, puede resultar tanto o más interesante que TOR, ya que su arquitectura es tan compleja como genial. Para no terminar este articulo sin un contenido practico que puedas probar en tu ordenador, me gustaría dejar una referencia a algunos artículos que he escrito sobre I2P en este sitio:

https://thehackerway.com/2011/11/28/preservando-el-anonimato-y-extendiendo-su-uso-conceptos-basicos-sobre-el-uso-de-i2p-parte-xxii/

https://thehackerway.com/2011/11/30/preservando-el-anonimato-y-extendiendo-su-uso-conceptos-basicos-sobre-el-uso-de-i2p-parte-xxiii/

https://thehackerway.com/2011/12/02/preservando-el-anonimato-y-extendiendo-su-uso-administracion-de-i2p-aplicaciones-y-servicios-incluidos-parte-xxiv/

https://thehackerway.com/2011/12/05/preservando-el-anonimato-y-extendiendo-su-uso-administracion-de-i2p-aplicaciones-y-servicios-incluidos-parte-xxv/

https://thehackerway.com/2011/12/07/preservando-el-anonimato-y-extendiendo-su-uso-servicios-anonimos-eepsites-y-ssh-en-i2p-parte-xxvi/

https://thehackerway.com/2011/12/09/preservando-el-anonimato-y-extendiendo-su-uso-servicios-anonimos-plugins-en-i2p-parte-xxvii/

https://thehackerway.com/2011/12/12/preservando-el-anonimato-y-extendiendo-su-uso-arquitectura-y-protocolos-utilizados-en-i2p-parte-xxviii/

https://thehackerway.com/2011/12/16/preservando-el-anonimato-y-extendiendo-su-uso-estructura-de-i2p-parte-xxx/

https://thehackerway.com/2011/12/21/preservando-el-anonimato-y-extendiendo-su-uso-hacking-i2p-desarrollo-de-aplicaciones-usando-streaming-library-parte-xxxii/

https://thehackerway.com/2012/01/18/preservando-el-anonimato-y-extendiendo-su-uso-hacking-i2p-desarrollo-de-aplicaciones-usando-bob-parte-xxxiii/

Si bien es cierto que son artículos que he escrito hace un poco más de 3 años, siguen teniendo vigencia y son bastante útiles para entender en detalle el funcionamiento de I2P. Finalmente, no creas nada de lo que he dicho, ve y compruébalo por ti mismo!. La invitación es clara, es el momento de comenzar a utilizar I2P y conocer de primera mano los beneficios que nos puede aportar.

Un saludo y Happy Hack! Adastra.

Preservando el Anonimato y Extendiendo su Uso – Comparación de Redes Anonimas y conclusiones finales – Parte XLII

febrero 8, 2012 14 comentarios

Aunque en esta serie de entradas se ha profundizado principalmente en TOR, I2P y FREENET, existen muchas más soluciones que van por la misma linea y que intentan preservar la privacidad de sus usuarios, no obstante en esta serie de publicaciones se ha optado por explicar las 3 soluciones anteriormente indicadas principalmente por las siguientes razones:

  1. Estabilidad.

  2. Volumen de usuarios

  3. Funcionalidades

  4. Resistencia a la censura.

Actualmente TOR, I2P y FreeNet son las redes que se encuentran en un estado más avanzado en los puntos anteriores, por lo tanto no se puede desestimar ninguna ni pretender que alguna es “superior” a otra, siempre es necesario tener presente que se trata simplemente de herramientas que intentan conseguir el mismo fin: Preservar el anonimato y la privacidad de sus usuarios. Sin embargo, cuando alguien desea que sus “acciones” sean anónimas, necesita conocer muy bien estas soluciones y determinar cual se ajusta a sus necesidades concretas, en algunos casos, los usuarios se decidirán por el uso de TOR dadas sus capacidades de “Outproxy” mientras que otros preferirán I2P o FREENET por sus capacidades de “Inproxy” y VPN, se trata simplemente de una decisión que el usuario debe tomar en un momento determinado dependiendo de lo que quiera hacer. No obstante es importante en este punto resaltar y comparar las principales funcionalidades de estas 3 redes con el fin de proporcionar un “marco de decisión” más amplio al usuario final e identificar cuales son los puntos fuertes y los puntos débiles de cada una de estas soluciones con respecto a las otras.

Leer más…

A %d blogueros les gusta esto: