de Flavio De Stefano

Ce am învățat hacking jocul de fotbal Facebook Messenger

Ce am invatat hacking jocul de fotbal Facebook Messenger
Fotbal de vară – Franck Michelhttps://www.flickr.com/photos/franckmichel/6384558985

Recent, în timpul ultimului Campionat European de Fotbal, Facebook a introdus un mic joc în aplicația Messenger care te face să pierzi ore și ore în ciuda simplității sale.

Dacă nu ai observat-o, citește Acest articol pe Mashable.

Trebuie să recunosc … Mă suge total la acest joc, așa că cel mai bun scor al meu a fost 9.

Dar, în calitate de dezvoltator, cel mai bun lucru pe care l-am putut face a fost să-mi înving prietenii prin pirateria jocului.

Chiar am crezut că acest lucru va fi simplu.

Primul mod: Ascultați solicitările HTTP (s)

În timp ce dezvoltați aplicații, vă dați seama imediat că aveți nevoie de un instrument de depanare HTTP pentru a analiza traficul de intrare / ieșire pentru API-urile dvs.

Charles este cel mai bun instrument pe care l-am găsit pentru a îndeplini această sarcină. Are o interfață foarte intuitivă și o puteți folosi cu ușurință în scopuri de depanare și inginerie inversă.

Trebuia să se încheie în acest moment: ar trebui să analizez API-ul pe care l-a folosit aplicația Facebook și să-l redau doar cu CURL în timp ce editați datele și scorul trimis la server.

Desigur, apelurile API sunt în HTTPS, deci sunt criptate .. dar Charles poate fi folosit ca un proxy HTTPS om în mijloc, permițându-vă să vizualizați în text simplu comunicarea dintre browserul web și serverul web SSL.

Ce am invatat hacking jocul de fotbal Facebook Messenger
Charles acționează ca un proxy – cu cereri eșuate

Perfect! Așa că am instalat certificatul rădăcină Charles pe iPhone și am încercat să inspectez traficul. Dar toate apelurile HTTP către serverele Facebook au fost refuzate în avans în timpul fazei de strângere de mână SSL.

Ce am invatat hacking jocul de fotbal Facebook Messenger
SSL – imagine oferită de cisco.com

Făcând unele cercetări, am descoperit că unele aplicații ale companiei, cum ar fi Facebook și Google, utilizează un strat suplimentar de securitate pentru a se asigura că certificatul furnizat de serverul de la distanță este cel așteptat. Această tehnică se numește Fixarea certificatului.

Puteți face acest lucru cu ușurință, incluzând cheia publică a certificatului serverului la distanță în cadrul aplicației, astfel încât să fie ușor să validați identitatea clientului pentru fiecare cerere HTTPS.

Această tehnică invalidează Omul în mijloc (MITM) Atac.

Mare treabă Facebook! Dar … (amintiți-vă, există întotdeauna un dar) există o modalitate de a dezactiva Fixarea certificatului SSL folosind unele modificări de sistem disponibile numai pe un dispozitiv cu închisoare.

Prima modalitate (îmbunătățită): Jailbreak un dispozitiv și instalarea iOS SSL Kill Switch

IPhone-ul meu rulează în prezent iOS 9.x, deci la momentul scrierii acestui articol era imposibil să fac jailbreak. Așa că am luat un iPad mini vechi care rulează iOS 8.3.x și l-am jailbrown ușor folosind TaiG instrument.

Căutând pe web, am găsit Comutator SSL Kill 2, un instrument Blackbox pentru a dezactiva validarea certificatului SSL în cadrul aplicațiilor iOS și OS X.

Odată încărcat într-o aplicație iOS sau OS X, SSL Kill Switch 2 corecționează funcții specifice SSL de nivel scăzut din API-ul Secure Transport pentru a suprascrieți și dezactivați validarea certificatului implicit al sistemului, precum și orice fel de validare a certificatului personalizat (cum ar fi fixarea certificatului).

SSL Kill Switch folosește MobileSubstrate pentru a corela funcții de sistem precum API de transport securizat. Acestea sunt implementarea TLS de cel mai mic nivel pe iOS.

Aceasta înseamnă că dezactivarea validării certificatelor SSL în API-ul Secure Transport ar trebui să afecteze majoritatea (dacă nu toate) API-urile de rețea disponibile în cadrul iOS.

Vă rog, faceți-vă o favoare și urmați acest blog care acoperă toate aceste concepte.

Deci, m-am conectat la iPad folosind SSH și am instalat pachetul:

wget https://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

Odată repornit, m-am așteptat să văd traficul simplu, dar a fost o viziune optimistă: Am aceleași erori.

Am încercat așa încă o oră. Am citit undeva că Facebook și Twitter folosesc protocolul SPDY pentru apelurile lor API, iar aceasta ar putea fi o problemă pentru Charles. Așa că am instalat un alt tweak care (teoretic) a dezactivat protocolul SPDY, dar nu a funcționat.

Înfometat.

Privind problemele proiectului, am observat că altcineva are aceeași problemă (https://github.com/nabla-c0d3/ssl-kill-switch2/issues/13), fără rezoluție.

1612015511 498 Ce am invatat hacking jocul de fotbal Facebook Messenger

Pauză.

A doua modalitate: Simulați evenimente tactile în aplicație

Mi-am dat seama că există multe trucuri de joc care folosesc o abordare „umană”: simulează evenimente tactile (unul dintre cele mai populare jocuri pe care multe trucuri folosesc această strategie este Clash of Clans).

Navigând pe web pentru un instrument care automatizează aceste operațiuni, am găsit acest tweak minunat – AutoTouch. Poate înregistra evenimente tactile umane și stoca datele într-un script LUA. Apoi puteți edita acest script produs și puteți simula orice doriți oriunde pe dispozitivul dvs.

Odată instalat cu Cydia, Am salvat o captură de ecran BMP a aplicației Messenger cu mingea vizibilă și am obținut coordonatele de unde să fac clic.

1612015511 991 Ce am invatat hacking jocul de fotbal Facebook Messenger
Captură de ecran realizată pentru a obține coordonata

Ceea ce am crezut este că, făcând clic exact în centrul axei X a mingii, a trebuit să simulez evenimente tactile repetitive în aceleași coordonate și apoi să opresc scenariul când am avut un scor cu care eram mulțumit.

Iată ce am scris pentru a atinge acest obiectiv:

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

Nu, nu a funcționat.

Probabil, dezvoltatorii Facebook au introdus o eroare aleatorie la coordonatele tactile pentru a simula mai bine jocul sau pentru a preveni acest tip de scripturi.

Sau, poate am făcut doar clic pe pixelul greșit.

Așadar, pentru a doua șansă, am încercat să simulez mai multe clicuri într-o zonă mai mare, dar fără noroc. Uneori, am simulat atât de multe evenimente tactile încât Springboard tocmai s-a prăbușit din cauza erorilor de memorie.

În loc să dau clic pe aceleași coordonate de fiecare dată, am încercat o abordare mai bună.

Citirea AutoTouch-ului documentație, Am găsit următoarele două metode:

  • findColor (culoare, număr, regiune) – Căutați coordonatele punctelor de pixel care se potrivesc cu culoarea specificată pe ecranul curent.
  • getColor (x, y) – Obțineți valoarea culorii punctului pixel al coordonatei specificate pe ecranul curent.

Ideea a fost să găsim o culoare unică în interiorul mingii și să folosim findColor metodă pentru a obține coordonatele mingii în acel moment, pentru a simula un eveniment tactil.

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

Nu știu de ce, dar pur și simplu nu a funcționat. Poate că findColor este prea lent pentru a intercepta mingea, ceea ce face scriptul inutil.

A treia modalitate: Ingineria inversă a aplicației

Nu am abilități native bune în Obiectivul C, dar îmi amintesc (când am jucat cu jailbreak-ul acum 4 ani) că a existat un instrument de către Saurik care s-ar putea injecta în procesele iOS.

Este lansat împreună cu Cydia și a fost numit Cycript. A permis dezvoltatorilor să exploreze și să modifice aplicațiile care rulează pe iOS, prin injectarea de cod în timpul rulării.

Am citit câteva tutoriale de bază despre cum să-l folosesc și, după câteva lupte, am decis să urmez acest (alt) mod.

După ce vă conectați prin SSH la dispozitivul dvs. iOS, vă puteți atașa cu ușurință la un proces doar tastând:

cycript -p Messenger

Am încercat să inspect câteva clase de bază ale interfeței de utilizare, cum ar fi UIApp, dar nu am găsit nimic interesant. Apoi am făcut un complet depozitul de clase, filtrându-l pentru cuvântul cheie fotbal.

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] );

A fost un proces lent.

Eu descoperit că Facebook Messenger are un număr foarte mare de clase.

Dar, până la urmă, am obținut o listă mică.

1612015512 891 Ce am invatat hacking jocul de fotbal Facebook Messenger
Rezultatul scenariului

Odată ce am obținut numele clasei, am folosit un script pentru a tipări toate metodele clasei și, inspectând MNSoccerGame clasa, metodele rezultate au fost:

1612015512 33 Ce am invatat hacking jocul de fotbal Facebook Messenger
Metodele dump din clasa MNSoccerGame

Notă: încă nu înțeleg care este metoda wasCheatDetected.

Acum, când am avut o listă completă a metodelor de clasă, am decis să trec peste _setScore metoda, sperând că alte metode nu au observat asta.

Pentru a face acest lucru, am folosit MobileSubstrate si este MS.hookMessage metodă.

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

Acum puteți juca, pierde, și oricum înscrie un nou record.

Ce am învățat

Nu te opri niciodată. Încercați întotdeauna și descoperiți un nou mod de a realiza același lucru. Știu, este doar un joc, dar dacă tratezi problema pe care încerci să o rezolvi ca pe o provocare, vei primi mult mai mult decât satisfacția de a-ți bate prietenii.