Megfigyelhető, hogy az elmúlt egy évben szinte minden pókerterem nagy erőfeszítéseket tett azért, hogy "fish-baráttá" alakítsa át szolgáltatását. Ezt a célt szolgálják az anonim cash game asztalok is.
Ezeken az asztalokon nem jelenik meg a játékosok nickje, helyette "Player 1", "Player 2", "Player 3", stb. olvasható. A funkció célja, hogy a játékosok elrejthessék valós kilétüket az ellenfelek, a leosztásaikat gyűjtő oldalak, illetve a segédprogramok elől, amelyek így nem tudják azonosítani őket.
Ez természetesen a gyenge játékosoknak kedvez, hiszen a mértékadó statisztikák hiánya rendkívül nehézzé teszi a regularok számára a többasztalos pókert, valamint abban sem lehetnek biztosak, legalábbis a játék elején, hogy nem egy náluk erősebb regulart találtak ellenfélül az egyik anonim heads-up asztalnál.
A Bodog nemrégiben minden asztalát anonimre változtatta és a PartyPoker is növelte anonim asztalai számát. A HHSmithy adathalász oldal azonban feldedezte, egyszerű szoftver használatával mindkét teremben megjeleníthetők a játékosnevek ezeken az asztalokon.
A hibát először a PartyPokeren fedezték fel, így az alábbi írás is a teremmel foglalkozik.
A HHSmithy cikke a PartyPoker anonim asztalainak biztonságáról:
"Több mint egy évvel ezelőtt a 2+2 fórumon posztolták, a PokerTableRatings képes beolvasni a játékosneveket a PartyPoker anonim asztalain. Bár a problémát márciusra elhárították, ismervén az online pókertermek "biztonságát", úgy gondoltuk, újabb próbát teszünk. Sajnos, négy óra kísérletezés múltán meg kellett állapítanunk, aki tudja, mit csinál, továbbra is különösebb nehézség nélkül megjelenítheti a screenneveket.
Tájékoztattuk a problémáról a PartyPokert, jelenleg a válaszukra várunk, amiről természetesen beszámolunk. Épp ezért egyelőre nem szeretnénk pontos betekintést engedni a dolog metódusába, de ez mindenképpen egy olyan probléma, amit a PartyPokernek sürgősen javítania kell. Hiszen a terem anonim asztalai pillanatnyilag csak azok számára anonimek, akik nem próbálják megkerülni a korlátozást - nem a legmegnyugatóbb feltevés, amikor pénz forog kockán.
A PartyPoker névtelen asztalai tehát valójában közel sem anonimek. Hamarosan további termeket vizsgálunk meg, mert valószínűnek tartjuk, hogy nem a PartyPoker az egyetlen olyan terem, amely nem oldotta meg megfelelően az anonim asztalok védelmét.
Figyelem, programozói zsargon következik!
Mi a hiba oka? Az, hogy jelenleg az összes adatot elküldi a szerver a kliensnek, a hacker pedig ezt a lehetőséget használhatja ki az alábbi módon.
A folytatásban csak felületesen mutatjuk be a technikát.
Kliens manipulálása
Az egyik meghatározó pont a PartyPoker anonim asztalainak kezelésében az alábbi logika:
A pókerkliensnek ugyanis nem lenne szabad a fenti parancssorral rendelkeznie. Akik kicsit is járatosak a szofverek világában, könnyűszerrel képesek az "Anonymous" ellenőrzés visszavonására, és az alábbi jelölés hozzáadására.
Alternatív megoldásként úgy lehetne módosítani a programot, hogy bármilyen programsor is határozza meg a pokerTable.isAnonymus()-t, az hamis eredményt adjon. Gyakorlatilag így működik a program, amit videónkban bemutattunk.
Ezen hatások bármelyike elérhető, ha egy DLL-t ágyazunk a PartyPoker alkalmazásba, és társítjuk a megfelelő funkciókkal. Bárki, akit érdekel, hogy hozhat létre hasonló kódokat, nézzen körül a google-en hasonló kulcsszavakkal: "c++ function hook” vagy “detours hooking a function”. Itt is találhattok anyagot az API kódoláshoz. Érdemes megjegyezni, hogy csupán API kódolás használata némi kreativitást igényel, hogy ugyanaz a hatása legyen, mint a funkciótársításnak.
Még várunk kicsit, mielőtt több információt adnánk közre a "ha" tételek megtalálásáról. A Party Pokernek szeretnénk kedvezni ezzel, hátha megpróbálják kijavítani a hibát, mielőtt pontosan megmondjuk, melyik funkciót mivel kell társítani. Egyébként, ha tudjátok kezelni az IDA Pro-t vagy az OllyDbg-t, nem lesz túl nehéz ezeket megtalálni.
Információ kiolvasása a memóriából
Még ha a PartyPoker egy ügyesebb módszert is használna a felhasználók kilétének felfedése ellen, az igazi játékosnevek mindenképp tárolásra kerülnek a program memóriájában. Alapvető Win32-es parancsok, mint a "ReadProcessMemory" lehetővé teszik, hogy egy program bejusson a 0-k és 1-esek közé. A FreePHG ezt a technikát használja, olvassa az épp zajló handeket, és a lemezre írja őket. Működésének rövid leírása a következő: a program az alkalmazás memóriáját olvassa, és mintákat/ismert statikus címeket használva keres olyan adatszerkezeteket, amelyek az asztal állapotára utalnak.
Ha veszünk egy memória analizáló programot, mint a Memory Hacking Software, és egy futó PartyPoker alkalmazás megnyitására használjuk, rengeteg szemetet fogunk találni. Viszont ha már van elképzelésünk arról, hogy mit keresünk, kifinomultabb keresési parancsokkal kutathatunk a kliens memóriájában, például egy asztal reprezentációja után (játékosnevek, asztalnevek, stb.). Persze sok részletről lehetne még itt beszélni, szerkezetekről, és hogy hogyan társítják a különböző szerkesztők a memóriát, de erről talán egy másik posztban beszélünk majd. Nagyon-nagyon egyszerűen (tényleg, egyáltalán nem így néz ki a PartyPoker memóriája, de ez egy leegyszerűsített képet ad a dologról) így néz ki, amit a memóriában találunk:
Ebből két dolog fontos számunkra:
1) Az asztalok MINDIG tartalmazzák a játékosok adatait valahol a memóriában. Még ha az asztal anonim is, a játékosnevek valahol ott lebegnek, és a megfelelő módszerekkel felfedhetők.
2) Az Asztal objektum a memóriában tartalmaz egy értéket, ami "1" ha az asztal anonim, és "0", ha nem az. Ez az egyetlen nagyobb különbség a normál és az anonim asztalok között. Semmi sincs elrejtve, beágyazva, megváltoztatva vagy titkosítva.
Ha csak ezen információ alapján szeretnél adatokat szerezni az anonim asztalokról, nagyon nehéz dolgod lesz. A PartyPoker mappában található GameTable.dll nevű fájlban való kutakodás egy bináris analizáló programmal, mint az IDA Pro, sokat segíthet.
A kliens-szerver forgalom megfigyelése
Most mondjuk, hogy a PartyPoker aktívan megsemmisített minden részt a memóriában, ami a játékosok nevét tárolja - valami őrült memória-áttoló technikával, amellyel semmi sem marad a helyén elég ideig, és a memória nem letérképezhető (ez valójában lehetetlen, de most tegyünk úgy, mintha ez lenne a helyzet). Így is van egy alapvető hiba abban, ahogy a PartyPoker kezeli az anonim asztalokat: a játékosok nincsenek titkosítva a szerver és a kliens kommunikációja közben. Ez a fő oka annak, hogy a felsorolt támadásokra lehetőség van - az igazi játékosnevek és ID-k feladata, hogy azonosítsák azt, aki cselekszik a játék folyamán.
Tegyük fel, hogy Mike és Jeff játszik a "Heads Up Anonymous Table #12415"-ön. Egy igazi anonim beállítás esetében a PartyPoker szervereknek valamiféle térképező módszerük lenne, hogy tudják, kicsoda valójában Player 1 a "Heads Up Anonymous Table #12415" asztalnál. Abban az esetben a kliens-szerver kommunikáció valahogy így nézne ki:
Player 1 @ Anon Table #12415 bets $13,37.
Player 2 @ Anon Table #12415 folds.
A Party szerverei tudnák, hogy "Player 1 @ Anon Table #12415" nem más, mint Mike, "Player 2 @ Anon Table #12415" pedig Jeff, de sem Mike, sem Jeff nem tudná, ki a másik, ha pusztán a szerver forgalmát vizsgálná. A dolgok jelen állása szerint a fenti interakció jelenleg így néz ki:
A szerver és a Party kliens kommunikációja tartalmazza a valódi játékosneveket. Így Jeff megnézhetné az üzeneteket, amelyeket a gépe fogadott, és láthatná, hogy Mike volt az, aki hívott ellene. Ezek után egy halom eszköz segítségével könnyebben dönthetne.
Ezt a fajta információt többféleképpen is el lehet csípni: egy közbülső proxy segítségével, vagy a programba ékelve az "ssl_write/ssl_read" funkciókat. Másik alternatíva erre a kémszoftver, mint pl. az oSpy.
Persze itt nincs szó arról az extra munkáról, ami ahhoz kell, hogy utána megfordítsuk az aktuális protokollt, ez nem könnyű feladat. Az alapvető szabály a biztonsággal kapcsolatban az, hogy a feltöréshez szükséges erőfeszítések miatt ne érje meg az adott programot feltörni. Az online póker esetében azonban, ahol hatalmas pénzekről is szó lehet, elképzelhető, hogy valaki hasonló támadást indítson.
Konklúzió
Valójában csak a felszínt kapargattuk, hogy egy kellően határozott programozó hogy használhatja ki ezt a hibát, és fordíthatja saját hasznára. A jövőben részletesebben fogunk foglalkozni technikákkal, amelyeket használva a játékosok megvédhetik magukat a kliensektől és az esetleges támadásoktól" - írta a HHSmithy.
A fejleményekről beszámolunk.
Ezeken az asztalokon nem jelenik meg a játékosok nickje, helyette "Player 1", "Player 2", "Player 3", stb. olvasható. A funkció célja, hogy a játékosok elrejthessék valós kilétüket az ellenfelek, a leosztásaikat gyűjtő oldalak, illetve a segédprogramok elől, amelyek így nem tudják azonosítani őket.
Ez természetesen a gyenge játékosoknak kedvez, hiszen a mértékadó statisztikák hiánya rendkívül nehézzé teszi a regularok számára a többasztalos pókert, valamint abban sem lehetnek biztosak, legalábbis a játék elején, hogy nem egy náluk erősebb regulart találtak ellenfélül az egyik anonim heads-up asztalnál.
A Bodog nemrégiben minden asztalát anonimre változtatta és a PartyPoker is növelte anonim asztalai számát. A HHSmithy adathalász oldal azonban feldedezte, egyszerű szoftver használatával mindkét teremben megjeleníthetők a játékosnevek ezeken az asztalokon.
A hibát először a PartyPokeren fedezték fel, így az alábbi írás is a teremmel foglalkozik.
A HHSmithy cikke a PartyPoker anonim asztalainak biztonságáról:
"Több mint egy évvel ezelőtt a 2+2 fórumon posztolták, a PokerTableRatings képes beolvasni a játékosneveket a PartyPoker anonim asztalain. Bár a problémát márciusra elhárították, ismervén az online pókertermek "biztonságát", úgy gondoltuk, újabb próbát teszünk. Sajnos, négy óra kísérletezés múltán meg kellett állapítanunk, aki tudja, mit csinál, továbbra is különösebb nehézség nélkül megjelenítheti a screenneveket.
Tájékoztattuk a problémáról a PartyPokert, jelenleg a válaszukra várunk, amiről természetesen beszámolunk. Épp ezért egyelőre nem szeretnénk pontos betekintést engedni a dolog metódusába, de ez mindenképpen egy olyan probléma, amit a PartyPokernek sürgősen javítania kell. Hiszen a terem anonim asztalai pillanatnyilag csak azok számára anonimek, akik nem próbálják megkerülni a korlátozást - nem a legmegnyugatóbb feltevés, amikor pénz forog kockán.
A PartyPoker névtelen asztalai tehát valójában közel sem anonimek. Hamarosan további termeket vizsgálunk meg, mert valószínűnek tartjuk, hogy nem a PartyPoker az egyetlen olyan terem, amely nem oldotta meg megfelelően az anonim asztalok védelmét.
Figyelem, programozói zsargon következik!
Mi a hiba oka? Az, hogy jelenleg az összes adatot elküldi a szerver a kliensnek, a hacker pedig ezt a lehetőséget használhatja ki az alábbi módon.
- Kliens manipulálása
- Információ kiolvasása a memóriából
- A kliens-szerver forgalom megfigyelése
A folytatásban csak felületesen mutatjuk be a technikát.
Kliens manipulálása
Az egyik meghatározó pont a PartyPoker anonim asztalainak kezelésében az alábbi logika:
A pókerkliensnek ugyanis nem lenne szabad a fenti parancssorral rendelkeznie. Akik kicsit is járatosak a szofverek világában, könnyűszerrel képesek az "Anonymous" ellenőrzés visszavonására, és az alábbi jelölés hozzáadására.
Alternatív megoldásként úgy lehetne módosítani a programot, hogy bármilyen programsor is határozza meg a pokerTable.isAnonymus()-t, az hamis eredményt adjon. Gyakorlatilag így működik a program, amit videónkban bemutattunk.
Ezen hatások bármelyike elérhető, ha egy DLL-t ágyazunk a PartyPoker alkalmazásba, és társítjuk a megfelelő funkciókkal. Bárki, akit érdekel, hogy hozhat létre hasonló kódokat, nézzen körül a google-en hasonló kulcsszavakkal: "c++ function hook” vagy “detours hooking a function”. Itt is találhattok anyagot az API kódoláshoz. Érdemes megjegyezni, hogy csupán API kódolás használata némi kreativitást igényel, hogy ugyanaz a hatása legyen, mint a funkciótársításnak.
Még várunk kicsit, mielőtt több információt adnánk közre a "ha" tételek megtalálásáról. A Party Pokernek szeretnénk kedvezni ezzel, hátha megpróbálják kijavítani a hibát, mielőtt pontosan megmondjuk, melyik funkciót mivel kell társítani. Egyébként, ha tudjátok kezelni az IDA Pro-t vagy az OllyDbg-t, nem lesz túl nehéz ezeket megtalálni.
Információ kiolvasása a memóriából
Még ha a PartyPoker egy ügyesebb módszert is használna a felhasználók kilétének felfedése ellen, az igazi játékosnevek mindenképp tárolásra kerülnek a program memóriájában. Alapvető Win32-es parancsok, mint a "ReadProcessMemory" lehetővé teszik, hogy egy program bejusson a 0-k és 1-esek közé. A FreePHG ezt a technikát használja, olvassa az épp zajló handeket, és a lemezre írja őket. Működésének rövid leírása a következő: a program az alkalmazás memóriáját olvassa, és mintákat/ismert statikus címeket használva keres olyan adatszerkezeteket, amelyek az asztal állapotára utalnak.
Ha veszünk egy memória analizáló programot, mint a Memory Hacking Software, és egy futó PartyPoker alkalmazás megnyitására használjuk, rengeteg szemetet fogunk találni. Viszont ha már van elképzelésünk arról, hogy mit keresünk, kifinomultabb keresési parancsokkal kutathatunk a kliens memóriájában, például egy asztal reprezentációja után (játékosnevek, asztalnevek, stb.). Persze sok részletről lehetne még itt beszélni, szerkezetekről, és hogy hogyan társítják a különböző szerkesztők a memóriát, de erről talán egy másik posztban beszélünk majd. Nagyon-nagyon egyszerűen (tényleg, egyáltalán nem így néz ki a PartyPoker memóriája, de ez egy leegyszerűsített képet ad a dologról) így néz ki, amit a memóriában találunk:
Ebből két dolog fontos számunkra:
1) Az asztalok MINDIG tartalmazzák a játékosok adatait valahol a memóriában. Még ha az asztal anonim is, a játékosnevek valahol ott lebegnek, és a megfelelő módszerekkel felfedhetők.
2) Az Asztal objektum a memóriában tartalmaz egy értéket, ami "1" ha az asztal anonim, és "0", ha nem az. Ez az egyetlen nagyobb különbség a normál és az anonim asztalok között. Semmi sincs elrejtve, beágyazva, megváltoztatva vagy titkosítva.
Ha csak ezen információ alapján szeretnél adatokat szerezni az anonim asztalokról, nagyon nehéz dolgod lesz. A PartyPoker mappában található GameTable.dll nevű fájlban való kutakodás egy bináris analizáló programmal, mint az IDA Pro, sokat segíthet.
A kliens-szerver forgalom megfigyelése
Most mondjuk, hogy a PartyPoker aktívan megsemmisített minden részt a memóriában, ami a játékosok nevét tárolja - valami őrült memória-áttoló technikával, amellyel semmi sem marad a helyén elég ideig, és a memória nem letérképezhető (ez valójában lehetetlen, de most tegyünk úgy, mintha ez lenne a helyzet). Így is van egy alapvető hiba abban, ahogy a PartyPoker kezeli az anonim asztalokat: a játékosok nincsenek titkosítva a szerver és a kliens kommunikációja közben. Ez a fő oka annak, hogy a felsorolt támadásokra lehetőség van - az igazi játékosnevek és ID-k feladata, hogy azonosítsák azt, aki cselekszik a játék folyamán.
Tegyük fel, hogy Mike és Jeff játszik a "Heads Up Anonymous Table #12415"-ön. Egy igazi anonim beállítás esetében a PartyPoker szervereknek valamiféle térképező módszerük lenne, hogy tudják, kicsoda valójában Player 1 a "Heads Up Anonymous Table #12415" asztalnál. Abban az esetben a kliens-szerver kommunikáció valahogy így nézne ki:
Player 1 @ Anon Table #12415 bets $13,37.
Player 2 @ Anon Table #12415 folds.
A Party szerverei tudnák, hogy "Player 1 @ Anon Table #12415" nem más, mint Mike, "Player 2 @ Anon Table #12415" pedig Jeff, de sem Mike, sem Jeff nem tudná, ki a másik, ha pusztán a szerver forgalmát vizsgálná. A dolgok jelen állása szerint a fenti interakció jelenleg így néz ki:
A szerver és a Party kliens kommunikációja tartalmazza a valódi játékosneveket. Így Jeff megnézhetné az üzeneteket, amelyeket a gépe fogadott, és láthatná, hogy Mike volt az, aki hívott ellene. Ezek után egy halom eszköz segítségével könnyebben dönthetne.
Ezt a fajta információt többféleképpen is el lehet csípni: egy közbülső proxy segítségével, vagy a programba ékelve az "ssl_write/ssl_read" funkciókat. Másik alternatíva erre a kémszoftver, mint pl. az oSpy.
Persze itt nincs szó arról az extra munkáról, ami ahhoz kell, hogy utána megfordítsuk az aktuális protokollt, ez nem könnyű feladat. Az alapvető szabály a biztonsággal kapcsolatban az, hogy a feltöréshez szükséges erőfeszítések miatt ne érje meg az adott programot feltörni. Az online póker esetében azonban, ahol hatalmas pénzekről is szó lehet, elképzelhető, hogy valaki hasonló támadást indítson.
Konklúzió
Valójában csak a felszínt kapargattuk, hogy egy kellően határozott programozó hogy használhatja ki ezt a hibát, és fordíthatja saját hasznára. A jövőben részletesebben fogunk foglalkozni technikákkal, amelyeket használva a játékosok megvédhetik magukat a kliensektől és az esetleges támadásoktól" - írta a HHSmithy.
A fejleményekről beszámolunk.