M2G Posted January 12, 2013 Report Posted January 12, 2013 (edited) Facebook friend adder pro registration bypass.Autor: M2G @ Romanian Security TeamData: 12. 01. 2013In 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: Facebook is a fast growing social network in which you can receive updates of information around the world in seconds. It has over 850 million members and is growing rapidly each day. Facebook FriendAdder Pro (FFAP) helps you reach out to people for personal and business purposes.FFAP is the most professional facebook automation tool. It is the dream of facebook marketers who make full use of it will probably benefit a lot. It is an all in one automation marketing tool for facebook marketers. FFAP has more than 20+ features, from mass friend requests to mass wall posts, the ability to fill profile's information, upload profile pictures, find targeted friends, like/share/comment/post wall update and suggest events to friends, our software has the features available to allow you to place your marketing efforts on autopilot. Facebook FriendAdder Pro can spare no effort to help you to achieve your success.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 ServiceNota 1:Userul pentru acest program este de forma: 650XXX iar parola de forma: UmNJOkVhB0iJ+jxAeiWocRZ6Lpg5ck6TP3gA9mgGDEFzAc7aORyKwGf1vHblq4AAPsC1bMzK+j0fegZTLR4g9A==Asa ca o sa incercam sa facem register cu:ID: 650XXX (unde xxx sunt numere, sau litere)Pass: UmNJOkVhB0iJ+jxAeiWocRZ6Lpg5ck6TP3gA9mgGDEFzAc7aORyKwGf1vHblq4AAPsC1bMzK+j0fegZTLR4g9A== (orice string de forma asta va merge pentru register)Dupa cum se vede, inregistrarea a esuat.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 encyclopediaDespre fisierele .class: Java class file - Wikipedia, the free encyclopediaDeschidem 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.jarNavigand 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.File -> new -> Java ProjectIi 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.jarDezarhivam 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 LibrariesAici 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:import org.apache.commons.codec.binary.Base64;O cautare pe google ne ajuta sa ajungem la libraria care mai lipseste.Codec - Download Commons CodecDescarcam 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.!SESSION 2013-01-12 22:01:06.880 -----------------------------------------------eclipse.buildId=unknownjava.version=1.5.0_16java.vendor=Sun Microsystems Inc.BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_USCommand-line arguments: -os win32 -ws win32 -arch x86 -clean!ENTRY org.eclipse.osgi 4 0 2013-01-12 22:01:11.535!MESSAGE Application error!STACK 1java.lang.UnsupportedClassVersionError: Bad version number in .class file at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:601) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:567) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:490) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:478) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:458) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216) at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400) at org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(SingleSourcePackage.java:35) at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:473) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at com.facebook.friendadder.pro.launcher.Application.start(Unknown Source) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) at org.eclipse.equinox.launcher.Main.run(Main.java:1410)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:Nota 2:Stiu ca aplicatia e simplu de pacalit pentru ca nu isi stocheaza valori de configurare prin registrii sau alte locuri mai ascunse ci doar in folderul ei dar scopul acestui tutorial este de a prezenta o metoda, o tehnica si trebuie privit strict pentru metoda si partea tehnica si nu pentru altceva.Desigur cred ca sunt functionalitati care nu merg si trebuie sapat mai mult in aplicatie pentru a rezolva aceste probleme dar acesta a fost doar un demo pentru a prezenta metoda Edited January 12, 2013 by M2G corectare 3 Quote
raynor009 Posted January 12, 2013 Report Posted January 12, 2013 Like a boss , multumesc pentru tutorial. Quote
poterasal Posted January 19, 2013 Report Posted January 19, 2013 (edited) Bun tutorialul. Edited January 19, 2013 by poterasal Quote
poterasal Posted January 19, 2013 Report Posted January 19, 2013 (edited) Scuze pentru x2 post.Am inteles tot mai putin partea asta : 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. " Edited January 19, 2013 by poterasal Quote
M2G Posted January 19, 2013 Author Report Posted January 19, 2013 Din jd-gui dai save all sources si o sa ai ca rezultat un fisier de tip arhiva cu toate sursele din acel .jar.Daca dezarhivezi, o sa gasesti acolo un folder care se numeste "com".Pur si simplu tragi folderul com peste folderul src din eclipse pentru a incarca sursele in proiectul eclipse.Nu mai face dublu post ca iei warn. Ai buton de edit. Quote
SimeTrie95Online Posted January 23, 2013 Report Posted January 23, 2013 Super dar de ce nu ai pus tota munca la Download sau nu ai vrut OK Oricum e super tare tutorialul.... Quote