Le réseau TOR constitue un véritable outil pour l'anonymat, et bien entendu cela se transforme rapidement en une arme pour les pirates informatiques. C'est pour cette raison qu'il est utile de savoir programmer un détecteur TOR, bien que cela ne soit vraiment pas dur dans la théorie, il y a tout de même quelques détails qui peuvent être plus qu'utile.





Je vais me contenter de reprendre la définition de Wikipédia, car en plus d'être pertinente me permet de plus développer le côté programmation.


Selon Wikipedia:

The Onion Router ou TOR (littéralement : le routage en oignon) est un réseau mondial décentralisé de routeurs, organisés en couches, appelés noeuds de l'oignon, dont la tâche est de transmettre de manière anonyme des paquets TCP. C'est ainsi que tout échange Internet basé sur TCP peut être anonymisé en utilisant Tor. Tor est un logiciel libre distribué sous licence BSD révisée.
Le routage en oignon dans TOR

Le routage en oignon fut conçu à partir de l'appréciation des carences des systèmes pré-existant (notamment les serveurs mandataires) qui ne suffisent pas à garantir l'anonymat d'un individu.

Tor est la seconde génération de systèmes de routage en oignon (le premier a révélé beaucoup de ses défauts et n'a donc jamais eu de succès.)

* Vue d'ensemble

Le routage en oignon utilise diverses techniques pour faire rebondir un échange TCP au sein d'Internet afin que des analyses de trafic sur une partie du réseau (notamment par celui qu'on appelle un homme au milieu) ne puissent pas identifier un utilisateur. Dans la suite de l'article, on suppose vouloir échanger un paquet entre un client et un serveur (voir Client-serveur).

* Construction d'un circuit

Ayant accès à la liste des noeuds de Tor, chaque client doit y choisir un chemin aléatoire (il pourra en changer au bout d'un certain intervalle de temps), puis construit un circuit au sein duquel chaque noeud a la propriété de connaître son prédécesseur et son successeur, sans en savoir plus.

Cette construction fait appel au concept de cryptographie hybride. Chaque noeud d'oignon possède une clef publique, mais la cryptographie à clef secrète est bien plus rapide que celle à clef publique. L'idée est donc de distribuer à chaque noeud du circuit une clef secrète chiffrée avec leur clef publique.

Après la phase de construction, chaque noeud du circuit a une clef secrète qui lui est propre et ne connaît que son prédécesseur et son successeur au sein du circuit.

* Échange de paquets

Pour acheminer un paquet au serveur, le client doit chiffrer son paquet de nombreuses fois :

* la première fois, le client chiffre son paquet TCP avec la clef secrète correspondant au dernier noeud, numéroté n.
* la deuxième fois, avec celle de l'avant-dernier noeud, numérotée n-1.
* la troisième fois, avec celle de n-3.
* la quatrième fois, avec celle de n-4.
* ...
* la dernière fois, avec celle du premier noeud, numérotée 1.

À ce stade, toutes les couches de l'oignon enferment le paquet TCP. Voyons comment est pelé l'oignon : lorsque le client envoie ce paquet au circuit qu'il a construit :

* le premier serveur du circuit déchiffre le paquet avec la clef 1 et l'envoie au deuxième serveur.
* le deuxième serveur déchiffre ce paquet avec la clef 2.
* ...
* le dernier serveur déchiffre ce paquet avec la clef n et obtient le paquet original.

En pratique, un client du réseau Tor peut configurer son navigateur Web pour utiliser un serveur mandataire personnel qui donne accès à Tor (comme Privoxy). Voici le déroulement d'une visite de Wikipédia par ce client :

* Son navigateur envoie la requête HTTP à Privoxy.
* Privoxy retranche l'information non anonyme, passe l'information via SOCKS au client Tor. Le client construit un circuit (si ce n'est déjà fait), chiffre les données à envoyer, et les passe au premier noeud.
* Ce premier noeud déchiffre une partie de l'enveloppe et fait suivre les données jusqu'à atteindre le noeud de sortie.
* Ce noeud de sortie envoie la requête à Wikipedia.

La même chose se passe en sens inverse. L'échange est ainsi anonyme, mais est cependant très ralenti.

* Un anonymat partiel

Tor ne peut assurer la protection de paquets UDP, et n'en soutient donc pas les utilisations, notamment les requêtes aux serveurs DNS, pourtant nécessaires à la navigation Web et extrêmement révélatrices des habitudes de navigation du client. Cependant Tor offre la possibilité de router les requêtes DNS à travers son réseau, notamment à l'aide de la commande "torify".

Par ailleurs, tout site Web peut disposer sur ses pages un applet Java qui lui renvoie l'adresse IP de ses clients, annulant ainsi l'efficacité de Tor, qui avait justement pris soin de masquer cette information. Il est difficile de se prémunir de cette parade, car bloquer l'exécution de ce type de code bloque également des fonctionnalités parfois indispensables aux services rendus par un site.

* Attaque de type "Time Pattern" :

Tor permet d'empêcher un attaquant de suivre le chemin pris par une connexion. Cependant, s'il ne peut reconnaître le contenu du flux, il existe des moyens dont le principe est en quelque sorte lié au problème des canaux cachés. Par exemple, envoyez un flux comme du code morse : 3 paquets envoyés en salve, puis 5 secondes de silence, puis 3 paquets, etc. Lorsque vous verrez un flux sortir d'un noeud Tor et dont le "motif temporel" ressemble à celui-ci, alors vous saurez que c'est le vôtre.

Selon ce principe, vous pouvez chercher à attribuer une signature temporelle à un flux que vous essayez de suivre, ce qui vous permettra peut-être de le faire. Un attaquant peut d'ailleurs augmenter ses chances en donnant lui-même un motif temporel au flux qu'il cherche à suivre. C'est en effet chose possible. Comme au sein d'un noeud tous les paquets sont transférés par le biais d'une machine commune et se partagent donc les ressources du système, un attaquant peut inonder un noeud de ses propres paquets pour moduler un ralentissement de la machine comme il l'entend, et ainsi créer une signature temporelle pour les flux qui traversent ce noeud précis.

Ces deux types d'attaques sont très différents et posent de nombreuses questions. La première montre que même si le réseau Tor protégeait parfaitement votre anonymat, des moyens simples peuvent le contourner complètement et fortement compromettre son efficacité. Le second exemple est plus destiné à montrer que bien que Tor reste un outil formidable, on peut l'attaquer directement, et il n'est donc pas un paradis pour hackers.

Sources : Wikipédia




A cela, j'ajoute la définition du verbe : "torifier". D'oà quelques dérrivées comme "torification", "torifiable", d'après le contexte de la définition vous serez à même de comprendre le sens de ces mots, bien que presque évident.

Torifier
Action de paramétrer une application pour qu'elle soit invisible d'un point de vue extérieure au réseau. Utiliser le couple Privoxy/TOR en paramètre de connexion réseau. L'action de torification est valable sur quasiment toutes les applications sous Linux, mais également sous Windows, dans les application permettant la configuration d'un proxy. En effet, sous Linux, depuis la console (Konsole, Gnome-terminal, ...) jusqu'au logiciel de messagerie instantanée (Kopete, Pidgin, aMSN, ...) les programmes sont torifiables .

Le principe est simple, sous Linux, une application qui demande à communiquer sur le réseau, donc sur internet, passe par SOCKS, qui est lui même géré par Privoxy. Voici un schéma :



            +------------------------+
            |        netfilter       |
            +------------------------+
            |                        |
  libpcap   |  +------------------+  |
        \\   |  |     Privoxy      |  |   +-----------------+                         
         \\  |  +------------------+  |   | Accès au réseau |                             } P
          \\ |  |                  |  |   |      réél       |                             } r  T
 Konsole  >>>  |  SOCKS  >  TOR   |  >>> +-----------------+ >>> Internet >> FAI <---->  } o  O
            |  |                  |  | \\                                     N9UF        } x  R
            |  +------------------+  |  \\                                    FREE        } y
            |                        |   \\ Câble réseau                       ...    
            +------------------------+
 




Se cacher ? Mais pourquoi ?
Il ne faut pas chercher à se cacher, nous en avons pas le pouvoir. Par contre se faire passer pour quelqu'un d'autre est largement plus faisable...

Pour être un maximum anonyme, c'est très simple, et très certainement illégal :

- détourne la connexion téléphonique de l'un de tes voisins
- pirate une connexion WiFi qui est autour de chez toi, tant qu'à faire prend l'adresse MAC du PC qui navigue... pour faire propre prend le même système d'exploitation (fingerprinting avec p0f... (logiciel libre wink )
- par dessus le marché, utilise TOR.
- et bien sûr, n'oublie pas de passer par une machine virtuelle (virtua box, logiciel libre aussi wink ) oà le disque est crypté / ou bien utilise AnonymOS (une version spéciale de BSD, partition chiffrée, applications torrifiées (les paquets passent par SOCKS, puis Privoxy donc finalement par Tor)

Avec tout ça, même si on remonte à toi, ce qui sera déjà bien assez ardu, il te suffira de supprimer ta machine virtuelle (quelques fichiers), et dans le cas du CD AnonymOS, il te suffira de le détruire (émiette le et jette une partie dans les toilettes et une autre dans la poubelle) smile

Voilà, être anonyme c'est possible, mais illégal, si on nous surveille, c'est pour qu'on ne fasse rien d'illégal, est-ce illégal de surveiller les autres ?

En tout cas avec ces précautions, il n'est pas possible de retrouver ton adresse IP, ni ton adresse MAC, puisque tu n'en as plus : IP du WiFi squaté, MAC générée !

La protection maximale relève après de la morale, si un utilisateur classique peut se cacher, se protéger de manière à n'être visible de personne, alors un individu mal intentionné (hacker, pédophile, ...) peut faire la même chose, et l'ordinateur lui ne sait pas faire la différence... du moins pour le moment !





L'intérêt de détecter un noeud TOR est purement à titre préventif, avec ce que est décrit ci-dessus, il n'est pas très difficile d'outre passer se réseau, tant que la page internet du client envoie des données autrement que par SOCKS. Par contre il peut être judicieux de placer un détecteur TOR, sur un site de paiement en ligne ou bien sur un chan IRC afin d'éviter les tentatives de hacking, en plus d'avoir placé une applet Java pour avoir l'adresse IP réelle, on peut savoir qui exactement a voulu se cacher. Nous allons voir un script PHP pouvant aider à la détection des noeuds TOR. Mais nous aurons d'abord besoin de définit les champs de la table.


CREATE TABLE `tor` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `ip` VARCHAR(15) NOT NULL DEFAULT '',
  `dns` VARCHAR(100) NOT NULL DEFAULT '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2570 ; 

Nous avons donc quelque chose comme ceci :


 +-----+-----------------+--------------------------------------------------+
 | id  |  ip             | dns                                              |
 +-----+-----------------+--------------------------------------------------+
 |     |                 |                                                  |
 | 1   | 75.108.78.83    | cdm-75-108-78-83.asbnva.dhcp.suddenlink.net      |
 | 2   | 218.14.43.21    | 213.43.14.218.broad.zs.gd.dynamic.163data.com.cn |
 | 3   | 218.198.171.198 | 218.198.171.198                                  |
 |     |                 |                                                  |
 |  ... et ainsi de suite ...                                               | 

Une fois la table crée, il suffit d'attaquer la table :


<?
 
function Is_From_TOR($Vip)
{
   $Vdns  = strtolower(gethostbyaddr($Vip));
   $req   = "SELECT * from `tor` WHERE `ip`='$Vip'";
   $res   = mysql_query($req); 
 
   // Si l'adresse IP est dans la base de données des noeuds TOR
   if($res!='')
   {
      $rep = mysql_fetch_row($res);
   }
 
   // Si la réponse de la requ&ecirc;te est vide
   if($rep[0]=='')
   { 
      // Filtre pour déterminer avec une probabilité que l'adresse IP
      // appartient à l'un des noeuds de sorties TOR
      if(
    strstr($Vdns,"edu")
      || strstr($Vdns,".gov")         // Sites gouvernmentaux...
      || strstr($Vdns,".mil")         // Sites militaires...
      || strstr($Vdns,"static")       // static ? en france ?
      || strstr($Vdns,"private")      //
      || strstr($Vdns,"anonym")       // Nom explicite
      || strstr($Vdns,".com")         // Sites commerciaux...
      || strstr($Vdns,"tor")          // Nom explicite
      || strstr($Vdns,"tok")          // Nom explicite (tor <=> tok)
      || strstr($Vdns,"random")       // Nom explicite 
      || strstr($Vdns,"localhost")
      || (gethostbyaddr($Vip) == $Vip) // Si le nom d'h&ocirc;te n'est pas resolvable
      )
      {      
    $new=true;
    $tor=true;
      }
   }
   else
   {
      $new=false;
      $tor=true;
   }
 
   // Si d'après le filtre sur le nom résolu c'est un noeud de sortie TOR
   // et qu'il n'est pas dans la base on l'ajoute
   if($new==true)
   {
      $req="INSERT INTO `w_its`.`tor` (`ip` ,`dns`) VALUES ('$Vip', '$Vdns');";
      mysql_query($req);
   }   
 
   return($tor);
}
 
?> 




Après avoir détecté si l'utilisateur utilise TOR ou non, on peut en plus de ça associer son adresse réelle à son adresse torifiée dans notre base de donnée, ce qui peut nous permettre de déterminer qui utilise TOR. Voici une applet qui insérée dans une page WEB permet de déterminer l'adresse IP réelle du client. La particularité des applets étant le fait que pour la communication vers l'extérieur n'utilise pas le support SOCKS. Sachant cela, sur un réseau local, l'adresse IP réelle ne vaudra rien, pour la simple raison que ce qui ne passe pas par le proxy n'a pas accès à l'extérieur. Si votre configuration est similaire, (par exemple sur votre box, port 80 bloqué en entrée et en sortie mais pas le port 9050 (privoxy, par défaut) ).


import java.net.*;
import java.io.*;
import java.applet.*;
 
public class GetClientIP extends Applet
{
   public void init()
   {
      try
      {
         InetAddress Ip =InetAddress.getLocalHost();
         System.out.println("IP:"+Ip.getHostAddress());
      }
      catch(Exception e)
      {
      e.printStackTrace();
      }
   }
} 

Nous devrions donc altérer la base de donnée pour qu'elle ressemble à ceci :


CREATE TABLE `tor` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `ip` VARCHAR(15) NOT NULL DEFAULT '',
  `dns` VARCHAR(100) NOT NULL DEFAULT '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2570 ; 

Nous avons donc quelque chose comme ceci :


 +-----+--------------+-----------------------------------------+--
 | id  |  ip_r        | dns_r                                   | 
 +-----+--------------+-----------------------------------------+--
 |     |              |                                         | 
 | 1   | 82.237.25.81 | 81-25.237-82-abo-wanadoo.fontenay-sb.fr |   (suite...) 
 | 2   | 90.227.18.99 | 90-227.18-99-abo-n9uf.toulon.fr         |  
 | 3   | 86.214.99.14 | 86-214.99-14-abo-fbx-marseilles.fr      | 
 |     |              |                 


           -----------------+--------------------------------------------------+------ 
            ip              | dns                                              | cpt 
           -----------------+--------------------------------------------------+------  
                            |                                                  |   
            75.108.78.83    | cdm-75-108-78-83.asbnva.dhcp.suddenlink.net      | 78
(...suite)  218.14.43.21    | 213.43.14.218.broad.zs.gd.dynamic.163data.com.cn | 97
            218.198.171.198 | 218.198.171.198                                  | 124
                            |                                                   

           -+----------------------------------------------------------------------------------------
            | ua
           -+----------------------------------------------------------------------------------------
(...suite)  | Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
            | Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.8
            | Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.1
 

A la différence près que cette fois chaque adresse IP des visiteurs sera insérée dans la base de donnée :


<?
   require_once('conect_sql.php');
 
   $Vip   = $HTTP_SERVER_VARS["REMOTE_ADDR"];
 
   $Vcpt  = 0;
   $Vdate = date("Y/m/d H:i");
   $Vua   = $HTTP_SERVER_VARS["HTTP_USER_AGENT"];
   $compteur = 0;
 
 
   $dbic = mysql_connect($dbhost,$dbuname,$dbpass); 
   mysql_select_db($dbname);         
 
   $res = mysql_query("SELECT id, ip, date, cpt FROM visiteurs WHERE ip='$Vip'");
   if($res)
   {
      list($id, $ip, $date, $cpt) = mysql_fetch_row($res);
      if( $ip )
      {
         mysql_query("UPDATE visiteurs SET date='$Vdate' WHERE ip='$Vip'");
         mysql_query("UPDATE visiteurs SET cpt=cpt+1 WHERE ip='$Vip'");
      }
      else
         mysql_query(  "INSERT into visiteurs (id, ip_r, dns_r, ip, dns, cpt) "
	              ." values ('','$Vip_r','$Vdns_r','$Vip','$Vdns','$Vcpt') " );
		      // On insère l'adresse IP réelle, l'IP trouvée, etc.
 
 
      mysql_query("OPTIMIZE TABLE 'visiteurs'");
 
      $result = mysql_query("SELECT * FROM visiteurs");
      $compteur = mysql_num_rows($result);
 
      echo "<b>Depuis le 27 avril 2007 il y a eu : </b>";
      if( $compteur == 1 )
         echo "$compteur visite ";
      else
         echo "$compteur visites ";
 
      echo "
<b>Nous sommes le : </b> ".date("d")." ".mois()." "
           .date("Y").", il est ".date("G").":".date("i").":".date("s")."
";
   }
 ?> 




Mine de rien, nous avons défini dans ce présent article un véritable système de surveillance capable de repérer l'ordinateur d'un individu qui tenterait de se cacher. La surveillance est illégale, mais pas dans ce sens, c'est plutôt dans le sens de la récupération de données privées, une adresse IP n'est pas privée, elle est publique (c'est votre fournisseur d'accès internet qui la publie sur le réseau internet) ; mais plutôt le sniffing sur un réseau sans fil, ou bien même du sniffing dans une entreprise.




   =>   Écrit par : Nicolas, le 04 décembre 2007


 
Mots clés :  
  network 
  
  security 
    >   Articles connexes :

GitVuln

GitVuln


HTTP Server, tell me who you are ?


Discuter avec un serveur web *apparement* muet ? Voici comment faire...


/tmp et /var/log en noexec sur macOS

/tmp et /var/log en noexec sur macOS



Durcissement de Windows

Durcissement de Windows


2557654