Paano nilikha ang backend ng laro ng hacker tungkol sa pagsira sa isang server

Paano nilikha ang backend ng laro ng hacker tungkol sa pagsira sa isang server
Patuloy naming sasabihin sa iyo kung paano inayos ang aming laser quest sa pagkasira ng server. Magsimula sa nakaraan artikulo tungkol sa paglutas ng paghahanap.

Sa kabuuan, ang backend ng laro ay mayroong 6 na yunit ng arkitektura, na susuriin namin sa artikulong ito:

  1. Backend ng mga entity ng laro na responsable para sa mga mekanismo ng laro
  2. Backend at site data exchange bus sa VPS
  3. Tagasalin mula sa mga kahilingan sa backend (mga elemento ng laro) hanggang sa Arduino at hardware sa site
  4. Ang Arduino, na responsable sa pagkontrol sa mga relay, ay nakatanggap ng mga utos mula sa tagasalin at ginawa ang aktwal na gawain
  5. Mga aktwal na device: bentilador, garland, floor lamp, atbp.
  6. Frontend - ang mismong website ng Falcon, kung saan kinokontrol ng mga manlalaro ang mga device

Pagdaanan natin ang bawat isa sa kanila.

Backend ng mga entity ng laro

Ang backend ay ipinatupad bilang isang spring boot application: mayroon itong ilang rest controllers, isang websocket endpoint at mga serbisyong may game logic.

Mayroon lamang tatlong controllers:

  • Megatron. Ang kasalukuyang page ng Megatron ay ipinadala sa pamamagitan ng mga kahilingan sa GET: bago at pagkatapos i-on ang power. Nagpaputok ang laser sa pamamagitan ng kahilingan ng POST.
  • Pagma-map sa mga pahina ng tilde upang maihatid ang mga ito ayon sa pangalan ng pahina. Gumagawa si Tilde ng mga pahina para i-export hindi gamit ang mga orihinal na pangalan, ngunit may panloob na ID at impormasyon sa pagsunod.
  • Captcha controller upang maghatid ng pseudo-high-load server captcha.

Ginamit ang endpoint ng websocket upang kontrolin ang mga gadget: mga lamp, garland at mga titik. Pinili itong sabay-sabay na ipakita sa lahat ng mga manlalaro ang kasalukuyang katayuan ng device: kung ito ay naka-on o naka-off, aktibo o hindi, anong kulay ng liham ang kasalukuyang naiilawan sa dingding. Upang gawing mas mahirap ang gawain ng pag-on ng laser, nagdagdag kami ng pahintulot sa garland at sa laser na may parehong login at password admin/admin.

Maaaring subukan ito ng mga manlalaro sa pamamagitan ng pag-on sa garland at ulitin ang parehong gamit ang laser.

Pinili namin ang gayong walang kuwentang pares ng login-password upang hindi pahirapan ang mga manlalaro sa hindi kinakailangang pagpili.

Upang gawing mas kawili-wili ang gawain, ginamit ang mga object ID mula sa mongodb bilang mga identifier ng device sa kwarto.

Naglalaman ang ObjectId ng timestamp: dalawang random na value, ang isa ay kinukuha batay sa identifier ng device, at ang pangalawa ay batay sa pid ng prosesong bumubuo nito at ang counter value. Nais kong gawin ang mga identifier na nabuo sa mga regular na pagitan at may iba't ibang mga proseso ng pid, ngunit sa isang karaniwang counter, upang ang pagpili ng isang laser device identifier ay magiging mas kawili-wili. Gayunpaman, sa huli, nagsimula ang lahat sa mga identifier na naiiba lang sa counter value. Maaaring ginawa nitong masyadong simple ang hakbang at hindi nangangailangan ng pagsusuri sa istruktura ng objectId.

Tagasalin mula sa mga kahilingan sa backend

script ng Python, na nagtrabaho sa mga timer at isinalin ang mga ito mula sa mga abstraction sa paglalaro sa isang pisikal na modelo. Halimbawa, "buksan ang lampara sa sahig" β†’ "i-on ang relay N2."

Ang script ay konektado sa RabbitMQ queue at inilipat ang mga kahilingan mula sa queue sa Arduino. Ipinatupad din nito ang lohika ng parallel light switching: kasama ang ilang mga aparato, ang ilaw sa mga ito ay naka-on, halimbawa, kapag ang kapangyarihan ay unang ibinibigay sa Megatron, ito ay naiilawan ng ilaw sa entablado. Ang disenyo ng pag-iilaw para sa cinematography ng buong eksena ay isang hiwalay na kuwento tungkol sa mahusay na gawain ng aming co-producer ng proyekto at taga-disenyo ng produksyon na si Ilya Serov, at sasabihin namin ang tungkol dito sa isang hiwalay na post.

Ang tagasalin ay responsable din para sa lohika ng paglulunsad ng shredder gamit ang isang timer at pagpapadala ng imahe sa TV: ang timer para sa paglulunsad ng shredder, isang sumisigaw na capybara, isang komersyal sa pagtatapos ng laro.

Paano naayos ang lohika para sa pagbuo ng token ng Megatron

Test shot

Bawat 25 segundo may nabuong bagong token at maaaring gamitin para i-on ang laser sa loob ng 10 segundo sa 10/255 na kapangyarihan. Link sa github na may Megatron code.

Pagkatapos ay lumamig ang laser sa loob ng 1 minuto - sa panahong ito ay hindi ito available at hindi tumanggap ng mga bagong kahilingan sa pag-shot.

Ang kapangyarihang ito ay hindi sapat upang sumunog sa lubid, ngunit ang sinumang manlalaro ay maaaring magpaputok ng Megatron at makita ang laser beam na kumikilos.

Ang MD5 hashing algorithm ay ginamit upang bumuo ng token. At gumana ang scheme MD5 mula sa MD5 + counter + secret para sa isang token ng labanan at walang lihim para sa isang token ng pagsubok.

Ang MD5 ay isang sanggunian sa isang komersyal na proyekto na ginawa ni Pavel, ang aming backender. Ilang taon lang ang nakalipas ang proyektong ito ay gumamit ng MD5, at nang sabihin niya sa arkitekto ng proyekto na ito ay isang hindi napapanahong algorithm ng pag-encrypt, nagsimula silang gumamit ng MD5 mula sa MD5. Dahil nagpasya kaming gawing posible ang pinaka-noob na proyekto, naalala niya ang lahat at nagpasya na gumawa ng isang maliit na sanggunian.

Combat shot

Ang combat mode ng Megatron ay 100% laser power sa 3 watts. Ito ay sapat na para sa 2 minuto upang masunog sa pamamagitan ng lubid na humahawak sa bigat, upang masira ang aquarium at baha ang server ng tubig.

Nag-iwan kami ng ilang pahiwatig sa Github ng proyekto: ibig sabihin, ang code ng pagbuo ng token, kung saan mauunawaan ng isa na ang mga token ng pagsubok at labanan ay nabuo batay sa parehong counter indicator. Sa kaso ng isang combat token, bilang karagdagan sa counter value, ginagamit din ang asin, na halos ganap na natitira sa kasaysayan ng pagbabago ng diwa na ito, maliban sa huling dalawang character.

Dahil alam ang data na ito, posibleng pag-uri-uriin ang huling 2 simbolo ng asin at talagang malaman na ang mga numero mula sa Lost, na na-convert sa hexadecimal system, ay ginamit para dito.

Pagkatapos ay kailangang makuha ng mga manlalaro ang counter value (sa pamamagitan ng pagsusuri sa test token) at bumuo ng combat token gamit ang susunod na counter value at ang asin na pinili sa nakaraang hakbang.

Ang counter ay tumaas lamang sa bawat test shot at bawat 25 segundo. Hindi namin isinulat ang tungkol dito kahit saan, ito ay dapat na isang maliit na sorpresa sa laro.

Serbisyo sa pakikipag-ugnayan ng Captcha

Sa mundo ng paglalaro, ito ang parehong captcha na kailangang i-load para ma-on ang fan at mabuksan ang flipchart na may pahiwatig. Sa tabi ng camera ay may laptop na may load monitoring.

Paano nilikha ang backend ng laro ng hacker tungkol sa pagsira sa isang server

Tools Kinakalkula ko kung ano ang ipapakita sa pagsubaybay bilang kasalukuyang pagkarga: temperatura at CPU Fan. Inilipat ang mga sukatan sa database ng timebase at iginuhit ng grafana.

Kung sa huling 5 segundo mayroong higit sa 50 mga kahilingan upang ipakita ang captcha, ang pag-load ay tumaas ng isang nakapirming + random na bilang ng mga hakbang. Ang kalkulasyon ay ang 100% load ay maaaring makamit sa loob ng dalawang minuto.

Sa katunayan, mayroong higit na lohika sa serbisyo kaysa sa ipinakita sa huling laro: inilagay namin ang monitor sa paraang tanging ang pag-ikot ng CPU Fan ang nakikita.

Sa simula ng paghahanap, nais nilang iwanan ang Grafan na ma-access mula sa website ng Falcon. Ngunit naglalaman din ito ng mga sukatan ng springboot mula sa ulat ng backend na application, na wala kaming oras upang i-clear, kaya nagpasya kaming harangan ang pag-access dito. At tama nga - kahit na sa simula ng paghahanap, nahulaan ng ilang manlalaro na ang application ay isinulat sa springboot framework at hinukay pa ang mga pangalan ng ilang serbisyo.

Pagho-host at data bus

Isang tool para sa paglilipat ng impormasyon mula sa backend patungo sa site, ang VPS server kung saan tumatakbo ang RabbitMQ.

Ang backend at data bus ay pinananatiling naka-on ang aming VPS. Ang kapangyarihan nito ay maihahambing sa computer na nakita mo sa screen: isang 2-core VPS na may dalawang gigabytes ng RAM. Ang taripa ay sinisingil para sa mga mapagkukunan, dahil ang peak load ay binalak sa loob lamang ng ilang araw - ito ang ginagawa ng aming mga kliyente na nagpaplanong mag-load ng VPS sa maikling panahon. Pagkatapos ay lumabas na ang pagkarga ay mas mataas kaysa sa aming inaasahan, at ang isang nakapirming taripa ay magiging mas kumikita. Kung gagawa ka ng quest, piliin ang mga line tariffs turbo.

Upang protektahan ang server mula sa DDoSa, ginamit namin ang Cloudflare.

Ito ay nagkakahalaga na sabihin na ang VPS ay nakatiis sa lahat nang may karangalan.

Ang Arduino, na responsable sa pagkontrol sa mga relay, ay nakatanggap ng mga utos mula sa tagasalin at ginawa ang aktwal na gawain

Ito ang higit na paksa ng susunod na artikulo tungkol sa bahagi ng hardware ng proyekto: nagpadala lamang ang backend ng mga kahilingan upang i-on ang isang partikular na relay. Nagkataon na alam ng backend ang halos lahat ng entity at ang mga kahilingan mula rito ay mukhang "i-on ang entity na ito." Ginawa namin ito para sa maagang pagsubok ng site (hindi pa namin naipon ang lahat ng Arduino at mga relay), sa huli ay iniwan namin ang lahat ng ganoon.

Frontend

Mabilis naming ginawa ang site sa tilde, tumagal ito ng isang araw ng trabaho at nakatipid kami ng 30 libo sa aming badyet.

Sa una, naisip namin na i-export na lang ang site at idagdag ang lohika na nawawala sa amin, ngunit napunta kami sa mga tuntunin ng paggamit na nagbabawal sa aming gawin ito.

Hindi kami handa na lumabag sa lisensya, kaya mayroong dalawang pagpipilian: upang ipatupad ang lahat sa aming sarili o direktang makipag-ugnay kay Tilda, pag-usapan ang tungkol sa proyekto at humingi ng pahintulot na baguhin ang code.

Pinili namin ang pangalawang opsyon at hindi lamang nila kami nakilala sa kalagitnaan, ngunit binigyan pa kami ng isang taon ng libreng account sa negosyo, kung saan kami ay lubos na nagpapasalamat sa kanila. Napaka-awkward na ipakita sa kanila ang disenyo ng website ng Sokol.

Bilang resulta, inilakip namin ang js logic sa frontend para sa pagpapadala ng mga kahilingan sa mga elementary device, at bahagyang binago ang mga istilo ng mga button para sa pag-on at pag-off ng mga elemento ng laro.

Disenyo ng website

Ang kasaysayan ng mga paghahanap, na nagkakahalaga ng isang hiwalay na kabanata.

Nais naming lumikha ng hindi lamang isang makalumang site, ngunit isang ganap na kasuklam-suklam na lumalabag sa lahat ng pangunahing panuntunan ng disenyo. Kasabay nito, mahalaga na mapanatili ang pagiging mapagkakatiwalaan: hindi nito dapat sirain ang kwento ng ENT, ipakita ang pagiging mapagpanggap ng may-akda, at kailangang maniwala ang mga manlalaro na maaaring umiral ang naturang site at magdala pa ng mga kliyente. At dinala niya! Habang nagpapatuloy ang laro, dalawang beses kaming nakipag-ugnayan para gumawa ng mga website.

Sa una ako mismo ang gumawa ng disenyo, sinusubukang magsama ng higit pang mga gif at makintab na elemento. Ngunit ang aking asawang taga-disenyo ng 10 taon ay tumingin sa kanyang balikat at ibinasura ito bilang "masyadong mahusay." Upang masira ang mga panuntunan sa disenyo, kailangan mong malaman ang mga ito.

Paano nilikha ang backend ng laro ng hacker tungkol sa pagsira sa isang server

Mayroong ilang mga kumbinasyon ng kulay na pumukaw ng isang pangmatagalang pakiramdam ng pagkasuklam: berde at pula ng pantay na kayamanan, kulay abo at rosas, asul at kayumanggi. Sa huli, kami ay nanirahan sa isang kumbinasyon ng pula at berde bilang mga pangunahing kulay, nagdagdag ng mga gif na may pusa at pumili ng 3-4 na larawan ni Sokolov mismo mula sa isang stock na larawan. Mayroon lang akong ilang mga kinakailangan: isang nasa katanghaliang-gulang na lalaki, nakasuot ng hindi angkop na suit na may dalawang sukat na masyadong malaki at sa isang "propesyonal na studio photo shoot" pose. Para sa pagsusulit, ipinakita nila ito sa mga kaibigan at nagtanong "paano mo ito gusto?"

Sa proseso ng pagbuo ng disenyo, ang aking asawa ay kailangang humiga tuwing kalahating oras; nagsimulang lumipad ang helicopter. Sinubukan ni Pasha na buksan ang developer console sa karamihan ng screen habang tinatapos niya ang frontend - upang protektahan ang kanyang mga mata.

Mga aktwal na device

Ang mga bentilador at mga ilaw ay inilagay sa pamamagitan ng mga solid-state relay upang hindi agad na bumukas ang kapangyarihan - upang ang kapangyarihan ay tumaas kasabay ng pagsubaybay.

Ngunit pag-uusapan natin ito sa susunod na post, tungkol sa hardware na bahagi ng laro at ang aktwal na pagtatayo ng site.

Manatiling nakatutok!

Iba pang mga artikulo tungkol sa paghahanap na sirain ang server

Paano nilikha ang backend ng laro ng hacker tungkol sa pagsira sa isang server

Pinagmulan: www.habr.com

Magdagdag ng komento