Comment le backend d'un jeu de hackers sur la destruction d'un serveur a été créé



Nous continuons à vous dire comment notre quête laser avec la destruction du serveur a été organisée. À partir de l' article précédent sur la résolution de la quête .



Au total, le backend du jeu comportait 6 unités architecturales, que nous analyserons dans cet article:



  1. Backend des entités de jeu responsables des mécanismes de jeu
  2. Bus d'échange de données backend et site sur VPS
  3. Traducteur des requêtes backend (éléments de jeu) vers arduino et matériel sur le site
  4. Arduino, qui était en charge du contrôle des relais, a reçu les commandes du traducteur et a fait le travail proprement dit
  5. Appareils réels: ventilateur, guirlandes, lampadaires, etc.
  6. Frontend - le site Falcon lui-même, à partir duquel les joueurs contrôlent les appareils


Passons en revue chacun d'eux.



Backend des entités de jeu



Le backend a été implémenté en tant qu'application de démarrage à ressort: il avait plusieurs contrôleurs de repos, un point de terminaison websocket et des services avec une logique de jeu.



Il n'y avait que trois contrôleurs:



  • Megatron. La page actuelle de Megatron a été envoyée via des requêtes GET: avant et après la mise sous tension. Le laser a déclenché une requête POST.
  • , . , ID .
  • , - .


Le point de terminaison Websocket a été utilisé pour contrôler les gadgets: lampes, guirlandes et lettres. Il a été choisi d'afficher de manière synchrone l'état actuel de l'appareil à tous les joueurs: qu'il soit allumé ou éteint, actif ou non, quelle couleur de la lettre est actuellement sur le mur. Afin de compliquer légèrement la tâche d'allumer le laser, nous avons lancé une autorisation sur la guirlande et le laser avec le même identifiant et mot de passe administrateur / administrateur.



Les joueurs pouvaient le tester en allumant la guirlande et en faisant de même avec le laser.



Nous avons choisi une telle paire de mots de passe de connexion triviale afin de ne pas tourmenter les joueurs avec une sélection inutile.



Pour rendre la tâche un peu plus intéressante, les identifiants d'objets de mongodb ont été utilisés comme identifiants des appareils dans la salle.



ObjectId contient un horodatage: deux valeurs aléatoires, dont l'une est prise en fonction de l'identifiant du périphérique et la seconde en fonction du processus pid qui le génère et de la valeur du compteur. Je voulais faire les identifiants générés à intervalles réguliers et à partir de différents processus pid, mais avec un compteur commun, pour que la sélection de l'identifiant du dispositif laser soit plus intéressante. Cependant, au final, tout le monde a commencé avec des identifiants qui ne diffèrent que par la valeur du compteur. Cela a peut-être rendu l'étape trop simple et n'a pas nécessité l'analyse de la structure des identificateurs objectId.



Traducteur des requêtes backend



Script Python qui traitait des minuteries et traduit des abstractions de jeu en un modèle physique. Par exemple, «allumer le lampadaire» → «activer le relais N2».



Le script s'est connecté à la file d'attente RabbitMQ et a transmis les demandes de la file d'attente à Arduino. Il a également mis en œuvre la logique d'allumage parallèle de la lumière: avec certains appareils, la lumière était allumée sur eux, par exemple, lorsque le Megatron était initialement alimenté, il était éclairé avec une lumière de scène. La conception de l'éclairage pour une scène cinématographique entière est une histoire distincte sur l'excellent travail de notre co-producteur de projet et concepteur de production Ilya Serov, et nous en parlerons dans un article séparé.



Le traducteur était également responsable de la logique de démarrage de la déchiqueteuse par minuterie et de transmission de l'image à la télévision: la minuterie pour démarrer la déchiqueteuse, le capybara hurlant, la publicité à la fin du jeu.



Comment la logique de génération du jeton mégatron a été organisée



Tir d'essai



Toutes les 25 secondes, un nouveau jeton était généré, il pouvait être utilisé pour allumer le laser pendant 10 secondes à une puissance de 10/255. Lien vers github avec le code Megatron .



Ensuite, le laser a été refroidi pendant 1 minute - à ce moment-là, il n'était pas disponible et n'acceptait pas de nouvelles demandes de tir.



Cette puissance n'était pas suffisante pour brûler la corde, mais n'importe quel joueur pouvait tirer depuis Megatron et voir le faisceau laser en action.



L'algorithme de hachage MD5 a été utilisé pour générer le jeton. Et le schéma était MD5 de MD5 + compteur + secret pour le jeton de combat et sans secret pour celui de test.



MD5 est une référence à un projet commercial réalisé par Pavel, notre backender. Il y a quelques années à peine, ce projet utilisait MD5, et quand il a dit à l'architecte du projet qu'il s'agissait d'un algorithme de chiffrement hérité, ils ont commencé à utiliser MD5 de MD5. Depuis que nous avons décidé de faire le maximum de projet Noob, il s'est souvenu de tout et a décidé de faire une petite référence.



Tir de combat



Le mode de combat de Megatron est une puissance laser de 100% 3W. Cela suffit pendant 2 minutes pour brûler la corde qui tenait le kettlebell pour casser l'aquarium et remplir le serveur d'eau.



Nous avons laissé plusieurs indices sur le github du projet: à savoir, le code de génération de jetons, par lequel il était possible de comprendre que les jetons de test et de combat sont générés sur la base du même indicateur de compteur. Dans le cas du jeton de combat, en plus de la valeur du compteur, le sel est également utilisé, ce qui a été presque complètement laissé dans l'histoire des changements dans cette substance, à l'exception des deux derniers caractères.



Connaissant ces données, il a été possible d'itérer sur les 2 derniers symboles de sel et de découvrir en fait que des nombres de Lost ont été utilisés pour cela, traduits dans le système à 16 chiffres.



Ensuite, les joueurs devaient attraper la valeur du compteur (en analysant le jeton de test) et générer un jeton de combat en utilisant la valeur de compteur suivante et le sel sélectionné à la dernière étape.



Le compteur était simplement incrémenté à chaque coup d'essai et toutes les 25 secondes. Nous n'avons écrit nulle part à ce sujet, cela aurait dû être une petite surprise.



Service d'interaction avec captcha



Dans le monde du jeu, c'était le même captcha qui devait être chargé pour allumer le ventilateur et ouvrir un paperboard avec un indice. Il y avait un ordinateur portable avec surveillance de la charge à côté de la caméra.







Le service a calculé les éléments à afficher dans la surveillance en tant que charge actuelle: température et ventilateur du processeur. Les métriques ont été transmises à la base de données de la base de temps et rendues dans grafana.



Si, au cours des 5 dernières secondes, plus de 50 demandes d'affichage captcha ont été reçues, la charge a augmenté par correction + un nombre aléatoire d'étapes. Le calcul était qu'une charge de 100% pouvait être obtenue en deux minutes.



En fait, il y avait plus de logique dans le service que ce qui était affiché dans le jeu final: nous avons réglé le moniteur de telle manière que seule la rotation du ventilateur du processeur était visible.



Au début de la quête, ils voulaient laisser Grafana accessible depuis le site Web de Sokol. Mais il contenait également des métriques Springboot pour le rapport de l'application backend, que nous n'avons pas eu le temps de nettoyer, nous avons donc décidé de fermer l'accès. Et à juste titre - au début de la quête, certains joueurs ont deviné que l'application était écrite dans le framework springboot et ont même déterré le nom de certains services.



Hébergement et bus de données



Un outil pour transférer des informations du backend vers le site, le serveur VPS sur lequel RabbitMQ a été lancé.



Le backend et le bus de données ont été conservés sur notre VPS . Sa puissance était comparable à celle de l'ordinateur que vous avez vu à l'écran: un VPS 2 cœurs avec 2 gigaoctets de RAM. Le tarif a été pris pour les ressources, car la charge de pointe n'était prévue que pour quelques jours - c'est ce que font nos clients, qui prévoient de charger VPS pour une courte période. Ensuite, il s'est avéré que la charge était plus élevée que prévu et qu'un tarif fixe serait plus rentable. Si vous allez faire une quête, choisissez les tarifs de la ligne turbo .



Pour protéger le serveur de DDoSa, nous avons utilisé Cloudflare.



Il faut dire que le VPS a tout résisté avec brio.



Arduino, qui était en charge du contrôle des relais, a reçu les commandes du traducteur et a fait le travail proprement dit



C'est plus un sujet pour le prochain article sur la partie matérielle du projet: le backend a simplement envoyé des requêtes pour activer un relais spécifique. Il se trouve que le backend connaissait presque toutes les entités et les requêtes de celui-ci ressemblaient à "activer cette entité". Nous l'avons fait pour les premiers tests du site (nous n'avions pas encore rassemblé tout l'Arduino et les relais), à la fin nous l'avons laissé ainsi.



L'extrémité avant



Nous avons rapidement créé le site sur tilde, cela a pris une journée de travail et nous a fait économiser 30 000 du budget.



Au départ, nous pensions simplement exporter le site et ajouter la logique qui nous manquait, mais nous nous sommes heurtés à des conditions d'utilisation qui nous interdisaient de le faire.



Nous n'étions pas prêts à violer la licence, il y avait donc deux options: tout inventer nous-mêmes ou contacter Tilda directement, parler du projet et demander la permission de changer le code.



Nous avons choisi la deuxième option et ils ne nous ont pas simplement rencontrés à mi-chemin, mais ils nous ont même donné un an de compte professionnel gratuit, ce dont nous sommes très reconnaissants. C'était très embarrassant de leur montrer la conception du site Web de Sokol.



En conséquence, nous avons attaché js-logic au frontend pour envoyer des requêtes aux appareils élémentaires, légèrement changé les styles des boutons pour activer et désactiver les éléments du jeu.



Conception du site



Historique de recherche, qui vaut un chapitre séparé.



Nous voulions créer non seulement un site démodé, mais un site absolument nauséabond qui enfreint toutes les règles de conception de base. Dans le même temps, il était important de préserver la crédibilité: il ne fallait pas casser les histoires ORL, démontrer la prétention de l'auteur, et les joueurs devraient croire qu'un tel site pouvait exister et même attirer des clients. Et il a apporté! Pendant que le jeu tournait, on nous a demandé à deux reprises de créer des sites Web.



Au début, j'ai fait le design moi-même, en essayant de coller plus de GIF et d'éléments brillants. Mais mon mari, un designer avec 10 ans d'expérience, a regardé par-dessus son épaule et l'a rejeté comme "trop ​​bon". Pour enfreindre les règles de conception, vous devez les connaître.







Il existe plusieurs combinaisons de couleurs qui provoquent une sensation persistante de dégoût: vert et rouge de jutosité égale, gris et rose, bleu plus brun. En conséquence, nous avons opté pour une combinaison de rouge et de vert comme couleurs de base, ajouté des gifs avec un chat et choisi 3-4 photos de Sokolov lui-même sur le stock de photos. Je n'avais que quelques exigences: un homme d'âge moyen, dans un costume mal ajusté quelques tailles plus grandes et dans la pose de "séance photo professionnelle en studio". Pour le test, ils l'ont montré à des amis et ont demandé: "Comment l'aimes-tu?"



Dans le processus de développement de la conception, mon mari a dû s'allonger toutes les demi-heures et a commencé à piloter un hélicoptère. Pasha a essayé d'ouvrir la console du développeur sur la majeure partie de l'écran, pendant qu'il terminait l'interface - il prenait soin de ses yeux.



Appareils réels



Les ventilateurs et les lumières ont été montés à travers des relais à semi-conducteurs afin qu'ils ne s'allument pas immédiatement à pleine puissance - de sorte que l'accumulation de puissance se produise en parallèle avec la surveillance.



Mais nous en parlerons dans le prochain article, à propos de la partie matérielle du jeu et de la construction réelle du site.



Restez à l'écoute!



Autres articles sur la quête avec la destruction du serveur








All Articles