Wie das Backend eines Hackerspiels zur Zerstörung eines Servers entstand

Wie das Backend eines Hackerspiels zur Zerstörung eines Servers entstand
Wir erzählen Ihnen weiterhin, wie unsere Laserquest mit der Zerstörung des Servers ablief. Beginnen Sie im vorherigen Artikel über die Lösung der Quest.

Insgesamt verfügte das Backend des Spiels über 6 Architektureinheiten, die wir in diesem Artikel analysieren werden:

  1. Backend von Spieleinheiten, die für Spielmechanismen verantwortlich waren
  2. Backend- und Site-Datenaustauschbus auf VPS
  3. Übersetzer von Backend-Anfragen (Spielelemente) zu Arduino und Hardware vor Ort
  4. Arduino, das für die Steuerung der Relais zuständig war, empfing Befehle vom Übersetzer und erledigte die eigentliche Arbeit
  5. Tatsächliche Geräte: Ventilator, Girlanden, Stehlampen usw.
  6. Frontend – die Falcon-Website selbst, von der aus Spieler Geräte steuern

Lassen Sie uns jeden einzelnen davon durchgehen.

Backend von Spieleinheiten

Das Backend wurde als Spring-Boot-Anwendung implementiert: Es verfügte über mehrere Rest-Controller, einen Websocket-Endpunkt und Dienste mit Spielelogik.

Es gab nur drei Controller:

  • Megatron. Die aktuelle Megatron-Seite wurde über GET-Anfragen gesendet: vor und nach dem Einschalten. Der Laser wurde durch die POST-Anfrage abgefeuert.
  • Tilde-Seiten so zuordnen, dass sie nach Seitennamen bereitgestellt werden. Tilde erstellt Seiten für den Export nicht mit Originalnamen, sondern mit interner ID und Compliance-Informationen.
  • Captcha-Controller zur Bereitstellung von Pseudo-Hochlast-Server-Captcha.

Der Websocket-Endpunkt wurde zur Steuerung von Geräten verwendet: Lampen, Girlanden und Briefe. Es wurde gewählt, um allen Spielern synchron den aktuellen Status des Geräts anzuzeigen: ob es an oder aus ist, aktiv oder nicht, welche Farbe des Buchstabens gerade an der Wand leuchtet. Um das Einschalten des Lasers etwas zu erschweren, haben wir die Autorisierung für die Girlande und den Laser mit demselben Login und Passwort admin/admin hinzugefügt.

Spieler konnten es testen, indem sie die Girlande einschalteten und dasselbe mit dem Laser wiederholten.

Wir haben ein so triviales Login-Passwort-Paar gewählt, um Spieler nicht mit unnötiger Auswahl zu quälen.

Um die Aufgabe etwas interessanter zu gestalten, wurden Objekt-IDs von mongodb als Gerätekennungen im Raum verwendet.

ObjectId enthält einen Zeitstempel: zwei Zufallswerte, von denen einer basierend auf der Gerätekennung und der zweite basierend auf der PID des Prozesses, der ihn generiert, und dem Zählerwert ermittelt wird. Ich wollte, dass die Kennungen in regelmäßigen Abständen und mit unterschiedlichen PID-Prozessen generiert werden, aber mit einem gemeinsamen Zähler, damit die Auswahl einer Lasergerätekennung interessanter wird. Am Ende starteten jedoch alle mit Identifikatoren, die sich nur im Zählerwert unterschieden. Dies hat den Schritt möglicherweise zu einfach gemacht und erfordert keine Analyse der objectId-Struktur.

Übersetzer von Backend-Anfragen

Python-Skript, der an Timern arbeitete und sie von Gaming-Abstraktionen in ein physisches Modell übersetzte. Beispiel: „Stehlampe einschalten“ → „Relais N2 einschalten“.

Das Skript stellte eine Verbindung zur RabbitMQ-Warteschlange her und übertrug Anforderungen aus der Warteschlange an Arduino. Es implementierte auch die Logik des parallelen Lichtschaltens: Bei einigen Geräten wurde das Licht eingeschaltet, beispielsweise wurde Megatron bei der ersten Stromversorgung mit Bühnenlicht beleuchtet. Das Lichtdesign für die Kinematographie der gesamten Szene ist eine separate Geschichte über die großartige Arbeit unseres Projekt-Co-Produzenten und Produktionsdesigners Ilya Serov, über die wir in einem separaten Beitrag berichten werden.

Der Übersetzer war auch für die Logik verantwortlich, den Shredder mithilfe eines Timers zu starten und das Bild an den Fernseher zu übertragen: den Timer zum Starten des Shredders, ein schreiendes Wasserschwein, einen Werbespot am Ende des Spiels.

Wie die Logik zur Generierung des Megatron-Tokens aufgebaut war

Testaufnahme

Alle 25 Sekunden wurde ein neuer Token generiert, mit dem der Laser für 10 Sekunden bei 10/255 Leistung eingeschaltet werden konnte. Link zu Github mit Megatron-Code.

Anschließend kühlte der Laser für 1 Minute ab – während dieser Zeit war er nicht verfügbar und nahm keine neuen Schussanfragen entgegen.

Diese Kraft reichte nicht aus, um das Seil zu durchbrennen, aber jeder Spieler konnte Megatron abfeuern und den Laserstrahl in Aktion sehen.

Zur Generierung des Tokens wurde der MD5-Hashing-Algorithmus verwendet. Und der Plan ist aufgegangen MD5 von MD5 + Zähler + Geheimnis für einen Kampftoken und ohne Geheimnis für einen Testtoken.

MD5 ist eine Anspielung auf ein kommerzielles Projekt, das Pavel, unser Backender, durchgeführt hat. Noch vor ein paar Jahren verwendete dieses Projekt MD5, und als er dem Projektarchitekten mitteilte, dass es sich um einen veralteten Verschlüsselungsalgorithmus handele, begannen sie, MD5 von MD5 zu verwenden. Da wir beschlossen hatten, das Projekt so noob wie möglich zu machen, erinnerte er sich an alles und beschloss, eine kleine Referenz zu machen.

Kampfschuss

Der Kampfmodus von Megatron besteht aus 100 % Laserleistung bei 3 Watt. Dies reicht für 2 Minuten, um das Seil, das das Gewicht hielt, zu durchbrennen, das Aquarium zu zerstören und den Server mit Wasser zu überfluten.

Wir haben ein paar Hinweise auf dem Github des Projekts hinterlassen: nämlich den Token-Generierungscode, aus dem man erkennen kann, dass die Test- und Kampf-Tokens auf der Grundlage desselben Zählerindikators generiert werden. Im Falle eines Kampftokens wird neben dem Gegenwert auch ein Salz verwendet, das mit Ausnahme der letzten beiden Zeichen fast vollständig in der Änderungsgeschichte dieses Wesens verbleibt.

Mit Kenntnis dieser Daten war es möglich, die letzten beiden Symbole des Salzes zu sortieren und tatsächlich herauszufinden, dass dafür die in das Hexadezimalsystem umgewandelten Zahlen aus Lost verwendet wurden.

Dann mussten die Spieler den Zählerwert ermitteln (durch Analyse des Testmarkers) und unter Verwendung des nächsten Zählerwerts und des im vorherigen Schritt ausgewählten Salzes einen Kampfmarker generieren.

Der Zähler wurde einfach bei jedem Testschuss und alle 25 Sekunden erhöht. Darüber haben wir nirgendwo geschrieben, es sollte eine kleine Spielüberraschung sein.

Captcha-Interaktionsdienst

In der Gaming-Welt war dies dasselbe Captcha, das geladen werden musste, um den Lüfter einzuschalten und das Flipchart mit einem Hinweis zu öffnen. Neben der Kamera stand ein Laptop mit Auslastungsüberwachung.

Wie das Backend eines Hackerspiels zur Zerstörung eines Servers entstand

Service Ich habe berechnet, was als aktuelle Auslastung im Monitoring angezeigt werden soll: Temperatur und CPU-Lüfter. Die Metriken wurden in die Zeitbasisdatenbank übertragen und von Grafana gezeichnet.

Wenn es in den letzten 5 Sekunden mehr als 50 Anfragen zur Anzeige des Captchas gab, dann erhöhte sich die Last um eine feste + zufällige Anzahl von Schritten. Die Berechnung lautete, dass 100 % Auslastung in zwei Minuten erreicht werden könnten.

Tatsächlich steckte mehr Logik in dem Dienst, als im fertigen Spiel dargestellt wurde: Wir haben den Monitor so platziert, dass nur die Drehung des CPU-Lüfters sichtbar war.

Zu Beginn der Quest wollten sie Grafan über die Falcon-Website zugänglich machen. Es enthielt aber auch Springboot-Metriken aus dem Backend-Anwendungsbericht, für deren Löschung wir keine Zeit hatten, weshalb wir beschlossen, den Zugriff darauf zu blockieren. Und das zu Recht – schon zu Beginn der Quest vermuteten einige Spieler, dass die Anwendung im Springboot-Framework geschrieben war, und gruben sogar die Namen einiger Dienste aus.

Hosting und Datenbus

Ein Tool zum Übertragen von Informationen vom Backend zur Site, dem VPS-Server, auf dem RabbitMQ ausgeführt wurde.

Das Backend und der Datenbus blieben eingeschaltet unser VPS. Seine Leistung war vergleichbar mit dem Computer, den Sie auf dem Bildschirm sahen: ein 2-Core-VPS mit zwei Gigabyte RAM. Der Tarif wurde für Ressourcen berechnet, da die Spitzenlast nur für wenige Tage geplant war – so machen es unsere Kunden, die VPS für kurze Zeit laden möchten. Dann stellte sich heraus, dass die Auslastung höher war als erwartet und ein Festtarif rentabler wäre. Wenn Sie eine Quest erledigen, wählen Sie die Linientarife Turbo.

Um den Server vor DDoSa zu schützen, haben wir Cloudflare verwendet.

Es ist erwähnenswert, dass der VPS alles mit Ehre überstanden hat.

Arduino, das für die Steuerung der Relais zuständig war, empfing Befehle vom Übersetzer und erledigte die eigentliche Arbeit

Dies ist eher das Thema des nächsten Artikels über den Hardware-Teil des Projekts: Das Backend sendete einfach Anfragen zum Einschalten eines bestimmten Relais. Zufällig kannte das Backend fast alle Entitäten und Anfragen von ihm sahen aus wie „Diese Entität einschalten“. Wir haben dies für einen frühen Test der Website getan (wir hatten noch nicht alle Arduinos und Relais zusammengebaut), am Ende haben wir alles so gelassen.

Frontend

Wir haben die Website schnell auf Tilde erstellt, es dauerte einen Arbeitstag und wir haben 30 Euro an unserem Budget eingespart.

Anfangs dachten wir darüber nach, die Seite einfach zu exportieren und die fehlende Logik hinzuzufügen, aber wir stießen auf Nutzungsbedingungen, die uns dies untersagten.

Wir waren nicht bereit, die Lizenz zu verletzen, daher gab es zwei Möglichkeiten: alles selbst zu implementieren oder Tilda direkt zu kontaktieren, über das Projekt zu sprechen und um Erlaubnis zur Änderung des Codes zu bitten.

Wir entschieden uns für die zweite Option und sie kamen uns nicht nur auf halbem Weg entgegen, sondern schenkten uns sogar ein Jahr kostenloses Geschäftskonto, wofür wir ihnen sehr dankbar sind. Es war sehr umständlich, ihnen das Website-Design von Sokol zu zeigen.

Aus diesem Grund haben wir dem Frontend eine js-Logik hinzugefügt, um Anfragen an elementare Geräte zu senden, und die Stile der Schaltflächen zum Ein- und Ausschalten von Spielelementen leicht geändert.

Дизайн сайта

Die Geschichte der Suchanfragen, die ein eigenes Kapitel wert ist.

Wir wollten nicht nur eine altmodische Website erstellen, sondern eine absolut eklige Website, die gegen alle Grundregeln des Designs verstößt. Gleichzeitig war es wichtig, die Glaubwürdigkeit aufrechtzuerhalten: Es durfte die HNO-Geschichte nicht zerstören, die Anmaßung des Autors demonstrieren und die Spieler mussten glauben, dass eine solche Website existieren und sogar Kunden anziehen könnte. Und er hat es mitgebracht! Während das Spiel lief, wurden wir zweimal kontaktiert, um Websites zu erstellen.

Zuerst habe ich das Design selbst gemacht und versucht, mehr GIFs und glänzende Elemente einzubauen. Aber mein Designer-Ehemann, mit dem ich seit 10 Jahren verheiratet bin, schaute über die Schulter und tat es als „zu gut“ ab. Um Designregeln zu brechen, müssen Sie sie kennen.

Wie das Backend eines Hackerspiels zur Zerstörung eines Servers entstand

Es gibt mehrere Farbkombinationen, die ein anhaltendes Ekelgefühl hervorrufen: Grün und Rot von gleicher Intensität, Grau und Rosa, Blau plus Braun. Am Ende entschieden wir uns für eine Kombination aus Rot und Grün als Grundfarben, fügten GIFs mit einer Katze hinzu und wählten aus einem Stockfoto 3-4 Fotos von Sokolov selbst aus. Ich hatte nur ein paar Anforderungen: einen Mann mittleren Alters, der einen schlecht sitzenden Anzug trug, der ein paar Nummern zu groß war, und in einer „professionellen Studio-Fotoshooting“-Pose. Zum Test zeigten sie es Freunden und fragten: „Wie gefällt es dir?“

Während der Designentwicklung musste sich mein Mann jede halbe Stunde hinlegen, der Helikopter begann zu fliegen. Pasha versuchte, die Entwicklerkonsole auf den größten Teil des Bildschirms zu öffnen, während er mit der Fertigstellung des Frontends fertig war – um seine Augen zu schützen.

Tatsächliche Geräte

Die Lüfter und Lichter wurden über Halbleiterrelais montiert, sodass sie sich nicht sofort bei voller Leistung einschalteten – sodass die Leistung parallel zur Überwachung anstieg.

Aber darüber sprechen wir im nächsten Beitrag, über den Hardware-Teil des Spiels und den eigentlichen Aufbau der Seite.

Bleib dran!

Weitere Artikel über die Suche nach der Zerstörung des Servers

Wie das Backend eines Hackerspiels zur Zerstörung eines Servers entstand

Source: habr.com

Kommentar hinzufügen