Dimanche dernier, le serveur qui héberge ce site a été rendu indisponible. De dimanche 16h jusqu'à lundi 11h. La raison de son indisponibilité est que le port réseau a été automatiquement coupé suite à un trafic non désiré.

Dans un premier temps, je me suis demandé quel avait été ce trafic non désiré. En recherchant des informations chez online.net (auprès de qui je loue ce serveur), j'ai trouvé leur critères :

  • DHCP
  • adresse MAC non attribuée au serveur
  • requête ARP
  • trop de requêtes par seconde en émission ou réception

Je passe en revue tous ces points:

  • je n'ai pas installé de serveur DHCP
  • je n'ai pas touché à mon adresse MAC
  • je n'ai rien qui puisse générer des requêtes ARP (à moins qu'un programme non légitime le fasse pour moi)

Je reste par contre dans le doute concernant le dernier point vu que, même si j'ai plutôt bien configuré mon pare-feu, je ne suis techniquement pas à l'abris d'un déni de service. J'ai donc dû prendre mon mal en patience en attendant de pouvoir enquêter.

Lundi matin, vers 11h, le service de monitoring d'online.net m'envoie un SMS automatique pour me dire que mon serveur répond au ping. Je m'empresse de me connecter pour vérifier rapidement s'il n'y a pas un processus indésirable de lancé, pour charger les règles de mon pare feu et pour faire un check up rapide de choses à sécuriser en attendant de pouvoir enquêter plus tard dans la journée

Étant de sortie ce soir là, j'ai profité de mon trajet en RER pour lancer un tcpdump sur le serveur. J'ai tout de suite compris où était le problème, je recevais entre 600 et 1000 paquets par seconde alors que je n'avais laissé ouverts que peu de services qui ne génèrent pas ce trafic en temps normal. Tcpdump m'a montré qu'il s'agissait de quelques hôtes (2-3 à ce moment là) lançant des séries de requêtes à tour de rôle par lot de plusieurs centaines sur le port 27960 en UDP.

Pour ceux qui font tourner des serveurs de jeux de type FPS, vous aurez certainement reconnu là le port par défaut utilisé par le moteur de Quake 3. J'ai justement sur cette machine un serveur Urban Terror (mod de Quake 3) qui utilise ce port. Je ne l'ai pas relancé depuis le reboot du matin et j'avais même bloqué ce port. Ne pouvant rien faire de plus, je laisse les choses telles quelles en attendant de pouvoir m'en occuper plus sérieusement.

Le lendemain, j'ai finalement le temps de m'en occuper. Pensant être victime d'une attaque de DoS, je commence à faire des recherches dans ce sens. Et je tombe d'abord sur l'article Application-Level Reflection Attacks. Dans un premier temps je me soucie peu du titre et je vais directement à l'endroit où il est question de Quake 3. J'en arrive à lire les points 4 et 5 qui me donnent l'intérêt technique de ces requêtes. Je n'ai par contre pas saisi toute la portée de l'attaque directement et je n'ai même pas remarqué le terme "DRDoS".

Je continue mes recherches en allant cette fois directement sur les forums officiels d'Urban Terror et je tombe directement sur un sujet intitulé "DRDoS". Ne connaissant pas le terme mais voyant que c'est un type de déni de service, je vais voir ce qu'il s'y dit. Et là, bingo ! C'est en effet bel et bien le problème auquel je suis confronté et qui affecte tous les serveurs de la communauté. Je parcours le sujet et vois qu'un patch officiel est disponible. Au cours de la discussion, l'article sur lequel j'étais d'abord tombé est mentionné. Je décide donc d'y retourner pour le lire en entier.

Cette fois-ci, j'ai compris toute la portée de l'attaque et sa gravité. Pour expliquer rapidement la technique utilisée, les serveur de jeux fournissent aux clients des commandes pour obtenir des informations sur le serveur (joueurs en ligne, carte jouée, etc.). Dans le cas d'un FPS, l'interaction en temps réel prime. Ces serveurs utilisent donc UDP plutôt que TCP pour avoir le meilleur temps de réponse possible. Ils fournissent ces commandes via UDP également donc pas besoin d'initialiser de connexion pour faire la requête. Le paquet contenant la requête fait environ 60 octets. Le paquet contenant la réponse fait environ en moyenne 500 octets. Donc en envoyant massivement des requêtes, on reçoit 10 fois plus de données que l'on en envoie. Sachant qu'il existe plusieurs milliers de serveurs de jeux, il est possible de répartir des requêtes sur tous ces serveurs pour avoir encore plus de réponses. Voilà pour la partie technique pure. Maintenant, ce mécanisme exploité d'une certaine manière permet d'attaquer des cibles au choix avec une attaque DRDoS (Distributed Reflection Denial of Service). Au début, je pensais être la victime de cette attaque, mais en fait, aux yeux de la machine ciblée, je suis un des attaquants dans ce déni de service.

Le ou les attaquants réels vont d'abord récupérer la liste des serveurs existants auprès du master server (mécanisme dans lequel les serveurs se notifient auprès des masters pour pouvoir être listés par les clients). Ensuite chaque attaquant va envoyer constamment à tous les serveurs de la liste la requête vue précédemment en ayant pris soin de modifier le paquet à émettre en remplaçant leur adresse dans le champ adresse source du paquet par celle de la machine ciblée pour l'attaque. Chaque serveur reçoit une requête, et renvoie la réponse à l'adresse source renseignée dans le paquet, celle de la victime. En supposant qu'il y ai 100 attaquants envoyant 1paquet/s à 1000 serveurs simultanément, chaque attaquant envoie 1000 paquets de 60 octets par seconde donc un débit de 59ko/s (tout a fait réalisable avec une connexion ADSL classique) et la cible recevra 100 000 paquets de 500 octets par seconde donc un débit de 48Mo/s. S'il s'agit d'un particulier, sur une connexion ADSL classique, celle-ci se fait directement saturer. S'il s'agit d'un serveur avec une connexion 100Mbps, elle sera également saturée. En ce qui concerne un connexion 1Gbps ou 10Gbps, il faudra soit augmenter le nombre de paquets par seconde envoyés par les attaquants, soit augmenter le nombre d'attaquants. Dans tous les cas, la quantité de données générée est impressionnante.

Cette attaque a plusieurs choses d'horrible. Tout d'abord, les paquets ne contiennent pas l'adresse de l'attaquant réel. Pour savoir d'où vient l'attaque, il faudrait remonter toute la chaine de routage du paquet en se basant sur les adresses matériel mais le serveur utilisé pour la réflection ne peut pas connaître directement l'origine réelle du paquet. Ensuite, chaque serveur doit gérer ce trafic parasite. Il entraîne en général du lag pour les joueurs et dans certains cas (le mien apparemment) enclenche le blocage du port réseau par sécurité. Enfin, du point de vue de la victime, ce sont les serveurs de jeu qui ont réalisé le déni de service. Ce sont donc eux les coupables.

Au final, j'ai mis à jour mon serveur Urban Terror avec le patch officiel. Il limite le nombre de requêtes par IP sur un temps donné. J'ai lancé iftop avant le patch et après le patch pour voir son effet et le résultat est sans appel. 4 à 8Mo/s de trafic généré sur la voie montante pour un trafic de 400-600ko/s sur la voie descendante avant le patch. Après le patch, même trafic sur la voie descendante mais 10 à 20ko/s sur la voie montante. Les choses sont maintenant rentrées dans l'ordre pour mon serveur même si je continue de recevoir 600 à 800 paquets par seconde à cause de cette attaque. Je n'ai plus qu'à attendre que tous les serveurs soient patchés pour que cette attaque ne soit plus réalisable avec des serveurs Urban Terror. Mais bon, avant UrT, les serveurs CoD 2 étaient exploités, et beaucoup d'autres sont encore exploitables vu le nombre de jeux basés sur le moteur de Quake 3.

Concernant le procédé de l'attaque, je suis déjà très partagé sur les attaques de type DoS et DDoS. D'un côté selon la cible de l'attaque je peux parfois avoir envie d'approuver un tel acte mais dans tous les cas je suis totalement contre le fait de chercher à mettre hors service un serveur, quel que soit le moyen utilisé et qu'elle qu'en soit la raison. Pour ce qui est des attaques de type DRDoS, je les trouve tout simplement inacceptables, surtout en voyant quelles sont les cibles de telles attaques. J'ai regardé un peu les IP ciblées, j'y ai vu un particulier aux Pays-Bas, un site amateur sur les voitures, un petit site professionnel aux États-Unis, etc. Clairement, tout ce que je vois ici ce sont des attaques soit automatiques et aléatoires soit simplement pour le plaisir de l'attaquant.