Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 02/12/13 in all areas

  1. Facebook friend adder pro registration bypass. Autor: M2G @ Romanian Security Team Data: 12. 01. 2013 In acest tutorial va voi prezenta un mod de a trece de verificarea de username si parola pentru programul facebook friend adder pro. Inainte de a incepe vreau sa precizez ca aceasta metoda este una destul de simpla si ca sunt sanse sa nu mearga pentru produse software carora li s-a acordat mai multa atentie in ceea ce priveste capitolul securitate. O descriere a programului cum apare pe site-ul lor: Ce-i de la lively ofera o versiune trial, care limiteaza accesul la 3 rulari ale aplicatiei. Pentru aceasta demonstratie am folosit varianta trial pentru windows: Facebook FriendAdder Pro Download - Lively 24*7 Service Primul lucru pe care il facem este sa extragem arhiva si sa exploram structuda fisierelor si directoarelor. Putem deduce usor ca aplicatia este scrisa in java si este folosit un launcher pentru a crea un executabil care sa lanseze aplicatia in executie. Cu alte cuvinte, toata logica aplicatiei este incapsulata in fisierele .jar. Vom folosii jd-gui pentru a incerca sa decompilam fisierele .class din arhiva .jar. Despre fisierele jar: JAR (file format) - Wikipedia, the free encyclopedia Despre fisierele .class: Java class file - Wikipedia, the free encyclopedia Deschidem unul din fisierele .jar cu ajutorul jd-gui si surpriza: avem acces la tot codul sursa si mai ales neobfuscat al programului. De aici incepem sa cautam clasele si metodele care sunt resposabile pentru determinarea unui register valid in sistem. Dupa ceva cautari ajungem la fisierul com.lively.browser_6.0.0.201212262126.jar Navigand prin pachete ajunge la clasa Preference din com.lively.browser.preference unde gasim niste metode care par sa contina ceva logica prin care se face autentificarea. Navigand prin aceasta clasa gasim 2 metode (isValidMemeber si verify) care aparent se ocupa cu inregistrarea si validarea userilor. public static boolean isValidMember(int member, String id, String sn) { switch (member) { case 0: return true; case 1: return verify(id, sn); case 2: return (verify(id, sn)) && (id.length() <= 4); case 3: return (verify(id, sn)) && (id.length() <= 3); } return false; } public static boolean verify(String id, String sn) { try { if ((id == null) || (id.equals("")) || (sn == null) || (sn.equals(""))) { return false; } id = id.trim(); sn = sn.trim(); Signature sig = Signature.getInstance("SHA1withRSA"); sig.initVerify(getPublicKey()); sig.update(id.getBytes("UTF8")); boolean result = sig.verify(Base64.decodeBase64(sn.getBytes("UTF8"))); if (result) { getInstance().idDecryptCipherMap.put(id, getDecryptCipher(sn)); } if ((result) && ( ((Integer.parseInt(id) >= 650000) && (Integer.parseInt(id) <= 650073)) || ( (Integer.parseInt(id) >= 659990) && (Integer.parseInt(id) <= 659999)))) { String mac = MacAddr.getMacAddr(); result = mac.equals(getLicenseMac(id)); } return result; } catch (Exception localException) { } return false; } Primul lucru pe care il observam este ca aceste clase returneaza o valoare booleana. De aici putem sa deducem ca daca am forta cumva una din aceste metode sa returneze true de fiecare data, problema noastra cu inregistrarea ar disparea si am putea sa facem bypass la acel register. Codul sursa pe care il vedem in jd-gui este defapt codul decompilat din fisierele .class din acea arhiva .jar. Nu putem sa modificam metoda direct in jd-gui si sa speram ca in felul acesta o sa reusim. Pentru a face asta ne vom folosii de Eclipse. Eclipse classic este perfect pentru ce avem noi nevoie. Il descarcam si il rulam. In eclipse vom crea un nou proiect java. Ii dam proiectului un nume, nu conteaza ce nume. Pentru acest demo am ales: "ffap_RST_demo" Apasam finish si putem sa observam ca proiectul a fost creat. Din jd-gui avem optiunea sa salvam toate fisierele deschise ca si cod sursa. Deci o sa alegem File -> Save all sources avand incarcat in prealabil jar-ul com.lively.browser_6.0.0.201212262126.jar Dezarhivam fisierul .zip cu sursele, creat te catre jd-gui. Acum trebuie sa tragem cu drag & drop folderul com peste folderul src din eclipse pentru a incarca sursele decompilate in proiectul nostru din eclipse. Daca apare un dialog alegeti copy files and folders si apasati ok. Deschidem in editor clasa care ne intereseaza si observam ca avem foarte multe erori. Aceste erori sunt din cauza ca exista dependente intre clasele pe care le-am decompilat si incarcat si celelalte clase din celelalte fisiere .jar. Nu o sa putem modifica si compila fisierul atat timp cat acesta are erori asa ca aceste dependente trebuie rezolvate. Pentru a face asta dam click dreapta pe proiectul java din eclipse si alegem properties. Alegem din panoul din stanga "Java build path" iar in dreapta selectam tabul Libraries Aici apasam pe "Add external jars" si selectam toate celelalte fisiere .jar din directorul programului. Observam ca o mare parte din erori s-au rezolvat si am mai ramas cu o singura eroare la un import: O cautare pe google ne ajuta sa ajungem la libraria care mai lipseste. Codec - Download Commons Codec Descarcam ultima versiune, extragem arhiva si adaugam fisierele .jar la proiect la fel cum am facut si cu celelalte dependente si am scapat si de aceasta problema. Acum putem sa modificam metoda si sa o compilam. Navigam pana la metoda verify, ii stergem tot continutul si scriem "return true" Deci metoda verify din: public static boolean verify(String id, String sn) /* */ { /* */ try /* */ { /* 323 */ if ((id == null) || (id.equals("")) || (sn == null) || (sn.equals(""))) { /* 324 */ return false; /* */ } /* 326 */ id = id.trim(); /* 327 */ sn = sn.trim(); /* 328 */ Signature sig = Signature.getInstance("SHA1withRSA"); /* 329 */ sig.initVerify(getPublicKey()); /* 330 */ sig.update(id.getBytes("UTF8")); /* 331 */ boolean result = sig.verify(Base64.decodeBase64(sn.getBytes("UTF8"))); /* 332 */ if (result) { /* 333 */ getInstance().idDecryptCipherMap.put(id, getDecryptCipher(sn)); /* */ } /* 335 */ if ((result) && ( /* 336 */ ((Integer.parseInt(id) >= 650000) && (Integer.parseInt(id) <= 650073)) || ( /* 337 */ (Integer.parseInt(id) >= 659990) && (Integer.parseInt(id) <= 659999)))) { /* 338 */ String mac = MacAddr.getMacAddr(); /* 339 */ result = mac.equals(getLicenseMac(id)); /* */ } /* 341 */ return result; } catch (Exception localException) { /* */ } /* 343 */ return false; /* */ } va deveni: /* */ public static boolean verify(String id, String sn) /* */ { return true; /* */ } Aceasi chestie o putem face si cu metoda isValidMember dar nu e necesar aici. O chestie importanta care trebuie stiuta este ca eclipse compileaza fisierele in momentul in care acestea sunt salvate asa ca tot ce trebuie sa facem este sa salvam modificarile si sa mergem in directorul in care am creat proiectul java. Aici putem sa observam ca avem clasa de care avem nevoie gata compilata. Stiind ca un fisier .jar este defapt o arhiva putem sa luam fisieru compilat de noi si sa-l inlocuim cu cel existent in directorul programului. Acum rulam programul in speranta ca ideea noastra a functionat si ca putem sa trecem de acel register. Dar surpriza: Se pare ca avem o problema dar aplicatia a creat un fisier de log. De aici putem observa ca aplicatia a fost compilata cu java 1.5 dar noi am compilat cu versiunea curenta 1.7 si aceasta pare sa fie cauza crash-ului. Ne intoarcem in eclipse dam click dreapta pe proiect si alegem properties. De aici alegem java compiler din panoul din stanga. In panoul din dreapta setam "Compiler compliance level la 1.5" Acum e nevoie de un rebuild al proiectului. Pentru asta este necesar doar sa tastam un spatiu in editor si sa salvam (ctrl+s). Daca nu merge asa dati Project si Build project. Dupa build luam fisierul si il punem in arhiva jar, ca si mai sus. Ruland aplicatia suntem intampinati de acelasi dialog de register. Incercam o inregistrare cu credentialele de mai sus(vezi nota 1) si:
    1 point
×
×
  • Create New...