sábado, 27 de abril de 2019

Consultando información sobre los repetidores disponibles en la red

Stem puede ser útil para controlar una instancia de TOR desde una rutina de código externa, pero también cuenta con algunas utilidades que le permiten a un atacante consultar los descriptores emitidos por las autoridades de directorio o aquellos documentos que ya han sido descargados por un cliente. Dichos documentos contienen mucha información sobre los repetidores que conforman la red de TOR y dicha información puede ser utilizada para realizar ataques dirigidos contra cualquier repetidor en la red. La información que puede ser recuperada de los descriptores emitidos, contiene datos sobre la versión del sistema operativo del repetidor, Ancho de banda aportado, Nickname, Fingerprint, dirección IP, entre otros datos que pueden resultar bastante informativos y reveladores para un atacante.
Por otro lado, muchos de los usuarios que deciden configurar su instancia de TOR para que actué como un repetidor en la red, no son conscientes de la cantidad de información que exponen sobre sus ordenadores y que se distribuyen abiertamente por las autoridades de directorio a cualquier usuario en la red. Además, en algunas ocasiones no tienen los conocimientos sobre seguridad informática necesarios para mantener seguro su ordenador y de esta forma, pueden quedar expuestos a ataques por medio de la red de TOR.
Uno de los mecanismos más sencillos para obtener los últimos descriptores generados es utilizando  la clase stem.descriptor.remote.DescriptionDownloader.
#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.descriptor.remóte import DescriptorDownloader
>>>downloader = DescriptorDownloader()
>>>for descriptor in downloader.get_consensus().run():
>>>    if descriptor. exit_policy. is_exiting_allowed () :
>>>        print descriptor
>>> 
Con las instrucciones anteriores, se obtiene el fichero del último consenso generado por las autoridades de directorio y se pinta por pantalla la información de los repetidores que participan en los circuitos como nodos de salida.
También es posible consultar cuales son las autoridades de directorio que emiten los descriptores utilizando la función get_authorities
#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.descriptor.remóte import get_authorities
>>>dirs = get_authorities()
>>> for dir in dirs.keys():
>>>    print 'NickName %s, Address %s, OR_PORT %s, DIR_PORT %s, Fingerprint %s, V3Ident (Usada para votar en el consenso) %s ' % (dirs[dir].nickname, dirs[dir].address, dirs [dir] .or_port, dirs [dir ]. dir_port, dirs [dir ] .fingerprint, dirs[dir].v3ident) 
La función get_authorities no recibe ningún argumento y retoma un diccionario que contiene la información pública disponible sobre las autoridades de directorio de TOR. Con las instrucciones anteriores, simplemente se pinta por pantalla toda la información retomada por la función.
Otra forma de obtener los descriptores con sus correspondientes entradas, es por medio de una instancia de TOR en ejecución, ya que dicha instancia ya habrá descargado los descriptores de las autoridades de directorio, con lo cual, solamente sería necesario conectarse al controlador y consultar la información descargada.
La ventaja de obtener esta información desde una instancia en ejecución, es la rapidez con la que se obtiene la información, ya que consultar directamente las autoridades de directorio puede llevar algún tiempo dependiendo de la carga de los servidores en el momento en el que se consultan.
#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
>>>controller = Controller. from_port (port = 9151)
>>>passw = getpass .getpass ( 'Pass : ')
>>>controller. authenticate (passw)
>>>for routerEntry in controller.get_network_statuses():
>>>     print routerEntry
La función get_network_statuses es la encargada de retomar un listado de entradas que corresponden a cada uno de los repetidores que conforman el último consenso descargado por el cliente.
Por otro lado, también es posible recuperar esta información sin utilizar el controlador, para ello es necesario leer el directorio de datos del cliente y ejecutar la función parse_file. Si las instrucciones anteriores se ejecutan desde el directorio raíz del cliente de TOR, se obtendrán todos los descriptores relacionados con el último consenso.No obstante, tal como se comentaba en párrafos anteriores, si el fichero de configuración torre no tiene la opción de configuración UseMicroDescriptors con el valor “0”, el cliente por defecto descargará solamente una fracción de la información de cada repetidor en la red, solamente aquellos datos que le permitan construir circuitos y operar con normalidad.
Para un atacante, es mucho más interesante acceder a la información completa, es decir, recuperar el Server Descriptor emitido por las autoridades de directorio.
Script: stemExitNodes.py
from stem.descriptor.remóte import DescriptorDownloader


downloader = DescriptorDownloader()
fd = open('exit_nodes','w')
for descriptor in downloader.get_server_descriptors().run():
    if descriptor.exit_policy.is_exiting_allowed():
    fd. write ("NickName : "+descriptor .nickname+''\n")
    fd.write ("FingerPrint ” +descriptor .fingerprint+"\n")
    fd.write("Address " +descriptor.address+"\n")
    fd.write("Platform " +descriptor.platform+"\n")
    fd.write("OS " + descriptor.operating_system+"\n")
    fd.write("Burst " + str(descriptor.burst_bandwidth)+"\n")
    fd.write("Estimated " + str(descriptor.observed_bandwidth)+"\n")
    fd.write("\n")
fd.close ()
Con el script anterior, se crea una instancia de la clase DescriptorDownloader y luego se invoca a la función get_server_descriptors para recuperar los Server Descriptors que se encuentran alojados en las autoridades de directorio. Posteriormente se escribe en un fichero de texto los campos de cada uno de los repetidores encontrados.

Por Daniel Echeverri Montoya.

No hay comentarios.: