Acum câteva zile, am încheiat unul dintre cele mai emoționante evenimente pe care am avut norocul să le organizăm în cadrul blogului – un joc online de tip hacker cu distrugerea serverului.
Rezultatele au depășit toate așteptările noastre: participanții nu doar că au participat, ci s-au organizat rapid într-o comunitate bine sudată de 620 de persoane pe Discord, care a cucerit efectiv questul în două zile, fără pauză pentru somn.
Și iată cum s-a terminat:

Cum a început totul și despre ce este vorba de fapt?
Jocul a început pe 12 august, când am publicat pe blog un videoclip în care un hacker înfățișat ca un craniu propune să jucăm un joc, să distrugem serverul, să provocăm un scurtcircuit în cameră (sau un mini-incendiu) și să luăm banii rămași în shredder.
A fost un quest online: am lansat o transmisiune pe YouTube dintr-o cameră pe care am umplut-o cu dispozitive IoT, cu un server sub pat (pe care trebuia să-l distrugem), iar deasupra serverului am montat un acvariu și am suspendat deasupra lui un greutate. Pentru a face jocul mai palpitant, am decis să stabilim un fond de premii de 200.000 de ruble, pe care l-am încărcat în shredder și l-am setat să pornească la fiecare 60 de minute. Fiecare oră shredder-ul consuma 1000 de ruble – cu cât jucătorii opreau mai repede, cu atât mai mulți bani câștigau.

Construirea acestui quest a fost un quest în sine – a trebuit să ne hrănim cu livrări și să dormim câte câteva ore pe zi chiar în aceeași cameră. Dar cel mai uimitor a fost să observăm zborul gândirii jucătorilor și dedicarea lor emoțională pe parcurs.
Dacă trebuie să fiu sincer, ingeniozitatea jucătorilor în dezlegarea provocărilor a depășit cu mult planul nostru modest: în fiecare minut liber citeam chat-ul de pe Discord și, în unele cazuri, am plâns de râs, descoperind ce fac jucătorii și cum glumesc pe parcurs.
La proiect au muncit neobosit 7 persoane: un backend developer, un specialist hardware, un adevărat producător de film, un designer CG și doi inspirați co-producători.
În postările următoare, vom explica cum a fost implementat acest quest din punct de vedere tehnic, iar acum voi dezvălui soluția: cum trebuia să se hack-uiască această cameră în timpul transmisiunii. De asemenea, vom reaminti cronologia evenimentelor și toate teoriile nebune ale ilumiantilor din chatul Discord.
Ce aveau jucătorii la începutul jocului
Toate obiectele din cameră erau împărțite în trei categorii:
- Dispozitive IoT simple de utilizat, non-joc
- Dispozitive de joc pentru parcurgerea quest-ului
- Ambient

Am plasat 8 elemente foarte simple de gestionat: două lămpi, un șir de lumini, cinci litere SOCK, fiecare dintre ele având capacitatea de a schimba culoarea. Toate aceste elemente puteau fi activate/dezactivate direct de pe site, iar rezultatul era vizibil imediat în transmisie — le-am făcut accesibile tuturor jucătorilor, indiferent de nivelul lor de cunoștințe tehnice.

Tot ce se activa simplu de pe site
Printre elementele de joc importante, de care era nevoie pentru a finaliza quest-ul, accesul cărora nu era atât de ușor de obținut:
- Un server cu capacul deschis și un acvariu deasupra lui
- O greutate, suspendată astfel încât să spargă acvariul
- Megatron 3000 — un laser puternic, îndreptat către sfoara care susținea greutatea
- Un ventilator puternic, care se activa sub sarcină pe server
- Un flipchart pe care erau scrise username-ul și parola pentru Megatron
- Un telefon, la care se putea suna și se putea vedea apelul în direct
- Un shredder care mânca câte o bancnotă de 1000 de ruble pe oră
Cum a fost dezlegat quest-ul
Voi spune imediat: cutia se deschidea destul de ușor.
Obiectivul jocului era să oprești shredder-ul, provocând un scurtcircuit în cameră. Pentru acest lucru, trebuia să spargi acvariul, aruncând în el greutatea și să umpli serverul cu apă. Greutatea era suspendată pe un fir pe care Megatron îl ținti. Preluând controlul asupra Megatron, sfoara putea fi tăiată. Acest lucru se făcea în 5 pași simpli:
Pasul 1. Aduceți sarcină serverului aflat în cameră
De exemplu, prin trimiterea pachetelor cu comanda.
ab -r -n 10000 -c 100 -s 280 -l https://ws.ooosokol.ru/captchaSfatul a fost o captură foarte dificilă pe .

Acel captcha care trebuia atacat

În timpul încărcării serverului, temperatura acestuia creștea, iar acest lucru putea fi monitorizat pe ecranul deschis chiar înaintea camerei. Apoi se activa ventilatorul care ridica o ușoară perdea de pe flipchart. Atunci apărea loginul și parola de acces la pagina Megatron scrisă pe tablă.
Pagina de control a Megatron putea fi găsită verificând toate certificatele emise pentru domeniul ooosokol.ru.
Pe subdomeniu se afla pagina de control a Megatron. Însă aceasta nu se deschidea până când Megatron nu primea alimentarea inițială.
Toți acești pași au fost finalizați aproape instantaneu în comentariile transmisiunii pe youtube. Apoi, sarcinile au devenit mai dificile, iar jucătorii au creat serverul Discord RUVDS Hack Room și au continuat discuția acolo.
Pasul 2. Oferiți alimentarea inițială la Megatron
Toate dispozitivele inteligente gestionate de pe site (celebrile lumini care erau activate și dezactivate fără oprire de jucători) aveau identificatori proprii.
Pentru a oferi alimentarea inițială la Megatron și, în același timp, a-l ilumina, era necesar să găsiți și să activați un dispozitiv ascuns pe pagina de control a biroului.

Pentru aceasta, trebuia să ne uităm la identificatorii dispozitivelor și să observăm că sunt 4 dispozitive, dar pe site sunt disponibile doar 3.

Pagina Megatron devenea disponibilă la activarea celui de-al 4-lea dispozitiv, iar laserul se ilumina. Însă era imposibil să tragi cu laserul, iar pe pagina lui Indiciul despre compania de administrare

3. Sună compania de administrare și cere să activezi alimentarea la Megatron
Din cauza LOR Megatron nu putea trage, deoarece în birou s-au fumat siguranțele. Activarea alimentării înapoi putea fi făcută doar de compania de administrare, la care trebuia să suni și să treci identificarea ca și proprietar de SRL.
A fost ușor să găsim numărul companiei de administrare - l-am inserat direct în footer.
Însă a trece identificarea a fost mult mai greu.

А вот пройти идентификацию было гораздо сложнее.
Când am sunat la numărul +74991130688, a răspuns o fată-operator și, cu un ton plictisit, a cerut să spun NIF-ul companiei și numele complet al proprietarului. Fără aceste informații, ea a refuzat să activeze alimentarea și a explicat că sunt doar o dispecerată externalizată, că au 2000 de clienți și birouri și că fără aceste informații nu poate găsi ceea ce caută.
Pentru jucători, acesta a fost cel mai complicat etapă. NIF-ul corect și numele proprietarului au fost căutate timp de aproape două zile, iar eu (în calitate de operator al dispeceratului) am primit mai mult de 400 de apeluri în acest timp. Telefonul suna la fiecare 2-3 minute.
Băieții au făcut tot ce au putut. Au folosit totul: au deschis sursele site-ului, au căutat proprietarul site-ului Sokolov, l-au verificat pe rețelele sociale.
Au căutat NIF-uri ale diferitelor companii.

Planul aproape complet de căutare.
Într-un moment dat, au sunat chiar folosind un număr fals — de parcă apelau din biroul companiei Sokol, menționată în subsol.
Atunci am aflat câte companii poartă numele Sokol. Practic, fiecare dintre aceste companii a fost apelată de jucători, dar asta nu se compară cu ce a trăit site-ul. , de la care am cumpărat acel Megatron acum aproximativ o lună.
Mai întâi, discord a atacat suportul LaserMasters.

Apoi au reușit să găsească acolo un cont al cuiva! În timp ce suportul LaserMasters a devenit mai vorbăreț.
Atenție, îndepărtați copiii de la ecran!


În cele din urmă, au decis să facă DDoS asupra LaserMasters și site-ul lor a căzut. De asemenea, am reușit să cădem și site-ul Sokol, deși l-am ridicat rapid.
În timpul investigației, băieții din discord au găsit chiar un actor, fotografia căruia am cumpărat-o de pe stocuri, pentru a interpreta rolul principalului antagonist, proprietarul LLC Andrei Sokolov. Se pare că îl cheamă Yuri și că nu are habar în ce problemă a intrat.

Andrei Sokolov, personajul jocului.

Yuri, modelul.
Dacă ar fi știut cum a făcut 600 de oameni să nu doarmă timp de două zile...)
Apoi, au început să cerceteze în mod specific sub mine, ca organizator al quest-ului (ceea ce ar fi putut avea succes dacă băieții ar fi reușit să-mi hack-uiască canalele de lucru).

M-am îngrijorat puțin când mi-au menționat patronimul și chiar și codul meu fiscal. Dar m-am relaxat când, în procesul de telefon stricat, am descoperit că am un frate mai mare, care s-a dovedit a fi director tehnic la Habr.
Fratele meu drag, care a primit și el ceva

Între timp, ipotezele deveneau din ce în ce mai incredibile

Și s-a ajuns la teorii iluminate.

Cele mai savuroase teorii ale conspirației se refereau la SpongeBob, Harry Potter și lumina intermitentă a ghirlandei de diode chinezești pe care am pus-o în interiorul unității centrale.
De unde vine SpongeBob și Harry Potter, veți spune? Le-am băgat adresele pe pagina de contacte a Sokola și asta a generat o mulțime de speculații în comunitatea de Discord. Deși voiam doar să aducem un omagiu operelor noastre preferate din copilărie.

Acea mențiune de pe pagina ""
Și în urma acestui lucru





S-a descoperit că în serial există cu adevărat documente ale lui SpongeBob. Le numeau ca fiind codul fiscal

Una dintre cele mai complexe teorii era că în pulsațiile ghirlandei chinezești era un mesaj în cod Morse.
Am înregistrat scintilațiile și am încercat să le decryptăm



Dintre teoriile mai simple — băieții au încercat să înțeleagă dacă nu cumva e ascuns un indiciu în hărți.

Pe drum, ne-au comparat cu — o evaluare nemeritat de bună, dar oricum plăcută.


Jucătorii au încercat cu fervoritate ingineria socială. M-au sunat sub pretextul FSB-ului, al pompierilor, al lui Sokolov, al fostei sale soții și al unui paznic care se pretindea că stă la noi la parter. Au spus că a început un incendiu, cineva a rămas blocat în lift, iar cea mai emoționantă poveste a fost că în biroul cuprins de flăcări se află un cățel al apelantului.

Au fost și încercări de mită
Încet, în chat au început să apară meme proprii.
Iată câteva



Între timp, uzinele se opreau





Indiciu
Banul din shredder se reducea tot mai mult. Pentru ca câștigătorul să primească măcar ceva, am decis să facem un indiciu. De asemenea, urmând regulile designului de joc, chiar înainte de final să creștem tensiunea.
Printr-o în blog am pus un videoclip. La început a fost inserat un fragment din Fight Club — ca referire la Tyler Durden, care se gândea la inserarea 25-ului cadru în filme, în timp ce lucra în cinematografe.
Am decis să aplicăm aceeași mecanică și am inserat 25-ul cadru ca indiciu, cum să codul fiscal corect și numele complet al proprietarului.


După aceasta, băieții s-au descurcat foarte repede
Pasul 4. Atragerea cu laserul în modul non-combat
La activarea alimentării de către compania de gestionare și după introducerea siguranțelor, Megatron se activa și putea trage în modul de testare. În formularul de introducere fusese deja introdus un token pentru un tir de test.

Fiecare 25 de secunde se genera un nou token, care putea fi folosit pentru a activa laserul timp de 10 secunde la o putere de 10/255
Apoi, laserul se răcea timp de 1 minut și în acest minut nu era disponibil, nu accepta noi solicitări de tragere.
Această putere nu era suficientă pentru a tăia frânghia, dar orice jucător putea trage cu Megatron și vedea raza laser în acțiune.
Reacția comunității a fost mai mult decât tumultoasă

Dar toată lumea s-a calm în curând și a înțeles că acesta nu era sfârșitul jocului

Mai departe, comunitatea a început să descifreze cum se pornește modul de luptă
Brainstorming


Au apărut falsuri pe Discord
Nu știm că pe piciorul mesei în transmisie era scris ceva
Comunitatea a trecut la pasul 4. Să înțeleagă cum se generează token-urile: să găsească gist-ul și să genereze un token care activează laserul în modul de luptă
Modul de luptă al lui Megatron este 100% puterea laserului la 3 W. Acest lucru este suficient timp de 2 minute pentru a tăia frânghia care ținea greutatea, a sparge acvariul și a inunda serverul cu apă.
Am lăsat câteva indicii pe : anume codul de generare a token-ului, care permitea să se înțeleagă că token-urile de test și cele de luptă sunt generate pe baza unei singure măsuri a contorului. În cazul token-ului de luptă, pe lângă valoarea contorului se folosește și un salt, care a fost lăsat aproape complet în istoria modificărilor acestui gist, cu excepția ultimele două simboluri.

Cum și-au dat toți seama rapid, aceasta era 42
În comentariile gist-ului era o corespondență între Andrei Sokolov și dezvoltator ("dezvoltatorul înțelept", cum l-au numit băieții din Discord).
În corespondență, Andrei a trimis unul dintre token-urile de luptă, iar dezvoltatorul a răspuns că acest token a fost inițializat la valoarea contorului 42.

Cunoscând aceste date, se putea verifica ultimele 2 simboluri ale saltului și se putea descoperi că pentru acesta s-au folosit cifre din Lost, traduse în sistem hexazecimal.
Apoi, jucătorii au trebuit să capteze valoarea contorului (analizând tokenul de test) și să genereze un token de luptă, folosind următoarea valoare a contorului și sarea obținută la pasul anterior.
Contorul s-a incrementat cu fiecare test de tragere și la fiecare 25 de secunde. Despre aceasta nu am menționat nicăieri, trebuia să fie o mică surpriză în joc. Echipa a rezolvat rapid problema și a activat megatronul în modul de luptă.
Pasul 5. Înghițeți funia cu laserul

Cum a fost
Aici totul este simplu. Trimiterea tokenului de luptă activa laserul în modul de luptă, iar camera se transforma și intra în „modul de catastrofă”, așa cum l-am numit în scenariul general:
- Toată lumina din cameră se stinge
- Butonii dispozitivelor iot de pe site deveneau inaccesibili
- Se activa un flash și sunetul unei sirene
- Greutatea roșie se lumina
- Pe ecranul televizorului începea numărătoarea inversă până la activarea laserului în modul de luptă
Am dat o oră și jumătate pentru numărătoarea inversă, pentru ca toți cei care jucau să aibă timp să activeze transmisia și să vadă finalul. Și nu degeaba: în timp ce așteptam cu inima bătând să aud sunetul impactului și sticla care se spărgea din camera alăturată, întreaga echipă care construiște questul, fără să se consulte, a început să se îndrepte spre bază pentru a vedea finalul cu ochii lor. Ei doar alergau în cameră și începeau să se îmbrățișeze.
Între timp, în Discord


După încheierea numărătorii inverse, laserul s-a activat în modul de luptă și, în două minute, a tăiat funia — greutatea a zburat direct spre acvariu. Înainte de impact, pe ecran s-a auzit o capibara nebună, strigând, în panică, cu labele mici ridicate.
Cum toată echipa era acolo, am filmat un mesaj scurt pentru toți cei care au luptat timp de două zile pentru final, în Discord, și am mers să deschidem șampania:

Cum am calculat timpul pentru lansarea videoclipurilor comerciale și zborul greutății?
După zeci de teste de tăiere a funiei cu laserul, am realizat că aceasta este o construcție foarte nesigură — funia tăiată parțial devine mai subțire, sub greutatea funiei se întindea, își schimba poziția și laserul nu mai putea să o taie complet.
Așadar, am ales o altă cale: am duplicat arderea, înfășurând frânghia cu un fir din nichrom. Prin fir curentul electric a trecut, acesta s-a încălzit până la roșu și a ars frânghia în aproximativ 2 secunde — aceasta ne oferea o înțelegere exactă a când să activăm capibara strigătoare, să oprim cronometrarea și să lansăm spotul publicitar:

Ce nu a funcționat?
În final, din unitatea de sistem ar fi trebuit să iasă un fum dens, ca la un incendiu — am pregătit fumigene, le-am aprins similar, dar dintr-un motiv oarecare nu au funcționat (probabil din cauza apei).
Cine este câștigătorul?
Câștigătorul a fost Arcadi Alexeev din Sankt Petersburg — tocmai el a generat primul token de test și a câștigat banii rămași în shredder, în valoare de 134.000 de ruble.
Un mic interviu cu Arcadi.
Spune-ne despre tine, cu ce te ocupi la muncă?
Sunt specialist în securitate, am absolvit BIT la ITMO. Lucrez ca dezvoltator web full-stack în outsourcing. La școală eram olimpic, inclusiv la programare și matematică.
Cum ai aflat despre joc?
Am intrat pe Habr doar ca să citesc, am văzut un articol, m-am interesat.
Câte ore ai jucat, când te-ai alăturat?
M-am alăturat seara acelei zile, când a fost publicat articolul (cu o zi înainte de final). Am stat seara și o mare parte din ziua următoare.
Ce ți-a plăcut, ce nu?
În general, mi-a plăcut tot (până la urmă, am câștigat)), dar m-a deranjat puțin partea cu apelurile. Adică să suni și să verifici fiecare versiune era cumva incomod, mai ales că înțelegeam că mai sunt câteva zeci de oameni care sună, jumătate glumesc și încearcă ingineria socială.
Cum ai înțeles cum să găsești tokenul de luptă pentru megatron?
Când am intrat, deja se făcuse spam pe server, apăsaseră pe lumini, găsiseră parola pentru adminul laserului, diverse subdomenii și pagini.
A fost ușor să găsești profilul pe GitHub și gist-ul cu comentarii. De acolo este evident procesul de generare a tokenului și secretul pentru acesta. În astfel de questuri nu trebuie să inovezi prea mult imo, deoarece poți fi cufundat în multe varianta de evoluție a evenimentelor; și în consecință, trebuie să urmezi direcția în care te împinge creatorul questului.
Ținând cont de celelalte subdomenii și de site-ul de test de pe Tilda, a devenit clar că, după alimentarea cu energie a laserului, va trebui să găsesc un token. În consecință, chiar în acea seară am schițat o cerere generală pentru activarea laserului (bazată pe cele 4 forme disponibile: 1 pe site-ul de lucru și 3 pe site-ul de test / vechi) și am încercat să brutez token-uri de lucru începând cu 42 (așa, de nebun — poate că era deja totul activat, iar pagina cu trimiterea token-ului s-ar fi deschis doar după INN și numele complet).
Nu sunt sigur că cererea a fost corectă, deoarece nu am avut timp să verific (deoarece verificarea putea fi efectuată doar pentru activarea laserului), dar m-am pregătit din timp pentru a brutez token-ul.
Acolo exista o logică evidentă cu websocket-urile și controlul dispozitivelor în fișierul app.js. Era un indiciu gros legat de dispozitivul a9, care genera o eroare de socket când trimiteam power: true. Am încercat să-i trimit tot felul de lucruri — cine știe, poate existau dispozitive suplimentare pentru descifrarea INN-ului, dar fără succes.
Apoi am mai încercat să brutez celelalte ID-uri în jurul celor zece, dar toate erau device-uri necunoscute. Am încercat, de asemenea, să caut tot felul de lucruri pe Google, m-am conectat la chsokolow@gmail.com, am trimis diverse prin formularul de pe pagina de prețuri, am cercetat cu lasermasters, dar tot fără succes. În ziua următoare, am stat în chat, căutând diverse, apoi a apărut tema stego și am discutat cu cineva de la stegosolve pentru imagini și gif-uri (dar în mod logic, știam că 99% din ele nu conțin nimic, deoarece ar fi fost prea mult + s-ar fi contrazis cu linia principală a quest-ului).
Dar, în final, am stat câteva ore și am analizat toate imaginile și gif-urile. Am mai sunat de câteva ori cu diverse variante de INN, dar fără succes. Apoi am decis să mai las totul deoparte, dar au postat un indiciu — și a devenit clar că, în scurt timp, INN-ul va fi găsit, ceea ce s-a și întâmplat. Apoi, fie eu, fie altcineva (nu e clar) am trimis power: true pe dispozitivul a9 și laserul a început să funcționeze, deși s-ar putea să nu existe o legătură și să fi început să funcționeze pur și simplu după INN. În general, am intrat în administrarea laserului și am fost surprins, deoarece serverul trimitea singur token-ul (iar eu mă pregăteam să brutez). A devenit evident că token-ul era unul de test, deoarece transmisia + bunul simț + l-am verificat.
În cod existau logica de trimitere a tokenului de lucru undeva prin notificare, dar, probabil, fie era un cod incorect, fie era necesar pentru alte părți ale sistemului. Am schițat un script pentru a obține tokenul de lucru curent din testul actual și am început să apăs F5, încercând să le trimit — au fost probleme cu asta, deoarece toată lumea apăsa constant butonul de trimitere, schimbând astfel tokenul. Apoi, site-ul a picat, numărătoarea a fost resetată, dar nu asta contează — după un timp, am trimis tokenul de lucru. Teoretic, numărătoarea era 58 și tokenul era 449a776938f7ce4cf19f8603045dca0f la momentul activării, dacă nu greșesc. De fapt, asta e tot.
Apoi, m-am mai enervat puțin de comentarii de genul „da, toate astea sunt triviale, doar am avut noroc”. Ei bine, dacă intri pe pagină, te gândești o minută, scrii un script în câteva minute, îl verifici — atunci da, e trivial. Dar am făcut asta în 10-20 de secunde și apoi am avut probleme timp de câteva minute să trimit tokenul.
Desigur, puteam încerca să scriu logica pentru a captura și trimite automat, dar ar fi durat mai mult și ar fi fost un risc mai mare, plus probabil că cloud-ul ar fi început să se plângă. Ce mi-a mers cu adevărat bine a fost ultima etapă — puțin algoritmi pe viteză + viteza de reacție, asta este exact ceea ce îmi place. Dacă ar fi fost o sarcină direct din pen-test, probabil că nu aș fi fost primul.
Dar asta nu e încă sfârșitul
Abia aștept să vă povestesc despre toată echipa minunată care a construit acest quest și despre toate soluțiile ingineresti pe care le-a găsit. Dar acest post a ieșit deja mult prea mare — așa că vor fi articole separate despre asta, așa că rămâneți aproape și abonați-vă la blogul nostru de pe Habra.
Sursa: habr.com
