martes, 27 de diciembre de 2016

Resolviendo el reto Nro 10 Android de ESET Ekoparty 2016 #eko12 - PARTE 2



Como habíamos quedado en la PARTE 1 el CrackmeBaby.apk desencripta un nuevo.apk

content.apk SHA256: 94317deb79ced2ece91b413d142492c76c876a320957a0f21bdf2a8150d6d427





Arrancamos la APP y nos muestra esta imagen, evidentemente algo mal estamos haciendo.





Decompilamos con APK-Multy-tool 

Existen dos activities SuperActivity y SuperbActivity.

Esto lo vemos en el AndroidManifest.xml





Y la actividad que se esta iniciando por default es SuperActivity y vemos en el código que solo muestra una imagen (la de Obi Wan)





SuperbActivity hace cosas mas interesantes y vemos que nunca arranca por lo que vamos a forzar su arranque




Para arrancar la actividad modificamos el AndroidManifest.xml para que arranque la SuperbActivity y luego volvemos a compilar y firmar.




Así vamos a obtener una segunda aplicación que siempre arrancará la actividad correcta para resolver este reto, por lo que a partir de ahora seguiremos trabajando con ella.




La arrancamos y vemos lo siguiente:



Una imagen de Fsociety y un contador decreciente, no tenemos ningún ingreso de datos como en el apk de la Parte 1.


En el código vemos



try
      {
        if ((SuperbActivity.b <= 0.0D) && (SuperbActivity.a < 0))
        {
          SuperbActivity.a += 1;
          SuperbActivity.access$002(SuperbActivity.this, 10.0D * (int)Math.log(Math.pow(SuperbActivity.a, SuperbActivity.a)));
          SuperbActivity.b = SuperbActivity.this.c;
          String str = SuperbActivity.this.getPreferences(4).getString("password", "no_password");
          if (e.SHA1(str).equalsIgnoreCase("249192f0a4f70aa25aa5c7521625f7d6e4021042"))
            new a().execute(new b[] { new b(SuperbActivity.this.getApplicationContext(), d.decrypt(str, "Jhv1Bk0Qi07jOVEeyImynOQmiiz1MvZakazhOaAld-0=")) });
        }
        SuperbActivity.this.t.setText(String.format("Próximo intento: %.1f", new Object[] { Double.valueOf(SuperbActivity.b) }));
        SuperbActivity.b -= 0.1D;
        SuperbActivity.this.g.postDelayed(this, 100L);
        return;
      }
      catch (Exception localException)
      {
        Log.e(SuperbActivity.this.getResources().getString(2131099668), "Oops!");

      }



Podemos observar que por otro lado hay un hash de SHA1 y un d.decrypt que toma como ingreso la cadena Jhv1Bk0Qi07jOVEeyImynOQmiiz1MvZakazhOaAld-0=


Vemos también:


  protected void onCreate(Bundle paramBundle)
  {
......................................
    paramBundle.putString("password", "insert_password_here");
    paramBundle.apply();

  }


Revisando el codigo SMALI veo lo siguiente:


.source "SuperbActivity.java"

  .line 61
    .local v0, "editor":Landroid/content/SharedPreferences$Editor;

    const-string v2, "password"


Significa que existe una shared memory en la cual deberemos poner una clave para que luego sea comparada con el hash del SHA1 y si machea se ejecuta la función d.decrypt("clave",Jhv1Bk0Qi07jOVEeyImynOQmiiz1MvZakazhOaAld-0=)

Busque el hash por internet sin suerte, por lo que intente con hashcat y probar una clave de 10 dígitos incremental....

hashcat64.exe -m 100 -a 3 example0.hash ?s?s?s?s?s?s?s?s?s?s --incremental 

Probé con solo numéricos, con alfa + may/minusculas sin éxito, para luego pasar al set con caracteres espaciales. Hasta los siete caracteres fue rápido y luego paso de horas a días y años... por lo que descartamos esté método debido a que un reto en una confer no nos puede llevar tanto tiempo a menos que tengamos una maquina cuántica...

Probe con hashcat porque al ver a Obi se me vino a la mente "Usa la Fuerza"...fuerza bruta....mmmm.... no...no.... solo fue una trampita :D


La password debería estar en otro lugar, revisando las imágenes de los recursos se las pase al exiftool y en la imagen de fsociety se puede ver lo siguiente en el Thumbnail


exiftool -b -ThumbnailImage image.jpg > my_thumbnail.jpg







Ahora que tengo la password r4bb!th0l3 se la puedo poner en el shared memory con el ADM en /data/data/eset.ekoparty.challenge.crackmeharder/shared_prefs/SuperbActivity.xml







O asignar la password directamente en el SuperbActivity.smali y me olvido.

Lógicamente vuelvo a compilar y firmar la aplicación.


.source "SuperbActivity.java"

  .line 61
    .local v0, "editor":Landroid/content/SharedPreferences$Editor;
    const-string v2, "password"

    const-string v3, "r4bb!th0l3"


Cuando machea el SHA1, como habíamos comentado antes, se 
ejecuta d.decrypt( r4bb!th0l3,Jhv1Bk0Qi07jOVEeyImynOQmiiz1MvZakazhOaAld-0=) 
obteniendo como resultado el string f0ll0w_th3_wh!t3_r4bb!t!

Acá la podemos ver en un dump de memoria previo.




Cada vez que el contador se pone en cero o se da click en el label, el apk llama a la class b y visita un sitio.

        SuperbActivity.this.t.setText(String.format("Próximo intento: %.1f", new Object[] { Double.valueOf(SuperbActivity.b) }));
        SuperbActivity.b -= 0.1D;

        SuperbActivity.this.g.postDelayed(this, 100L);



class b
{
  .................................
  String getUrl()
  {
    return "http://desafioseset.com/";
  }

}


En el LOGCAT se ve lo siguiente





Por otro lado se llama a la Class n a la cual se le pasa el string f0ll0w_th3_wh!t3_r4bb!t!


 SuperbActivity.FLAG = new n().func(localb.getKeyword());



class n
{
  static
  {
    System.loadLibrary("dostuff");
  }


Por lo que si hacemos un DUMP de la memoria.








Obtenemos la FLAG :D

eko_eset_m0b!l35



El APK lo deje modificado para que ingrese directamente a la actividad que corresponde, tome la clave y la imprima en el logcat.







Les dejo el apk original y la modificada con los archivos SMALI que toque.


https://dl.dropboxusercontent.com/u/80008916/Crackmeharder.7z



Eso es todo por este 2016 @Dkavalanche 










No hay comentarios:

Android: BankBot. Hace un tiempo se filtro el fuente de un Bankbo t para android y se masifico bastante, creo que muchos lo han lanzado pa...