Una-al-mes Mission 003 Writeup

Una-al-mes Mission 003 Writeup

Muy buenas a todos, hoy os traigo un write-up del unaalmes #3 de Hispasec:

Empezamos con lo que parece ser un QR dividido en 16 piezas y muy desordenado:

Para ordenar el QR yo he usado gaps, un resolvedor de puzzles usando algoritmos genéticos. Si bien éste es más util en imágenes complejas, jugando con los parámetros nos servirá de ayuda.

La imagen mide 408x408px con lo que sabemos que cada pieza mide 102x102px

Ejecutando gaps con las opciones:

gaps --image=qr_mosaic.jpg --size=102 --generations=20 --population=1000

Obtenemos una imagen que, aunque no es directamente el qr resuelto, nos ha hecho gran parte del trabajo:

  Imágenes integradas 1

 

Con ésto solo queda ordenar las 3 partes con gimp y tenemos el QR, el cual podemos leer con nuestro lector de QR preferido, como por ejemplo éste. La imagen nos llevas pues a mediafire, donde podemos descargar una apk.
Esta apk parece darnos un tiempo limitado para introducir una contraseña. He utilizado dex2jar (comando dex2jar timer.apk) para transformar el apk en clases java y he extraido del jar MainActivity.class. (Cabe decir que también extraje Companion y SecurityKT, pero tras un análisis posterior, no me han hecho falta para resolver el reto).
Usando jad he descompilado la MainActivity (comando jad MainActivity.class), y, aunque he visto la función de la generación de la solución, era tan compleja que opté por observar la generación de la clave.
En la función «generateKey», se puede observar como utiliza como clave base SECRET_KEY, que en el propio archivo se puede ver que es «deck_riuk_rick_rock_rick_ruck_tirk_rack_rick_ring_truck_reck«, hace un split a las palabras conforme al guión bajo, y recoge solo las palabras cuyo índice corresponde a números primos. Posteriormente reconstruye la clave añadiendo de nuevo las barras bajas.
private final String generateKey(){
 Iterable iterable=(Iterable)StringsKt.split$default((CharSequence)Companion.getSECRET_KEY(),new String[]{"_"},false,0,6,null);   <- Split key
 Collection collection = (Collection)new ArrayList();
 int i = 0;
 for(Iterator iterator = iterable.iterator(); iterator.hasNext();){
    Object obj1 = iterator.next();
    int j = i + 1;                            <- Aquí solo está gestionando el contador del índice
    int k = i;
    String _tmp = (String)obj1;
    if(SecurityKt.isPrime(k))                 <- Comprueba si el indice es primo
      collection.add(obj1);                   <- Si lo es lo añade a la lista
    i = j;
 }

 Iterator iterator1 = ((Iterable)(List)collection).iterator();
 if(!iterator1.hasNext())
   throw (Throwable)new UnsupportedOperationException("Empty collection can't be reduced."); 
 Object obj;
 String s;
 String s1;
 for(obj = iterator1.next(); iterator1.hasNext(); obj = (new StringBuilder()).append(s1).append("_").append(s).toString()){ 
    s = (String)iterator1.next();                              <- En este for reconstruye la clave                                                             
    s1 = (String)obj;                                                                                                       
 }

 return (String)obj;     <- Retorna la clave generada
}
El resultado aplicando los pasos a mano es: rick_rock_ruck_rack_reck.

 

Utilizando esta clave en el apk descargado anteriormente obtenemos la flag:

 

¡Un saludo a todos y hasta la próxima!

 

 

Un comentario

  1. Pablo Cabeza dice:

    No entendi nada.

    Recien me inicio en el mundo de la programación y desarrollo web, comenzé realizando una aplicación web y ya la tengo casi cmpleta y funcionando, ahora me voy a enfocar en la parte de seguridad, pero me doy cuenta que esto es otro mundo, es como si tuviese que comenzar desde cero nuevamente.

    Buscando en la web asuntos de seguridad informatica, cai en la página de una-al-mes y por medio de ese sitio encontre tu blog.

    pudieses darme unos concejos de como tratar este mundo de seguridad informatica, quisiera empezar a involucrarme con estas cosas extrañas que solo unos pocos conocen.

    saludos desde Venezuela.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

diecisiete + cinco =

A %d blogueros les gusta esto: