Před pár dny jsme dokončili jednu z nejvíce emocionálně nabitých událostí, kterou jsme měli tu čest organizovat v rámci blogu — hackerskou online hru s destrukcí serveru.
Výsledky překonaly všechna naše očekávání: účastníci se nejen zapojili, ale rychle se zorganizovali do soudržného společenství 620 lidí na Discordu, které doslova dobývalo quest během dvou dnů bez přestávky na spánek.
A tak to skončilo:

Jak to všechno začalo a o co vlastně šlo?
Hra začala 12. srpna, kdy jsme na blogu zveřejnili video, ve kterém hacker v kostýmě lebky vyzývá k účasti ve hře, zničit server, způsobit v místnosti zkrat (nebo mini požár) a vzít zbylé peníze ve shredderu.
Byl to online quest: spustili jsme YouTube přenos z místnosti, kterou jsme naplnili IoT zařízeními, pod postelí byl server (který měl být zničen), a nad serverem jsme umístili akvárium a zavěsili nad ním závaží. Aby hra byla zajímavější, rozhodli jsme se vytvořit cenový fond ve výši 200 000 rublů, který jsme naložili do shredderu a nastavili ho na zapnutí každých 60 minut. Každou hodinu shredder zkonzumoval 1000 rublů — čím dříve by hráči zastavili, tím více peněz by vyhráli.

Budování tohoto questu bylo samo o sobě questem — museli jsme se stravovat z jedné služby a spát několik hodin denně přímo v téže místnosti. Nejdůležitější však bylo pozorovat tok myšlenek hráčů a jejich emocionální zapojení během procesu.
Pokud mám být upřímný, tak vynalézavost hráčů při řešení úkolů mnohokrát překonala náš skromný plán: každou volnou minutu jsme sledovali chat na Discordu a v některých případech jsme doslova plakali smíchy, když jsme zjišťovali, co hráči dělají a jak během hry žertují.
Na projektu neúnavně pracovalo 7 lidí: backend vývojář, hardwarový specialista, skutečný filmový producent, CG designer a dva tvůrci nápadů.
V následujících příspěvcích vám povíme, jak byl quest technicky realizován, a zatím vám odhalím jeho rozluštění: jak správně hacknout tuto místnost během přenosu. Také si připomeneme chronologii událostí a všechny šílené iluminate teorie z chatteru na Discordu a všechno další.
Co měli hráči na začátku hry
Všechny předměty v místnosti byly rozděleny do tří kategorií:
- Jednoduše ovladatelné, neherní IoT zařízení
- Herní zařízení pro absolvování questů
- Atmosféra

Umístili jsme 8 velmi snadno ovladatelných prvků: dvě lampy, jeden girland, pět písmen SOKOL, z nichž každé bylo možné měnit barvu. Všechny je bylo možné zapínat/vypínat přímo z webu a ihned vidět výsledek na přenosu — speciálně jsme je udělali dostupné pro všechny hráče, bez ohledu na úroveň technické zdatnosti.

Vše, co se jednoduše zapínalo z webu
Z důležitých herních prvků, které byly nezbytné pro absolvování questů a k nimž nebyl tak snadný přístup:
- Server s otevřeným víkem a akváriem nad ním
- Kettlebell zavěšená tak, aby rozbila akvárium
- Megatron 3000 — výkonná laserová ukazovátka, namířená na provaz, který drží kettlebell
- Výkonný ventilátor, který se zapínal při zátěži na serveru
- Flipchart, na kterém byly napsány login a heslo k Megatronu
- Telefon, na který bylo možné zavolat a vidět svou hovor v přímém přenosu
- Škrabák, který stravoval 1000-rublovou bankovku za hodinu
Jak byl přesně vyřešen kvíz
Řeknu hned: krabička se otevírala docela jednoduše.
Cílem hry bylo zastavit škrabáka tím, že se udělá zkrat v místnosti. K tomu bylo nutné rozbít akvárium, vhodit do něj kettlebell a zalít server vodou. Kettlebell byla držena na provázku, na který mířil Megatron. Ovládat Megatronem, lana bylo možné přerušit. To se dalo udělat ve 5 jednoduchých krocích:
Krok 1. Zatížit server, který stál v místnosti
Například odesíláním paketů příkazem.
ab -r -n 10000 -c 100 -s 280 -l https://ws.ooosokol.ru/captchaNápovědou byla velmi zatěžující na .

Ta samá kapča, kterou bylo třeba napadnout

Při zátěži serveru se zvyšovala jeho teplota a to bylo možné sledovat na monitorování, které bylo otevřeno přímo před kamerou. Poté se zapnul ventilátor, který otevřel lehký závěs na flipchartu. Tehdy se otevřel napsaný na tabuli login a heslo pro přístup na stránku Megatronu.
A samotnou stránku pro řízení Megatronu bylo možné najít, pokud zkontrolujete všechny certifikáty vydané na doménu ooosokol.ru.
Na subdoméně byla stránka správy Megatronu. Ale neotevřela se, dokud nebylo Megatronu dodáno primární napájení.
Všechny tyto etapy hráči prošli téměř okamžitě v komentářích vysílání na YouTube. Dále byly úkoly složitější a hráči vytvořili Discord server RUVDS Hack Room a pokračovali v diskusi tam.
Krok 2. Dodání primárního napájení na Megatron
Všechna chytrá zařízení ovládaná z webu (ty stejné lampy, které bez přestání zapínali nebo vypínali hráči) měla své identifikátory.
Aby bylo možné dodávat primární napájení na Megatron a zároveň jej osvítit, bylo třeba najít a zapnout skryté zařízení na stránce správy kanceláře.

K tomu bylo nutné se podívat na identifikátory zařízení a zjistit, že celkem zařízení je 4, zatímco na webu jsou dostupná jen 3.

Stránka Megatronu se po zapnutí 4. zařízení stala dostupnou a samotný laser se rozsvítil. Ale přitom bylo nemožné střílet laserem, protože na něm visela zpráva, že laser zatím není dostupný, a nápověda: v kanceláři vyhořely pojistky, je třeba volat na správní společnost a požádat o zapnutí napájení.

Nápověda o správní společnosti
3. Zavolat na správní společnost a požádat o zapnutí napájení Megatronu
Podle LORu Megatron nemohl vystřelit, protože v kanceláři vyhořely pojistky. Napájení zpět mohl zapnout pouze správní společnost, na kterou bylo třeba zavolat a projít identifikací jako majitel LLC.
Najít číslo správní společnosti bylo snadné — vložili jsme jej přímo do patičky.

Ale projít identifikací bylo mnohem složitější.
Při zavolání na číslo +74991130688, zvedla telefon operátorka a nudným hlasem požádala o uvedení IČO společnosti a celé jméno majitele. Bez toho zapojení napájení odmítala a vysvětlila to tím, že je to obyčejná dispečerská služba na outsourcingu, mají 2000 klientů a kanceláří a bez těchto informací není možné najít požadovaný.
Pro hráče to byl nejtěžší krok. Správné IČO a jméno majitele hledali téměř dva dny, a já (v roli operátora dispečerské služby) během této doby přijala více než 400 telefonátů. Telefon zvonil každé 2-3 minuty.
Kluci pátrali, jak mohli. Používali vše: prozkoumávali zdrojové kódy webu, googlili majitele webu Sokola, zkoumali sociální sítě.
Hledali IČO různých společností

Téměř kompletní schéma vyhledávání
V jednu chvíli dokonce zavolali se zaměněným číslem — jako by volali z kanceláře společnosti Sokolec uvedené v patičce.
Tehdy jsme zjistili, kolik obrovské množství firem nese název Sokolec. Prakticky každé z těchto firem se dovolali hráči, ale to se nedalo srovnávat s tím, co zažil web , od které jsme skutečně kupovali ten Megatron před přibližně měsícem.
Nejprve Discord zaútočil na podporu LaserMasters.

Pak tam dokázali najít něčí účet! Zatímco podpora LaserMasters už nešetřila výrazy.
Pozor, odstraňte děti od obrazovky


Nakonec jsme se rozhodli prostě DDoSovat LaserMasters a jejich web spadl. Stejně se podařilo položit i web Sokolec, i když jsme ho rychle zvedli.
Během vyšetřování kluci z Discordu dokonce našli herce, jehož fotografii jsme koupili ze stocků, aby hrál roli hlavního antagonisty, vlastníka LLC Andreje Sokolova. Ukázalo se, že se jmenuje Jurij a nemá vůbec ponětí, do jakého malátného dobrodružství se dostal.

Andrej Sokolov, postava hry

Jurij, model
Kdyby věděl, jak přinutil 600 lidí nespát dva dny...)
Pak začali kopat konkrétně pod mě, jako organizátora questů (což mohlo skončit úspěchem, kdyby kluci uhádli, jak hacknout moje pracovní kanály).

Trochu jsem se znepokojila, když zmínili mé patronymikum a dokonce i IČO. Ale ulevilo se mi, když mi během procesu zkresleného telefonu náhle přišel starší bratr, který se náhle ukázal jako technický ředitel Habra.
Můj drahý rodný bratr, kterému to také spadlo do klína

Mezitím se domněnky stávaly stále neuvěřitelnější

Až do iluminátských teorií.

Nejsou to nejšťavnatější konspirační teorie týkající se Sponge Boba, Harryho Pottera a blikající čínské LED řetězy, které jsme položili dovnitř systémové jednotky.
Odkud Sponge Bob a Harry Potter, řeknete? Jejich adresy jsme vložili na stránku kontaktů Sokolec a to vyvolalo spoustu domněnek v discordové komunitě. Přitom jsme jen chtěli vzdát hold našim oblíbeným dětským dílům.

Odkaz na stránce ""
A nakonec





Ukázalo se, že v seriálu skutečně existují dokumenty Houbového Bobka. Byly nazývány jako IČO

Jedna z nejobtížnějších teorií byla ta, že blikání čínských lampionů obsahuje zprávu v Morseově abecedě.
Jasné signály byly zachycovány a pokoušeli se je dešifrovat.



Z jednodušších teorií se snažili zjistit, jestli není nějaká nápověda zasunutá v mapách.

Cestou nás srovnávali s — nepřiměřeně vysoko hodnocení, ale i tak příjemné.


Hráči naplno zkoušeli sociální inženýrství. Volali mi pod záminkou FSB, hasičů, samotného Sokolova, jeho bývalé ženy a ochránce, který prý sedí dole. Říkali, že začal požár, někdo uvízl v výtahu, a nejvíce dojemná byla historka o tom, že v kanceláři, kterou zachvátil oheň, prý sedí pejsek volajícího.

Pokusy o úplatky také proběhly.
Postupně se v chatu začaly objevovat vlastní memy.
Tady je pár z nich.



A továrny mezitím stály.





Nápověda
Peněz ve šrederu ubývalo. Aby vítěz získal něco, rozhodli jsme se udělat nápovědu. A také, vycházející ze zásad herního designu, přímo před finále zvýšit napětí.
Samostatným na blogu jsme zveřejnili video. Na začátku byl vložen úryvek z Klub rváčů — jako odkaz na Tylera Durdena, který myslel na vkládání 25. snímku do filmů, zatímco pracoval v kinech.
Rozhodli jsme se použít tuto stejnou mechaniku a vložili 25. snímek jako nápovědu, jak správné IČ a jméno vlastníka.


Poté se kluci velmi rychle zorientovali.
Krok 4. Střílet laserem v nebojovém režimu.
Při dodávce energie správcem a po zapnutí pojistek se Megatron zapnul a mohl střílet v testovacím režimu. Do formuláře pro zadání byl již vložen token pro testovací výstřel.

Každých 25 sekund se generoval nový token, který bylo možné využít k zapnutí laseru na 10 sekund na výkonu 10/255.
Poté se laser chladil 1 minutu a v tuto minutu nebyl dostupný, nepřijímal nové výstřely.
Tento výkon nebyl vůbec dostatečný k přepálení provazu, ale kterýkoli hráč mohl vystřelit z Megatrona a vidět laserový paprsek v akci.
Reakce komunity byla více než bouřlivá.

Ale všichni se rychle uklidnili a pochopili, že to ještě není konec hry.

Dál se komunita začala zabývat tím, jak spustit bojový režim.
Brainstorming.


Na Discordu se objevily fake účty.
Nevěděli jsme, že na noze stolu je v přenosu něco napsáno.
Komunita se dostala k kroku 4. Porozumět, jak se generují tokeny: najít gist a vygenerovat token, který zahrnuje laser v bojovém režimu.
Bojový režim Megatronu je 100% výkon laseru na 3 W. To je zcela dostačující na 2 minuty, aby spálil provaz, který držel závaží, rozbil akvárium a zalil server vodou.
Zanechali jsme několik nápověd na : konkrétně kód generování tokenu, podle kterého bylo možné pochopit, že testovací a bojové tokeny se generují na základě jedné hodnoty počítadla. V případě bojového tokenu se kromě hodnoty počítadla ještě používá sůl, kterou jsme téměř úplně nechali v historii změn tohoto gistu, kromě dvou posledních znaků.

Jak si všichni rychle domysleli, bylo to 42.
V komentářích gistu byla korespondence Andreje Sokolova s vývojářem ("moudrý vývojář", jak ho nazvali kluci z Discordu).
V korespondenci Andrej poslal jeden z bojových tokenů a vývojář odpověděl, že tento token byl inicializován při hodnotě počítadla 42.

S těmito údaji bylo možné vyzkoušet 2 poslední znaky soli a fakticky zjistit, že pro ni byla použita čísla z Lost, převedená do 16-číslicové soustavy.
Poté hráčům zbývalo pouze chytit hodnotu počítadla (analyzováním testovacího tokenu) a vygenerovat bojový token, používajíc následující hodnotu počítadla a vybranou sůl z předchozího kroku.
Počítadlo se jednoduše inkrementovalo při každém testovacím výstřelu a každých 25 sekund. O tom jsme nikde nezmiňovali, to mělo být malou herní nečekaností. Kluci si s tím velmi rychle poradili a spustili Megatron v bojovém režimu.
Krok 5. Spálit provaz laserem.

Jak to probíhalo.
Tady už to bylo jednoduché. Odeslání bojového tokenu zahrnovalo laser do bojového režimu, a místnost se měnila a přecházela do „režimu katastrofy“, jak jsme to nazvali v celkovém scénáři:
- Veškeré světlo v místnosti se vypnulo.
- Tlačítka IoT zařízení na webu se stala nedostupnými.
- Rozsvítila se blikající světla a zvuk sirény.
- Červené závaží se rozsvítilo.
- Na obrazovce televize začal odpočet do spuštění laseru v bojovém režimu.
Dali jsme půldruhé hodiny na odpočet, aby se všichni, kdo hráli, stihli zapnout přenos a vidět finále. A nešlo o náhodu: zatímco jsem s napětím očekávala zvuk úderu a rozbíjejícího se skla z vedlejší místnosti, celý tým, který sestavil quest, se bez domluvy začal sjíždět na základnu, aby viděli finále na vlastní oči. Prostě vbíhali do místnosti a začali se objímat.
Mezitím v Discordu


Po skončení odpočtu se laser zapnul do bojového režimu a za dvě minuty přepálil provaz — kettlebell letěla přímo do akvária. Před nárazem na obrazovce zakřičela šílená kapibara, panikařila a zvedla malé tlapičky.
Když už se tam sešel celý tým, natočili jsme krátkou zprávu pro všechny, kdo dva dny bojovali za finále na Discordu, a šli otevřít šampaňské:

Jak jsme spočítali čas spuštění reklamních videí a let kettlebellu?
Po desítkách testů přepalování provazu laserem jsme zjistili, že to je velmi nespolehlivá konstrukce — polopřepálený provaz se stal tenčím, pod váhou kettlebellu se napínal, měnil polohu a laser již nemohl projít až do konce.
Proto jsme šli jinou cestou: dublovali jsme přepalování, omotáním provazu nichromovým drátem. Skrze drát jsme pouštěli proud, ten se nažhavil a přepálil provaz přibližně za 2 sekundy — to nám dalo přesnou představu o tom, kdy zapnout křičící kapibaru, zastavit časovač spuštění a spustit reklamní video:

Co se nám nepovedlo?
Ve finále měl z boxu vycházet hustý kouř, jako při požáru — připravili jsme dýmovnice, zapalovali je podobným způsobem, ale nějak to nefungovalo (pravděpodobně kvůli vodě).
Kdo je vítěz?
Vítězem se stal Arkadiy Alexeev ze Sankt-Petěrburgu — on jako první vygeneroval testovací token a vyhrál zbytek peněz ve shredderu ve výši 134 000 rublů.
Krátký rozhovor s Arkadiem.
Pověz mi o sobě, čemu se věnuješ v práci?
Jsem bezpečnostní technik, studoval jsem BITS na ITMO. Pracuji jako full-stack webový vývojář na volné noze. Ve škole jsem byl olympionik, včetně programování a matematiky.
Jak jsi se o hře dozvěděl?
Zašel jsem na Habr jen tak na čtení, viděl jsem článek, zaujal mě.
Kolik hodin jsi hrál, když ses připojil?
Připojil jsem se večer toho dne, kdy byla zveřejněna článek (tj. den před koncem). Seděl jsem večer a velkou část následujícího dne.
Co se ti líbilo a co ne?
Celkově se mi to všechno líbilo (no a co, vyhrál jsem)), ale trochu mě obtěžovalo, jak často jsem musel volat. No, volat a kontrolovat každou verzi je tak nějak nepříjemné, přinejmenším bylo trapné - chápal jsem, že tam volá dalších několik desítek lidí, polovina si dělá srandu a snaží se o soc. inženýrství.
Jak jsi pochopil, jak najít bojový token k megatronu?
Když jsem přišel, už spammovali server, hráli si s tlačítky, našli heslo od admin panelu laseru, různé subdomény a stránky.
Ještě bylo snadné najít profil na Gitu a gist s komentáři. Odtud je zřejmý proces generování tokenu a secret pro něj. V takových questech není potřeba šíleně vymýšlet, protože se dá utopit v hromadě možných scénářů; a tím pádem je potřeba následovat to, kam tě tlačí tvůrce questu.
S ohledem na ostatní subdomény a testovací web na Tildě bylo jasné, že poté, co se zapne napájení laseru, bude potřeba získat token. Proto jsem ještě ten večer sepsal přibližný požadavek na zapnutí laseru (na základě 4 dostupných formulářů: 1 na pracovním webu a 3 na testovacím/staro-ní) a pokusil jsem se bruteforce pracujícími tokeny od 42 (no, prostě tak, na blbce - třeba už je všechno zapnuto a stránka pro odesílání tokenu se jednoduše otevře po IČ a jméně).
Nejsem si jistý, že požadavek byl správný, protože nebyl čas na kontrolu (protože bylo možné zkontrolovat jen zapnutí laseru), ale na přebírání tokenu jsem se připravoval předem.
Ještě tam byla zřejmá logika s websockety a ovládáním zařízení v souboru app.js. Byl tam silný náznak na zařízení a9, na které odeslání power: true způsobilo pád socketu. Zkoušel jsem na něj posílat různé příkazy - třeba tam mohlo být další zařízení pro odhalení IČ, ale bez úspěchu.
Po chvíli jsem prozkoumal i ostatní ID v okolí těch deseti, ale všude bylo unknown device. Pak jsem se pokusil vyhledávat různé věci, přihlásil jsem se na chsokolow@gmail.com, poslal jsem různé informace ve formuláři na stránce s cenami, zkoumal jsem lasermasters, ale všechno bez úspěchu. Následující den jsem byl v chatu, vyhledával jsem různá témata, pak se objevilo stego-téma a poradil jsem se s někým ohledně stegosolve pro obrázky a GIFy (ale rozum mi říkal, že 99% tam nic není, protože by to bylo příliš + odporovalo by to hlavní linii questu).
Nakonec jsem také pár hodin procházel všechny obrázky a GIFy. Znovu jsem volal s různými variantami IČO, ale nic. Potom jsem se rozhodl na chvíli zapomenout, ale někdo zveřejnil nápovědu — a bylo jasné, že IČO brzy najdou, což se i stalo. Pak to buď já, nebo někdo jiný (to není jasné) poslalo power: true na a9 zařízení a laser začal fungovat, i když možná zde není spojení a začal fungovat prostě po IČO. Každopádně jsem se dostal do administrace laseru a byl jsem nemile překvapen, protože server sám posílal token (a já už jsem se připravoval na bruteforce). Bylo jasné, že token je testovací, protože vysílání + zdravý rozum + já jsem ho zkontroloval.
V kódu byla logika pro posílání pracovního tokenu někam notifikací, ale zřejmě to byl buď neplatný kód, nebo to bylo potřeba pro jiné části systému. Napsal jsem skript pro získání aktuálního pracovního tokenu z aktuálního testovacího a pak jsem čekal na F5, snaže se je poslat — s tím byly problémy, protože všichni neustále mačkali tlačítko odeslat, čímž měnili token. Potom také web spadl, čítač se resetoval, ale teď už na tom nezáleží — po nějaké době jsem poslal pracovní token. Podle plánu měl čítač 58 a token byl 449a776938f7ce4cf19f8603045dca0f v době aktivace, pokud se nepletu. To je vlastně všechno.
Pak jsem měl ještě pár rozčilení z komentářů jako "ano, to je všechno triviální, ano, měl jsi prostě štěstí." No, pokud se dostanete na stránku, promyslíte to minutu, napíšete skript za pár minut, zkontrolujete ho — pak ano, triviální. Ale já to udělal za 10-20 sekund, a pak jsem prostě několik minut nemohl token odeslat.
Samozřejmě, mohl jsem zkusit napsat logiku pro automatické zachycení a odesílání, ale to by bylo delší a s velkým rizikem, navíc by snad cloud začal protestovat. To, co mi opravdu vyšlo, bylo samotné poslední fáze — trochu algoritmů na rychlost + rychlost reakce, to je přesně moje. Kdyby tam bylo zadání přímo z pentestu, pravděpodobně bych nebyl první.
Ale to ještě není konec
Nemohu se dočkat, až vám povím o celém úžasném týmu, který tento úkol vybudoval, a o všech inženýrských řešeních, která našli. Ale tento příspěvek už je tak obrovský — proto o tom budou samostatné články, takže zůstaňte s námi a sledujte náš blog na Habru.
Zdroj: habr.com
