Après avoir lu les articles sur le "démantèlement" de certains botnets comme mariposa et waledac, nous nous sommes intéressés à la détection de ces réseaux ainsi qu'aux faiblesses inhérentes à leurs modes de communication.
Dans le cas de ces réseaux, nous pouvons remarquer un élément commun, et pas des moindres : leurs modes de communication reposent sur le protocole DNS.
Grâce au travail de Defense Intelligence sur mariposa, nous savons aujourd'hui qu'une certaine quantité de serveurs DNS contrôlaient le réseau. Même si ces adresses évoluaient au fur et à mesure de la mise à jour des bots, elles restaient le référentiel de toutes les mises à jour du réseau. Pour preuve, après avoir mis la main sur les domaines ils ont pu contrôler à leur tour le réseau et récolter des données volées depuis les bots venant de plus de 190 pays.
De même dernièrement, Microsoft a annoncé qu'il avait "démantelé" le réseau waledac qui base lui aussi une partie de sa communication sur des technologies à base de DNS en demandant la fermeture temporaire de 277 noms de domaines.
Dans les deux cas la méthode utilisée par ces botnets est bien connue. Elle utilise la fonctionnalité de round robin DNS qui consiste en l'ajout d'une grosse quantité d'IP avec un TTL très bas sur un même host, on l'appelle Fast-Flux.
Elle a la propriété de changer continuellement les adresses IP attachées à un même nom DNS. Elle permet ainsi de cacher rapidement le destinataire par un effet de bord intéressant du TTL bas, le changement d'adresse IP rapide. Ces dernières font ainsi office de "reverse proxy" pour la communication avec le reste du réseau (lien Wikipedia).
Regardons maintenant les méthodes de communication décentralisées, utilisées massivement ces dernières années, comme par exemple les DHT (tables de hachages distribuées) utilisées dans des protocoles P2P, par exemple, BitTorrent.
Essayons de nous mettre dans la peau d'un "Bot Master" (contrôleur du botnet) pour imaginer un concept qui ne se base plus sur des référents fixes tels que les services DNS, HTTP, IRC, ... mais sur le réseau lui même.
Pour la communication réseau, il est judicieux d'utiliser une DHT de type Chord, qui permet de d'associer chaque représentant du réseau à un hash unique. Cela permet de faire du calcul de distance, de simplifier la communication, et de baser les messages sur un système d'évènements totalement asynchrone afin de créer ce qu'on appelle un overlay network.
Il existe une implémentation de l'algorithme de Chord en langage C, le projet Chimera.
Du fait des faibles dépendances de cette bibliothèque il est possible de la porter assez simplement sur plusieurs architectures et OS différents, pouvant être aussi exotiques que certaines appliances/routeurs ou encore certains téléphones (utilisant une µ/glibc).
L'overlay network peut ainsi être décomposé en quatre primitives indispensables à la vie du réseau :
- set // qui permet d'ajouter une ressource (peer, chunk)- get // qui permet de récuperer une ressource
- del // qui supprime une ressource
- route // qui route le message vers la ressource
L'avantage direct de ce type de technologie est la non divulgation des adresses des destinataires, et surtout le fait de se passer des problématiques de routage entre les différents noeuds.
Le principe d'une DHT étant pour un peer de ne connaître qu'une petite portion du réseau, une personne voulant récupérer les adresses IP de tout le réseau n'aura que la vision du peer qu'il contrôle avec ses voisins, sa "leaf" pour reprendre les termes liés à la bibliothèque chimera.
Le routage est automatique, les problématiques de routage sont négociées par la DHT elle-même.
Le principal problème de ce mode de communication provient du NAT. En effet, un client, situé derrière un routeur, possédant une adresse privée ne pourra pas directement communiquer avec le reste du réseau, la passerelle ne relayant pas les messages entrants.
Il existe cependant plusieurs méthodes pour traverser les NAT, la plus efficace pour ce type de réseau étant l'utilisation de Peer spéciaux dits points de rendez-vous. Il prennent en charge les connexions sortantes d'un client NATé lui permettant de communiquer avec le reste du réseau.
L'utilisation de l'UDP hole punching fiabilise cette méthode en assurant une connexion directe une fois la négociation avec le point de rendez-vous effectuée.
Un bon exemple est le botnet Conficker qui utilise des points de rendez-vous, mais là encore en utilisant des listes de domaines générés par le bot toutes les 3h, et surtout prédictibles.
Il existe également une autre solution, moins fiable, de communiquer directement avec des clients derrières des NAT, en profitant de l'état stateless de l'UDP. Depuis un Peer A, nous pouvons faire envoyer en continu des paquets sur un Peer B qui ne s'attendra pas à recevoir le flux. Si le NAT ne modifie pas le port source du Peer A, B peut envoyer à son tour un flux UDP en direction de A sur ce même port source et ainsi assurer la connexion. Cette méthode est en effet peu fiable car le port source peut se retrouver modifié par l'équipement réseau en amont.
Revenons à notre DHT. Une attaque peut mettre en péril l'intégrité d'une DHT : le fait d'ajouter une énorme quantité de bot afin de la polluer et après un certain temps, de tous les déconnecter en même temps pour couper le routage entre nodes. Ces "tainted Peer" doivent être identique en tout point aux autres peers du réseau. La réussite de cette attaque est liée à la taille du réseau. Plus le réseau est grand et plus il sera difficile de polluer la DHT.
De même, pour vérifier si une information est valide ou pas il n'existe actuellement aucune méthode fiable de vérification des messages, un tainted peer peut envoyer de fausses informations.
Généralement le bot master possède une clef privée permettant de signer ses messages, ce qui handicape les messages autonomes entre peers, à l'exception des messages de type keepalives et les forward de messages signés.
Pour conclure, il semble évident que l'émergence d'une solution totalement décentralisée, actuellement possible avec des outils et des bibliothèques open-source, serait plus difficile à éradiquer. Il existe aujourd'hui des solutions concrètes pour fabriquer des réseaux décentralisés indépendant de l'OS et de l'architecture, qui ne font appel à aucun référant fixe en dehors du réseau lui-même et capable de faire du NAT traversal. Contrairement aux exemples précédant cités en début d'article, il sera extrêmement difficile dans les années à venir de supprimer ce type de réseau.
Pour vous donner un ordre d'idée, le plus gros "cloud" n'appartient pas à Microsoft, Google ou Amazon, mais aux propriétaires du ver Conficker.


Comme un code source parle bien souvent plus qu'un long discours, vous trouverez