ÁLTAL JOE LEVY
Miután nagy érdeklődést kapott az iránt Trivia Cracker , egy Chrome kiterjesztés, amely lehetővé teszi, hogy egyszerűen csalni a népszerű játékban Trivia Crack , Úgy döntöttem, érdekes lehet megnézni, hogy léteznek-e ugyanolyan típusú sérülékenységek más népszerű játékokban. Őrült népszerűségére való tekintettel az első olyan játék, amelyet gondoltam kivizsgálni, természetesen az volt Cukorka törő .
A szikla alatt élők számára Candy Crush Saga egy mérkőzés-három kirakós játék Facebook , az iPhone és az Android, még 2012-ben megjelent. Annak ellenére, hogy lényegében újracsoportos Felékesített , Cukorka törő sikerült megelőznie a „legnépszerűbb” alkalmazásbolt-listákat, az előtte lévő játékokkal ellentétben. Még most, három évvel a megjelenése után is még mindig erős első alkalmazásként mind az iOS, mind a Google Play alkalmazásboltokban. És nem is beszélve az őrültekről 75 millió kedvelés Cukorka törő feltöltötte a Facebookot.
Tekintettel a népszerűségére, azt gondolná, hogy egy ilyen csiszolt és sikeres játék fejlesztői időt szakíthattak arra, hogy a csalás ellen biztonságos módon megvalósítsák. De, mint kiderült, valami kód megírása, hogy megcsaljon Cukorka törő valójában meglehetősen egyszerű. Akárcsak Trivia Crack , egy hétvége alatt írhattam és kiadhattam egy Chrome kiterjesztést, Candy Crush Cracker , Ez tért meg a legjobban közepesből Cukorka törő játékos egy isten-szerű zúzódáshoz. Az alábbiakban láthatja a Candy Crush Cracker-t akcióban, ahol azt használom, hogy extra életeket szerezzek, és bármilyen kívánt pontszámmal legyőzzem a szinteket:
Tehát mi a baj Candy Crush Saga Megvalósítása, amely lehetővé tette számomra, hogy olyan egyszerűen elkészítsek egy eszközt, amely lehetővé teszi, hogy bárki is megcsaljon? Röviden, egy szintet verve be Cukorka törő olyan egyszerű, mint kérést küldeni a Cukorka törő szerver azt mondja, hogy megverte a szintet. Akár pontszámot is küldhet - bármilyen pontszámot -, hogy azt mondhassa, ezzel a pontszámmal megverte a szintet. A biztonsági rés részletei, hogyan találtam meg, és hogyan építettem ki egy Chrome-bővítményt annak kihasználása érdekében.
Hogyan lehet feltörni Candy Crush Saga
1) A sebezhetőség megtalálása
Sok barátom az Cukorka törő fanatikusok, pontszámok elérése és olyan szintek elérése, amire soha nem lennék képes természetesen. De míg az én Cukorka törő képességeim folyamatosan kudarcot vallottak, arra gondoltam, hogy talán a fordított mérnöki képességeim új édességdaráló magasságokba juttathatnak. Gyanítottam, hogy lehetséges, hogy elküldhetem a saját kéréseimet a címre Cukorka törő Szervereit, vagy használjon néhány adatot a kliensnek küldött válaszokban Cukorka törő Szervereivel, hogy előnyt szerezzen a játékban. Szóval elkezdtem kutatni, hogy milyen adatok vannak Cukorka törő a kliens és a szerver oda-vissza továbbad.
Ezen adatok ellenőrzéséhez nagyjából ugyanazt a folyamatot követtem, mint az Trivia Crack . játszottam Cukorka törő a böngészőmben Facebookon között küldött kérések és válaszok rögzítése és ellenőrzése során Cukorka törő Ügyfél és szerver, egy korábban létrehozott eszköz segítségével Gargl . Igen, tudom, hogy a Fiddler, a Charles vagy a Chrome Developer Tools segítségével is felhasználhattam volna ugyanezt. Úgy döntöttem, hogy inkább a Gargl-t használom, mert amellett, hogy lehetővé teszi az ügyfél / szerver kérések / válaszok megtekintését, a Gargl lehetővé teszi ezeknek a kéréseknek a módosítását és paraméterezését is, majd automatikusan generál modulokat az Ön által választott programozási nyelven, így ezeket a kéréseket megteheti. kódsor írása nélkül. De erről később.
Egyébként elmondás után Gargl elkezdeni a felvételt és a Cukorka törő a Facebook-on a böngészőmben az első lépés az volt, hogy kitaláljuk, hogy az ezen a Facebook-oldalon küldött sok kérelem melyikhez kapcsolódik Cukorka törő , szemben a Facebooktal. Az oldalon lévő HTML ellenőrzése azt mutatta, hogy a Cukorka törő a flash tartalmak iframe-en keresztül beágyazódnak a Facebookba. Az iframe felett közvetlenül látható elem egy sajátos URL-re való elküldésre szánt űrlap volt - https://candycrush.king.com/FacebookServlet/ .

Joe Levy
Tudtam, hogy King az a társaság, amely létrehoz Candy Crush Saga , ezért gyanítottam, hogy ez az a domain, ahol Cukorka törő házigazdája. A következő lépés csak a játék megkezdése volt Cukorka törő , és amikor a kéréseket néztem végig, Gargl megállapítja, hogy az oldal a „king.com” nevű URL-t használja:

Joe Levy
Ahogy verem a szinteket Cukorka törő , Azt vettem észre, hogy minden szintre új kérelmet adtak ki. Úgy tűnt, hogy a kérelmeket közvetlenül egy szint sikeres teljesítése után adták ki:

Joe Levy
Úgy tűnt, talán az ügyfél mondja meg Cukorka törő szerver, amikor a játéknak vége. Ez arra késztetett bennem, hogy talán az ügyfél nem csak azt mondja, hogy a játéknak vége, hanem azt is, hogy a felhasználó megverte-e a szintet vagy sem, és ha a szintet megverték, akkor a felhasználó milyen pontszámmal verte meg a szintet.
Arra gondoltam, hogy van vezetõm, és belemélyedtem a 'gameEnd' kérés részleteibe.
2) A sérülékenység részleteiben
Használata Gargl hogy megnézze a „candycrush.king.com/api/gameEnd3? kérés / válasz részletesen, meg tudtam erősíteni, hogy valóban megmondja a szervernek, amikor a játéknak vége, és a pontszám, amellyel a felhasználó megverte a szintet:

Joe Levy
Amint a fentiekből látható, a szerverre küldött kérelem lekérdezési karakterlánc-paraméterként tartalmaz egy JSON-objektumot, amely tartalmazza a pontszámot, amellyel a szintet elverték, a megvert szint azonosítóját, valamint egy csomó egyéb információt. A lekérdezési karakterlánc neve nem túl leíró „arg0?” - lehet, hogy a játék alkotói megpróbálják elrejteni azt a tényt, hogy ez a paraméter a titok annak, hogy minden Cukorka törő az álmok valóra válnak!
Az „arg0?” Paraméter teljes értéke a következőképpen néz ki:

Joe Levy
Némi kísérletezés és a kérés figyelése közben, amikor több szintet végeztem, meg tudtam különböztetni, hogy mit jelentenek az arg0 mezők többsége, és honnan származnak. Az EpisodeId és a levelId a szint azonosítására szolgál, és megtalálhatók a szervernek küldött kérelemben, amikor elkezdi játszani a szintet - https: //candycrush.king.com/api/gameStart2.
A mag megtalálható ebben a „gameStart” kérésben is, és úgy tűnik, véletlenszerű magot jelent arra nézve, hogy hogyan kell kinéznie a cukorka elrendezésének a szinten. Ezenkívül minden API-kérelem, amelyet a Cukorka törő „_session” lekérdezési karakterlánc-paraméterrel kell elküldeni az aktuális felhasználói munkamenet azonosításához. Ez az érték megtalálható a gameStart kérésben, és valójában bármelyik kérésben is Cukorka törő , ami azt illeti.
Így néz ki a https://candycrush.king.com/api/gameStart2 kérelem:

Joe Levy
Ismét úgy néz ki Cukorka törő Az alkotók vagy nagyon rosszul találják ki a kreatív paraméterek nevét, vagy megpróbálják elhomályosítani ezeket az információkat, hogy megnehezítsék API-juk manipulálását. Az EpisodeId az „arg0” nevű lekérdezési karakterlánc-paraméteren keresztül kerül elküldésre, a levelId „arg1” -ként, a mag pedig „arg2” -ként kerül elküldésre. Valamilyen oknál fogva úgy döntöttek, hogy meglehetősen leíró nevet használnak a munkamenet-tokenhez - „_ session”.
Az episodeId, levelId, score és seed kivételével a gameEnd request arg0 lekérdezési karakterlánc-paraméterének többi mezője nem fontos, és a fentiekhez hasonlóan keményen kódolható. Vagyis kivéve a cs. A Cs ebben az esetben valószínűleg az ellenőrző összeget jelenti, mert ha nem a megfelelő értéket küldi el, akkor a kérés sikertelen lesz. Kiderült, hogy az ellenőrző összeg mező értékének összeállítása sem olyan nehéz. A helyes ellenőrző összeg megszerzéséhez egyszerűen MD5 kivonatol egy adott karakterláncot, és ennek a karakterláncnak az első hat karakterét használja ellenőrző összegként. A hash karakterlánc megfelel a formátumnak:
::: - 1 ::: BuFu6gBFv79BH9hk
A UserId az egyetlen olyan információ, amely még nincs meg a fenti karakterlánc elkészítéséhez. A „gameInit” kérelem küldi el, amely minden betöltéskor megtörténik Candy Crush Saga —Https: //candycrush.king.com/api/gameInitLight. Ezt a kérést bármikor megteheti (természetesen a _session átadása lekérdezési karakterlánc-paraméterként), és a válasz tartalmazza a userId-t:

Joe Levy
Remek, most megvan minden, ami a gameEnd kéréshez szükséges!
Próbáljuk meg beilleszteni ezeket az információkat a Fiddler zeneszerzőjébe, megcélozva a játék első szintjét, és lássuk, mi történik, ha beírunk egy 100 000-es pontszámot, kiszámoljuk az ellenőrző összeget, megadjuk a gameEnd kérést, majd újratöltjük Candy Crush Saga :

Joe Levy
Nos, barátaim, úgy tűnik, sikeresen feltörtünk Cukorka törő !
Míg Candy Crush Saga tett néhány védekező intézkedést, lehetővé téve, hogy egyetlen kérés teljesítse a szintet, bármilyen ponttal, közvetlenül ellentétes a Védekező programozás Programozási gyakorlat - különösen a soha ne bízzon az ügyfélben ”Web programozási elv. Mivel a kiszolgálónak nincs kontrollja az ügyfél viselkedése felett, nem feltételezheti, hogy az ügyfél nem fog rosszindulatúan viselkedni, ezért meg kell védenie magát. A „teljes szintek” megvalósításának jobb módja az lenne, ha arra késztetnénk az ügyfelet, hogy a felhasználó minden egyes lépését a szinten elküldje a szervernek, és a szervernek meg kell határoznia, hogy ezek a lépések sikeresen elég magas pontszámot érnek-e el a szint teljesítéséhez. Bár ez a módszer szintén nem tökéletes, ez legalább azt jelenti, hogy az ügyfélnek, akár kézi felhasználói művelettel, akár valamilyen automatizált módszerrel, a szintet kell játszania ahelyett, hogy csak azt mondaná a szervernek, hogy 'én nyerek'.
Azonban, Cukorka törő nem ezt tette, hanem megbízik az ügyfélben. Most csak egy rosszindulatú kliens létrehozásáról volt szó, hogy kihasználják azt a tényt, hogy az ügyfél csak elmondhatja a szervernek, hogy tetszőleges szintet nyert. Ideális esetben olyan, amelyet nem műszaki felhasználók számára könnyű telepíteni és használni. Hmm ... mit szólnál egy Chrome kiterjesztéshez, amely csak egy gombot ad hozzá a Cukorka törő játék Facebookon , Hogy ha rákattint, akkor az aktuális szintet automatikusan megveri ??
3) A sebezhetőség kihasználása
Ahogy fentebb említettem, Gargl lehetővé teszi, hogy fogadja azokat a kéréseket, amelyeket rögzített, szükség szerint módosíthatta és paraméterezhette, majd automatikusan generálhat modulokat az Ön által választott programozási nyelven, hogy ugyanazokat a kéréseket tegye meg. Nem megyek bele a folyamat részleteibe, mivel megnézheti az egyiket Gargl blogbejegyzések hogy megtalálja ezt az információt, de lényegében én generáltam egy Gargl sablonfájl a Cukorka törő Különböző API kéréseket, a Gargl Chrome kiterjesztés , majd egy Gargl-generátor segítségével a sablonfájlból a Cukorka törő JavaScript könyvtár . A Gargl használata ehhez lehetővé tette egy olyan JavaScript könyvtár létrehozását, amely beszél Cukorka törő Kiszolgálói, anélkül, hogy ehhez kódsort írnának, és hogy legyen sablonfájlom a jövőre nézve, ha később ugyanezt szeretném megtenni egy másik programozási nyelvvel.
Miután ez megvolt Cukorka törő JavaScript könyvtár, egyszerű kérdés volt egy Chrome kiterjesztés létrehozása a JavaScript-ben, amely a Cukorka törő A Facebook játékoldal iframe-je (candycrush.king.com) hozzáad egy gombot a játék HTML-jéhez, és amikor erre a gombra kattint, pontszámot kér a felhasználótól, a fenti lépésekkel megtalálja az episodeId, levelId, seed, _session és userId, majd kiadja a gameEnd kérést a jelenlegi szint legyőzéséhez.

Joe Levy
És csak úgy, Candy Crush Cracker született! Kíváncsi a Candy Crush Cracker működésének pontos részleteire? Nézze meg a forráskódot itt: GitHub .
Fotó keresztül m01229 / Flickr (CC BY 2.0)