Publier un site web sur le réseau Tor (hidden-service)

Publier un site web sur le réseau Tor (hidden-service)

Bonjour à tous, aujourd’hui je vous présente un deuxième article sur les hidden-services du réseau Tor. Après avoir déjà abordé ce sujet il y a quelques semaines, je vous présente dans ce petit guide, comment publier un site web sur ce réseau.

Pour plus d’informations concernant le fonctionnement avancé de Tor et les hidden services, consultez mon article précédent: https://le-guide-du-secops.fr/index.php/2021/11/23/utiliser-le-reseau-tor-pour-acceder-a-un-hidden-service-nat-traversal-udp-hole-punching/

I. Prérequis

Deux machines sous linux. Dans mon cas :

  • Ubuntu (serveur distant), disposant du service tor et apache2
  • Kalilinux (client), disposant du service tor, afin d’accéder au service caché web du serveur

Les deux machines sont des VMs émulées via VMware workstation 16 dans mon réseau local naté classique. Elles sont sur le même réseau privé, mais vont communiquer en finalité exclusivement via le réseau Tor (via le DNS xxxxxxxxx.onion de la machine Ubuntu)

II. Paramétrage du service caché – Ubuntu

Pour commencer, vous devez installer tor, par le biais du gestionnaire de packet apt :

apt install tor

Puis, éditez le fichier de configuration suivant :

nano  /etc/tor/torrc 
## Configuration file for a typical Tor user
## Last updated 9 October 2013 for Tor 0.2.5.2-alpha.
## (may or may not work for much older or much newer versions of Tor.)
##
## Lines that begin with "## " try to explain what's going on. Lines
## that begin with just "#" are disabled commands: you can enable them
## by removing the "#" symbol.
##
## See 'man tor', or https://www.torproject.org/docs/tor-manual.html,
## for more options you can use in this file.
##
## Tor will look for this file in various places based on your platform:
## https://www.torproject.org/docs/faq#torrc
## Tor opens a socks proxy on port 9050 by default -- even if you don't
## configure one below. Set "SocksPort 0" if you plan to run Tor only
## as a relay, and not make any local application connections yourself.
#SocksPort 9050 # Default: Bind to localhost:9050 for local connections.
#SocksPort 192.168.0.1:9100 # Bind to this address:port too.
## Entry policies to allow/deny SOCKS requests based on IP address.
## First entry that matches wins. If no SocksPolicy is set, we accept
## all (and only) requests that reach a SocksPort. Untrusted users who
## can access your SocksPort may be able to learn about the connections
## you make.
SocksPolicy accept 127.0.0.1
#SocksPolicy reject *
## Logs go to stdout at level "notice" unless redirected by something
## else, like one of the below lines. You can have as many Log lines as
## you want.
##
## We advise using "notice" in most cases, since anything more verbose
## may provide sensitive information to an attacker who obtains the logs.
##
## Send all messages of level 'notice' or higher to /var/log/tor/notices.log
Log notice file /var/log/tor/notices.log
## Send every possible message to /var/log/tor/debug.log
#Log debug file /var/log/tor/debug.log
## Use the system log instead of Tor's logfiles
#Log notice syslog
## To send all messages to stderr:
#Log debug stderr
## Uncomment this to start the process in the background... or use
## --runasdaemon 1 on the command line. This is ignored on Windows;
## see the FAQ entry if you want Tor to run as an NT service.
RunAsDaemon 1

## The directory for keeping all the keys/etc. By default, we store
## things in $HOME/.tor on Unix, and in Application Data\tor on Windows.
#DataDirectory /var/lib/tor
## The port on which Tor will listen for local connections from Tor
## controller applications, as documented in control-spec.txt.
#ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
#HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C
#CookieAuthentication 1
############### This section is just for location-hidden services ###
## Once you have configured a hidden service, you can look at the
## contents of the file ".../hidden_service/hostname" for the address
## to tell people.
##
## HiddenServicePort x y:z says to redirect requests on port x to the
## address y:z.
HiddenServiceDir /var/lib/tor/web_hidden_service/
HiddenServiceVersion 3
HiddenServicePort 80 127.0.0.1:80
################ This section is just for relays #####################
#
## See https://www.torproject.org/docs/tor-doc-relay for details.
## Required: what port to advertise for incoming Tor connections.
#ORPort 9001
## If you want to listen on a port other than the one advertised in
## ORPort (e.g. to advertise 443 but bind to 9090), you can do it as
## follows.  You'll need to do ipchains or other port forwarding
## yourself to make this work.
#ORPort 443 NoListen
#ORPort 127.0.0.1:9090 NoAdvertise
## The IP address or full DNS name for incoming connections to your
## relay. Leave commented out and Tor will guess.
#Address noname.example.com
## If you have multiple network interfaces, you can specify one for
## outgoing traffic to use.
# OutboundBindAddress 10.0.0.5
## A handle for your relay, so people don't have to refer to it by key.
#Nickname ididnteditheconfig
## Define these to limit how much relayed traffic you will allow. Your
## own traffic is still unthrottled. Note that RelayBandwidthRate must
## be at least 20 KB.
## Note that units for these config options are bytes per second, not bits
## per second, and that prefixes are binary prefixes, i.e. 2^10, 2^20, etc.
#RelayBandwidthRate 100 KB  # Throttle traffic to 100KB/s (800Kbps)
#RelayBandwidthBurst 200 KB # But allow bursts up to 200KB/s (1600Kbps)
## Use these to restrict the maximum traffic per day, week, or month.
## Note that this threshold applies separately to sent and received bytes,
## not to their sum: setting "4 GB" may allow up to 8 GB total before
## hibernating.
##
## Set a maximum of 4 gigabytes each way per period.
#AccountingMax 4 GB
## Each period starts daily at midnight (AccountingMax is per day)
#AccountingStart day 00:00
## Each period starts on the 3rd of the month at 15:00 (AccountingMax
## is per month)
#AccountingStart month 3 15:00
## Administrative contact information for this relay or bridge. This line
## can be used to contact you if your relay or bridge is misconfigured or
## something else goes wrong. Note that we archive and publish all
## descriptors containing these lines and that Google indexes them, so
## spammers might also collect them. You may want to obscure the fact that
## it's an email address and/or generate a new address for this purpose.
#ContactInfo Random Person <nobody AT example dot com>
## You might also include your PGP or GPG fingerprint if you have one:
#ContactInfo 0xFFFFFFFF Random Person <nobody AT example dot com>
## Uncomment this to mirror directory information for others. Please do
## if you have enough bandwidth.
#DirPort 9030 # what port to advertise for directory connections
## If you want to listen on a port other than the one advertised in
## DirPort (e.g. to advertise 80 but bind to 9091), you can do it as
## follows.  below too. You'll need to do ipchains or other port
## forwarding yourself to make this work.
#DirPort 80 NoListen
#DirPort 127.0.0.1:9091 NoAdvertise
## Uncomment to return an arbitrary blob of html on your DirPort. Now you
## can explain what Tor is if anybody wonders why your IP address is
## contacting them. See contrib/tor-exit-notice.html in Tor's source
## distribution for a sample.
#DirPortFrontPage /etc/tor/tor-exit-notice.html
## Uncomment this if you run more than one Tor relay, and add the identity
## key fingerprint of each Tor relay you control, even if they're on
## different networks. You declare it here so Tor clients can avoid
## using more than one of your relays in a single circuit. See
## https://www.torproject.org/docs/faq#MultipleRelays
## However, you should never include a bridge's fingerprint here, as it would
## break its concealability and potentionally reveal its IP/TCP address.
#MyFamily $keyid,$keyid,...
## A comma-separated list of exit policies. They're considered first
## to last, and the first match wins. If you want to _replace_
## the default exit policy, end this with either a reject *:* or an
## accept *:*. Otherwise, you're _augmenting_ (prepending to) the
## default exit policy. Leave commented to just use the default, which is
## described in the man page or at
## https://www.torproject.org/documentation.html
##
## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses
## for issues you might encounter if you use the default exit policy.
##
## If certain IPs and ports are blocked externally, e.g. by your firewall,
## you should update your exit policy to reflect this -- otherwise Tor
## users will be told that those destinations are down.
##
## For security, by default Tor rejects connections to private (local)
## networks, including to your public IP address. See the man page entry
## for ExitPolicyRejectPrivate if you want to allow "exit enclaving".
##
#ExitPolicy accept *:6660-6667,reject *:* # allow irc ports but no more
#ExitPolicy accept *:119 # accept nntp as well as default exit policy
#ExitPolicy reject *:* # no exits allowed
## Bridge relays (or "bridges") are Tor relays that aren't listed in the
## main directory. Since there is no complete public list of them, even an
## ISP that filters connections to all the known Tor relays probably
## won't be able to block all the bridges. Also, websites won't treat you
## differently because they won't know you're running Tor. If you can
## be a real relay, please do; but if not, be a bridge!
#BridgeRelay 1
## By default, Tor will advertise your bridge to users through various
## mechanisms like https://bridges.torproject.org/. If you want to run
## a private bridge, for example because you'll give out your bridge
## address manually to your friends, uncomment this line:
## PublishServerDescriptor 0

Après avoir fait les changement dans le fichier torrc, redémarrez le service tor :

systemctl restart [email protected]

Naviguez dans le dossier du service caché web_hidden_service :

cd /var/lib/tor/web_hidden_service/ && ls -alt

Affichez l’adresse .onion (DNS) de votre service caché :

cat /var/lib/tor/web_hidden_service/hostname
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion

III. Transformation du service web apache2, en hidden-service

Bien, nous avons finit côté tor, maintenant, nous devons nous occuper d’installer un service Web. Dans mon cas je vais choisir apache2 :

apt install apache2

Puis, si vous le souhaitez, éditez rapidement la page par défaut d’apache2 /var/www/html/index.html (étape optionnelle)

nano /var/www/html/index.html 

Afin que notre service apache2 comprenne que celui-ci va être transmuer en service caché, nous devons renseigner la variable ServerName, dans le virtualhost par défaut :

cd /etc/apache2/sites-available/

Désactivez le virtual host par défaut, le temps d’effectuer la modification :

a2dissite 000-default.conf

Editez le virtual host, et renseignez la directive ServerName :

nano 000-default.conf

Enregistrez les modification, puis activez de nouveau le virtual host et redémarrez le service :

a2ensite 000-default.conf

Dès lors, redémarrez apache2 :

systemctl restart apache2

IV. Test depuis un client – (Kalilinux dans mon cas)

Depuis peu, le navigateur Tor browser est disponible depuis les paquets officiels… sous kali linux et Ubuntu ! Alléluia, plus besoin d’ajouter un repository manuellement pour pouvoir installer Tor Browser. 🙂

sudo apt install tor torbrowser-launcher
torbrowser-launcher & # Le navigateur doit être lancé avec un utilisateur standard (pas root sinon -> crash)

Pour lancer le navigateur tor, utilisez la commande suivante en tant qu’utilisateur standard. (Tor ne peut pas s’exécuter « as root » :

torbrowser-launcher & # Ou depuis le menu "recherche" bia la GUI ...

Note : Si vous n’arrivez pas à vous connecter au réseau tor, lors du démarrage du navigateur, redémarrez votre machine.

Depuis la machine kali-linux, je vais donc tenter d’atteindre le site web par l’intermédiaire :

  • Du navigateur tor
  • De la commande « torify » curl

Dans votre navigateur, entrez l’adresse suivante :

http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion

L’affichage du résultat n’est pas instantané, étant donné que vous devez traverser le réseau tor.

Afin de tester, si nous pouvons accéder à notre hidden-service via la commande curl, nous devons la « torifier » avec la commande torsocks (ou torify qui est alias de cette commande). Cette méthode permet d’encapsuler votre requête HTTP dans le réseau tor.

systemctl start tor 
torify curl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion | head 

V. Configuration SSL de notre hidden-service web (Pour aller plus loin…)

Pour ceux qui souhaiteraient utiliser let’s encrypt pour le chiffrement SSL, cela n’est pas possible, je vous arrête tout de suite. Je ne vais pas rentrer dans les détails, tout est expliqué ici :

Reprenons, Ajoutez la ligne suivante dans la configuration de torrc :

nano  /etc/tor/torrc 
HiddenServicePort 443 127.0.0.1:443

Enregistrez le fichier, puis redémarrez tor :

systemctl restart [email protected]

Activez le mode SSL d’apache2 (ne pas le redémarrer, on le ferra juste une fois à la fin) :

a2enmod ssl

Créez un dossier pour accueillir notre certificat, et notre clé :

mkdir /etc/apache2/ssl

Générez un certificat auto-signé, pour une durée de 10 ans ~ :

openssl req -x509 -nodes -days 3600 -newkey rsa:4096 -out /etc/apache2/ssl/server.crt -keyout /etc/apache2/ssl/server.key

Désactivez votre virtual host /etc/apache2/sites-available/000-default.conf le temps d’ajouter la ligne :

cd /etc/apache2/sites-available/
a2dissite 000-default.conf

Le temps d’ajouter la ligne suivante. (elle va nous permettre de rediriger tout les trafics HTTP –> HTTPS)

  • Redirect Permanent / https://xxxxxxxxxxxxxxxxxxxxxxxxx.onion
nano /etc/apache2/sites-available/000-default.conf 

Editez par la suite le virtual host default-ssl.conf, en ajoutant les directives suivantes :

nano /etc/apache2/sites-available/default-ssl.conf
  • ServerName xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion
  • SSLCertificateFile /etc/apache2/ssl/server.crt
  • SSLCertificateKeyFile /etc/apache2/ssl/server.key

Enregistrez le fichier, activez de nouveaux les deux virtual hosts

a2ensite 000-default.conf default-ssl.conf 
systemctl restart apache2 

Depuis le navigateur torbrowser, essayez maintenant d’accéder à l’URL http://xxxxxxxxxx.onion/, vous verrez que vous serez automatiquement redirigé vers la version HTTPS du site. Ci cela n’est pas le cas essayez de vider le cache du navigateur, sinon, vous avez sûrement fait une petite erreur dans la configuration lors de la configuration d’HTTPS

Voilà votre hidden-service supporte maintenant HTTPS !

J’espère que cet article vous aura plus 🙂

++

Geoffrey Sauvageot-Berland

Geoffrey Sauvageot-Berland

Ingénieur diplômé par l’état en Informatique et Cybersécurité. Généraliste, à l'origine administrateur systèmes et réseaux, j’occupe actuellement un poste d’auditeur en sécurité offensive. J’apprécie également la programmation/automatisation. Fondateur du blog : "Le Guide du SecOps", anciennement "Le Guide du SysOps"

Related Posts

Tester la sécurité d’une API : Un Guide Pratique

Tester la sécurité d’une API : Un Guide Pratique

Weevely – un Webshell interactif polyvalent (cheat sheet)

Weevely – un Webshell interactif polyvalent (cheat sheet)

Configuration d’un relais Tor (Guard/Middle Node)

Configuration d’un relais Tor (Guard/Middle Node)

Reconstruction d’OS non chiffrés : Analyse post-exploitation

Reconstruction d’OS non chiffrés : Analyse post-exploitation