lunes, 6 de mayo de 2019

Estableciendo conexiones contra circuitos de TOR desde Python

Cuando se inicia el cliente de TOR, automáticamente el software intenta leer el fichero “torrc”, el cual a su vez contiene varias propiedades de usos muy variados, como por ejemplo la propiedad “SocksPort” que define el puerto por el que se va a iniciar un proxy del tipo socks, el cual es frecuentemente utilizado desde un navegador para visitar sitios en Internet o en la deep web de forma anónima.
No obstante, este proxy también puede utilizarse directamente desde cualquier otro programa, como por ejemplo un script en Python. Poder utilizar rutinas de código que se conecten por medio de un circuito de TOR tiene varias ventajas desde el punto de vista de un atacante, especialmente con lo referente a la ejecución de pruebas de penetración sobre aplicaciones o servidores web de forma anónima. Para conseguir dicho objetivo, es posible utilizar algunas librerías que permiten crear conexiones por medio de un proxy socks como por ejemplo, requesocks y socksipy.
Socksipy, más que una librería completa llena de funcionalidades, es un pequeño script que funciona como envoltorio a todas las invocaciones que se realicen utilizando sockets en Python, es decir, todas las conexiones de red que se lleven a cabo desde un script. Para utilizarlo, basta con descargarlo desde el sitio web del proyecto ubicado en el siguiente enlace.
El contenido del paquete descargado, contendrá documentación básica sobre su uso y un fichero Python con el nombre socks.py. Para utilizarlo, basta ubicar dicho fichero en el mismo directorio donde se encuentra el script a ejecutar o ubicarlo en el directorio “<PYTHON_INSTALL>/li /sitepackages" de tal forma que se encuentre disponible para otros scripts como ocurre con cualquier otra librería.
Script: socksSimpleProxy.py
import socket
import socks
import requests


def connectTor():
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5 , "127.0.0.1", 9150, True)
    socket.socket = socks.socksocket


connectTor()
r = requests.get("http://www.google.com")
print r.status_code
for header in r.headers.keys():
    print header + " : " + r.headers[header]
La función connectTor del script anterior, utiliza el módulo socks de socksipy para establecer la configuración del proxy socks que será utilizado para realizar cualquier tipo de conexión de red. Se indica que el tipo de proxy será socks5 y el puerto donde se encuentra en ejecución es el “9150” en la máquina local. El valor del puerto tiene que ser igual al valor de la propiedad “SocksPort” indicada en el fichero “torrc". Posteriormente, se utiliza la requests para ejecutar una petición HTTP GET contra el recurso especificado en la función y después de ejecutar la petición, se consultan todas las cabeceras de la respuesta para pintarlas por pantalla.
Por otro lado, requesocks es un fork de requests que a la fecha de escribir este documento se encuentra separado de la librería, con lo cual es necesario descargarlo e instalarlo de manera independiente a requests. En futuras versiones se está contemplando integrar las funcionalidades de requesocks directamente en requests, lo que se debe tener en cuenta es que con requesocks, se permite el uso del atributo “proxies" de un objeto session para especificar los detalles de configuración del proxy que se desea utilizar.
Script: requesocksSimpleProxy.py
import requesocks as requests


if __name__ == "__main__":
    session = requests.session()
    session.proxies = {'http': 'socks5://127.0.0.1:9150','https':
'socks5://127.0.0.1:9150'}
    r = session.get('http://www.google.com')
    print r.status_code

    for header in r .headers . keys () :
        print header + " : " + r.headers[header]
En el script anterior, todas las peticiones realizadas por medio del objeto session instanciado, utilizarán los detalles de configuración del proxy socks definido. En el caso de que el proxy especificado no se encuentre en ejecución, habrá un error en la conexión y no será posible acceder al recurso indicado en la función get.

Por Daniel Echeverri Montoya.

No hay comentarios.: