Web Hacking: Instalando múltiples instancias de Tor para ocultar tu IP en una misma máquina

En esta entrada voy a tratar de explicar como conseguir instalar múltiples instancias de Tor en tu servidor y cómo utilizar éstas para hacer múltiples peticiones HTTP a la vez a una web externa, consiguiendo que cada petición HTTP proceda de una IP diferente, de manera que el servidor de la web externa crea que son peticiones de clientes diferentes localizados en diferentes regiones geográficas del planeta. Además, como plus, en la siguiente entrada, os enseñaré como hacer que cada vez que una de las instancias Tor haga una petición HTTP y devuelva el resultado, se fuerce a ésta instancia a renovar el circuito y obtener una nueva IP. Tanto la peticiones HTTP a través de las instancias Tor, como la llamada al puerto de control de la instancia se hacen a través de PHP puro.

Asimismo, he creado un vídeo en YouTube donde podéis seguir este tutorial de “una manera más visual” y complementar la información que os doy en esta entrada.

URL del video: https://www.youtube.com/watch?v=7c-39FtQ0Pg

Hace una semana que me encuentro actualizando y revisando un antiguo proyecto personal (que empezó en 2012) que rastrea constantemente y obtiene datos de diferentes webs externas de forma masiva. Todo el proyecto esta desarrollado en PHP puro y utiliza un sistema de plugins para añadir nuevos sitios webs desde donde obtener mas datos.

El escaneo constante de webs externas puede afectar al rendimiento de los servidores de dichas webs, especialmente si se hace de forma masiva, y es por eso que los administradores de red o los firewalls suelen banear las IPs que presentan ciertos patrones como múltiples peticiones en un periodo corto de tiempo desde una misma IP, las cabeceras “User Agent” no son los usuales que encontramos en navegadores, etc…

Hay muchas formas o aproximaciones para evitar que estos servidores baneen la IP de tu rastreador, pero de entre todas ellas, la más efectiva es ir cambiando de IPs geolocalizadas en diferentes puntos del planeta para que las webs externas se piensen que se trata de peticiones de clientes distintos alrededor del mundo.

La forma más sencilla, efectiva y gratuita de navegar con una IP diferente a la tuya es utilizar la red Onion del proyecto Tor. No voy a explicar en detalle qué es y cómo funciona Tor Project ya que podéis encontrar miles de páginas que lo explican, pero la idea básica es que cada vez que queramos hacer una petición HTTP desde nuestro servidor, ésta será enrutada a través de un circuito de repetidores (relays) seleccionados aleatoriamente y que sólo expondrá la IP del último relay al servidor de la web que estés rastreando.

Si utilizamos el mismo circuito de relays Tor todo el tiempo, la web que estés rastreando detectará que la IP del último relay del circuito tiene un comportamiento anómalo y la podría llegar a banear, por lo que en este tutorial os enseñaré además, como renovar el circuito y obtener una nueva IP para cada petición HTTP.

Esta técnica la vengo utilizando hace unos años y aunque no es infalible 100%, se puede mejorar con otras aproximaciones, si que es “bastante” difícil que puedan banear tu programa que está rastreando ya que las IPs son diferentes con cada petición HTTP.

Este tutorial esta basado en Debian 9, por lo que cualquier distro basada en Debian como, por ejemplo Ubuntu, debería seguir las mismas pautas sin grandes cambios. Asimismo, esta no es una forma permanente de tener funcionando las 5 instancias ya que se podrían estropear las configuraciones al actualizar el paquete “tor”. Os recomiendo, en el caso distros tipo Debian, el generar paquetes “deb” que instalen estas configuraciones automáticamente, pero ésto esta fuera del alcance de este tutorial.

INSTALANDO MULTIPLES INSTANCIAS DE TOR

Antes de empezar a instalar, nos logueamos como “root” o en su defecto añadiremos “sudo” a las instrucciones que requieran permisos de administrador.

Actualizamos los repositorios

apt-get update

Instalamos el paquete Tor

apt-get install tor

Desinstalamos el paquete “torsocks” porqué no nos hace falta

apt-get remove --purge torsocks

Por defecto se instalará una instancia de Tor como servicio. La detenemos

systemctl stop tor

Nos vamos al directorio donde se encuentran las librerías del sistema

cd /var/lib

Alli se encuentra un directorio llamado “tor” que contiene archivos necesarios para la ejecución de Tor. Creamos 5 directorios nuevos para las 5 instancias de Tor que utilizaremos en este tutorial

mkdir tor0
mkdir tor1
mkdir tor2
mkdir tor3
mkdir tor4

Copiamos el contenido del directorio “tor” en los nuevos directorios que hemos creado

cp -R tor/* tor0
cp -R tor/* tor1
cp -R tor/* tor2
cp -R tor/* tor3
cp -R tor/* tor4

Ajustamos los permisos de los nuevos directorios que hemos creado para que coincidan con los permisos del directorio original “tor”

chmod -R 700 tor0
chmod -R 700 tor1
chmod -R 700 tor2
chmod -R 700 tor3
chmod -R 700 tor4
chmod g-x,g+s tor0
chmod g-x,g+s tor1
chmod g-x,g+s tor2
chmod g-x,g+s tor3
chmod g-x,g+s tor4

Modificamos los permisos de los archivos que contienen los nuevos directorios creados para que coincidan con los permisos de los ficheros que contiene el directorio original “tor”

chmod 600 tor0/*
chmod 600 tor1/*
chmod 600 tor2/*
chmod 600 tor3/*
chmod 600 tor4/*

Acto seguido, modificamos el propietario de los nuevos directorios para que coincidan con el propietario del directorio original “tor”

chown debian-tor:debian-tor -R tor0
chown debian-tor:debian-tor -R tor1
chown debian-tor:debian-tor -R tor2
chown debian-tor:debian-tor -R tor3
chown debian-tor:debian-tor -R tor4

Nos vamos al directorio de los archivos de configuración de Tor

cd /etc/tor

Renombramos el archivo de configuración existente por el del nombre de nuestra primera instancia

mv torrc torrc0

Editamos el fichero y descomentamos y cambiamos los valores siguientes

SOCKSPort 8000
DataDirectory /var/lib/tor0
ControlPort 9000

Los “DataDirectory” son los nuevos directorios que hemos creado en “/var/lib”, los puertos “SOCKS” serán 8000, 8001, 8002, 8003, 8004 y los puertos de control 9000, 9001, 9002, 9003, 9004. Estos puertos los podéis cambiar por los que queráis siempre que no estén siendo utilizados por el sistema.

Además, en el archivo de configuración anterior, al final añadiremos la siguiente linea

User debian-tor

para especificar que Tor se ejecutará bajo los permisos del usuario de Debian “debian-tor”.

Copiamos este archivo de configuración como plantilla para las 4 instancias restantes

cp torrc0 torrc1
cp torrc0 torrc2
cp torrc0 torrc3
cp torrc0 torrc4

Editamos los 4 archivos de configuración restantes y substituimos los valores “SOCKSPort”, “DataDirectory” y “ControlPort” por los valores correctos de cada instancia.

Una vez que todos los archivos de configuración ya estén creados, podemos lanzar las 3 instancias de Tor a mano para comprobar que todo es correcto

tor -f /etc/tor/torrc0 &
tor -f /etc/tor/torrc1 &
tor -f /etc/tor/torrc2 &
tor -f /etc/tor/torrc3 &
tor -f /etc/tor/torrc4 &

Si habéis seguido cada paso correctamente, todas las instancias se deberían haber cargado sin problemas y estar corriendo a la vez. Con un

ps aux | grep tor

podéis comprobar que las 5 instancias siguen en ejecución y no se han parado. Además, con

lsof -i | grep tor

podéis comprobar que los puertos 8000, 8001, 8002, 8003, 8004, 9000, 9001, 9002, 9003 y 9004 están “escuchando” a la espera de nuevas conexiones.

Como última comprobación, vamos a ver si cada instancia nos dá IPs diferentes y si es posible renovar los circuitos de cada instancia a través del puerto del control para obtener nuevas IPs constantemente. Como medida de control vamos a ver nuestra IP pública real

curl 'https://api.ipify.org?format=json'

Ahora, por cada instancia de Tor, vamos a comprobar su IP

curl --socks5-hostname 127.0.0.1:8000 'https://api.ipify.org?format=json'
curl --socks5-hostname 127.0.0.1:8001 'https://api.ipify.org?format=json'
curl --socks5-hostname 127.0.0.1:8002 'https://api.ipify.org?format=json'
curl --socks5-hostname 127.0.0.1:8003 'https://api.ipify.org?format=json'
curl --socks5-hostname 127.0.0.1:8004 'https://api.ipify.org?format=json'

Cada instancia de Tor nos debería devolver IPs diferentes. Para renovar los circuitos Tor de cada instancia y estas IPs por otras diferentes, debemos acceder al puerto de control y enviar la señal “SIGNAL NEWNYM”. Lo podemos comprobar con las siguientes instrucciones, una por cada instancia Tor

printf "AUTHENTICATE \"password\"\r\nSIGNAL NEWNYM\n\r" | nc 127.0.0.1 9000
printf "AUTHENTICATE \"password\"\r\nSIGNAL NEWNYM\n\r" | nc 127.0.0.1 9001
printf "AUTHENTICATE \"password\"\r\nSIGNAL NEWNYM\n\r" | nc 127.0.0.1 9002
printf "AUTHENTICATE \"password\"\r\nSIGNAL NEWNYM\n\r" | nc 127.0.0.1 9003
printf "AUTHENTICATE \"password\"\r\nSIGNAL NEWNYM\n\r" | nc 127.0.0.1 9004

De nuevo, para comprobar que los circuitos con sus correspondientes IPs de salida han cambiado. repetimos las siguientes instrucciones

curl --socks5-hostname 127.0.0.1:8000 'https://api.ipify.org?format=json'
curl --socks5-hostname 127.0.0.1:8001 'https://api.ipify.org?format=json'
curl --socks5-hostname 127.0.0.1:8002 'https://api.ipify.org?format=json'
curl --socks5-hostname 127.0.0.1:8003 'https://api.ipify.org?format=json'
curl --socks5-hostname 127.0.0.1:8004 'https://api.ipify.org?format=json'

Con esto ya hemos comprobado que 5 instancias de Tor se pueden ejecutar a la vez en la misma máquina. Ahora, ya solo nos queda transformar estas instancias en servicios del sistema que se ejecuten automáticamente al arrancar o reiniciar el sistema.

Desinstalamos del arranque la instancia por defecto que se creó al instalar Tor

update-rc.d tor remove

Nos vamos al directorio donde se definen los servicios del sistema

cd /etc/init.d

Vemos que existe un archivo llamado “tor”, por lo que lo renombramos por el nombre de nuestra primera instancia “tor0”

mv tor tor0

Editamos este archivo y cambiaremos algunos valores

# Provides: tor0
NAME=tor0
TORPID=$TORPIDDIR/tor0.pid
DEFAULTSFILE=/etc/default/tor
DEFAULT_ARGS="--defaults-torrc /etc/tor/torrc0"

A “Provides” y “NAME” le damos un nombre único por instancia. “DEFAULTSFILE” lo cambiamos y lo declaramos explícitamente, ya que hemos cambiado el valor de “NAME”. “TORPID” es el archivo del “Process ID” por lo que se creará un PID por instancia. Para la primera será “tor0.pid”. Por último en “DEFAULT_ARGS”, le pasamos el fichero de configuración de esa instancia a través del parámetro “–defaults-torrc”.

 

Ahora copiamos este archivo como plantilla para las restantes 4 instancias

cp tor0 tor1
cp tor0 tor2
cp tor0 tor3
cp tor0 tor4

Y editamos cada archivo para darle los valores correspondientes que necesite cada instancia (0,1,2,3 y 4).

Lo ultimo que nos queda hacer es decirle al sistema que queremos que cada uno de estos servicios se ejecuten al arrancar o reiniciar el sistema. Para ello, recargamos el demonio que controla los servicios del sistema para que procese las nuevas configuraciones

systemctl daemon-reload

Y a continuación, instalamos los servicios en sus correspondientes “run levels” para que se ejecuten automáticamente al arrancar o reiniciar el sistema

update-rc.d tor0 defaults
update-rc.d tor1 defaults
update-rc.d tor2 defaults
update-rc.d tor3 defaults
update-rc.d tor4 defaults

Solo nos queda reiniciar el sistema para comprobar que las 5 instancias se cargan correctamente en el inicio

reboot

En cuanto el sistema arranque de nuevo, comprobamos que las 5 instancias se han cargado con un

ps aux | grep tor

y vemos que los puertos 8000, 8001, 8002, 8003, 8004, 9000, 9001, 9002, 9003 y 9004 están “escuchando” y a la espera de nuevas conexiones

lsof -i | grep tor

Y ¡ ésto es todo !. Ya tenemos 5 instancias de Tor corriendo en nuestra máquina que podemos utilizar como “proxies” para cualquier tipo de conexión y desde cualquier programa. En mi caso, los utilizaré para poder hacer 5 peticiones HTTP a la vez con diferentes IPs desde el programa que tengo creado en PHP.

Si no tenéis claro algunos pasos, ayudaros del vídeo tutorial que he creado en YouTube.

En la siguiente entrada, os cuento como utilizar estos “proxies” Tor desde PHP y cómo cambiar los circuitos y las IPs automáticamente tras cada petición HTTP, por lo que la web de destino creerá que se trata de clientes geolocalizados en  distintas partes del mundo.

Enlace a la siguiente entrada aquí.

¡ No hagáis “maldades” con ésto please !

 

Si te ha gustado y quieres compartir esta página..