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