Livesport - Vertical privilege escalation(s)

V

napsal Michal

Chyba v business logice, která umožňovala manipulaci s bonusy a výsledky soutěže.

Úvod

Zkoumal jsem některé služby Livesportu a všiml si něčeho podivného na tom, jak funguje registrace uživatelů na dvou jejich subdoménách – bonusy.livesport.cz a soutez.livesport.cz. To, co začalo jako celkem rutinní nález o špatně zabezpečeném registračním endpointu, rychle eskalovalo: stejná chyba v registraci se ukázala být vstupním bodem k plnému administrátorskému přístupu na obou subdoménách. Jedna mi umožnila manipulovat s výpisy bonusů na sázení zobrazovanými všem uživatelům, druhá mi umožnila zmanipulovat výsledky soutěže Euro 2024.

Všechny nálezy byly nahlášeny bezpečnostnímu týmu Livesportu, obratem opraveny a odměněny prostřednictvím jejich bug bounty programu. Tento writeup pokrývá celý řetězec napříč všemi třemi reporty.

Poznámka ke klasifikaci: Problém s řízením přístupu je technicky nejlépe popsán jako privilege misassignment at registration – noví uživatelé získali administrátorský přístup bez jakéhokoli eskalačního kroku. V praxi většina bug bounty programů a taxonomie OWASP Broken Access Control (A01:2025) řadí tento případ pod Vertical Privilege Escalation, a přesně tak byl i nahlášen a přijat. Pokud si píšete vlastní reporty, vyplatí se o té nuanci vědět.

Cíl

Obě dotčené aplikace jsou postavené na platformě Bubble, no-code platformě, která překládá frontendové interakce na API volání proti backendovému runtime. Bubble vystavuje sadu standardních endpointů pro správu uživatelů (/user/signup, /user/login, /user/hi, atd.) a endpoint pro spouštění workflow (/workflow/start), který řídí server-side business logiku. Pochopení této základní platformy se ukázalo být klíčové pro všechny nálezy.

Obě subdomény měly odlišný účel, ale sdílely stejný základ v Bubble a, jak se ukázalo, i stejné bezpečnostní chyby v konfiguraci:

  • bonusy.livesport.cz – srovnávací stránka bonusů pro české sázkové operátory (Tipsport, Fortuna, Betano, Chance), zobrazující vkladové bonusy, nabídky free betů a affiliate CTA.
  • soutez.livesport.cz – soutěžní platforma navázaná na Euro 2024, umožňující uživatelům tipovat výsledky zápasů o možnost vyhrát ceny.

Nálezy

#1: Nezabezpečený registrační endpoint

Dotčené URL: https://bonusy.livesport.cz · https://soutez.livesport.cz

Popis

Při mapování útočné plochy obou aplikací jsem si všiml, že Bubble-standardní endpoint /user/signup je veřejně dostupný a přijímá registrace bez jakékoli smysluplné validace. Nakupily se na sebe tři problémy:

  1. Žádné ověření e-mailu – účty byly vytvořeny a okamžitě aktivní; žádný potvrzovací odkaz, žádná výzva.
  2. Slabá politika hesel – endpoint akceptoval heslo dlouhé i jediný znak.
  3. Žádný rate limiting – nic nebránilo automatizovanému hromadnému vytváření účtů.

Proof of Concept

Objevování bylo postupné. Zavolání endpointu bez parametrů vrátilo popisnou chybu:

GET /user/signup HTTP/2
Host: bonusy.livesport.cz

HTTP/2 400 Bad Request
{"message":"NO_EMAIL","translation":"Prosím zadejte email"}

Přidání e-mailu, ale bez hesla:

GET /user/signup?email=test2@qwerty.com HTTP/2
Host: bonusy.livesport.cz

HTTP/2 400 Bad Request
{"message":"NO_PASSWORD","translation":"Prosím zadejte heslo"}

A s obojím – úspěch, s jednoznakovým heslem:

GET /user/signup?email=test2@qwerty.com&password=a HTTP/2
Host: bonusy.livesport.cz

HTTP/2 200 OK
"1718007830927x469356327557668000"

Odpověď vrátila interní ID nového uživatele a session cookies byly okamžitě nastaveny a platné.

Hromadné vytváření účtů

Pro potvrzení absence rate limitingu jsem napsal rychlý Bash skript:

#!/bin/bash
for i in {1..10}; do
  email="testuser$i@qwerty.com"
  password="a"
  curl -X GET "https://bonusy.livesport.cz/user/signup?email=$email&password=$password"
done

Všech deset účtů bylo vytvořeno v rychlém sledu bez jakéhokoli omezování nebo blokování. Záměrně jsem se zastavil u deseti (s dohledatelným rozsahem testuser1-10@qwerty.com), aby bylo možné účty v databázi snadno najít a smazat.

Enumerace účtů

Užitečný vedlejší efekt popisných chybových hlášení: opětovná registrace již obsazeného e-mailu vrátila odlišnou chybu USED_EMAIL, což umožňovalo snadno zjistit, zda je daná adresa na platformě zaregistrovaná.

HTTP/2 400 Bad Request
{"message":"USED_EMAIL","translation":"Tento email se již používá: testuser3@qwerty.com"}

Dopad

  • Enumerace účtů – útočník může zjistit, které e-mailové adresy mají registrované účty.
  • Slabá politika hesel – triviální brute-force proti jakémukoli účtu, jehož e-mail je známý.
  • Hromadné vytváření účtů – spam, zneužití kvót na uživatele a potenciální vyčerpání zdrojů.

Samo o sobě jde o nález střední závažnosti. V kombinaci s nálezy #2 a #3 níže se závažnost výrazně násobí.

#2: Vertical Privilege Escalation na bonusy.livesport.cz

Dotčené URL: https://bonusy.livesport.cz

Popis

Po registraci testovacího účtu na bonusy.livesport.cz přes nechráněný registrační endpoint jsem prozkoumal, k čemu má daný účet přístup. Admin panel na https://bonusy.livesport.cz/admin/ se ukázal být plně přístupný – s kompletními právy pro čtení, zápis a mazání nad všemi výpisy bonusů na webu.

Datový model uživatele potvrdil, že účet neměl žádnou zvláštní roli. Volání /api/1.1/init/data ukázalo _type: "user" bez admin příznaku, členství ve skupině nebo jakéhokoli povýšeného atributu. Navzdory tomu byl admin panel i všechna jeho workflow volně přístupné a plně funkční.

Proof of Concept

Pomocí testovacího účtu bugbounty01@qwerty.com vytvořeného přes /user/signup proběhlo přihlášení do admin panelu okamžitě. Uvnitř admin panelu na https://bonusy.livesport.cz/admin/ jsem měl přístup k:

  • Úplnému seznamu všech aktuálních výpisů bonusů s ovládacími prvky pro úpravu a smazání každé položky
  • Tlačítku Create Bonus pro přidání nových výpisů

Přihlášení do administrace.

Viděl jsem všechny dostupné bonusy.

Mohu libovolně upravovat kterýkoli ze stávajících bonusů (Tipsport – Free 500 CZK for your first bets). Případně je zde ikona „koše“, což znamená, že mohu jakýkoli bonus zároveň smazat.

Nebo je možné vytvořit zcela nový bonus pomocí tlačítka „Create Bonus“.

Čistě pro účely proof-of-conceptu jsem si dovolil vytvořit nový bonus s názvem „Test Bonus – Non-functional“, abych potvrdil výše uvedené tvrzení, že vše lze skutečně libovolně upravovat. URL jsem nastavil na https://livesport.cz, takže pokud jej „náhodou“ navštívíte, budete v nejhorším případě přesměrováni na váš hlavní web.

Bonus vytvořen.

Dopad

Dopad je zde závažnější, než by se zprvu mohlo zdát. Útočník s tímto přístupem by mohl:

  • Manipulace obsahu pro phishing: Upravit CTA URL stávajících výpisů bonusů tak, aby přesměrovávaly uživatele na phishingové stránky ovládané útočníkem. Stránka bonusy.livesport.cz je důvěryhodná služba Livesportu, takže uživatelé klikající na tlačítko „Tipsport - 500 Kč zdarma“ by neměli důvod tušit, že cíl byl podměněn.

  • Vytváření falešných bonusů: Vytvořit zcela smyšlené, vysoce atraktivní bonusy pro maximalizaci prokliků na škodlivou URL – zneužitím důvěry, kterou uživatelé vkládají do značky Livesport.

  • Ničení obsahu: Smazat všechny stávající výpisy a narušit tak základní funkci stránky.

Zejména phishingový vektor představuje významné riziko pro koncové uživatele, nejen pro Livesport z provozního hlediska.

#3: Vertical Privilege Escalation na soutez.livesport.cz

Dotčené URL: https://soutez.livesport.cz

Popis

Stejná chyba v konfiguraci byla přítomná i na soutěžní subdoméně. Po registraci přes /user/signup byl admin panel na https://soutez.livesport.cz/admin/ plně přístupný. V tomto případě byly v sázce jiné věci: admin panel ovládal losování soutěže Euro 2024.

Proof of Concept

Testovací účet bugbounty02@qwerty.com byl zaregistrován a použit k autentizaci proti admin panelu přes POST /workflow/start. Server vrátil "outcome":"success" a session byla ustanovena.

Úspěšně jsem se přihlásil do admin panelu. Uvnitř panelu Administrace Soutěže byla v té době aktivní soutěž tipovací na zápas Německo vs. Skotsko (14. června 2024, 21:00) s 30 odeslanými tipy a dostupným a funkčním tlačítkem Vylosovat. S funkcí losování jsem neinteragoval. Zastavil jsem se u potvrzení přístupu, zdokumentoval jej a okamžitě nahlásil.

V době, kdy jsem tento report odesílal Livesportu, tato anketa běžela.

Dopad

Celý řetězec zneužití s využitím nálezů #1 a #3 dohromady:

  1. Zaregistrovat více účtů přes nechráněný endpoint /user/signup – bez limitu, bez ověření.
  2. Odeslat z každého účtu soutěžní tipy a maximalizovat tak podíl tipů patřících útočníkovi.
  3. Přihlásit se do admin panelu s kterýmkoli z týchž účtů.
  4. Spustit losování výherce ve chvíli, která maximalizuje šanci, že bude vybrán jeden z vlastních tipů – nebo prostě počkat a losování zopakovat, pokud výsledek není příznivý (podle toho, jak je losovací workflow implementováno).

Každou budoucí soutěž na této platformě by bylo možné zmanipulovat a vyhrát na počkání. Kombinace hromadného vytváření účtů a přístupu k admin losování z toho udělala kompletní selhání integrity soutěže.

Časová osa

    1. června 2024: Nezabezpečený registrační endpoint a Vertical Privilege Escalations nahlášeny přes https://bugbounty.livesport.eu/
    1. června 2024: Vendor potvrdil přijetí všech reportů ještě téhož dne a zranitelnosti byly vyhodnoceny jako platné.
    1. srpna 2024: Bohužel byly obě subdomény oficiálně out-of-scope, ale nálezy se jim líbily a odměnili je částkou $200.00 a 10 body. Oba weby byly stránky třetích stran vytvořené přes Bubble.io jejich dodavatelem.