Créer un service caché via le réseau TOR

Pourquoi créer un service caché ? Publier un service caché sur le grand méchant darknet permet dans l'exemple d'avoir un service en ligne plus discret que sur l'internet visible comme par exemple un FTP ou un blog perso (On peut exiger une vie privée sans pour autant se reprocher quoi que ce soit ou animer des activités illégales)

Pourquoi mettre des rideaux chez soit si l'on à rien à cacher ?

Bref passons à l'essentiel

Mais avant cela, une explication sur le fonctionnement du réseau TOR (coté serveur)

  • Le serveur choisit les points d'introductions en leur communiquant sa clef publique (l'Identifiant n'est pas l'IP mais la clef publique)
  • Le serveur fait un descripteur de service (Publique Key + IP des points d'introductions) et envoi le descripteur à la Hashtab distribuée de TOR
  • Lorsque le client renseigne le domaine onion de la cible il télécharge la hashtab, grâce à cela il connaît les relais d’introductions et la publique key. Il créer un circuit parmi les relais jusqu’à fixer un point de rdv sur un relai choisit (il utilise un secret partagé)
  • Le client assemble un descriptif en mixant celui du service onion avec le point de rdv et le secret partagé, puis envoi le descriptif aux points d'introductions du service onion (le descriptif est chiffré avec la Publique Key du service onion)
  • Le point d'introduction communique le nouveau descriptif au service onion, puis le service créer un circuit entre les relais TOR jusqu'au point de rdv (il utilise le secret partagé du descriptif)
  • Le point de RDV interconnecte le client et le service

Service TOR et port binding

TOR fonctionnant en tant que proxy, le principe consiste à écouter sur un port dédié au processus TOR (qui sera accessible depuis le réseau TOR) qui renverra sur le port du service à cacher via la boucle local (Port binding)

Installer TOR en tant que service

Il est préférable d'installer TOR depuis le package du site plutôt que les dépôts

https://www.torproject.org/docs/debian.html.en

Choisissez la distribution et la version de tor (Debian 9 stretch & Tor stable dans l'exemple) puis copiez les commandes générées

apt-get update && apt-get install apt-transport-https gnupg2 dirmngr

gpg2 --keyserver hkp://pool.sks-keyservers.net

echo "deb https://deb.torproject.org/torproject.org stretch main" >> /etc/apt/sources.list.d/tor.list
echo "deb-src https://deb.torproject.org/torproject.org stretch main" >> /etc/apt/sources.list.d/tor.list

gpg2 --recv A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89
gpg2 --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -

apt update && apt install tor deb.torproject.org-keyring

Maintenant que TOR est installé en tant que daemon, nous allons configurer le port binding

Configuration d'un service HTTP caché

Dans cet exemple la configuration sera la suivante:

Le port 80 sera écouté via le processus TOR, puis TOR redirigera la requêtes vers le service apache sur le port 9080

TOR écoute sur le port 80
Apache écoute sur le port 9080
Les utilisateurs voulant accéder à notre serveur web arriveront sur le port 80

Configuration d'apache

Configurer le service apache pour le faire écouter sur le port 9080 (Adaptez selon votre bon vouloir)

$vi /etc/apache2/ports.conf

Listen 9080 #Port en local

$vi /etc/apache2/site-available/000-default.conf

<VirtualHost *:9080>
....

service apache2 restart

Configurer le service caché

Configurer le port binding de TOR du port 80 vers le port 9080

$vi /etc/tor/torrc

#Décommentez les lignes ci-dessous et modifez la ligne HiddenServicePort

HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:9080

#Redémarrez le service tor
systemctl restart tor

Désormais le serveur WEB est disponible sur le réseau TOR depuis l'adresse décrit dans le fichier /var/lib/tor/hidden_service/hostname

Voir le domaine attribué au service caché

cat /var/lib/tor/hidden_service/hostname

Voir la clef privée TOR associé au nom de domaine

/!\ Cette clé privée permet de chiffrer les communications du service caché /!\

car /var/lib/tor/hidden_service/hs_*private_key

Accéder au service caché TOR (Via linux)

Installer TOR sur le client linux (Procédure ci-haute)

Pour y accéder (sous linux) installer tor puis configurer le proxy de votre navigateur comme ci-dessous

En se connectant sur sur le domaine Onion généré le site web est en ligne

Configuration d'un service SSH caché

Dans l'exemple le service caché écoutera sur le port 22 et le service SSH sur le port 2222

$vi /etc/tor/torrc

#Ajoutez la ligne la ligne HiddenServicePort dans la zone adaptée

HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:9080
HiddenServicePort 22 127.0.0.1:2222

#Redémarrez le service tor
$systemctl restart tor

Pour se connectez en SSH :

$torify ssh -p 22 usermysterious@grm77qabnpgrknez67vwzfc7obrjoqevratetjqkwcy46qp6ahcu46id.onion

usermysterious@grm77qabnpgrknez67vwzfc7obrjoqevratetjqkwcy46qp6ahcu46id.onion's password: 

Créer plusieurs services cachés

Il est possible d'avoir plusieurs domaines associés au service TOR
Pour ne pas avoir de soucis de droits sur les dossiers, dupliquez le hidden_service existant et videz le nouveau

#Copier le dossier /var/lib/tor/hidden_service en gardant les attribus

cp -a /var/lib/tor/hidden_service /var/lib/tor/hidden_service2
rm /var/lib/tor/hidden_service2/*
rm -rf /var/lib/tor/hidden_service2/*

systemctl restart tor

Une fois le service redémarré le nouveau dossier hidden_service2 contient son hostname ainsi que sa clef privée

cat /var/lib/tor/hidden_service2/hostname

ka5245pfxtdwrbdbceqmnmv4v5adi7hf52g5zjp3ns3dwzkokgzi66qd.onion

Cette méthode peut être pratique dans le cas ou vous auriez plusieurs service à publier sur le réseau tor (La bonne pratique serait de cloisonner un hostname par service)

Hacking & Misconfiguration

Service accessible depuis le WAN classique

Le service doit seulement être publié sur le réseau TOR (Logique) cependant des erreurs fréquentes sont souvent commise :

Dans l'exemple le port 80 est celui d'entrée de TOR, le port 9080 est celui du service apache, Que ce passe t-il si le port 9080 est accessible pour le réseau internet ?

AAAAARF moi qui voulait dénoncer des scandales politiques me voila retrouvé, arrêté et suicidé ! Pas de panique vous avez plusieurs moyens de sécuriser cela

Configurer Apache pour écouter seulement sur l'IP local

$vi /etc/apache2/site-available/000-default.conf #fichier de configuration du site

#Ajoutez cela Entre les balise <VirtualHost

<Directory /var/www/html/>
        order deny,allow
        deny from all
        allow from 127.0.0.1/8
</Directory>

systemctl restart apache2

Bloquer le port apache à tout le monde via le parefeu (Seul la boucle local est autorisée)

iptables -A INPUT -i ens3 -p tcp --dport 9080 -j REJECT
#ens3 est l'interface d'ou provient le traffic depuis le WAN

Clef publique RSA connu

Imaginons que votre service SSH soit accessible depuis le WAN et le réseau TOR, le protocole SSH est très bavard notamment sur l'échange de clef RSA publique

Imaginons qu'un hackeur scan sur le port 22 de votre serveur en onion, récupère la clef publique et la recherche dans un outil comme SHODAN ?

$torify nmap grm77qabnpgrknez67vwzfc7obrjoqevratetjqkwcy46qp6ahcu46id.onion -p 22 --script ssh-hostkey

PORT   STATE SERVICE
22/tcp open  ssh
| ssh-hostkey: 
|   2048 1a:d0:97:3a:48:f7:0a:08:3d:0b:b9:63:04:dd:4e:af (RSA)
|   256 5d:77:99:2c:47:38:b3:1c:79:b3:66:62:84:12:8d:78 (ECDSA)
|_  256 a7:8e:70:8c:3e:50:58:31:cc:01:b9:87:d1:7f:80:10 (EdDSA)

Aaaaarf Shodan à ma clef SSH publique dans sa base de donnée et l'associe à mon IP WAN ! (Retrouvé, arrêté, suicidé !)

Pour cela, il est nécessaire d'éviter de mettre le port SSH accessible sur le réseau TOR, encore plus dangereux de le mettre sur les 2 réseaux en même temps.

Si le publier sur TOR est indispensable, bloquez l'accès via le parefeu pour l'interface ou arrive la traffic vers le port SSH (et assurez vous qu'il ne soit pas disponible sur shodan)

Serveur Web Bavard

Un serveur Apache laissé par défaut est très bavard, des options peuvent donner des indications sur l'emplacement géographique du serveur et des modules peuvent indiquer le vrai nom/IP du serveur

Header HTTP

Les en-têtes HTTP peuvent donner beaucoup d'information

$curl -I --socks5-hostname 127.0.0.1:9050 grm77qabnpgrknez67vwzfc7obrjoqevratetjqkwcy46qp6ahcu46
id.onion

HTTP/1.1 200 OK
Date: Thu, 10 Jan 2019 11:08:38 GMT
Server: Apache/2.4.25 (Debian)
Last-Modified: Wed, 09 Jan 2019 21:37:11 GMT
ETag: "92-57f0d43bdd59b"
Accept-Ranges: bytes
Content-Length: 146
Vary: Accept-Encoding
Content-Type: text/html

L'en-tête HTTP donne la date du serveur (donc potentiellement son fuseau horaire géographique, la version du service, la dernière modification html, ...)

Apache module server-status

Le module status-server d'apache est activé par défaut et accessible depuis 127.0.0.1, hors la requêtes envoyés sur le service web est reçu par TOR et renvoyé depuis 127.0.0.1 vers le port apache

curl --socks5-hostname 127.0.0.1:9050 grm77qabnpgrknez67vwzfc7obrjoqevratetjqkwcy46qp6ahcu46id.onion/server-status

Miracle nous avons le nom du VHOST et le port ! l'anonymat désormais inexistant !

Pour désactiver le module status d'apache

a2dismod status
systemctl restart apache2

Vulnérabilités Web PHP

Malgré le fait qu'une vulnerabilité PHP peut compromettre totalement le serveur (selon leur criticité), l'affichage du phpinfo peut révéler certaines informations sensibles pouvant désanonymiser le serveur.

Le nom de domaine du serveur est affiché, le serveur est désanonymisé

Métadonnée & Exif

Les photos prisent peuvent contenir de la métadonnée en exif pouvant révéler des informations (Coordonées GPS, modèle, serial, ...) Les images disponibles depuis le service peuvent désanonymiser l'administrateur

$exiftool Icon.png

GPS Direction                   : 36.8626865671642
Subsec Time Original            : 892
GPS Latitude                    : 40 deg 43' 13.54" N
Digital Zoom Ratio              : 2.66086956521739
Exif Image Height               : 2448
Metering Mode                   : Multi-segment
Aperture Value                  : 2.2
Exif Image Width                : 3264
GPS Longitude                   : 73 deg 59' 2.43" W
GPS Speed Ref                   : km/h
Exif Version                    : 0221
Lens Make                       : Apple
Lens Info                       : 4.15mm f/2.2
Lens Model                      : iPhone 6 back camera 4.15mm f/2.2
Resolution Unit                 : inches
X Resolution                    : 72
Camera Model Name               : iPhone 6
Y Resolution                    : 72
Make                            : Apple
Date Created                    : 2017:08:30 17:40:40
GPS Position                    : 40 deg 43' 13.54" N, 73 deg 59' 2.43" W

Un récap de bonnes pratique de sécurité dispo à cette adresse :

https://riseup.net/en/security/network-security/tor/onionservices-best-practices

https://github.com/s-rah/onionscan/blob/master/doc/what-is-scanned-for.md

Hacking tools

proxychains & torify

Permettent de proxifier le traffic de la commande en argument

$torify nmap grm77qabnpgrknez67vwzfc7obrjoqevratetjqkwcy46qp6ahcu46id.onion -p 22 --script ssh-hostkey

PORT   STATE SERVICE
22/tcp open  ssh
| ssh-hostkey: 
|   2048 1a:d0:97:3a:48:f7:0a:08:3d:0b:b9:63:04:dd:4e:af (RSA)
|   256 5d:77:99:2c:47:38:b3:1c:79:b3:66:62:84:12:8d:78 (ECDSA)
|_  256 a7:8e:70:8c:3e:50:58:31:cc:01:b9:87:d1:7f:80:10 (EdDSA)

Onioff

Permet de vérifier si l'adresse Onion est disponible et indique le type de service / référencement

https://github.com/k4m4/onioff

Onionscan

Outil de scan complet d'un service caché (Misconfiguration, défault config, metadata, ...) c'est une vrai usinagaz qui automatise toute la recherche de vulnérabilité

https://github.com/s-rah/onionscan

Deepexplorer

Permet de rechercher des services caché (en bruteforce de domaine) et de rechercher des mots clefs dans le contenu via web crawling

https://github.com/blueudp/deep-explorer