domingo, 21 de abril de 2019

Uso de STEM para controlar una instancia local de TOR

Con Stem es posible crear aplicaciones que funcionen de un modo similar a Vidalia o ARM ya que permite consultar y controlar todas las características de un proceso TOR local. Además de utilizar el protocolo de control de TOR, también permite ejecutar otras rutinas relacionadas con el funcionamiento de la red, como por ejemplo consultar los descriptores almacenados en las autoridades de directorio y posteriormente descargarlos.
Antes de iniciar una instancia local de TOR (cliente) es necesario verificar el valor de la propiedad “ControlPort" ya que dicho valor, indica el puerto utilizado para que rutinas externas puedan controlar la instancia local de TOR.
En Stem, el uso de la clase stem.control.Controller permite el intercambio de información entre una rutina en Python y el cliente de TOR.
#python
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
» from stem.control import Controller
» import getpass
» passw = getpass.getpass('pass: ')
» controller = Controller.from_port(port = 9151)
» controller.authenticate(passw)
En las líneas anteriores, se ha utilizado el puerto “9151” para crear una instancia del controlador y posteriormente, se ha utilizado la función authenticate para ejecutar el procedimiento de autenticación en la instancia de TOR. En este caso, el cliente admite autenticación por contraseña ya que en el fichero de configuración “torrc" estará establecida la propiedad “HashedControlPassword” con el hash de la contraseña que permite acceder al controlador.
El siguiente paso en el uso básico de esta librería, consiste en utilizar algunas de las funciones disponibles en la clase de controlador. Es de especial interés el uso de la función get_info ya que permite consultar las claves definidas en el protocolo de control de TOR, las cuales pueden ser consultadas en el siguiente link.
Con el uso de la función get_info se ha procedido a consultar algunas de las claves disponibles en el proceso de TOR. Dichas claves, están diseñadas para proveer información que no se encuentra disponible en el fichero de configuración “torrc”. Además, tal como se ha comentado anteriormente, todas las claves que pueden ser utilizadas se encuentran documentadas en la especificación del protocolo de control de TOR.
Otra característica que puede ser útil para un pentester o atacante, es la posibilidad de iniciar de forma programática una instancia de TOR, en tal caso, es necesario incluir las mismas propiedades que soporta el fichero de configuración “torrc”.
Script: stemLaunchTor.pyimport stem.process
from stem.util import term

def logs_tor(log):
      if "Bootstrapped " in log:
      print term.format(log, term.Color.GREEN)

tor_process = stem.process.launch_tor_with_config (config = { 'SocksPort' : '9000', 'ExitNodes': '{es}',}, init_msg_handler = logs_tor,)
Con el script anterior, se ejecuta la utilidad launch_tor_with_config la cual se encarga de ejecutar el comando tor. Dicho comando tiene que estar incluido en el path del sistema para que pueda ser ejecutado. Por otro lado, el argumento config admite un diccionario compuesto por las mismas propiedades y valores que son aceptados por el fichero de configuración “torrc”. Finalmente, se especifica una función de callback con el atributo init_msg_handler que se invocará cada vez que el proceso genere un mensaje de log. La función de callback definida, simplemente pintará por pantalla, aquellos mensajes que se encuentren relacionados con el arranque del proceso y selección del circuito.
Por otro lado, Stem cuenta con dos mecanismos de comunicación con el proceso de TOR, los cuales son síncrono y asincrono. En el modo síncrono, se envían las peticiones utilizando alguna de las funciones del controlador y posteriormente se reciben las respuestas, siguiendo el típico modelo de cliente-servidor. Este mecanismo es el que se ha utilizado con la función get_info. Con el modo asincrono, el controlador se suscribe a un listado de eventos que se pueden producir en la instancia de TOR y se registra una función de callback para cada uno de los eventos.
El listado de eventos disponibles en Stem se encuentran listados en el siguiente link.
Script: stemEventListener.py
from stem.control import Controller
from stem.control import EventType
import getpass

def new_con(event):
    print 'Contenido Parseado %s / Contenido Crudo' % (event.parsed_content, event.raw_content)

def bandwidth_event(event) :
    print 'Leido %s / Escrito %s ' % (event.read, event.written)

passw = getpass.getpass('pass: ')
controller = Controller.from_port(port = 9151)
controller.authenticate(passw)
controller.add_event_listener(new_con, EventType.NEWCONSENSUS)
controller.add_event_listener(bandwidth_event, EventType.BW)
controller.cióse()
Con el programa anterior, se crea un controlador que se conecta a una instancia local de TOR y registra los eventos “NEWCONSENSUS” y “BW ’. El primero se produce cuando se ha generado un nuevo consenso en la red de TOR y el cliente ha sido notificado, mientras que el segundo se ejecuta cada segundo y contiene las estadísticas relacionadas con los paquetes enviados y recibidos.

Por Daniel Echeverri Montoya.

No hay comentarios.: