Categorías
Hacking Hacking Python Networking Programacion Web Applications

Implementando WebSockets con Tornado

En un articulo anterior he hablado sobre la librería Tornado y cómo se puede utilizar para implementar servidores y clientes TCP asíncronos. Además, también he hablado sobre algunas de las vulnerabilidades más comunes en WebSockets, una de las características más interesantes en la especificación HTML5. En esta ocasión veremos cómo utilizar los módulos disponibles en Tornado para crear un servidor web básico que soporte WebSockets para poder realizar pruebas de concepto rápidas y comprender el comportamiento tanto en clientes como servidores de los websockets.

Tornado es una librería que solamente se encuentra disponible para máquinas basadas en Unix, por este motivo, en un próximo articulo hablaré sobre otra implementación independiente de plataforma basada en Java llamada websocket4j. Otra buena solución cuando queremos realizar pruebas con un sistema basado en Windows.

  1. Implementación de un cliente utilizando la API de WebSockets

Antes de comenzar a implementar el servidor, vamos a comenzar creando un cliente básico que servirá posteriormente para probar cualquier implementación de un servidor con WebSockets. Para implementar un cliente, basta con utilizar la API en Javascript que se encuentra habilitada en prácticamente todos los navegadores modernos que soportan HTML5, como es el caso de Firefox, Opera o Chrome.

test.html

[sourcecode language=»javascript»]
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    <script type="text/javascript">
        function WebSocketTest() {
                var ws = new WebSocket("ws://localhost:8888/ws?Id=123456789&name=Adastra&continue=Yes");
        if (ws != null && ws.readyState == WebSocket.OPEN) {
          ws.send("Data from the client to the server!");
        }
                ws.onopen = function() {
                    ws.send("Opening connection!");
                };
                ws.onmessage = function (evt) {
                    var received_msg = evt.data;
                    alert("Message received… " + received_msg);
                };
                ws.onclose = function() {
                    alert("Connection is closed…");
                };
        }
        </script>
    </head>
    <body>
        <a href="javascript:WebSocketTest()">Run WebSocket</a>
    </body>
</html>
[/sourcecode]

En la página HTML se puede apreciar que la función “WebSocketTest” contiene todos los elementos necesarios para establecer una comunicación con el servidor web y posteriormente, enviar y recibir mensajes de forma asíncrona. Esto último es lo que hace tan interesantes los WebSockets, ya que después de establecer el handshake, tanto cliente como servidor pueden enviarse mensajes sin necesidad de esperar a que la otra parte conteste y el servidor, puede enviar datos sin necesidad de que exista una petición previa por parte del cliente.

Ahora bien, después de tener preparada la pieza de código correspondiente al cliente, lo siguiente consistirá en crear un servidor que se encargue de procesar las peticiones y manejar todas las conexiones utilizando el protocolo de WebSockets.

  1. Implementación del un servidor utilizando la API de WebSockets y la librería Tornado

Como comentaba anteriormente, Tornado cuenta con varias clases y funciones que permiten crear diversos tipos de elementos de red, tanto síncronos como asíncronos. En este caso concreto nos centraremos en el módulo que permite la creación de servidores y aplicaciones web con Tornado. Esto será útil para realizar pruebas de concepto y entender el funcionamiento de ciertas características propias en entornos web.
El siguiente programa permitirá la creación de un servidor web básico utilizando Tornado, el cual aceptará conexiones en HTTP normales si el usuario solicita el recurso “/” y conexiones utilizando el protocolo de WebSockets si el usuario solicita el recurso “/ws”.

serverTornado.py

[sourcecode language=»python»]</pre>
<pre>import tornado.ioloop
import tornado.web
import tornado.websocket
from tornado.options import define, options, parse_command_line
class Client:
    def __init__(self, clientId, name, cont, connection):
        self.id = clientId
        self.name = name
        self.cont = cont
        self.connection = connection

clients = []
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("test.html")

class WebSocketHandler(tornado.websocket.WebSocketHandler):
    def open(self, *args):
        self.id = self.get_argument("Id")
        self.name = self.get_argument("name")
        self.cont = self.get_argument("continue")
        newclient = True
        for client in clients:
            if client.id == self.id:
                client.connection.write_message("Hello Again %s !" %(client.name))
                newclient = False
                break
        if newclient:
            clientRef = Client(self.id, self.name, self.cont, self)
            clients.append(clientRef)
            self.write_message("Hello %s !" %(self.name))
           

    def on_message(self, message):        
        for client in clients:
            if client.id == self.id:
                print "Message from %s received : %s" % (client.name, message)
    
      
    def on_close(self):
        for client in clients:
            if self.id == client.id:
                clients.remove(client)
                break

define("port", default=8888, help="run on the given port", type=int)
app = tornado.web.Application([
    (r’/’, IndexHandler),
    (r’/ws’, WebSocketHandler),
])

if __name__ == ‘__main__’:
    parse_command_line()
    app.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()
[/sourcecode]

Los elementos más importantes del programa anterior son los siguientes:
– Objeto del tipo “
tornado.web.Application” el cual se encarga de definir las URI disponibles para el servidor web. En este caso concreto, se ha definido que el usuario podrá acceder a la ruta “/” y “/ws”. Si el usuario solicita el recurso “/” el servidor se encargará de ejecutar el handler “IndexHandler” y si el usuario solicita el recurso “/ws” el servidor se encargará de ejecutar el handler “WebSocketHandler”.

– IndexHandler: Clase que hereda de la clase “tornado.web.RequestHandler” y que se encarga de procesar las peticiones HTTP realizadas por los clientes que emplean el método GET. En este caso, la case se encarga simplemente de responder al cliente con la página “test.html”, la cual incluye el contenido que se ha explicado anteriormente en el la primera parte de este articulo, es decir, la página HTML con los elementos necesarios para interactuar con el servidor web.

– WebSocketHandler: Clase que hereda de la clase “tornado.web.WebSocketHandler” y que se encarga de procesar las peticiones entrantes que utilicen el protocolo de WebSockets. La clase incluye los métodos “open”, “on_message” y “on_close”, los cuales son invocados automáticamente cuando se abre una conexión, se recibe un mensaje y se cierra una conexión existente, respectivamente.

– Finalmente, la definición propiamente dicha del servidor web viene dada por una instancia de la clase “tornado.ioloop.IOLoop”, la cual se encarga de crear un hilo de ejecución que se mantendrá en funcionamiento de forma indefinida y que utilizará las opciones por línea de comandos que se han definido por medio de la función “tornado.options.define”.

Con todos lo anterior, ahora es posible ejecutar el servidor web y probar los métodos de los dos handlers definidos.

>python serverTornado.py

Si el usuario solicita el recurso “/”, el servidor se encargará de responder con la página “test.html” tal como se enseña en la siguiente imagen.

En enlace que se puede ver en la imagen, se encarga de invocar a una función en Javascript que permite interactuar con el servidor web y enviar mensajes utilizando el protocolo WebSockets, tal como se puede apreciar en la siguiente imagen.

Se trata de un ejemplo muy simple y que no solo permite conocer cómo funcionan los websockets, sino que también explica como utilizar Tornado para crear un servidor que los soporte. No obstante, tal como mencionaba anteriormente, Tornado solamente funciona para sistemas basados en Unix, con lo cual, en el próximo articulo hablaré sobre otra librería basada en Java llamada websockets4j.

Un Saludo y Happy Hack!
Adastra.

Categorías
Hacking Networking Services - Software

20 sitios en la web profunda de TOR que te podrían interesar

Si te interesa el Hacking y la ciberseguridad, no dudes en apuntarte a las formaciones en The Hacker Way:

CURSOS EN THE HACKER WAY

 

La web profunda de TOR es un entorno que se encuentra en constante cambio y los servicios ocultos que consultamos un día, al otro día pueden dejar de funcionar por muchos motivos, ya que no hay que olvidar que la mayoría son mantenidos por voluntarios en la red y no son servidores dedicados. Por este motivo, algunos de los sitios en la web profunda que he compartido hace algunos meses ya no se encuentran activos, de todos modos te invito a que los visites, aquí, aquí y aquí.

A continuación, expongo un listado de 20 servicios ocultos (HTTP) en la web profunda de TOR que probablemente serán de tu interés.

1. Onion Soup

Enlaces en la web profunda relacionados con bases de datos de direcciones “.onion”, buscadores de servicios ocultos, redes sociales en la web profunda, entre otros recursos interesantes.

Dirección: http://soupksx6vqh3ydda.onion/links.shtml

2. HackForum

Un foro sobre hacking que a diferencia de los foros tradicionales que solemos encontrar por Internet, contiene hilos y manuales muy interesantes sobre anonimato, malware, desarrollo de “bichos”, entre otras cosas.

Dirección: http://a2emrmdsprmm6t7i.onion/

3. Galaxy2

Galaxy fue una red social que gano mucha popularidad en la red de TOR, pero dicho servicio ha dejado de estar disponible hace algunos meses y debido a ello, ha salido “Galaxy2”, una red social que pretende sustituir a Galaxy.

Dirección: http://w363zoq3ylux5rf5.onion/

4. Wikileaks

Se trata de un “mirror” en la deep web del famoso WikiLeaks, con todos los documentos e información filtrada en los últimos años.

Dirección: http://zbnnr7qzaxlk5tms.onion/

5. GlobaLeaks

Por medio de esta plataforma cualquiera puede reportar/filtrar información sobre acciones indebidas, como las violaciones a los derechos fundamentales que comenten los gobiernos de algunos países contra sus ciudadanos. Se encuentra diseñada para proteger a toda costa la identidad de la persona que reporta dichos abusos y utiliza la plataforma “GlobaLeaks” (https://globaleaks.org).

Dirección: http://ak2uqfavwgmjrvtu.onion/#/

6. A Beginner Friendly Comprehensive Guide to Installing and Using a Safer Anonymous Operating System.

Se trata de una guía muy recomendable sobre la instalación y uso de un sistema operativo (Debian, por supuesto) con las herramientas y utilidades necesarias para que permita a sus usuarios un nivel adecuado de anonimato y seguridad.

Dirección: http://yuxv6qujajqvmypv.onion/index.php?title=Main_Page

7. BB Compendium

Se trata de un sitio en el que encontraras manuales de todo tipo, no solamente relacionados con la informática, sino también sobre medicina, uso aplicado de la química, manuales sobre entrenamiento militar, entre otras cosas.

Dirección: http://nope7beergoa64ih.onion/

8. Is online that hidden service?

A veces una instancia de TOR puede estar mal configurada y el acceso a la web profunda es tan lento, que la conexión a un sitio web se corta antes de que el servicio conteste a las peticiones. Para estar completamente seguros de que un sitio oculto en la red de TOR se encuentra caído, existe este servicio, el cual despejará cualquier tipo de duda al respecto.

Dirección: http://ol56t3xahrpk2b62.onion/

9. WTF is my IP?

Si no estas seguro si tienes correctamente configurado tu navegador para conectarte a la web profunda de forma segura, una buena forma consiste en consultar el servicio “checktor” de TOR (https://check.torproject.org/). Sin embargo, si quieres conocer más detalles sobre las cabeceras HTTP y fugas de información del navegador, este servicio puede ser muy útil.

Dirección: http://ofkztxcohimx34la.onion/

10. Ping sec

Muchos de vosotros leéis este blog porque os gusta la seguridad informática (o eso espero) y precisamente por ese motivo incluyo en este listado el blog “Ping Sec”. Creo que hay pocos blogs tan interesantes como este. Fijaros en la sección de malware: OSMDB ( Open Source Malware Data Base ).

Dirección: http://pmryw2y4t3u46uts.onion/

11. Sinbox

Se trata de un sistema de email que no utiliza javascript ni almacena cookies en el navegador, además toda la información entre remitente y destinatario viaja cifrada.

Dirección: http://sinbox4irsyaauzo.onion/

12. Directorio TOR en español

Servicio oculto en castellano con varias direcciones onion separadas por categorías.

Dirección: http://cjxbupyxay3ibikr.onion/

13. ZeroBin

Se trata de un PasteBin “con esteroides” en el que los mensajes se pueden cifrar, marcar el tiempo de caducidad, destruir después de ser leído y puede ser expuesto de forma pública en forma de discusión como si se tratará de un foro o privado para aquellos usuarios autorizados.

Dirección: http://zerobinqmdqd236y.onion/

14. TorFind

Se trata de un buscador muy interesante ya que no solamente busca direcciones onion en la web profunda de TOR, sino que también busca eepsites en I2P. Lleva activo varios años y la calidad de las búsquedas es bastante buena.

Dirección: http://ndj6p3asftxboa7j.onion/

15. Yacy

Aquí tenemos otro buscador para la web profunda de TOR, pero que además, permite aplicar varios filtros relacionados con el tipo de servicio (HTTP, FTP, SMB), extensión de documentos, etc. Los filtros permitidos son muy similares a los que se pueden aplicar en buscadores como Google o Shodan.

Dirección: http://yacy2tp5a2dhywmx.onion

16. Information and Anti-Forensics

Se trata de un sitio que examina cada una de las etapas relacionadas con el ataque a un sistema informático y las medidas defensivas que se pueden aplicar. Además, explica algunas medidas que sirven para proteger la privacidad y el anonimato de los usuarios.

Dirección: http://xzu2i6kiyhysfn4s.onion/index.html

17. TheChess

Si te gusta el ajedrez, como a mi, es un sitio que seguro te encantará, ya que podrás medirte con otros jugadores y entrar en competiciones. Suelo entrar a menudo en este sitio y si quieres, podemos echarnos una partida, solamente necesitas registrarte. 🙂

Dirección: http://theches3nacocgsc.onion/

18. TorStatus

Permite ver el estado de la red de TOR en todo momento. Enseña los repetidores que se encuentran activos y sus detalles de configuración más importantes, como por ejemplo el nombre del router, país, ancho de banda aportado, puerto de “Onion Routing”, puerto de directorio, sistema operativo, etc.

Dirección: http://jlve2y45zacpbz6s.onion/

19. Strategic Intelligence Network

Se trata de un servicio que se encarga de analizar los últimos acontecimientos en todos los países del mundo y determinar una escala que recibe el nombre de “SecCon” o “Security Conditions”. Dicha escala determina el nivel de amenaza de un país y si es seguro estar en él, ya sea como turista o como residente. Se trata de un servicio que se actualiza constantemente, dependiendo evidentemente de la información que se publica en los principales medios de comunicación. Otra característica interesante, es que cada “SecCon” tiene un color distinto dependiendo del riesgo que corren las personas que se encuentran allí y cuando se selecciona un país del mapa, enseña una reseña breve de la información que se ha utilizado para asumir el nivel de “SecCon” correspondiente y algunas medidas que deben tomar si deseas viajar allí.

Dirección: http://4iahqcjrtmxwofr6.onion

20. Yet another Tor Directory.

¿20 enlaces te resultan pocos? a mi también, pero no te preocupes, este servicio contiene un listado de más de 4000 direcciones onion en la web profunda de TOR con todo tipo de contenidos (algunos son ilegales, así que estar atentos por donde os metéis). Además se actualiza constantemente, ya que se encarga de recorrer y registrar servicios ocultos en la deep web.

Dirección: http://bdpuqvsqmphctrcs.onion/

Un saludo y Happy Hack!
Adastra.

Categorías
Hacking Networking Services - Software

Instalación de un proxy TOR2WEB para acceder a servicios ocultos desde Internet

Seguramente muchos de los que leéis este blog y os interesan temas relacionados con el anonimato, TOR y cosas similares, conocéis el proyecto “TOR2WEB”, pero para los que no, basta con decir que es una plataforma creada por el equipo de TOR que permite que los servicios ocultos que se publican internamente en la web profunda de TOR se encuentren disponibles desde Internet sin necesidad de que el cliente tenga que arrancar una instancia de TOR en su máquina. Esto quiere decir que cualquier usuario corriente en internet, utilizando cualquier navegador web, podrá acceder a un servicio oculto muy fácilmente.

TOR2WEB está diseñado para funcionar como un proxy reverso, que solamente se encarga de enrutar todas las peticiones entrantes desde la “clear web” a la “deep web” de TOR, con lo cual los servicios ocultos siguen siendo ocultos, incluso para un proxy TOR2WEB. No obstante, el cliente que visita dichos contenidos no lo es, a menos claro, que utilice TOR para acceder a dicho proxy algo que que no tiene mucho sentido, ya que al utilizar TOR ya se tiene acceso a la web profunda de TOR y realmente no seria necesario utilizar TOR2WEB.

“tor2web.org” está conformado por voluntarios en todo el mundo que configuran y exponen un servicio de TOR2WEB para que cualquier usuario en Internet pueda utilizarlo. Dado que se trata de un proxy, no almacena los contenidos de los sitios ocultos, simplemente se encarga de enrutar las peticiones entre la web profunda de TOR y la “web clara”.

Acceder a un servicio oculto en la web profunda de TOR es simple, solamente hace falta sustituir la cadena “.onion” de la dirección del servicio oculto por “.tor2web.org”.

Por ejemplo, si la dirección onion de un servicio oculto es la siguiente: “ajio7mfsscpvgd23.onion” la dirección que se debe utilizar para acceder a dicho servicio utilizando TOR2WEB es: “ajio7mfsscpvgd23.tor2web.org”.

Lo primero que verá el usuario cuando navega hacia dicho sitio es una nota legal que indica que TOR2WEB es solamente un servicio de proxy que tira de la web profunda de TOR y que los contenidos que el usuario visualizará son responsabilidad del creador del servicio oculto al que se intenta acceder. Si el usuario está de acuerdo con los términos expuestos por el proxy, puede continuar y acceder a los contenidos del servicio oculto. La siguiente imagen enseña enseña dicha advertencia.

tor2web1

 

Por otro lado, la plataforma también almacena unas estadísticas básicas sobre el número de accesos que ha tenido el servicio oculto el día anterior, por cuestiones de privacidad y para no generar registros sobre el uso de un servicio oculto, solamente se pueden ver las estadísticas del día anterior y no se almacena nada sobre los datos de otros días. Para acceder a dicha información basta con entrar a la uri “/antanistaticmap/stats/yesterday”. Por ejemplo: “ajio7mfsscpvgd23.tor2web.org/antanistaticmap/stats/yesterday”.
Como se ha mencionado anteriormente, TOR2WEB es un servicio que se encuentra soportado por varios voluntarios en Internet, los cuales configuran una instancia del proxy de TOR2WEB con un dominio propio o con el dominio de TOR2WEB.

Aunque el procedimiento de instalación de un nodo de TOR2WEB es una tarea que se encuentra documentada y bastante bien explicada en la documentación oficial del proyecto, en este artículo explicaré en detalle cómo se puede instalar, configurar y arrancar un nodo de TOR2WEB.

Instalación y configuración de un nodo de TOR2WEB

Antes que nada, el proyecto se encuentra alojado en la siguiente URL: https://github.com/globaleaks/Tor2web-3.0 y se recomienda navegar un poco por cada una de las secciones de la documentación para tener una idea más global del funcionamiento de Tor2Web. En primer lugar es necesario instalar el proyecto y dado que se encuentra pensado principalmente para plataformas basadas en Debian, el mecanismo de instalación consiste adicionar un repositorio a la lista del sistema y posteriormente ejecutar el comando “apt-get” o “aptitute”. Existe un script de instalación que se encarga de realizar todas estas tareas de forma automática y que se recomienda utilizar.

>wget https://raw.githubusercontent.com/globaleaks/Tor2web-3.0/master/scripts/install.sh

>chmod +x install.sh

>./install.sh

Cuando se ejecuta el script pide permisos de administrador para instalar el programa utilizando “apt-get”. Después de realizar la instalación, automáticamente se crea el directorio “/home/tor2web/certs” que es donde se deberán crear los certificados y las claves para el proxy.
Se deben ejecutar los siguientes comandos dentro de dicho directorio.

>openssl genrsa -out tor2web-key.pem 4096

>openssl req -new -key tor2web-key.pem -out tor2web-csr.pem

>openssl x509 -req -days 365 -in tor2web-csr.pem -signkey tor2web-key.pem -out tor2web-intermediate.pem

>openssl dhparam -out tor2web-dh.pem 2048

 

Con los pasos anteriores se encuentra casi terminada la instalación, sin embargo antes de poder arrancar el servicio, es necesario crear un fichero de configuración en “/etc/tor2web.conf”. Dicho fichero no existe por defecto, pero después de instalar Tor2Web, se crea automáticamente un fichero de configuración que sirve de ejemplo en “/etc/tor2web.conf.example”. Las propiedades de configuración que incluye el fichero permiten activar o desactivar varias características interesantes de TOR2WEB, sin embargo, las siguientes son las mínimas que se deben de incluir en el fichero de configuración antes de iniciar el servicio.

nodename: Identificador único del servicio. Es bastante útil para identificar las trazas que se envían a los administradores de TOR2WEB.

datadir: Directorio donde se encuentran los ficheros necesarios para el correcto funcionamiento del programa, incluyendo los certificados creados anteriormente.

processes y requests_per_process: Propiedades que permiten ejecutar el programa utilizando multiproceso. El valor recomendado para la propiedad “processes” es el número de cores del sistema +1.

basehost: Se trata del dominio base donde se ejecutará el proxy. TOR2WEB se puede desplegar en un dominio independiente al de tor2web y en tal caso, es necesario especificar dicho dominio en esta propiedad.

listen_port_http y listen_port_https: Puertos HTTP y HTTPS que serán utilizados por el proxy. Evidentemente los valores por defecto son 80 y 443 respectivamente.

sockshost y socksport: Son probablemente las propiedades más importantes, ya que permiten definir el host y el puerto en el que se encuentra en ejecución un proxy SOCKS de TOR. Es evidente la importancia de dichos valores, ya que TOR2WEB utilizará dicho proxy SOCKS para conectarse con la web profunda de TOR y devolver al usuario final los contenidos del servicio oculto que ha solicitado. En este sentido, para lanzar un nodo de TOR2WEB, es necesario tener una instancia de TOR levantada.

ssl_key, ssl_cert y ssl_dh: Se trata de propiedades que permiten especificar la ruta completa de los certificados y la clave privada que se han creado anteriormente para el servicio.

Con las propiedades anteriores se puede comenzar a utilizar TOR2WEB, sin embargo existen otras propiedades que habilitan características especiales del programa, por ejemplo la posibilidad de bloquear servicios ocultos con contenidos inapropiados, bloquear crawlers, sobre-escribir el fichero “robots.txt” y otras cosas que intentan “alejar” el contenido de servicios ocultos de buscadores como google.

Para conocer en mayor detalle todas las opciones de configuración disponibles, se recomienda revisar la documentación en la siguiente sección. https://github.com/globaleaks/Tor2web-3.0/wiki/Configuration-Guide
Para iniciar un nodo de TOR2WEB con la configuración mínima, se puede utilizar el siguiente fichero

[main]
nodename = AdastraTORY
datadir = /home/tor2web
processes = 5
requests_per_process = 100000
listen_port_http = 80
listen_port_https = 443
basehost = tor2web.org
sockshost = 127.0.0.1
socksport = 9150
ssl_key = /home/tor2web/certs/tor2web-key.pem
ssl_cert = /home/tor2web/certs/tor2web-intermediate.pem
ssl_dh = /home/tor2web/certs/tor2web-dh.pem
cipher_list = ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES128-SHA:DES-CBC3-SHA
ssl_tofu_cache_size = 100

 

Con el fichero anterior ubicado en “/etc/tor2web.conf” ahora es posible iniciar el servicio como cualquier otro del sistema

>sudo /etc/init.d/tor2web start
Enabling Tor2web Apparmor Sandboxing
* Starting Tor2web tor2web…
* Starting tor daemon… [ OK ]
>

Con los pasos anteriores, ahora ya contamos con una instancia en ejecución de TOR2WEB en local y disponible para desplegar en algún servidor en Internet.

Saludos y Happy Hack!
Adastra.