Hoe de backend van een hackergame over het vernietigen van een server tot stand kwam

Hoe de backend van een hackergame over het vernietigen van een server tot stand kwam
We blijven vertellen hoe onze laserzoektocht met het vernietigen van de server is geregeld. Begin in vorige artikel over het oplossen van de zoektocht.

In totaal had de backend van het spel 6 architecturale eenheden, die we in dit artikel zullen analyseren:

  1. Backend van game-entiteiten die verantwoordelijk waren voor spelmechanismen
  2. Backend- en sitegegevensuitwisselingsbus op VPS
  3. Vertaler van backend aanvragen (spelelementen) naar Arduino en hardware op locatie
  4. Arduino, die verantwoordelijk was voor de aansturing van de relais, kreeg opdrachten van de vertaler en deed het eigenlijke werk
  5. Werkelijke apparaten: ventilator, slingers, staande lampen, enz.
  6. Frontend - de Falcon-website zelf, van waaruit spelers apparaten besturen

Laten we ze allemaal doornemen.

Backend van game-entiteiten

De backend werd geïmplementeerd als een springboot-applicatie: deze had verschillende restcontrollers, een websocket-eindpunt en services met gamelogica.

Er waren slechts drie controllers:

  • Megatron. De huidige Megatron-pagina werd verzonden via GET-verzoeken: voor en na het inschakelen van de stroom. De laser schoot via het POST-verzoek.
  • Tilde-pagina's in kaart brengen, zodat ze worden weergegeven op paginanaam. Tilde produceert pagina's voor export, niet met originele namen, maar met interne ID- en compliance-informatie.
  • Captcha-controller voor pseudo-high-load servercaptcha.

Het Websocket-eindpunt werd gebruikt om gadgets te bedienen: lampen, slingers en brieven. Er is voor gekozen om de huidige status van het apparaat synchroon aan alle spelers weer te geven: of het aan of uit staat, actief of niet, welke kleur van de letter momenteel op de muur brandt. Om het inschakelen van de laser iets moeilijker te maken, hebben we autorisatie voor de slinger en de laser toegevoegd met dezelfde login en hetzelfde wachtwoord admin/admin.

Spelers konden het testen door de slinger aan te zetten en hetzelfde te herhalen met de laser.

We hebben voor zo'n triviaal login-wachtwoordpaar gekozen om spelers niet te kwellen met onnodige selectie.

Om de taak wat interessanter te maken, werden object-ID's van mongodb gebruikt als apparaatidentificatie in de ruimte.

ObjectId bevat een tijdstempel: twee willekeurige waarden, waarvan er één wordt genomen op basis van de apparaat-ID, en de tweede op basis van de pid van het proces dat deze genereert en de tellerwaarde. Ik wilde de identificatiegegevens met regelmatige tussenpozen en met verschillende pid-processen laten genereren, maar met een gemeenschappelijke teller, zodat de selectie van een laserapparaat-ID interessanter zou zijn. Uiteindelijk begon iedereen echter met identificatiegegevens die alleen verschilden in de tellerwaarde. Dit heeft de stap mogelijk te eenvoudig gemaakt en vereist geen analyse van de objectId-structuur.

Vertaler van backend-aanvragen

Python-script, die aan timers werkte en deze van gaming-abstracties vertaalde naar een fysiek model. Bijvoorbeeld: “zet de vloerlamp aan” → “zet relais N2 aan.”

Het script was verbonden met de RabbitMQ-wachtrij en bracht verzoeken van de wachtrij over naar Arduino. Het implementeerde ook de logica van parallelle lichtschakeling: samen met sommige apparaten werd het licht erop ingeschakeld, toen Megatron voor het eerst stroom kreeg, werd het verlicht met podiumlicht. Lichtontwerp voor de cinematografie van de hele scène is een apart verhaal over het geweldige werk van onze projectcoproducent en productieontwerper Ilya Serov, en we zullen erover vertellen in een aparte post.

De vertaler was ook verantwoordelijk voor de logica van het starten van de versnipperaar met behulp van een timer en het verzenden van het beeld naar de tv: de timer voor het starten van de versnipperaar, een schreeuwende capibara, een reclamespot aan het einde van het spel.

Hoe de logica voor het genereren van het Megatron-token was gestructureerd

Proefopname

Elke 25 seconden werd er een nieuw token gegenereerd, waarmee de laser 10 seconden lang op 10/255 vermogen kon worden ingeschakeld. Link naar github met Megatron-code.

De laser koelde vervolgens gedurende 1 minuut af - gedurende deze tijd was hij niet beschikbaar en accepteerde hij geen nieuwe opnameverzoeken.

Deze kracht was niet genoeg om door het touw te branden, maar elke speler kon Megatron afvuren en de laserstraal in actie zien.

Het MD5-hashing-algoritme werd gebruikt om het token te genereren. En het plan werkte MD5 vanaf MD5 + teller + geheim voor een gevechtsfiche en zonder geheim voor een testfiche.

MD5 is een verwijzing naar een commercieel project dat Pavel, onze backender, deed. Nog maar een paar jaar geleden gebruikte dit project MD5, en toen hij de projectarchitect vertelde dat het een verouderd versleutelingsalgoritme was, begonnen ze MD5 van MD5 te gebruiken. Omdat we besloten om een ​​zo noob-project mogelijk te maken, herinnerde hij zich alles en besloot een kleine referentie te maken.

Gevechtsschot

De gevechtsmodus van Megatron is 100% laservermogen bij 3 watt. Dit is genoeg om gedurende 2 minuten het touw dat het gewicht vasthield door te branden, het aquarium te breken en de server met water te laten overspoelen.

We hebben verschillende hints achtergelaten op de Github van het project: namelijk de code voor het genereren van tokens, waaruit men zou kunnen begrijpen dat de test- en gevechtstokens worden gegenereerd op basis van dezelfde tellerindicator. In het geval van een gevechtstoken wordt naast de tegenwaarde ook een salt gebruikt, die vrijwel volledig achterblijft in de veranderingsgeschiedenis van deze essentie, met uitzondering van de laatste twee karakters.

Met deze gegevens was het mogelijk om de laatste 2 symbolen van het zout te doorzoeken en er daadwerkelijk achter te komen dat de getallen uit Lost, omgezet naar het hexadecimale systeem, daarvoor werden gebruikt.

Vervolgens moesten de spelers de waarde van de teller opvangen (door het testtoken te analyseren) en een gevechtsfiche genereren met de volgende waarde van de teller en het zout dat in de laatste stap was geselecteerd.

De teller werd eenvoudigweg verhoogd bij elke testopname en elke 25 seconden. We hebben hier nergens over geschreven, het was bedoeld als een kleine spelverrassing.

Captcha-interactieservice

In de gamewereld was dit dezelfde captcha die moest worden geladen om de ventilator aan te zetten en de flipchart met een hint te openen. Naast de camera stond een laptop met belastingmonitoring.

Hoe de backend van een hackergame over het vernietigen van een server tot stand kwam

Dienst Ik heb berekend wat ik bij de monitoring moet weergeven als de huidige belasting: temperatuur en CPU-ventilator. De statistieken werden overgebracht naar de tijdbasisdatabase en getekend door grafana.

Als er in de afgelopen 5 seconden meer dan 50 verzoeken zijn geweest om de captcha weer te geven, wordt de belasting verhoogd met een vast + willekeurig aantal stappen. De berekening was dat in twee minuten een belasting van 100% kon worden bereikt.

Sterker nog, er zat meer logica in de service dan er in de uiteindelijke game werd weergegeven: we plaatsten de monitor zo dat alleen de rotatie van de CPU-ventilator zichtbaar was.

Aan het begin van de zoektocht wilden ze Grafan toegankelijk laten via de Falcon-website. Maar het bevatte ook springboot-statistieken uit het backend-applicatierapport, waarvoor we geen tijd hadden om het te wissen, dus besloten we de toegang daartoe te blokkeren. En terecht - zelfs aan het begin van de zoektocht vermoedden sommige spelers dat de applicatie in het springboot-framework was geschreven en hebben ze zelfs de namen van sommige services opgegraven.

Hosting en databus

Een tool voor het overbrengen van informatie van de backend naar de site, de VPS-server waarop RabbitMQ draaide.

De backend en databus bleven ingeschakeld onze VPS. De kracht was vergelijkbaar met de computer die je op het scherm zag: een 2-core VPS met twee gigabyte RAM. Het tarief werd in rekening gebracht voor resources, aangezien de piekbelasting slechts voor een paar dagen was gepland - dit is wat onze klanten doen die van plan zijn VPS voor een korte periode te laden. Toen bleek dat de belasting hoger was dan we hadden verwacht en dat een vast tarief winstgevender zou zijn. Als u een zoektocht doet, kiest u de lijntarieven turbo.

Om de server tegen DDoSa te beschermen, hebben we Cloudflare gebruikt.

Het is de moeite waard om te zeggen dat de VPS alles met eer heeft doorstaan.

Arduino, die verantwoordelijk was voor de aansturing van de relais, kreeg opdrachten van de vertaler en deed het eigenlijke werk

Dit is meer het onderwerp van het volgende artikel over het hardwaregedeelte van het project: de backend stuurde eenvoudigweg verzoeken om een ​​specifiek relais in te schakelen. Het gebeurde zo dat de backend bijna alle entiteiten kende en verzoeken ervan leken op “zet deze entiteit aan”. We hebben dit gedaan voor het vroeg testen van de site (we hadden nog niet alle Arduino en relais gemonteerd), uiteindelijk hebben we alles zo gelaten.

Voorkant

We hebben de site snel op tilde gemaakt, het kostte één werkdag en bespaarde ons 30 duizend op ons budget.

In eerste instantie dachten we erover om simpelweg de site te exporteren en de logica toe te voegen die we misten, maar we kwamen gebruiksvoorwaarden tegen die ons dit verboden.

We waren nog niet klaar om de licentie te schenden, dus er waren twee opties: alles zelf implementeren of rechtstreeks contact opnemen met Tilda, praten over het project en toestemming vragen om de code te wijzigen.

Wij kozen voor de tweede optie en ze hebben ons niet alleen halverwege ontmoet, maar ons zelfs een jaar lang gratis zakelijk account gegeven, waarvoor we ze erg dankbaar zijn. Het was erg lastig om hen het websiteontwerp van Sokol te laten zien.

Als gevolg hiervan hebben we js-logica aan de frontend toegevoegd voor het verzenden van verzoeken naar elementaire apparaten, en hebben we de stijlen van de knoppen voor het in- en uitschakelen van spelelementen enigszins gewijzigd.

Website ontwerp

De geschiedenis van zoekopdrachten, die een apart hoofdstuk waard is.

We wilden niet alleen een ouderwetse site maken, maar een absoluut walgelijke site die alle basisregels van ontwerp schendt. Tegelijkertijd was het belangrijk om de geloofwaardigheid te behouden: het mocht het KNO-verhaal niet breken, de pretentie van de auteur aantonen, en spelers zouden moeten geloven dat zo'n site zou kunnen bestaan ​​​​en zelfs klanten zou kunnen opleveren. En hij heeft het meegenomen! Terwijl het spel aan de gang was, werden we twee keer gecontacteerd om websites te maken.

In eerste instantie deed ik het ontwerp zelf, in een poging meer gifs en glimmende elementen toe te voegen. Maar mijn ontwerper-echtgenoot van 10 jaar keek over zijn schouder en deed het af als ‘te goed’. Om ontwerpregels te overtreden, moet je ze kennen.

Hoe de backend van een hackergame over het vernietigen van een server tot stand kwam

Er zijn verschillende kleurencombinaties die een blijvend gevoel van walging oproepen: groen en rood van gelijke rijkdom, grijs en roze, blauw plus bruin. Uiteindelijk hebben we gekozen voor een combinatie van rood en groen als basiskleuren, gifs met een kat toegevoegd en 3-4 foto's van Sokolov zelf geselecteerd uit een stockfoto. Ik had maar een paar vereisten: een man van middelbare leeftijd, gekleed in een slecht passend pak dat een paar maten te groot was en in een 'professionele studiofotoshoot'-pose. Voor de test lieten ze het aan vrienden zien en vroegen: "Wat vind je ervan?"

Tijdens het ontwerpontwikkelingsproces moest mijn man elk half uur gaan liggen; de helikopter begon te vliegen. Pasha probeerde de ontwikkelaarsconsole voor het grootste deel van het scherm te openen terwijl hij klaar was met het afwerken van de frontend - om zijn ogen te beschermen.

Echte apparaten

De ventilatoren en lampen werden via solid-state relais gemonteerd, zodat ze niet onmiddellijk op vol vermogen zouden inschakelen - zodat het vermogen parallel met de monitoring zou toenemen.

Maar we zullen hierover in de volgende post praten, over het hardwaregedeelte van het spel en de daadwerkelijke constructie van de site.

Stay tuned!

Andere artikelen over de zoektocht om de server te vernietigen

Hoe de backend van een hackergame over het vernietigen van een server tot stand kwam

Bron: www.habr.com

Voeg een reactie