Hoe die agterkant van 'n hacker-speletjie oor die vernietiging van 'n bediener geskep is

Hoe die agterkant van 'n hacker-speletjie oor die vernietiging van 'n bediener geskep is
Ons gaan voort om jou te vertel hoe ons lasersoektog met die vernietiging van die bediener gereël is. Begin in vorige artikel oor die oplossing van die soeke.

In totaal het die agterkant van die speletjie 6 argitektoniese eenhede gehad, wat ons in hierdie artikel sal ontleed:

  1. Agterkant van spel-entiteite wat verantwoordelik was vir spelmeganismes
  2. Backend- en werfdata-uitruilbus op VPS
  3. Vertaler van backend-versoeke (speletjie-elemente) na Arduino en hardeware op die terrein
  4. Arduino, wat verantwoordelik was vir die beheer van die aflos, het opdragte van die vertaler ontvang en die werklike werk gedoen
  5. Werklike toestelle: waaier, kranse, vloerlampe, ens.
  6. Frontend - die Falcon-webwerf self, waaruit spelers toestelle beheer het

Kom ons gaan deur elkeen van hulle.

Agterkant van speletjie-entiteite

Die agterkant is geïmplementeer as 'n veerboot-toepassing: dit het verskeie rusbeheerders, 'n websocket-eindpunt en dienste met spellogika gehad.

Daar was net drie beheerders:

  • Megatron. Die huidige Megatron-bladsy is deur AOO-versoeke gestuur: voor en nadat die krag aangeskakel is. Die laser het deur die POST-versoek afgevuur.
  • Kartering van tilde-bladsye sodat hulle deur bladsynaam bedien word. Tilde produseer bladsye vir uitvoer, nie met oorspronklike name nie, maar met interne ID en voldoeningsinligting.
  • Captcha-beheerder om pseudo-hoëlading-bediener-captcha te bedien.

Websocket eindpunt is gebruik om gadgets te beheer: lampe, krans en letters. Dit is gekies om sinchronies aan alle spelers die huidige status van die toestel te wys: of dit aan of af is, aktief of nie, watter kleur van die letter tans op die muur verlig is. Om die taak om die laser aan te skakel 'n bietjie moeiliker te maak, het ons magtiging by die krans en die laser gevoeg met dieselfde login en wagwoord admin/admin.

Spelers kan dit toets deur die krans aan te skakel en dieselfde met die laser te herhaal.

Ons het so 'n onbenullige login-wagwoordpaar gekies om nie spelers met onnodige keuse te pynig nie.

Om die taak 'n bietjie meer interessant te maak, is voorwerp-ID's van mongodb as toestelidentifiseerders in die kamer gebruik.

ObjectId bevat 'n tydstempel: twee ewekansige waardes, waarvan een geneem word op grond van die toestelidentifiseerder, en die tweede gebaseer op die pid van die proses wat dit genereer en die tellerwaarde. Ek wou die identifiseerders maak wat met gereelde tussenposes en met verskillende pid-prosesse gegenereer word, maar met 'n gemeenskaplike teller, sodat die keuse van 'n lasertoestel-identifiseerder interessanter sou wees. Maar op die ou end het almal begin met identifiseerders wat net in die tellerwaarde verskil het. Dit het dalk die stap te eenvoudig gemaak en nie ontleding van die objectId-struktuur vereis nie.

Vertaler van backend-versoeke

Python skrif, wat aan timers gewerk het en dit van spelabstraksies in 'n fisiese model vertaal het. Byvoorbeeld, "skakel die vloerlamp aan" → "skakel aflos N2 aan."

Die skrip het aan die RabbitMQ-tou gekoppel en versoeke van die tou na Arduino oorgedra. Dit het ook die logika van parallelle ligskakeling geïmplementeer: saam met sommige toestelle is die lig daarop aangeskakel, byvoorbeeld toe krag aanvanklik aan Megatron verskaf is, is dit met verhooglig verlig. Beligtingsontwerp vir die kinematografie van die hele toneel is 'n aparte storie oor die wonderlike werk van ons projek-medevervaardiger en produksie-ontwerper Ilya Serov, en ons sal daaroor in 'n aparte pos vertel.

Die vertaler was ook verantwoordelik vir die logika van die bekendstelling van die versnipperaar met behulp van 'n timer en die oordrag van die beeld na die TV: die tydhouer vir die bekendstelling van die versnipperaar, 'n skreeuende kapibara, 'n advertensie aan die einde van die speletjie.

Hoe die logika vir die generering van die Megatron-token gestruktureer is

Toetsskoot

Elke 25 sekondes is 'n nuwe teken gegenereer en kan gebruik word om die laser vir 10 sekondes teen 10/255 krag aan te skakel. Skakel na github met Megatron-kode.

Die laser het toe vir 1 minuut afgekoel – gedurende hierdie tyd was dit nie beskikbaar nie en het nie nuwe skootversoeke aanvaar nie.

Hierdie krag was nie genoeg om deur die tou te brand nie, maar enige speler kon Megatron afvuur en die laserstraal in aksie sien.

Die MD5 hashing-algoritme is gebruik om die teken te genereer. En die skema het uitgewerk MD5 vanaf MD5 + toonbank + geheim vir 'n gevegsteken en sonder 'n geheim vir 'n toetsteken.

MD5 is 'n verwysing na 'n kommersiële projek wat Pavel, ons backender, gedoen het. Net 'n paar jaar gelede het hierdie projek MD5 gebruik, en toe hy die projekargitek vertel dat dit 'n verouderde enkripsie-algoritme is, het hulle MD5 vanaf MD5 begin gebruik. Aangesien ons besluit het om die mees noob-projek moontlik te maak, het hy alles onthou en besluit om 'n klein verwysing te maak.

Gevegskoot

Megatron se gevegsmodus is 100% laserkrag teen 3 watt. Dit is genoeg vir 2 minute om deur die tou te brand wat die gewig gehou het, om die akwarium te breek en die bediener met water te oorstroom.

Ons het verskeie wenke oor die projek se Github gelaat: naamlik die tokengenerasiekode, waaruit mens kan verstaan ​​dat die toets- en gevegstekens gegenereer word op grond van dieselfde toonbankaanwyser. In die geval van 'n gevegsteken word, benewens die teenwaarde, ook 'n sout gebruik, wat byna heeltemal in die geskiedenis van die verandering van hierdie kern gelaat is, met die uitsondering van die laaste twee karakters.

Deur hierdie data te ken, was dit moontlik om deur die laaste 2 simbole van die sout te sorteer en eintlik uit te vind dat die getalle van Lost, omgeskakel na die heksadesimale stelsel, daarvoor gebruik is.

Toe moes die spelers die tellerwaarde vang (deur die toetsteken te ontleed) en 'n gevegsteken genereer deur die volgende tellerwaarde en die sout wat by die vorige stap gekies is, te gebruik.

Die teller het eenvoudig met elke toetsskoot en elke 25 sekondes toegeneem. Ons het nêrens hieroor geskryf nie, dit was veronderstel om 'n klein speletjie-verrassing te wees.

Captcha interaksie diens

In die spelwêreld was dit dieselfde captcha wat gelaai moes word om die waaier aan te skakel en die blaaibord met 'n wenk oop te maak. Langs die kamera was 'n skootrekenaar met vragmonitering.

Hoe die agterkant van 'n hacker-speletjie oor die vernietiging van 'n bediener geskep is

Service Ek het bereken wat om te vertoon in monitering as die huidige las: temperatuur en CPU Fan. Metrieke is na die tydbasisdatabasis oorgedra en deur grafana geteken.

As daar in die laaste 5 sekondes meer as 50 versoeke was om die captcha te vertoon, dan het die vrag met 'n vaste + ewekansige aantal stappe toegeneem. Die berekening was dat 100% las in twee minute bereik kon word.

Trouens, daar was meer logika in die diens as wat in die finale wedstryd vertoon is: ons het die monitor so geplaas dat slegs die rotasie van die CPU Fan sigbaar was.

Aan die begin van die soeke wou hulle Grafan toeganklik laat vanaf die Falcon-webwerf. Maar dit het ook springboot-statistieke van die backend-toepassingsverslag bevat, wat ons nie tyd gehad het om skoon te maak nie, so ons het besluit om toegang daartoe te blokkeer. En met reg - selfs aan die begin van die soeke het sommige spelers geraai dat die toepassing in die springboot-raamwerk geskryf is en selfs die name van sommige dienste opgegrawe.

Gasheer en databus

'n Hulpmiddel vir die oordrag van inligting vanaf die agterkant na die webwerf, die VPS-bediener waarop RabbitMQ geloop het.

Die agterkant en databus is aangehou ons VPS. Sy krag was vergelykbaar met die rekenaar wat jy op die skerm gesien het: 'n 2-kern VPS met twee gigagrepe RAM. Die tarief is vir hulpbronne gehef, aangesien die spitslading vir slegs 'n paar dae beplan is - dit is wat ons kliënte doen wat beplan om VPS vir 'n kort tydperk te laai. Toe blyk dit dat die vrag hoër is as wat ons verwag het, en 'n vaste tarief sal meer winsgewend wees. As jy 'n soeke doen, kies die lyntariewe turbo.

Om die bediener teen DDoSa te beskerm, het ons Cloudflare gebruik.

Dit is die moeite werd om te sê dat die VPS alles met eer deurstaan ​​het.

Arduino, wat verantwoordelik was vir die beheer van die aflos, het opdragte van die vertaler ontvang en die werklike werk gedoen

Dit is meer die onderwerp van die volgende artikel oor die hardeware-deel van die projek: die agterkant het eenvoudig versoeke gestuur om 'n spesifieke aflos aan te skakel. Dit het so gebeur dat die backend byna al die entiteite geken het en versoeke van dit het gelyk soos "skakel hierdie entiteit aan." Ons het dit gedoen vir vroeë toetsing van die werf (ons het nog nie al die Arduino en relais saamgestel nie), op die ou end het ons alles so gelos.

Voorkant

Ons het die webwerf vinnig op tilde geskep, dit het een werksdag geneem en ons 30 duisend op ons begroting bespaar.

Aanvanklik het ons gedink om bloot die webwerf uit te voer en die logika by te voeg wat ons mis, maar ons het teëgekom met terme van gebruik wat ons verbied het om dit te doen.

Ons was nie gereed om die lisensie te oortree nie, so daar was twee opsies: om alles self te implementeer of om Tilda direk te kontak, oor die projek te praat en toestemming te vra om die kode te verander.

Ons het die tweede opsie gekies en hulle het ons nie net halfpad ontmoet nie, maar het ons selfs 'n jaar se gratis besigheidsrekening gegee, waarvoor ons hulle baie dankbaar is. Dit was baie ongemaklik om vir hulle Sokol se webwerf-ontwerp te wys.

Gevolglik het ons js-logika aan die voorkant geheg om versoeke na elementêre toestelle te stuur, en die style van die knoppies vir die aan- en afskakel van speletjie-elemente effens verander.

Webwerf ontwerp

Die geskiedenis van soektogte, wat 'n aparte hoofstuk werd is.

Ons wou nie net 'n outydse webwerf skep nie, maar 'n absoluut walglike een wat al die basiese reëls van ontwerp oortree. Terselfdertyd was dit belangrik om geloofwaardigheid te handhaaf: dit moes nie die ENT-storie breek nie, die pretensieusheid van die skrywer demonstreer, en spelers sal moet glo dat so 'n webwerf kan bestaan ​​en selfs kliënte bring. En hy het dit gebring! Terwyl die speletjie aan die gang was, is ons twee keer gekontak om webwerwe te skep.

Ek het eers self die ontwerp gedoen en probeer om meer gifs en blink elemente in te sluit. Maar my ontwerpersman van 10 jaar het oor sy skouer gekyk en dit as "te goed" afgemaak. Om ontwerpreëls te breek, moet jy dit ken.

Hoe die agterkant van 'n hacker-speletjie oor die vernietiging van 'n bediener geskep is

Daar is verskeie kleurkombinasies wat 'n blywende gevoel van afsku wek: groen en rooi van gelyke rykdom, grys en pienk, blou plus bruin. Op die ou end het ons op 'n kombinasie van rooi en groen as die basiskleure besluit, gifs met 'n kat bygevoeg en 3-4 foto's van Sokolov self uit 'n voorraadfoto gekies. Ek het net 'n paar vereistes gehad: 'n middeljarige man, met 'n swakpassende pak 'n paar groottes te groot en in 'n "professionele ateljeefotosessie" pose. Vir die toets het hulle dit aan vriende gewys en gevra "hoe hou jy daarvan?"

Tydens die ontwerpontwikkelingsproses moes my man elke halfuur gaan lê die helikopter het begin vlieg. Pasha het probeer om die ontwikkelaarkonsole op die meeste van die skerm oop te maak terwyl hy klaargemaak het met die voorkant – om sy oë te beskerm.

Werklike toestelle

Die waaiers en ligte is deur vastestof-relais gemonteer sodat dit nie dadelik op volle krag sou aanskakel nie – sodat die krag parallel met monitering sou toeneem.

Maar ons sal in die volgende pos hieroor praat, oor die hardeware-deel van die spel en die werklike konstruksie van die webwerf.

Bly ingeskakel!

Ander artikels oor die soeke met die vernietiging van die bediener

Hoe die agterkant van 'n hacker-speletjie oor die vernietiging van 'n bediener geskep is

Bron: will.com

Voeg 'n opmerking