Amit a Facebook Messenger Soccer játék feltörésével tanultam

A közelmúltban, a legutóbbi labdarúgó Európa-bajnokság idején a Facebook bemutatott egy kis játékot a Messenger alkalmazásban, amely egyszerűsége ellenére órákat és órákat veszít.

Ha nem vette észre, olvassa el ezt a cikket a Mashable oldalon.

Be kell vallanom ... Teljesen szívom ezt a játékot, így a legjobb pontszámom 9 volt .

De fejlesztőként a legjobb, amit tehettem, hogy a barátaimat vertem meg a játék feltörésével.

Nagyon gondoltam, hogy ez egyszerű lesz.

Az első út: Hallgassa meg a HTTP kéréseket

Az alkalmazások fejlesztése közben azonnal rájön, hogy HTTP-hibakereső eszközre van szüksége a bejövő / kimenő forgalom elemzéséhez az API-k számára.

Károlya legjobb eszköz, amelyet megtaláltam ennek a feladatnak a végrehajtásához. Nagyon intuitív kezelőfelülettel rendelkezik, és könnyedén felhasználhatja hibakereséshez és reverz mérnöki célokra.

Ennek a pontnak kellett volna véget vetnie: elemeznem kellene a Facebook alkalmazás által használt API-t, és csak a CURL-lel kell visszajátszanom, miközben szerkesztem az adatokat és a szerverre küldött pontszámot.

Természetesen az API-hívások HTTPS-ben vannak, tehát titkosítva vannak .. de Charles használható ember-a-közepén HTTPS-proxyként, lehetővé téve a szövegböngésző és az SSL webszerver közötti kommunikáció egyszerű szövegben történő megtekintését .

Tökéletes! Így telepítettem a root root tanúsítványt az iPhone-ra, és megpróbáltam ellenőrizni a forgalmat. De az összes HTTP-hívást a Facebook szerverekre előzetesen megtagadták az SSL kézfogás szakaszában.

Néhány kutatás után rájöttem, hogy néhány vállalati alkalmazás, például a Facebook és a Google, egy további biztonsági réteget használ annak biztosítására, hogy a távoli szerver által biztosított tanúsítvány legyen az elvárt. Ezt a technikát Certificate Pinningnek hívják .

Könnyen megteheti, ha az alkalmazásba belefoglalja a távoli kiszolgálói tanúsítvány nyilvános kulcsát, így könnyű ellenőrizni az ügyfél identitását minden egyes HTTPS-kéréshez.

Ez a technika érvényteleníti a Man in the Middle (MITM) támadást.

Remek munka Facebook! De ... (ne feledje, mindig van egy de) van egy mód arra, hogy letiltsa az SSL tanúsítvány rögzítését, és csak a börtönben meghibásodott eszközön érhető el néhány rendszercsípést.

Az első út (továbbfejlesztve): Fogjon fel egy eszközt, és telepítse az iOS SSL Kill Switch alkalmazást

Az iPhone-on jelenleg az iOS 9.x fut, ezért az írás idején lehetetlen volt börtönbe kerülni. Szóval vettem egy régi iOS 8.3.x operációs rendszert futtató iPad mini-t, és könnyen börtönbe döntöttem a TaiG eszköz segítségével .

Az interneten keresve találtam az SSL Kill Switch 2-t, egy Blackbox eszközt, amely letiltotta az SSL tanúsítvány érvényesítését az iOS és az OS X alkalmazásokban.

Miután betöltött egy iOS vagy OS X alkalmazásba, az SSL Kill Switch 2 javítja az alacsony szintű SSL-funkciókat a Secure Transport API-n belül annak érdekében, hogy felülírja és letiltsa a rendszer alapértelmezett tanúsítványellenőrzését, valamint bármilyen egyedi tanúsítványellenőrzést (például igazolás rögzítése).

Az SSL Kill Switch a MobileSubstrate segítségével javítja a rendszerfunkciókat, például a Secure Transport API-t. Ők a legalacsonyabb szintű TLS implementáció az iOS rendszeren.

Ez azt jelenti, hogy az SSL tanúsítvány érvényesítésének letiltása a Secure Transport API-ban az iOS keretrendszerben elérhető hálózati API-k többségét (ha nem az összeset) érinti.

Kérjük, tegyen meg magának egy szívességet, és kövesse ezt a blogot, amely ezeket a fogalmakat tartalmazza.

Tehát az SSH segítségével csatlakoztam az iPad-hez, és telepítettem a csomagot:

wget //github.com/nabla-c0d3/ssl-kill-switch2/releases/download/0.10/com.nablac0d3.SSLKillSwitch2_0.10.deb --no-check-certificatedpkg -i com.nablac0d3.SSLKillSwitch2_0.10.debkillall -HUP SpringBoard

Miután újraindítottam, arra számítottam, hogy látom a sima forgalmat, de ez optimista elképzelés volt: ugyanazokat a hibákat kaptam.

Még egy órát próbáltam így. Valahol olvastam, hogy a Facebook és a Twitter az SPDY protokollt használja API hívásaihoz, és ez Charles számára problémát jelenthet. Tehát telepítettem egy újabb módosítást, amely (elméletileg) letiltotta az SPDY protokollt, de nem működött.

Éhező.

A projekt kérdéseit szemlélve azt vettem észre, hogy másnak is ugyanaz a problémája (//github.com/nabla-c0d3/ssl-kill-switch2/issues/13), felbontás nélkül.

Szünet.

A második út: Szimulálja az érintéses eseményeket az alkalmazáson belül

Rájöttem, hogy sok olyan játékcsalás van, amely „emberi” megközelítést alkalmaz: szimulálja az érintéses eseményeket (az egyik legnépszerűbb játék, amelyen sok játékcsaló használja ezt a stratégiát, a Clash of Clans).

Az interneten böngészve egy olyan eszközt, amely automatizálja ezeket a műveleteket, megtaláltam ezt a fantasztikus módosítást - az AutoTouch-ot. Az emberi érintéses eseményeket rögzítheti és az adatokat LUA szkriptben tárolhatja. Ezután szerkesztheti ezt az előállított szkriptet, és bármit szimulálhat a készülékén.

Miután telepítettem a Cydia-val, elmentettem a Messenger alkalmazás BMP-s képernyőképét, amelyen látható volt a labda, és megszereztem a kattintás koordinátáit.

Azt hittem, hogy pontosan a golyó X tengelyének közepére kattintva csak ugyanazon koordinátákban kellett szimulálnom az ismétlődő érintési eseményeket, majd le kellett állítanom a szkriptet, amikor olyan pontszámom volt, amellyel elégedett voltam.

Íme, amit e cél elérése érdekében írtam:

adaptResolution(768, 1024);adaptOrientation(ORIENTATION_TYPE.PORTRAIT);
for i=1,2000 do
 touchDown(1, 544, 954); usleep(66000); touchUp(1, 544, 954);
 usleep(10000);
end

Nem, nem működött.

Valószínűleg a Facebook fejlesztői véletlenszerű hibát vezettek be az érintési koordinátákon, hogy jobban szimulálják a játékot, vagy megakadályozzák az ilyen típusú szkripteket.

Vagy talán csak rossz pixelre kattintottam.

Tehát egy második esély érdekében megpróbáltam több kattintást szimulálni nagyobb területen, de szerencse nélkül. Néha annyi érintési eseményt szimuláltam, hogy a Springboard memóriahibák miatt összeomlott .

Ahelyett, hogy minden alkalommal ugyanazokra a koordinátákra kattintottam volna, jobb megközelítést próbáltam meg.

Reading the AutoTouch documentation, I found the following two methods:

  • findColor (color, count, region) - Search the coordinates of the pixel points matching the specified color on the current screen.
  • getColor (x, y) - Get the color value of the pixel point of the specified coordinate on the current screen.

The idea was to find a unique color inside the ball, and use the findColor method to get the coordinates of the ball in that moment, to simulate a touch event.

adaptResolution(768, 1024);adaptOrientation(ORIENTATION_TYPE.PORTRAIT);
local c = getColor(544, 954);
for i=1,2000 do local r = findColor(c, 0, {400, 500, 768, 1024});
 for i, v in pairs(r) do touchDown(1, v[1], v[2]); usleep(66000); touchUp(1, v[1], v[2]); usleep(10000); end
end

I don’t know why, but it simply didn’t work. Maybe the findColor is too slow to intercept the ball, which then makes the script useless.

The third way: Reverse engineer the app

I don’t have good native skills in Objective C, but I remember (when I played with the jailbreak ~4 years ago) that there was a tool by Saurik that could inject itself into iOS processes.

It is released along with Cydia and was called Cycript.It allowed developers to explore and modify running applications on iOS, by injecting code at run time.

I read some basic tutorials on how to use it, and after a few struggles, I decided to follow this (another) way.

Once you login via SSH into your iOS device, you can easily attach to a process just by typing:

cycript -p Messenger

I tried to inspect some basic UI classes like UIApp, but didn’t find anything interesting. Then I made a complete class dump, filtering it for the keyword soccer.

var C = Object.keys(ObjectiveC.classes);var soccer_classes = []; for (var i = 0; i < C.length; i++) C[i].match(/soccer/i) && soccer_classes.push( C[i] );

It was a slow process.

Rájöttem, hogy a Facebook Messenger nagyon sok osztályt tartalmaz.

De végül kaptam egy kis listát.

Miután megszereztem az osztályneveket, egy szkript segítségével kinyomtattam az osztály összes metódusát, és az MNSoccerGame osztály ellenőrzésével a kapott módszerek a következők voltak:

Megjegyzés: Még mindig nem értem, mi a módszer wasCheatDetected.

Most, hogy megvan az osztálymódszerek teljes listája, úgy döntöttem, hogy felülbírálom a _setScore metódust, remélve, hogy más módszerek ezt nem vették észre.

Ehhez a MobileSubstrate és annak MS.hookMessage módszerét használtam.

@import com.saurik.substrate.MS; 
var _setScore_pointer = {}; MS.hookMessage(MNSoccerGame, @selector(_setScore:), function(arg0) { return _setScore_pointer->call(this, 9999); }, _setScore_pointer);

Most már csak játszhat, veszíthet , és egyébként új rekordot szerezhet.

Amit tanultam

Never stop yourself. Always try and discover new way to accomplish the same thing. I know, it’s just a game, but if you treat the problem you’re trying to solve like a challenge, you’ll get much more than the satisfaction of beating your friends.