Los servicios ocultos en TOR son una de las características más interesantes que tiene dicha red y sin lugar a dudas, constituyen una forma de compartir información o comunicarse con alguien de forma confidencial y anónima. No obstante suelen ser muy lentos, pesados y a veces, no tienen unos buenos niveles de disponibilidad, además, después del último “advisory” de seguridad publicado por el equipo de TOR https://blog.torproject.org/blog/tor-security-advisory-relay-early-traffic-confirmation-attack muchos han optado por utilizar otras soluciones que suelen dar buenos niveles de anonimato, privacidad, confidencialidad y rendimiento, véase por ejemplo los “freesites” en Freenet o los “eepsites” en I2P. Lo cierto es que en los últimos años la red de TOR se ha convertido en el centro de atención, hay mucho interés de gobiernos y entidades privadas que ven en dicha red, una fuente de información ENORME y todos buscan cualquier tipo de fallo que permita descubrir la identidad de cualquier usuario que utilice TOR.
A pesar de todo, TOR sigue siendo “el rey” en el campo del anonimato y aunque otras redes del mismo tipo tienen características muy similares, aun no llegan al nivel de madurez ni a la cantidad de usuarios que usan TOR. Hablamos de una red muy solida y atacar directamente su infraestructura requiere de una cantidad considerable de servidores para intentar controlar una pequeña fracción de trafico, algo que no suele pasar desapercibido por demasiado tiempo.
Configurar un repetidor o servicio oculto no es demasiado complicado, solamente es necesario establecer las opciones de configuración adecuadas en el fichero “torrc” y a correr. No obstante, hay muchos detalles técnicos que son interesantes y que un hacker/pentester que se dedique a trabajar con esta red debería conocer.
¿Cómo funcionan los servicios ocultos en TOR?
En primer lugar, un servicio oculto puede ser cualquier cosa, desde un servidor HTTP, FTP, SSH, SAMBA, etc. Hablamos de servicios comunes que funcionan utilizando la red de TOR para el envío y recepción de paquetes, el único requisito es que dichos servicios utilicen protocolo TCP o se utilice un “wrapper” para convertir cualquier paquete de datos en otros protocolos como UDP o ICMP directamente a TCP. Como el lector podrá imaginarse, dichos servicios pueden contener fallos de seguridad que pueden ser aprovechados por un atacante y de esta forma, conseguir “romper” su anonimato, aunque suena simple, como se verá más abajo hay ciertos impedimentos que dificultan descubrir y posteriormente atacar servicios vulnerables en la red de TOR.
Evidentemente para que podamos seguir hablando de anonimato y privacidad tanto en el servicio como para sus clientes, la ubicación de ambas partes debe ser desconocida y para ello, TOR emplea el siguiente flujo de trabajo:
Paso 1. El servicio necesita estar disponible en la red de TOR para que los usuarios puedan utilizarlo y para ello, lo primero que hace es elegir tres repetidores en la red de TOR de forma aleatoria y construir un circuito virtual hacia ellos, esto quiere decir que el servicio no establece una conexión directa con dichos repetidores, son simplemente el punto final de los circuitos creados. Estos repetidores elegidos aleatoriamente en la terminología de TOR son conocidos como “Introduction Points” y son los encargados de recibir las peticiones de los clientes y enrutarlas por medio del circuito virtual hacia al servicio oculto. Posteriormente, el servicio oculto se encarga de enviar su clave pública a cada uno de los “Introduction Points”, la cual será utilizada para que cada “Introduction Point” pueda asociar dicha clave pública con un servicio concreto y de esta forma, no exponer en dichos repetidores la ubicación real del servicio.
Paso 2. Hasta este punto, solamente se seleccionan repetidores de forma aleatoria, se crean circuitos virtuales para comunicarse con dichas máquinas y se les envía la clave privada del servicio. No obstante, el servicio oculto debe estar disponible a los clientes y para ello debe registrar su información básica en la red de TOR y de esta forma los clientes podrán acceder a dicho servicio. El servidor debe conformar un “hidden service descriptor” que no es más que un fichero que contiene la dirección “onion” del servicio (se hablará de esto más abajo), su clave pública y el listado de “Introduction Points” seleccionados en el paso anterior. Este descriptor es enviado a las autoridades de directorio de TOR, las cuales se encargan de procesar la solicitud y registrar el servicio oculto.
Paso 3. El servicio está disponible y ahora cualquier usuario podrá acceder a él. No obstante, el cliente TIENE QUE CONOCER la dirección “onion” de ese servicio antes de poder consultarlo a las autoridades de directorio de TOR. Asumiendo que el cliente disponga de dicha dirección “onion”, realiza una petición HTTP a dicha dirección. Dicha petición es tratada de un modo distinto por el protocolo TOR, ya que detecta que se trata de una petición a un servicio oculto y automáticamente se encarga de obtener la información que se encuentra asociada con dicha dirección. En el caso de que dicha dirección se encuentre registrada, el cliente obtendrá la clave pública del servicio y el listado de los repetidores que actúan como “Introduction Point” para contactar con el servicio oculto. El documento que devuelven las autoridades de directorio se conoce como “Rendezvous Service Descriptor”.
Paso 4. Ahora que el cliente tiene todo lo que necesita saber para conectar con el servicio oculto, debe encargarse de crear un circuito a un repetidor concreto que será seleccionado de forma aleatoria y que se encargará de enviar las peticiones del cliente a uno de los “Introduction Point” del servicio oculto. Este repetidor que ha seleccionado el cliente de forma aleatoria se conoce como “Rendezvous Point” y es el encargado de enviar los datos de la petición del cliente junto con la clave pública del servidor para realizar la conexión con alguno de los “Introduction Point” definidos.
Paso 5. La petición inicial del cliente se conoce como “Introduce Message” y se trata de un mensaje cifrado con la clave pública del servicio en el que se indica la ubicación del “Rendezvous Point” junto con una cadena codificada utilizando el mecanismo “one-time-secret” (ver más aquí: http://searchsecurity.techtarget.com/definition/one-time-pad).
Paso 6. Dado que el servicio ahora conoce la ubicación del “Rendezvous Point”, las respuestas a las peticiones del cliente no pasarán por medio de los circuitos creados con los “Introduction Points”, sino que en su lugar, serán enviadas directamente al “Rendezvous Point” el cual usará el circuito establecido con el cliente para encaminar dichas respuestas a su correspondiente destino.
Se trata de un mecanismo que está muy bien pensado, de forma segura se preserva el anonimato y la confidencialidad de los datos. Es simplemente genial. No obstante se sacrifica muchísimo en términos de rendimiento ya que es bastante costosa la construcción de los circuitos involucrados entre el cliente y el servidor. Por este motivo, los hidden services en TOR son lentos. Para que quede un poco más clara la explicación anterior, la siguiente imagen enseña “grosso modo” cómo se establece un servicio oculto en TOR y cómo los clientes acceden a ellos.
Hasta este punto ya sabes como funcionan los servicios ocultos en TOR, ahora: ¿Cómo atacar un hidden service y encontrar su ubicación real?. Esa es la gran pregunta y no tiene una respuesta simple, antes habría que responder algunas otras para partir el problema en trozos:
¿Los servicios ocultos pueden contener vulnerabilidades, pero cómo las puedo aprovechar?
Claro que pueden contener vulnerabilidades (y muy gordas) y lo mejor de todo es que es relativamente fácil descubrir y explotar vulnerabilidades en cualquier servicio oculto. Solamente es necesario conocer el servicio oculto que se desea atacar y enrutar cualquier petición que el atacante desea enviar por medio del proxy SOCKS que se levanta en una instancia local de TOR cuando se utiliza la opción de configuración “SocksPort” en el fichero “torrc”. En realidad es un proceso bastante simple, solamente basta con enrutar todas las pruebas que un pentester profesional ejecutaría contra un objetivo determinado utilizando el proxy SOCKS de TOR.
¿Y si es tan fácil, porque los gobiernos y otras organizaciones no lo hacen para atacar servicios ocultos maliciosos?
Atacar un servicio oculto, del que se conoce su dirección “onion” puede ser una tarea “sencilla” (dependiendo de lo bien asegurado que se encuentre el servicio, evidentemente), pero atacar un servicio oculto desconocido, del que no se tiene su correspondiente dirección “onion” es otra cosa.
No se ha mencionado antes, pero las direcciones Onion generadas por TOR, son el resultado de aplicar el algoritmo Base32 sobre el hash SHA de los primeros caracteres de la clave pública del servicio oculto. El algoritmo Base32 generaráun valor codificado de 16 caracteres donde los valores validos son las letras de la “a” a la “z” en minúsculas y los dígitos entre 2 y 7. El resultado de dicha operación es la dirección onion para un servicio oculto y que el usuario debe conocer antes de poder acceder a él. Una vez comprendido lo anterior, una dirección como “ahgt56dr32mhkva1.onion” es teóricamente valida.
¿Es tan difícil obtener todo el listado de direcciones “.onion” en la red de TOR y luego intentar atacar todos los servicios ocultos al estilo “Chuck Norris”?
No solo es difícil, actualmente no hay ordenadores que sean capaces de tratar la cantidad de combinaciones posibles, especialmente cuando los 16 caracteres que conforman la dirección Onion son desconocidos para el atacante. Para que el lector comprenda la dificultad que implica intentar encontrar un servicio oculto, vamos a jugar un poco con los números y vamos a realizar algunos cálculos.
Sabemos que una dirección Onion se compone de 16 caracteres, donde los posibles valores de cada uno de esos 16 caracteres puede variar entre las letras de la “a” y “z” y los dígitos entre 2 y 7. Esto quiere decir, que para calcular el conjunto de direcciones, es necesario realizar un producto cartesiano https://es.wikipedia.org/wiki/Producto_cartesiano dónde el número de posibles combinaciones es: 32^16 = 1208925819614629174706176
Se trata de un valor ENORME y ahora, solamente por un segundo, imagina ese número de posibles combinaciones cargadas en la memoria de un programa para después intentar procesarlas. Es simplemente imposible e inviable con la capacidad de computo de los ordenadores modernos.
El espacio de posibles direcciones Onion es tan grande que resulta imposible controlar la totalidad de posibles servicios ocultos que puedan existir en la red de TOR (Eso sin mencionar que muchos no se encuentran activos todo el tiempo, dificultando aun más su detección). Hablamos de un problema que se encuentra relacionado con la capacidad de los ordenadores modernos y aunque se utilice un cluster de super-ordenadores, el problema sigue presente.
Vamos a jugar un poco más con los números, de tal modo que puedas comprender cuánto tiempo seria necesario para completar la tarea de generar y procesar el espacio total de posibles direcciones Onion.
Supongamos que tenemos uno o varios ordenadores que trabajan paralelamente y son capaces de procesar diez millones de posibles combinaciones por segundo, no estaría nada mal, verdad? Pues, abre una calculadora y haz el calculo o el interprete de Python, que también funciona como una calculadora.
>>> 32**16 / (10000000*60*60*24*365)
3833478626L
Estamos hablando de un proceso que puede tardar cerca de 4 billones de años. Ahora seguro que queda claro el porqué resulta tan difícil descubrir servicios ocultos en la red de TOR. Muchos de los servicios ocultos que conocemos, son muy difundidos en múltiples sitios en Internet, como por ejemplo en este blog, en el que encontrarás algunas entradas con direcciones Onion de servicios ocultos interesantes. La realidad es que la gran mayoría de servicios ocultos y especialmente aquellos que tienen contenidos maliciosos que son creados por mafias, traficantes y de otros grupos de delincuentes que pueden ser extremadamente peligrosos, se mantienen en las sombras y tienen un nivel de anonimato bastante alto ya quesus direcciones no las vas a encontrar en blogs, directorios de direcciones onion o cualquier sitio en Internet, son realmente servicios ocultos que un grupo muy limitado de personas conocen y utilizan. Esos servicios, puede que tengan vulnerabilidades que cualquier Hacker podría explotar, pero el punto es: ¿Cómo encontrar servicios con esas características? Es como encontrar una aguja en un pajar, o más concretamente encontrar una aguja entre 1208925819614629174706176 agujas. Resulta prácticamente imposible.
Pero algo se podrá hacer, no?
La realidad es que actualmente es poco lo que se puede hacer desde el punto de vista de un pentester o desarrollador, ya que se trata de un problema relacionado con capacidad y poder de procesamiento de los ordenadores actuales, un problema que probablemente se solucionará en algunos años/décadas con la llegada de los ordenadores cuánticos, los cuales teóricamente, tendrán una capacidad de procesamiento que será muchísimo mayor que varios super-ordenadores juntos, sin embargo para eso aun faltan varios años. Se puede intentar limitar la cantidad de combinaciones reduciendo el número de caracteres empleados para la generación de la dirección Onion, limitando también la cantidad de posibilidades y probablemente descartando una gran cantidad de direcciones con algún servicio en ejecución. Otra posibilidad, es tener el conocimiento de una dirección parcial y de este modo, la cantidad de combinaciones de la dirección onion se reducirá considerablemente. Finalmente, se puede crear un proceso que se ejecutará de manera indefinida e ininterrumpida generando direcciones onion validas de forma aleatoria y posteriormente ejecutar una petición contra dicha dirección con la esperanza de encontrar un servicio oculto, algo similar a pegar tiros al aire esperando darle a algún pato o irte a pescar, sera simplemente cuestión de suerte y puede tardar horas o incluso días en obtener resultados positivos.
No son soluciones que realmente ayuden a resolver el problema, sin embargo permiten acotarlo un poco.
De esto hablaré en una próxima entrada.
Saludos y Happy Hack!