Kako je nastao backend hakerske igrice o uništavanju poslužitelja

Kako je nastao backend hakerske igrice o uništavanju poslužitelja
Nastavljamo vam govoriti kako je organizirana naša laserska potraga s uništavanjem poslužitelja. Početak u prethodnom članak o rješavanju potrage.

Ukupno, backend igre je imao 6 arhitektonskih jedinica, koje ćemo analizirati u ovom članku:

  1. Backend entiteta igre koji su bili odgovorni za mehanizme igre
  2. Sabirnica za razmjenu podataka pozadine i stranice na VPS-u
  3. Prevoditelj s backend zahtjeva (elemenata igre) na Arduino i hardver na licu mjesta
  4. Arduino, koji je bio odgovoran za kontrolu releja, primao je naredbe od prevoditelja i obavljao stvarni posao
  5. Stvarni uređaji: ventilator, vijenci, podne svjetiljke itd.
  6. Frontend - sama web stranica Falcon s koje su igrači kontrolirali uređaje

Prođimo kroz svaki od njih.

Pozadina entiteta igre

Pozadina je implementirana kao proljetna aplikacija za pokretanje: imala je nekoliko rest kontrolera, krajnju točku websocketa i usluge s logikom igre.

Postojala su samo tri kontrolora:

  • Megatron. Trenutna Megatron stranica poslana je putem GET zahtjeva: prije i nakon uključivanja struje. Laser je ispalio kroz POST zahtjev.
  • Mapiranje tilde stranica tako da se poslužuju prema nazivu stranice. Tilde proizvodi stranice za izvoz ne s izvornim nazivima, već s internim ID-om i informacijama o sukladnosti.
  • Captcha kontroler za posluživanje captcha poslužitelja pseudo-visoko opterećenja.

Websocket krajnja točka korištena je za kontrolu gadgeta: lampi, girlandi i slova. Odabrano je da sinkronizirano prikazuje svim igračima trenutni status uređaja: je li uključen ili isključen, aktivan ili ne, koja boja slova trenutno svijetli na zidu. Kako bismo malo otežali zadatak paljenja lasera, dodali smo autorizaciju na girlandu i laser s istom prijavom i lozinkom admin/admin.

Igrači su to mogli isprobati uključivanjem girlande i ponoviti isto s laserom.

Izabrali smo tako trivijalan par login-password kako ne bismo mučili igrače nepotrebnim odabirom.

Kako bi zadatak bio malo zanimljiviji, ID-ovi objekata iz mongodb-a korišteni su kao identifikatori uređaja u sobi.

ObjectId sadrži vremensku oznaku: dvije nasumične vrijednosti, od kojih se jedna uzima na temelju identifikatora uređaja, a druga na temelju pid-a procesa koji ga generira i vrijednosti brojača. Želio sam napraviti identifikatore koji se generiraju u pravilnim intervalima i s različitim pid procesima, ali sa zajedničkim brojačem, kako bi izbor identifikatora laserskog uređaja bio zanimljiviji. No, na kraju su svi krenuli s identifikatorima koji su se razlikovali samo u protuvrijednosti. Zbog toga je korak možda bio previše jednostavan i nije zahtijevao analizu strukture objectId.

Prevoditelj iz pozadinskih zahtjeva

Python skripta, koji je radio na mjeračima vremena i preveo ih iz gaming apstrakcija u fizički model. Na primjer, "uključite podnu lampu" → "uključite relej N2."

Skripta se povezala s RabbitMQ redom i prenijela zahtjeve iz reda u Arduino. Također je implementirao logiku paralelnog uključivanja svjetla: zajedno s nekim uređajima, svjetlo na njima je bilo uključeno, na primjer, kada je Megatron inicijalno napajan, bio je osvijetljen svjetlom pozornice. Dizajn svjetla za kinematografiju cijele scene posebna je priča o velikom radu koproducenta našeg projekta i scenografa Ilje Serova, o čemu ćemo govoriti u posebnom postu.

Prevoditelj je također bio odgovoran za logiku pokretanja shreddera pomoću timera i prijenosa slike na TV: timer za pokretanje shreddera, capybara koja vrišti, reklama na kraju igre.

Kako je strukturirana logika za generiranje Megatron tokena

Probni hitac

Svakih 25 sekundi generirao se novi token i mogao se koristiti za uključivanje lasera na 10 sekundi pri snazi ​​10/255. Poveznica za github s kodom Megatron.

Laser se zatim hladio 1 minutu - tijekom tog vremena bio je nedostupan i nije prihvaćao nove zahtjeve za snimanje.

Ova snaga nije bila dovoljna da probije uže, ali je svaki igrač mogao ispaliti Megatron i vidjeti lasersku zraku na djelu.

Za generiranje tokena korišten je MD5 algoritam raspršivanja. I shema je uspjela MD5 od MD5 + brojač + tajna za borbeni žeton i bez tajne za testni žeton.

MD5 je referenca na komercijalni projekt koji je napravio Pavel, naš backender. Prije samo nekoliko godina ovaj je projekt koristio MD5, a kada je arhitektu projekta rekao da je to zastarjeli algoritam šifriranja, počeli su koristiti MD5 iz MD5. Kako smo odlučili napraviti što noob projekt, on se svega sjetio i odlučio napraviti malu referencu.

Borbeni hitac

Megatronov način borbe je 100% snaga lasera od 3 vata. To je dovoljno za 2 minute da pregori uže koje je držalo uteg, da se razbije akvarij i poplavi poslužitelj vodom.

Ostavili smo nekoliko natuknica na Githubu projekta: naime, kod za generiranje tokena, iz kojeg se moglo razumjeti da se testni i borbeni tokeni generiraju na temelju istog indikatora brojača. U slučaju borbenog žetona, osim protuvrijednosti, koristi se i sol, koja je gotovo u potpunosti ostavljena u povijesti promjena ovog sadržaja, s iznimkom zadnja dva znaka.

Poznavajući te podatke, bilo je moguće sortirati posljednja 2 simbola soli i zapravo saznati da su za nju korišteni brojevi iz Losta, pretvoreni u heksadecimalni sustav.

Zatim su igrači morali uhvatiti vrijednost brojača (analizom testnog žetona) i generirati borbeni žeton koristeći sljedeću vrijednost brojača i sol odabranu u prethodnom koraku.

Brojač se jednostavno povećavao sa svakim probnim udarcem i svakih 25 sekundi. O ovome nismo nigdje pisali, trebalo je biti malo iznenađenje u igri.

Usluga Captcha interakcije

U svijetu igara, to je bila ista captcha koju je trebalo učitati da bi se uključio ventilator i otvorio flipchart sa savjetom. Pokraj kamere nalazio se laptop s nadzorom opterećenja.

Kako je nastao backend hakerske igrice o uništavanju poslužitelja

Usluga Izračunao sam što prikazati u nadzoru kao trenutno opterećenje: temperaturu i CPU ventilator. Metrike su prebačene u bazu podataka vremenske baze i nacrtane od strane grafane.

Ako je u zadnjih 5 sekundi bilo više od 50 zahtjeva za prikaz captcha, tada se opterećenje povećava za fiksni + slučajni broj koraka. Računica je bila da se 100% opterećenje može postići za dvije minute.

Zapravo, u usluzi je bilo više logike nego što je prikazano u finalnoj igrici: postavili smo monitor na takav način da je vidljiva samo rotacija CPU ventilatora.

Na početku potrage željeli su ostaviti Grafana dostupnim s web stranice Falcon. Ali također je sadržavao springboot metriku iz izvješća pozadinske aplikacije, koju nismo imali vremena očistiti, pa smo odlučili blokirati pristup. I s pravom - čak i na početku potrage, neki igrači su pogodili da je aplikacija napisana u springboot frameworku i čak su iskopali nazive nekih usluga.

Hosting i podatkovna sabirnica

Alat za prijenos informacija iz pozadine na stranicu, VPS poslužitelj na kojem je bio pokrenut RabbitMQ.

Pozadina i podatkovna sabirnica ostali su uključeni naš VPS. Njegova je snaga bila usporediva s računalom koje ste vidjeli na ekranu: 2-jezgreni VPS s dva gigabajta RAM-a. Tarifa je naplaćena za resurse, budući da je vršno opterećenje planirano za samo nekoliko dana - to čine naši klijenti koji planiraju opteretiti VPS za kratko vrijeme. Tada se pokazalo da je opterećenje veće nego što smo očekivali, a fiksna tarifa bila bi isplativija. Ako radite misiju, odaberite linijske tarife turbo.

Za zaštitu poslužitelja od DDoSa koristili smo Cloudflare.

Vrijedi reći da je VPS sve časno izdržao.

Arduino, koji je bio odgovoran za kontrolu releja, primao je naredbe od prevoditelja i obavljao stvarni posao

Ovo je više tema sljedećeg članka o hardverskom dijelu projekta: backend je jednostavno poslao zahtjeve za uključivanje određenog releja. Dogodilo se da je backend znao gotovo sve entitete i zahtjevi iz njega izgledali su kao "uključi ovaj entitet". Napravili smo ovo za rano testiranje stranice (još nismo montirali sve Arduino i releje), na kraju smo sve ostavili tako.

Frontend

Brzo smo izradili stranicu na tildi, trajalo je jedan radni dan i uštedjelo nam je 30 tisuća kuna na našem budžetu.

U početku smo mislili jednostavno izvesti web mjesto i dodati logiku koja nam je nedostajala, ali smo naletjeli na uvjete korištenja koji su nam to zabranjivali.

Nismo bili spremni prekršiti licencu, pa su postojale dvije mogućnosti: da sve implementiramo sami ili da kontaktiramo direktno Tildu, razgovaramo o projektu i tražimo dopuštenje za promjenu koda.

Odabrali smo drugu opciju i ne samo da su nam izašli u susret, već su nam dali i godinu dana besplatnog poslovnog računa, na čemu smo im jako zahvalni. Bilo je vrlo nezgodno pokazati im dizajn Sokolove web stranice.

Kao rezultat toga, pridružili smo js logiku sučelju za slanje zahtjeva elementarnim uređajima i malo promijenili stilove gumba za uključivanje i isključivanje elemenata igre.

Dizajn web stranica

Povijest pretraga, koja je vrijedna zasebnog poglavlja.

Htjeli smo stvoriti ne samo staromodnu stranicu, već apsolutno odvratnu koja krši sva osnovna pravila dizajna. U isto vrijeme, bilo je važno zadržati uvjerljivost: nije smjelo razbiti ORL priču, pokazati pretencioznost autora, a igrači bi morali vjerovati da takva stranica može postojati i čak dovesti klijente. I donio ga je! Dok je igra trajala dva puta su nas kontaktirali za izradu web stranica.

U početku sam dizajnirao sam, pokušavajući uključiti više gifova i sjajnih elemenata. Ali moj suprug dizajner s kojim sam bio 10 godina pogledao je preko ramena i odbacio to kao "predobro". Da biste prekršili pravila dizajna, morate ih poznavati.

Kako je nastao backend hakerske igrice o uništavanju poslužitelja

Postoji nekoliko kombinacija boja koje izazivaju dugotrajan osjećaj gađenja: zelena i crvena jednakog bogatstva, siva i ružičasta, plava plus smeđa. Na kraju smo se odlučili za kombinaciju crvene i zelene kao osnovne boje, dodali gifove s mačkom i sa stock fotografije odabrali 3-4 fotografije samog Sokolova. Imao sam samo nekoliko zahtjeva: sredovječnog muškarca, u lošem odijelu nekoliko brojeva većem i u pozi za "profesionalno studijsko snimanje". Za probu su ga pokazali prijateljima i pitali "kako vam se sviđa?"

Tijekom procesa razvoja dizajna, moj muž je morao ići leći svakih pola sata, helikopter je počeo letjeti. Pasha je pokušao otvoriti konzolu za razvojne programere na veći dio zaslona dok je dovršavao sučelje - kako bi zaštitio oči.

Stvarni uređaji

Ventilatori i svjetla su montirani kroz solid-state releje kako se ne bi odmah uključili punom snagom - kako bi snaga rasla paralelno s nadzorom.

Ali o tome ćemo u sljedećem postu, o hardverskom dijelu igre i stvarnoj konstrukciji stranice.

Ostani u tunelu!

Ostali članci o misiji uništavanja poslužitelja

Kako je nastao backend hakerske igrice o uništavanju poslužitelja

Izvor: www.habr.com

Dodajte komentar