Kako je stvoren backend hakerske igre o uništavanju servera

Kako je stvoren backend hakerske igre o uništavanju servera
Nastavljamo da vam pričamo kako je uređena naša laserska potraga sa uništavanjem servera. Počni u prethodnom članak o rješavanju potrage.

Ukupno, pozadina igre je imala 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 pozadinske i web lokacije na VPS-u
  3. Prevoditelj sa backend zahtjeva (elemenata igre) na Arduino i hardver na licu mjesta
  4. Arduino, koji je bio odgovoran za kontrolu releja, primao je komande od prevodioca i obavljao stvarni posao
  5. Stvarni uređaji: ventilator, vijenci, podne lampe, itd.
  6. Frontend - sama Falcon web stranica, s koje su igrači kontrolirali uređaje

Hajde da prođemo kroz svaki od njih.

Pozadina entiteta igre

Backend je implementiran kao proljetna aplikacija za pokretanje: imao je nekoliko kontrolera za odmor, krajnju tačku websocketa i usluge s logikom igre.

Postojala su samo tri kontrolora:

  • Megatron. Trenutna Megatron stranica je poslana putem GET zahtjeva: prije i nakon uključivanja napajanja. Laser je ispalio kroz POST zahtjev.
  • Mapiranje tilda stranica tako da se poslužuju po imenu stranice. Tilde proizvodi stranice za izvoz ne s originalnim imenima, već s internim ID-om i informacijama o usklađenosti.
  • Captcha kontroler za posluživanje pseudo-visokog opterećenja server captcha.

Krajnja tačka Websocket-a je korištena za kontrolu gadžeta: lampe, vijenca i slova. Odabrano je da se svim igračima sinhrono prikazuje trenutni status uređaja: da li je uključen ili isključen, aktivan ili ne, koja boja slova trenutno svijetli na zidu. Kako bismo malo otežali zadatak uključivanja lasera, dodali smo autorizaciju vijencu i laseru sa istim loginom i lozinkom admin/admin.

Igrači su to mogli testirati uključivanjem vijenca i ponoviti isto s laserom.

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

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

ObjectId sadrži vremensku oznaku: dvije nasumične vrijednosti, od kojih se jedna uzima na osnovu identifikatora uređaja, a druga na osnovu pid-a procesa koji ga generiše i vrijednosti brojača. Želio sam napraviti identifikatore koji se generišu u pravilnim intervalima i sa različitim pid procesima, ali sa zajedničkim brojačem, kako bi izbor identifikatora laserskog uređaja bio zanimljiviji. Međutim, na kraju su svi počeli s identifikatorima koji su se razlikovali samo po vrijednosti brojača. Ovo je možda učinilo korak previše jednostavnim i ne zahtijeva analizu strukture objectId.

Prevodilac sa backend zahtjeva

Python skripta, koji je radio na tajmerima i preveo ih iz apstrakcija igara u fizički model. Na primjer, "upali podnu lampu" → "uključi relej N2."

Skripta se povezala na RabbitMQ red i prenijela zahtjeve iz reda u Arduino. Takođe je implementirala logiku paralelnog prebacivanja svjetla: zajedno s nekim uređajima se palilo i svjetlo na njima, na primjer, kada je Megatron inicijalno bio napajan, bio je osvijetljen scenskim svjetlom. Dizajn svjetla za kinematografiju cijele scene je posebna priča o sjajnom radu koproducenta našeg projekta i dizajnera produkcije Ilye Serova, o čemu ćemo pričati u posebnom postu.

Prevoditelj je također bio odgovoran za logiku pokretanja shredera pomoću tajmera i prijenosa slike na TV: tajmer za pokretanje shredera, vrišteća kapibara, reklama na kraju igre.

Kako je strukturirana logika za generiranje Megatron tokena

Probni udarac

Svakih 25 sekundi se generira novi token koji se može koristiti za uključivanje lasera na 10 sekundi pri 10/255 snage. Link na github sa Megatron kodom.

Laser se zatim ohladio 1 minut - za to vreme nije bio dostupan i nije prihvatao nove zahteve za snimanje.

Ova snaga nije bila dovoljna da se probije konopac, ali svaki igrač je mogao ispaliti Megatron i vidjeti laserski snop u akciji.

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

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

Borbeni hitac

Megatronov borbeni način je 100% snage lasera pri 3 vata. Ovo je dovoljno za 2 minute da progori konopac koji je držao težinu, da se akvarij razbije i server poplavi vodom.

Ostavili smo nekoliko nagoveštaja na Githubu projekta: naime, kod za generisanje tokena, iz kojeg se moglo shvatiti da se testni i borbeni tokeni generišu na osnovu istog brojača indikatora. U slučaju borbenog token-a, pored vrijednosti brojača, koristi se i sol, koja je gotovo u potpunosti ostala u istoriji mijenjanja ove suštine, sa izuzetkom posljednja dva znaka.

Znajući ove podatke, bilo je moguće sortirati posljednja 2 simbola soli i zapravo saznati da su za to korišteni brojevi iz Lost-a, pretvoreni u heksadecimalni sistem.

Tada 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. Nismo nigde pisali o tome, trebalo je da bude malo iznenađenje.

Usluga Captcha interakcije

U svijetu igara, ovo je bila ista captcha koju je trebalo učitati da bi se uključio ventilator i otvorio flipchart sa nagovještajem. Pored kamere je bio laptop sa nadzorom opterećenja.

Kako je stvoren backend hakerske igre o uništavanju servera

usluga Izračunao sam šta da prikažem u monitoringu kao trenutno opterećenje: temperaturu i ventilator CPU-a. metrike su prebačene u bazu podataka vremenske baze i iscrtane od strane grafana.

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

U stvari, bilo je više logike u servisu nego što je prikazano u finalnoj igri: monitor smo postavili tako da je bila vidljiva samo rotacija ventilatora CPU-a.

Na početku potrage htjeli su ostaviti Grafanu dostupnim sa Falcon web stranice. Ali sadržavao je i Springboot metrike iz izvještaja pozadinske aplikacije, koje nismo imali vremena da obrišemo, pa smo odlučili da mu blokiramo pristup. I s pravom - čak i na početku potrage, neki igrači su pogodili da je aplikacija napisana u springboot okviru i čak su iskopali imena nekih servisa.

Hosting i sabirnica podataka

Alat za prijenos informacija sa pozadine na stranicu, VPS server na kojem je RabbitMQ radio.

Backend i sabirnica podataka su ostali uključeni naš VPS. Njegova snaga je bila uporediva sa računarom koji ste videli na ekranu: 2-jezgarni VPS sa dva gigabajta RAM-a. Tarifa je naplaćivana za resurse, jer je vršno opterećenje planirano za samo nekoliko dana - to rade naši klijenti koji planiraju da učitaju VPS na kratak period. Tada se pokazalo da je opterećenje veće nego što smo očekivali, a fiksna tarifa bi bila isplativija. Ako radite zadatak, izaberite linijske tarife turbo.

Za zaštitu servera od DDoSa-e koristili smo Cloudflare.

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

Arduino, koji je bio odgovoran za kontrolu releja, primao je komande od prevodioca i obavljao stvarni posao

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

Frontend

Brzo smo napravili sajt na tildi, trajao je jedan radni dan i uštedeli smo 30 hiljada na našem budžetu.

U početku smo mislili da jednostavno izvezemo sajt i dodamo logiku koja nam je nedostajala, ali smo naišli na uslove korišćenja koji su nam to zabranjivali.

Nismo bili spremni da prekršimo licencu, pa su postojale dvije opcije: da sve implementiramo sami ili da direktno kontaktiramo Tildu, razgovaramo o projektu i tražimo dozvolu za promjenu koda.

Izabrali smo drugu opciju i oni su nam ne samo izašli u susret na pola puta, već su nam čak i dali godinu dana besplatnog poslovnog računa, na čemu smo im veoma zahvalni. Bilo je vrlo nezgodno pokazati im Sokolov dizajn web stranice.

Kao rezultat toga, priključili smo js logiku na frontend za slanje zahtjeva na elementarne uređaje, i malo promijenili stilove dugmadi za uključivanje i isključivanje elemenata igre.

Dizajn veb stranica

Istorija pretraživanja, koja vredi posebnog poglavlja.

Htjeli smo stvoriti ne samo staromodan sajt, već i apsolutno odvratan koji krši sva osnovna pravila dizajna. Istovremeno, bilo je važno održati uvjerljivost: nije trebalo razbiti ORL priču, pokazati pretencioznost autora, a igrači bi morali vjerovati da takva stranica može postojati, pa čak i dovesti klijente. I doneo ga je! Dok je igra trajala, dva puta su nas kontaktirali da napravimo web stranice.

U početku sam dizajnirao sam, pokušavajući uključiti više gifova i sjajnih elemenata. Ali moj 10-godišnji muž dizajner pogledao je preko ramena i odbacio to kao „predobro“. Da biste prekršili pravila dizajna, morate ih poznavati.

Kako je stvoren backend hakerske igre o uništavanju servera

Postoji nekoliko kombinacija boja koje izazivaju trajni osjećaj gađenja: zelena i crvena jednakog bogatstva, siva i ružičasta, plava plus smeđa. Na kraju smo se odlučili na kombinaciju crvene i zelene kao osnovne boje, dodali gifove sa mačkom i odabrali 3-4 fotografije samog Sokolova sa jedne stock fotografije. Imao sam samo nekoliko uslova: sredovečni muškarac, u neujednačenom odelu nekoliko većem broju i u pozi za „profesionalno studijsko fotografisanje“. Za test su ga pokazali prijateljima i pitali "kako vam se sviđa?"

Tokom procesa izrade dizajna, moj muž je morao da legne svakih pola sata, helikopter je počeo da leti. Pasha je pokušao da otvori konzolu za programere na većini ekrana dok je završavao frontend - da zaštiti oči.

Stvarni uređaji

Ventilatori i svjetla montirani su preko solid-state releja kako se ne bi odmah uključili na punu snagu - kako bi se snaga povećavala paralelno sa nadzorom.

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

Stay tuned!

Ostali članci o potrazi za uništenjem servera

Kako je stvoren backend hakerske igre o uništavanju servera

izvor: www.habr.com

Dodajte komentar