DNSCrypt, o como cifrar tus peticiones DNS

¿Cuántos de nosotros hemos utilizado la red TOR o un proxy anónimo para navegar de forma anónima? Y, ¿cuántos hemos tenido en cuenta que las peticiones DNS que realiza nuestra máquina puede que no sean enrutadas a través de la red TOR? Este simple descuido puede ser usado para identificarnos mediante algún tipo de correlación. Por ejemplo, un usuario que ha hecho consultas DNS de un dominio que posteriormente ha sido atacado a través de TOR. Aunque es complicado llegar a esta situación, puede darse el caso.

Actualmente es posible utilizar el propio cliente de TOR para enrutar las peticiones a través de esta red, u otras herramientas como dnsmasq, que actúa como un proxy capaz de redirigir las peticiones DNS a través de una red determinada. Aun así, las peticiones DNS realizadas no están cifradas, algo totalmente deseable. De esta forma, da igual si las peticiones son capturadas, ya que seguiremos manteniendo el anonimato sobre las consultas realizadas.

Una herramienta utilizada para cifrar las peticiones DNS es DNSCrypt. Utiliza el protocolo del mismo nombre para cifrar las peticiones DNS entre un cliente y un servidor de nombres que soporte dicho protocolo. Se puede consultar la lista de servidores de nombres públicos que aceptan este protocolo:

En el cliente, DNSCrypt levanta un proxy local donde se redirigen las peticiones DNS realizadas por el cliente. Las peticiones son cifradas y enviadas al servidor remoto, el cual resuelve la petición y devuelve el resultado cifrado.

Vamos a instalar el cliente de DNSCrypt. Para ello, necesitamos descargar los siguientes sources para compilarlos posteriormente:

Primero vamos a descomprimir y compilar la librería libsodium:

$ tar xvzf libsodium-1.0.8.tar.gz
$ cd libsodium-1.0.8/
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig

Ahora que la librería esta instalada en el sistema, vamos a compilar el cliente DNSCrypt:

$ tar xvzf dnscrypt-proxy-1.6.1.tar.gz
$ cd dnscrypt-proxy-1.6.1/
$ ./configure
$ make
$ sudo make install

Ya solo nos queda configurar las direcciones DNS de nuestra máquina para que apunten a localhost. Editamos el fichero /etc/resolv.conf y modificamos los DNS actuales por:

$ sudo vim etc/resolv.conf
nameserver 127.0.0.1

Ahora que está todo configurado, procedemos a lanzar el cliente DNSCrypt:

$ sudo /usr/local/sbin/dnscrypt-proxy -d \
	-r 208.67.220.220:443 \
	-N 2.dnscrypt-cert.opendns.com \
	-k B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79

Los parámetros utilizados son:

  • -d → Correr DNSCrypt en segundo plano.
  • -r → IP del servidor de nombres compatible con DNSCrypt (ver lista de servidores).
  • -N → FQDN del servidor (ver lista de servidores).
  • -k → Clave pública del servidor (ver lista de servidores).

Vamos a comprobar que realmente las peticiones DNS están saliendo cifradas de nuestro equipo. Vamos a poner un tcpdump o Wireshark capturando las peticiones hacia el servidor DNS que hemos establecido en la configuración (208.67.220.220).

Si vemos las capturas de tráfico, podemos confirmar que no se realizan peticiones DNS al puerto 53 de ningún otro servidor, sino que encontramos peticiones hacia el servidor OpenDNS (208.67.220.220) en el puerto 443/udp y el payload con nuestra consulta cifrada.

Ilustración 1: Captura de tráfico

Ilustración 1: Captura de tráfico

Podéis encontrar más información y opciones de configuración en la web de DNSCrypt o en el propio man del sistema donde ha sido instalado.

Saludos!

Twitter de Jose Manuel: @reverc0de

Comments

  1. Tor*

  2. 2.- # gpg –import *.pgp

    3.- # gpg –verify *.gz.sig *.tar.gz

    ——————————————-

    speaking about DNS – CVE-2015-7547

    BestRegards
    oceano