docker-onion-nmap o cómo escanear servicios .onion de la red Tor

docker-onion-nmap de Miles Richardson es un contenedor docker que permite escanear servicios "onion" de la red Tor. La imagen está basada en Alpine y utiliza proxychains para "wrappear" nmap. Tor y dnsmasq se ejecutan como demonio vía s6 y, como comentamos, se usa proxychains para que los escaneos de nmap vayan por el proxy SOCK de Tor en el puerto 9050.

Además también se configura Tor a través de DNSPort para resolver anónimamente las solicitudes DNS sobre el puerto 9053, en el que dnsmasq actúa como servidor DNS de autoridad (authority.) Luego Proxychains está configurado para proxy DNS a través de la resolución local, por lo que todas las solicitudes DNS pasarán por Tor y las aplicaciones pueden resolver las direcciones .onion.

Ejemplo:
$ docker run --rm -it milesrichardson/onion-nmap -p 80,443 forohpysho2t5mjs.onion
[tor_wait] Wait for Tor to boot... (might take a while)
[tor_wait] Done. Tor booted.
[nmap onion] nmap -p 80,443 forohpysho2t5mjs.onion
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/libproxychains4.so
[proxychains] DLL init: proxychains-ng 4.12

Starting Nmap 7.60 ( https://nmap.org ) at 2017-11-14 11:01 UTC
[proxychains] Dynamic chain  ...  127.0.0.1:9050  ...  forohpysho2t5mjs.onion:80  ...  OK
[proxychains] Dynamic chain  ...  127.0.0.1:9050  ...  forohpysho2t5mjs.onion:443 <--denied br="">RTTVAR has grown to over 2.3 seconds, decreasing to 2.0
RTTVAR has grown to over 2.3 seconds, decreasing to 2.0
Nmap scan report for forohpysho2t5mjs.onion (224.0.0.1)
Host is up (7.1s latency).

PORT    STATE  SERVICE
80/tcp  open   http
443/tcp closed https

Nmap done: 1 IP address (1 host up) scanned in 10.32 seconds

Uso:

Cuando el contenedor docker se inicia ejecuta Tor y dnsmasq como demonios. Después el script 'tor_wait' espera a que el proxy Tor SOCKS esté activo antes de ejecutar su comando. Por defecto, se pasan los argumentos nmap -sT -PN -n "$@", necesarios para funcionar sobre Tor (vía explainshell.com).

Por ejemplo, esto:

docker run --rm -it milesrichardson/onion-nmap -p 80,443 forohpysho2t5mjs.onion

será ejecutado como:

proxychains4 -f /etc/proxychains.conf /usr/bin/nmap -sT -PN -n -p 80,443 forohpysho2t5mjs.onion

Además del script personalizado para nmap, existen scripts de wrapping personalizados para curl y nc para usarlos a través de cadenas de proxy, en /bin/curl y /bin/nc. Para llamarlos, simplemente hay que especificar curl o nc como el primer argumento al ejecutar Docker. Por ejemplo:

docker run --rm -it milesrichardson/onion-nmap nc -z 80 forohpysho2t5mjs.onionn

Será ejecutado como:

proxychains4 -f /etc/proxychains.conf /usr/bin/nc -z 80 forohpysho2t5mjs.onion

y:

docker run --rm -it milesrichardson/onion-nmap curl -I https://forohpysho2t5mjs.onion

será ejecutado como:

proxychains4 -f /etc/proxychains.conf /usr/bin/curl -I https://forohpysho2t5mjs.onionn

Si queremos llamar a cualquier otro comando, incluido el /usr/bin/nmap original o /usr/bin/nc o /usr/bin/curl, podemos especificarlo también como el primer argumento para ejecutar docker, por ejemplo:

docker run --rm -it milesrichardson/onion-nmap /usr/bin/curl -x socks4h://localhost:9050 https://forohpysho2t5mjs.onion

Variables de entorno

Solo hay una variable de entorno: DEBUG_LEVEL. Si seteamos a "1", mostrará más información de depuración. Ejemplo:
$ docker run -e DEBUG_LEVEL=1 --rm -it milesrichardson/onion-nmap -p 80,443 forohpysho2t5mjs.onion
[tor_wait] Wait for Tor to boot... (might take a while)
[tor_wait retry 0] Check socket is open on localhost:9050...
[tor_wait retry 0] Socket OPEN on localhost:9050
[tor_wait retry 0] Check SOCKS proxy is up on localhost:9050 (timeout 2 )...
[tor_wait retry 0] SOCKS proxy DOWN on localhost:9050, try again...
[tor_wait retry 1] Check socket is open on localhost:9050...
[tor_wait retry 1] Socket OPEN on localhost:9050
[tor_wait retry 1] Check SOCKS proxy is up on localhost:9050 (timeout 4 )...
[tor_wait retry 1] SOCKS proxy DOWN on localhost:9050, try again...
[tor_wait retry 2] Check socket is open on localhost:9050...
[tor_wait retry 2] Socket OPEN on localhost:9050
[tor_wait retry 2] Check SOCKS proxy is up on localhost:9050 (timeout 6 )...
[tor_wait retry 2] SOCKS proxy UP on localhost:9050
[tor_wait] Done. Tor booted.
[nmap onion] nmap -p 80,443 forohpysho2t5mjs.onion
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/libproxychains4.so
[proxychains] DLL init: proxychains-ng 4.12

Starting Nmap 7.60 ( https://nmap.org ) at 2017-10-23 16:34 UTC
[proxychains] Dynamic chain  ...  127.0.0.1:9050  ...  forohpysho2t5mjs.onion:443  ...  OK
[proxychains] Dynamic chain  ...  127.0.0.1:9050  ...  forohpysho2t5mjs.onion:80  ...  OK
Nmap scan report for forohpysho2t5mjs.onion (224.0.0.1)
Host is up (2.8s latency).

PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 4.05 seconds

Notas

- NO se puede usar UDP en Tor
- Tor puede tardar 10-20 segundos en arrancar. Si esto es posible, otra opción es ejecutar el proxy en su propio contenedor, o ejecutarlo como el proceso principal y luego ejecutar "exec" para llamar comandos como nmap.

Proyecto: https://github.com/milesrichardson/docker-onion-nmap

Comentarios