Come è stato creato il backend di un gioco hacker sulla distruzione di un server

Come è stato creato il backend di un gioco hacker sulla distruzione di un server
Continuiamo a raccontarvi come è stata organizzata la nostra ricerca laser con la distruzione del server. Inizia nel precedente articolo sulla risoluzione della ricerca.

In totale, il backend del gioco contava 6 unità architettoniche, che analizzeremo in questo articolo:

  1. Backend delle entità di gioco responsabili dei meccanismi di gioco
  2. Backend e bus di scambio dati del sito su VPS
  3. Traduttore dalle richieste backend (elementi di gioco) ad Arduino e hardware in loco
  4. Arduino, responsabile del controllo dei relè, riceveva i comandi dal traduttore e svolgeva il lavoro vero e proprio
  5. Dispositivi reali: ventilatore, ghirlande, lampade da terra, ecc.
  6. Frontend: il sito Web Falcon stesso, da cui i giocatori controllavano i dispositivi

Esaminiamo ciascuno di essi.

Backend delle entità di gioco

Il backend è stato implementato come un'applicazione spring boot: aveva diversi controller rest, un endpoint websocket e servizi con logica di gioco.

C'erano solo tre controllori:

  • Megatron. La pagina attuale di Megatron è stata inviata tramite richieste GET: prima e dopo l'accensione. Il laser ha sparato attraverso la richiesta POST.
  • Mappatura delle pagine tilde in modo che vengano servite in base al nome della pagina. Tilde produce pagine per l'esportazione non con nomi originali, ma con ID interno e informazioni di conformità.
  • Controller captcha per servire captcha del server pseudo-alto carico.

L'endpoint Websocket è stato utilizzato per controllare i gadget: lampade, ghirlande e lettere. Si è scelto di mostrare in modo sincrono a tutti i giocatori lo stato attuale del dispositivo: se è acceso o spento, attivo o meno, di che colore è la lettera attualmente illuminata sul muro. Per rendere il compito di accendere il laser un po' più difficile, abbiamo aggiunto l'autorizzazione alla ghirlanda e al laser con lo stesso login e password admin/admin.

I giocatori potevano testarlo accendendo la ghirlanda e ripetere lo stesso con il laser.

Abbiamo scelto una coppia login-password così banale per non tormentare i giocatori con selezioni non necessarie.

Per rendere l'attività un po' più interessante, gli ID oggetto di mongodb sono stati utilizzati come identificatori del dispositivo nella stanza.

ObjectId contiene un timestamp: due valori casuali, uno dei quali viene preso in base all'identificatore del dispositivo, e il secondo in base al pid del processo che lo genera e al valore del contatore. Volevo che gli identificatori fossero generati ad intervalli regolari e con processi pid diversi, ma con un contatore comune, in modo che la selezione di un identificatore di dispositivo laser fosse più interessante. Tuttavia, alla fine, tutti hanno iniziato con identificatori che differivano solo nel controvalore. Ciò potrebbe aver reso il passaggio troppo semplice e non aver richiesto l'analisi della struttura objectId.

Traduttore dalle richieste di backend

Scrittura Python, che ha lavorato sui timer e li ha tradotti dalle astrazioni del gioco in un modello fisico. Ad esempio, “accendi la lampada da terra” → “accendi il relè N2”.

Lo script si è connesso alla coda RabbitMQ e ha trasferito le richieste dalla coda ad Arduino. Ha implementato anche la logica della commutazione parallela della luce: insieme ad alcuni dispositivi, la luce su di essi era accesa, ad esempio, quando l'alimentazione veniva inizialmente fornita a Megatron, veniva illuminata con la luce del palco. Il lighting design per la cinematografia dell'intera scena è una storia a parte sul grande lavoro del nostro coproduttore e scenografo Ilya Serov, e ne parleremo in un post separato.

Il traduttore è stato anche responsabile della logica di lanciare il distruggidocumenti utilizzando un timer e di trasmettere l'immagine alla TV: il timer per il lancio del distruggidocumenti, un capibara che urla, uno spot pubblicitario alla fine del gioco.

Come è stata strutturata la logica per la generazione del token Megatron

Tiro di prova

Ogni 25 secondi veniva generato un nuovo gettone che poteva essere utilizzato per accendere il laser per 10 secondi a una potenza 10/255. Collegamento a github con codice Megatron.

Il laser si è quindi raffreddato per 1 minuto: durante questo periodo non è stato disponibile e non ha accettato nuove richieste di iniezione.

Questo potere non era sufficiente per bruciare la corda, ma qualsiasi giocatore poteva sparare a Megatron e vedere il raggio laser in azione.

Per generare il token è stato utilizzato l'algoritmo di hashing MD5. E lo schema ha funzionato MD5 da MD5 + contatore + segreto per un segnalino combattimento e senza segreto per un segnalino test.

MD5 è un riferimento a un progetto commerciale realizzato da Pavel, il nostro backender. Solo un paio di anni fa questo progetto utilizzava MD5 e quando disse all'architetto del progetto che si trattava di un algoritmo di crittografia obsoleto, iniziarono a utilizzare MD5 da MD5. Dato che abbiamo deciso di realizzare il progetto più principiante possibile, si è ricordato di tutto e ha deciso di fare un piccolo riferimento.

Tiro da combattimento

La modalità di combattimento di Megatron è al 100% di potenza laser a 3 watt. Questo è sufficiente per 2 minuti per bruciare la corda che sosteneva il peso, per rompere l'acquario e inondare il server con acqua.

Abbiamo lasciato alcuni suggerimenti sul Github del progetto: ovvero il codice di generazione dei token, da cui si potrebbe capire che i token di test e di combattimento vengono generati in base allo stesso contatore. Nel caso di un gettone di combattimento, oltre al controvalore, viene utilizzato anche un sale, che viene quasi completamente lasciato nella storia del cambiamento di questo contenuto, ad eccezione degli ultimi due caratteri.

Conoscendo questi dati, è stato possibile ordinare gli ultimi 2 simboli del sale e scoprire effettivamente che per questo sono stati utilizzati i numeri di Lost, convertiti nel sistema esadecimale.

Quindi i giocatori dovevano individuare il valore del contatore (analizzando il gettone test) e generare un gettone di combattimento utilizzando il valore del contatore successivo e il sale selezionato nel passaggio precedente.

Il contatore aumenta semplicemente con ogni scatto di prova e ogni 25 secondi. Non ne abbiamo scritto da nessuna parte, doveva essere una piccola sorpresa di gioco.

Servizio di interazione Captcha

Nel mondo dei giochi, questo era lo stesso captcha che doveva essere caricato per accendere la ventola e aprire la lavagna a fogli mobili con un suggerimento. Accanto alla telecamera c'era un laptop con monitoraggio del carico.

Come è stato creato il backend di un gioco hacker sulla distruzione di un server

Servizio Ho calcolato cosa visualizzare nel monitoraggio come carico corrente: temperatura e ventola della CPU. Le metriche sono state trasferite nel database della base dei tempi e disegnate da grafana.

Se negli ultimi 5 secondi ci sono state più di 50 richieste di visualizzazione del captcha, il carico aumentava di un numero di passaggi fisso + casuale. Il calcolo prevedeva che il carico del 100% potesse essere raggiunto in due minuti.

In effetti, nel servizio c'era più logica di quanto mostrato nel gioco finale: abbiamo posizionato il monitor in modo tale che fosse visibile solo la rotazione della ventola della CPU.

All'inizio della ricerca volevano lasciare Grafan accessibile dal sito web di Falcon. Ma conteneva anche le metriche springboot del report dell'applicazione backend, che non abbiamo avuto il tempo di cancellare, quindi abbiamo deciso di bloccarne l'accesso. E giustamente, anche all'inizio della ricerca, alcuni giocatori hanno intuito che l'applicazione fosse scritta nel framework Springboot e hanno persino scoperto i nomi di alcuni servizi.

Hosting e bus dati

Uno strumento per trasferire informazioni dal backend al sito, il server VPS su cui era in esecuzione RabbitMQ.

Il backend e il bus dati sono stati mantenuti attivi il nostro VPS. La sua potenza era paragonabile al computer che vedevi sullo schermo: un VPS a 2 core con due gigabyte di RAM. La tariffa è stata addebitata per le risorse, poiché il carico di punta era previsto solo per pochi giorni: questo è ciò che fanno i nostri clienti che pianificano di caricare VPS per un breve periodo di tempo. Poi si è scoperto che il carico era maggiore di quanto ci aspettassimo e che una tariffa fissa sarebbe stata più redditizia. Se fai una missione, scegli le tariffe di linea turbo.

Per proteggere il server da DDoSa, abbiamo utilizzato Cloudflare.

Vale la pena dire che il VPS ha resistito a tutto con onore.

Arduino, responsabile del controllo dei relè, riceveva i comandi dal traduttore e svolgeva il lavoro vero e proprio

Questo è più l'argomento del prossimo articolo sulla parte hardware del progetto: il backend ha semplicemente inviato richieste per attivare un relè specifico. È successo che il backend conosceva quasi tutte le entità e le sue richieste sembravano "accendi questa entità". Lo abbiamo fatto per i primi test del sito (non avevamo ancora assemblato tutto l'Arduino e i relè), alla fine abbiamo lasciato tutto così.

Fine frontale

Abbiamo creato rapidamente il sito su tilde, ci è voluto un giorno lavorativo e abbiamo risparmiato 30mila sul nostro budget.

Inizialmente pensavamo semplicemente di esportare il sito e aggiungere la logica che ci mancava, ma ci siamo imbattuti in termini di utilizzo che ci vietavano di farlo.

Non eravamo pronti a violare la licenza, quindi c'erano due opzioni: implementare tutto da soli o contattare direttamente Tilda, parlare del progetto e chiedere il permesso di modificare il codice.

Abbiamo scelto la seconda opzione e non solo ci sono venuti incontro a metà strada, ma ci hanno anche regalato un anno di conto business gratuito, cosa di cui siamo loro molto grati. È stato molto imbarazzante mostrare loro il design del sito web di Sokol.

Di conseguenza, abbiamo collegato la logica js al frontend per l'invio di richieste ai dispositivi elementari e abbiamo leggermente modificato gli stili dei pulsanti per l'attivazione e la disattivazione degli elementi del gioco.

Design del sito web

La storia delle ricerche, che merita un capitolo a parte.

Volevamo creare non solo un sito vecchio stile, ma assolutamente disgustoso che violasse tutte le regole basilari del design. Allo stesso tempo, era importante mantenere la credibilità: non doveva interrompere la storia di ENT, dimostrare la pretenziosità dell'autore, e i giocatori dovevano credere che un sito del genere potesse esistere e persino portare clienti. E lo ha portato! Mentre il gioco era in corso, siamo stati contattati due volte per creare dei siti web.

All'inizio ho realizzato il design da solo, cercando di includere più gif ed elementi brillanti. Ma il mio marito stilista da 10 anni si è guardato alle spalle e l’ha liquidato come “troppo bello”. Per infrangere le regole del design, è necessario conoscerle.

Come è stato creato il backend di un gioco hacker sulla distruzione di un server

Esistono diverse combinazioni di colori che evocano una sensazione duratura di disgusto: verde e rosso di uguale ricchezza, grigio e rosa, blu più marrone. Alla fine, abbiamo optato per una combinazione di rosso e verde come colori di base, abbiamo aggiunto delle gif con un gatto e selezionato 3-4 foto dello stesso Sokolov da una foto d'archivio. Avevo solo pochi requisiti: un uomo di mezza età, che indossasse un abito inadeguato di un paio di taglie più grande e in una posa da “servizio fotografico in studio professionale”. Per il test, l’hanno mostrato agli amici e hanno chiesto “come ti piace?”

Durante il processo di sviluppo del progetto, mio ​​marito doveva sdraiarsi ogni mezz'ora e l'elicottero ha iniziato a volare. Pasha ha provato ad aprire la console per sviluppatori su gran parte dello schermo mentre finiva di finire il frontend, per proteggere i suoi occhi.

Dispositivi reali

I ventilatori e le luci sono stati montati tramite relè a stato solido in modo che non si accendessero immediatamente a piena potenza, in modo che la potenza aumentasse parallelamente al monitoraggio.

Ma di questo parleremo nel prossimo post, della parte hardware del gioco e della realizzazione vera e propria del sito.

Rimanete sintonizzati!

Altri articoli sulla missione per distruggere il server

Come è stato creato il backend di un gioco hacker sulla distruzione di un server

Fonte: habr.com

Aggiungi un commento