lunes, 26 de diciembre de 2016

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


Buenas, decidí terminar el año posteando como resolver este reto Android de ESET que me pareció muy bueno.

Vamos a necesitar APK-Multi-tool, dex2jar, JD-GUI, signapk.jar y un emulador de Android, en mi caso use bigNOX porque tengo una maquina con AMD y el emulador de Google de Windows no permite la aceleración de VM si no se posee un cpu Intel.

El Desafio:

**************************************************
Este es el desafío de reversing en Android.

Para encontrar el flag deberás utilizar técnicas sencillas de análisis de APK y algo de ingenio.

Al comienzo, probablemente debas utilizar algún motor de búsqueda para dar con la contraseña correcta, que es la respuesta a una adivinanza.

Encontrarás pistas que te guiarán en la dirección correcta.

Mucha suerte y happy reversing.


ROMPIENDO CrackMeBabe.apk

SHA256: ca80b0c050233ad6c9d70793ba76effeaffb9ede79508993f965beb04598233d



Cargamos el APK y ni bien lo lanzamos obtenemos la siguiente imagen de un personaje de Tv, por lo que se debe estar haciendo algún tipo de comprobación.





Decompilamos el APK con Multi-tool opción 9, con el obtendremos los archivos SMALI y el classes.dex que luego lo pasaremos por el dex2jar para obtener un .jar para abrirlo con el JD-Gui






d2j-dex2jar.bat classes.dex 

dex2jar classes.dex -> .\classes-dex2jar.jar

JD-Gui




Tenemos varias classes (Login, a, b, c, d, e, f)

Vamos a repasar a ojo de pájaro las principales funciones que me van a permitir sortear el entuerto.


Class f

Función  chk 
(se hacen comprobaciones de que tipo de dispositivo se esta utilizando y lo comprueba con un llamado a la clase d)

 if ((!Build.MODEL.contains(d.h)) && (!Build.MODEL.contains(d.i)) && (!Build.MODEL.contains(d.m)) && (!Build.FINGERPRINT.startsWith(d.k)) && (!Build.FINGERPRINT.startsWith(d.l)) && (!Build.MANUFACTURER.contains(d.n)) && (!Build.PRODUCT.contains(d.c)) && (!Build.MODEL.contains(d.c)))

Función chks(boolean) 

  return Build.VERSION.SDK_INT == 22;

Retorna verdadero si la versión del APLI level es 22 (Android Lollipop 5.0 - 5.1.1)
Por lo que tendríamos que ejecutarlo en un dispositivo con ese nivel de S.O. o emularlo con el AVD correspondiente.



Nombre códigoNúmero de versiónFecha de lanzamientoNivel de API
Apple Pie1.023 de septiembre de 20081
Banana Bread1.19 de febrero de 20092
Cupcake1.527 de abril de 20093
Donut1.615 de septiembre de 20094
Eclair2.0–2.126 de octubre de 20095–7
Froyo2.2–2.2.320 de mayo de 20108
Gingerbread2.3–2.3.76 de diciembre de 20109–10
Honeycomb13.0–3.2.622 de febrero de 201111–13
Ice Cream Sandwich4.0–4.0.418 de octubre de 201114–15
Jelly Bean4.1–4.3.19 de julio de 201216–18
KitKat4.4–4.4.4, 4.4W–4.4W.231 de octubre de 201319–20
Lollipop5.0–5.1.112 de noviembre de 201421–22
Marshmallow6.0–6.0.15 de octubre de 201523
Nougat7.0 - 7.122 de agosto de 201624 - 25

-----------------------------------------------------------------------------------------------------



Class Login en la cual se hacen varias comprobaciones para presentar el frame de login y pasar a la segunda etapa del desafío que es la de desencriptar un recurso y ejecutarlo (otro apk).

Función chkn (boolean) retorna verdadero si la latitud es 40 y la longitud es -74 en la geolocalización del dispositivo.

public boolean chkn()
  {
    int j = 0;
    int i = j;
    if (this.l != null)
    {
      i = j;
      if ((int)this.l.getLatitude() == 40)
      {
        i = j;
        if ((int)this.l.getLongitude() == -73)
          i = 1;
      }
    }
    return i;
  }

Acá tenemos una comprobación importante, se debe cumplir las dos, la chkn (lat:40 y long:-73) y la chks (version del SDK) de la class f para mostrar el frame del login, por otro lado se imprime un hint en el logcat

if ((chkn()) && (f.chks()))


    {
      setContentView(2130968602);
      this.bt = ((Button)findViewById(2131492970));
      this.tx = ((EditText)findViewById(2131492969));
      this.vw = ((TextView)findViewById(2131492971));
      this.vw.setOnClickListener(new c());
      Toast.makeText(this.con, "HINT: *Escucha* lo que Gollum responde y la clave encontrarás, o encuentra el enlace ofuscado que te guiará.", 1).show();
      Log.i(d.z, "HINT: *Escucha* lo que Gollum responde y la clave encontrarás, o encuentra el enlace ofuscado que te guiará.");
      return;
    }

Tenemos un hash md5 que corresponde a una clave a ingresar.


  public void onClick(View paramView)
  {
    if (((paramView instanceof Button)) && (paramView == this.bt))
      try
      {
        paramView = this.tx.getText().toString();
        MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
        localMessageDigest.update(paramView.getBytes("UTF-8"));
        paramView = String.format("%032x", new Object[] { new BigInteger(1, localMessageDigest.digest()) });
        if (!paramView.equalsIgnoreCase("16cc45d14201e8caf26d48e636b1c48d"))


Buscamos en internet el MD5 y corresponde a  3gg535


Desencripción del recurso "enc" localizado en assets/ mediante la class b  función b.decrypt();





protected String doInBackground(String[] paramArrayOfString)
    {
      try
      {
        File localFile = new File(Environment.getExternalStorageDirectory().getPath() + "/content.apk");
        if ((localFile.exists()) && (localFile.length() > 0L))
          return "Error";
        InputStream localInputStream = Login.this.getApplicationContext().getResources().getAssets().open("enc");
        FileOutputStream localFileOutputStream = new FileOutputStream(localFile);
        b.decrypt(paramArrayOfString[0], localInputStream, localFileOutputStream);
        paramArrayOfString = new Intent("android.intent.action.VIEW");
        paramArrayOfString.setDataAndType(Uri.fromFile(localFile), "application/vnd.android.package-archive");
        Login.this.startActivity(paramArrayOfString);
        this.blnResult = true;
        return "Executed";
      }
      catch (Exception paramArrayOfString)
      {
        while (true)
        {
          paramArrayOfString.printStackTrace();
          Log.e(d.z, paramArrayOfString.getMessage());
        }
      }
    }


-----------------------------------------------------------------------------------------------------

Class d donde se llama a la class e y se desencriptan varios strings que serán utilizados en la class f para comprobar en que tipo de dispositivo especifico se esta ejecutando y desviar un poco la atención del reverser.

package eset.ekoparty.challenge.crackmebabe;

public class d
{
  public static String a = "12321322869";
  public static final String b = e.pqz("htDaDYyZOg==");
  public static final String c = e.pqz("tNrV");
  public static final String g = e.pqz("5Y6OT9PAbvGYtDsxJChCQI0=");
  public static final String h = e.pqz("5dnREIScO57b4GAj");
  public static final String i = e.pqz("5fvTCo+RKq7apg==");
  public static final String k = e.pqz("5dnbEYaCN6KK");
  public static final String l = e.pqz("5cvQFI2fKa+K");
  public static final String m = e.pqz("5f/QG5GfN6WI109KNHoHGcNbxcOzZ57tl8xC");
  public static final String n = e.pqz("5fnbEZqdMbXB62Uj");
  public static final String y = e.pqz("r8rKD9nfca3F439nbTYRH8IA2tThctH5w48NXoLVdHkq1Yo=");
  public static final String z = e.pqz("hMzfHIjQE6SIxmpjcQ==");
}


Decodificadas quedan

a = 12321322869
b = Android
c = sdk
g = 000000000000000
h = google_sdk
i = Emulator
k = generic
l = unknown
m = Android SDK built for x86
n = Genymotion
y = http://lmgtfy.com/?q=gollum+riddles
z = Crack Me Babe

-----------------------------------------------------------------------------------------------------


Class e se encarga de pasar a texto las cadenas base64 encontradas en la classe d

public class e
{
  static String pqz(String paramString)
  {
    try
    {
      paramString = new String(new a(d.a.getBytes("UTF-8")).a(Base64.decode(paramString.getBytes(), 0)), "UTF-8");
      try
      {

        String str = paramString.replace("\"", "");


-----------------------------------------------------------------------------------------------------


Bueno como salimos de este lio....

La clave la tenemos que es 3gg535 quiere decir que lo mas difícil son las comprobaciones de las funciones de las class Login y F

Entonces vamos a modificar el código SMALI  para que nos permita pasar a la pantalla de ingreso de password y lograr desencriptar el recurso enc.

Luego de modificar los .SMALI  re-compilamos con el APK-Multi-tool y firmamos con el signapk.jar 



Modificando Login.SMALI


Código java:

Cambiamos el  if ((chkn()) && b(f.chks())) por  if ((f.chks()) && (f.chks())) 


if ((f.chks()) && (f.chks())) 
    {
      setContentView(2130968602);
      this.bt = ((Button)findViewById(2131492970));
      this.tx = ((EditText)findViewById(2131492969));
      this.vw = ((TextView)findViewById(2131492971));
      this.vw.setOnClickListener(new c());
      Toast.makeText(this.con, "HINT: *Escucha* lo que Gollum responde y la clave encontrarás, o encuentra el enlace ofuscado que te guiará.", 1).show();
      Log.i(d.z, "HINT: *Escucha* lo que Gollum responde y la clave encontrarás, o encuentra el enlace ofuscado que te guiará.");
      return;

    }

En .SMALI sería:

    .line 63
    :cond_1
    invoke-static {}, Leset/ekoparty/challenge/crackmebabe/f;->chks()Z

    move-result v0

    if-eqz v0, :cond_2

    invoke-static {}, Leset/ekoparty/challenge/crackmebabe/f;->chks()Z

    move-result v0


    if-eqz v0, :cond_2


Modificando f.SMALI

Código java:

Modificamos  chks()  para que retorne verdadero si utilizamos una versión menor a 99, con esto podemos probarlo en cualquier API level.



  public static boolean chks()
  {
    return Build.VERSION.SDK_INT < 99;

  }


En .SMALI sería:

    sget v0, Landroid/os/Build$VERSION;->SDK_INT:I

    const/16 v1, 0x63 
                   
    if-ge v0, v1, :cond_0


Compilamos con opción 12 de APK-Multi-tool




Luego firmamos el APK con signapk.jar


set usrc=0
set heapy=512
echo Signing Apk
java -Xmx%heapy%m -jar signapk.jar -w testkey.x509.pem testkey.pk8 in.apk out.apk




Instalamos y ejecutamos el APK.


Y vemos que ya paso de largo las comprobaciones y nos muestra el ingreso de la password.



Ingresamos la password 3gg535 y se descifra el recurso enc.





Para luego solicitar ser instalado.







Instalamos y ejecutamos.... pero lo vemos la próxima.


Les dejo el apk original, el apk parchado y los .SMALI para que pueda hacerlo 
Uds. en sus casas.

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


Próxima entrega antes de fin de año :D

Eso es todo por el momento @Dkavalanche 2016 







miércoles, 4 de mayo de 2016

Campaña de Ransomware: Locky - Parte III

Nueva campaña, esta vez se utiliza un documento  .docm que es un Documento Microsoft Word con macros.







El Indice de detecciones del documento es muy baja.



Al habilitar las macros en el docm, se produce la descarga e infección de la computadora.




Desempaquetado de la capa de ofuscación (crypter del binario)

https://virustotal.com/es/file/ed8390885a6bcdda11cb51f8d3c2553625d1c567f221a490450f44d2ac3cec3a/analysis/

BP en IsDebuggerPresent /ResumeThread/WriteProcessMemory y luego dumpear con Pe-TOOL




Locky...




Exenciones de archivo que busca para cifrar.



Probando el binario en forma dinámica.

Conexión con el C&C, eh visto que si no hay conexión a Internet o no puede encontrar vía dns los sitios de C&C, Locky no comienza con el proceso de cifrado de la PC.




El infame cartel de que nuestros datos fueron cifrados.







Muestras: https://www.dropbox.com/s/105s5umnmpm8cj8/Locky-03-05-16.zip?dl=0


Eso es todo por el momento @Dkavalanche 2016


jueves, 10 de marzo de 2016

Campaña de Ransomware: Locky - Parte II

Continúan con las campañas de infección en forma masiva, esta vez el Ransomware se encuentra alojado en un servidor nacional demostrando que esta amenaza llego para quedarse y atacar a usuarios de Argentina.

Asunto: : Shipping Information - Your Order #396-7972


Dear Customer,

Your order will be shipped shortly, we apologize for the troubles. Please, review the invoice in the attached file.


Sincerely,

Xxxxx..





JavaScript downloader ofuscado dentro de un archivo .zip








Trafico de red de la descarga.








Icono del malware Descargado



Baja detección por parte de los Antivirus.







El binario tiene una capa de Cripter igual al caso anterior, con un Bp en ResumeThread y dumpeando con PEtools obtenemos la muestra limpia.





Strings




Text strings referenced in Dumped:.text
Address    Disassembly                               Text string
004019CA   MOV DWORD PTR SS:[EBP-4],Dumped.004138B4  ASCII "bad allocation"
00401B09   PUSH Dumped.004138D0                      UNICODE "0123456789ABCDEF"
00401B78   PUSH Dumped.004138C4                      UNICODE ".tmp"
00401D8D   PUSH Dumped.004138D0                      UNICODE "0123456789ABCDEF"
00401DF0   PUSH Dumped.004138F4                      UNICODE ".locky"
0040253B   PUSH Dumped.00413928                      ASCII "invalid string position"
0040255A   PUSH Dumped.00413918                      ASCII "string too long"
00402607   PUSH Dumped.00413918                      ASCII "string too long"
00402687   PUSH Dumped.00413918                      ASCII "string too long"
00402763   PUSH Dumped.00413904                      ASCII "vector too long"
00402832   PUSH Dumped.00413918                      ASCII "string too long"
004028C4   PUSH Dumped.00413918                      ASCII "string too long"
00402AE8   PUSH Dumped.00413928                      ASCII "invalid string position"
00402B64   PUSH Dumped.00413928                      ASCII "invalid string position"
00402D2E   ASCII "L~",0
00402D85   PUSH Dumped.00413918                      ASCII "string too long"
00403174   PUSH Dumped.00413940                      UNICODE "\_Locky_recover_instructions.txt"
0040326D   PUSH Dumped.004139BC                      ASCII "id="
00403281   PUSH Dumped.004139A8                      ASCII "&act=stats&path="
004032A8   PUSH Dumped.0041399C                      ASCII "&encrypted="
004032D2   PUSH Dumped.00413990                      ASCII "&failed="
004032F9   PUSH Dumped.00413984                      ASCII "&length="
00403575   MOV EDI,Dumped.004139C0                   ASCII "Windows 2000"
00403599   MOV EDI,Dumped.004139D0                   ASCII "Windows XP"
004035A7   MOV EDI,Dumped.004139DC                   ASCII "Windows 2003"
004035B1   MOV EDI,Dumped.004139EC                   ASCII "Windows 2003 R2"
004035D3   MOV EDI,Dumped.004139FC                   ASCII "Windows Vista"
004035DA   MOV EDI,Dumped.00413A0C                   ASCII "Windows Server 2008"
004035EA   MOV EDI,Dumped.00413A20                   ASCII "Windows 7"
004035F1   MOV EDI,Dumped.00413A2C                   ASCII "Windows Server 2008 R2"
00403602   MOV EDI,Dumped.00413A44                   ASCII "Windows 8"
00403609   MOV EDI,Dumped.00413A50                   ASCII "Windows Server 2012"
0040361A   MOV EDI,Dumped.00413A64                   ASCII "Windows 8.1"
00403621   MOV EDI,Dumped.00413A70                   ASCII "Windows Server 2012 R2"
0040363E   MOV EDI,Dumped.00413A88                   ASCII "Windows 10"
00403645   MOV EDI,Dumped.00413A94                   ASCII "Windows Server 2016 Technical Preview"
0040364C   MOV EDI,Dumped.00413ABC                   ASCII "unknown"
004036C5   PUSH Dumped.00413CF4                      ASCII "IsWow64Process"
004036CA   PUSH Dumped.00413CE4                      ASCII "kernel32.dll"
0040376F   PUSH Dumped.004139BC                      ASCII "id="
0040377E   PUSH Dumped.00413AF4                      ASCII "&act=getkey&affid="
004037A5   PUSH Dumped.00413AEC                      ASCII "&lang="
004037CB   PUSH Dumped.00413AE4                      ASCII "&corp="
004037F7   PUSH Dumped.00413ADC                      ASCII "&serv="
00403820   PUSH Dumped.00413AD4                      ASCII "&os="
00403847   PUSH Dumped.00413ACC                      ASCII "&sp="
0040386E   PUSH Dumped.00413AC4                      ASCII "&x64="
00403A33   PUSH Dumped.00413B08                      ASCII "Tahoma"
00403DB4   MOV DWORD PTR SS:[ESP],Dumped.00413940    UNICODE "\_Locky_recover_instructions.txt"
00403DC5   PUSH Dumped.00413B10                      UNICODE "\_Locky_recover_instructions.bmp"
00403E75   PUSH Dumped.00413B54                      ASCII "Control Panel\Desktop"
00403F17   MOV ECX,Dumped.00413B70                   ASCII "WallpaperStyle"
00403F9B   MOV ECX,Dumped.00413B80                   ASCII "TileWallpaper"
00403FE6   MOV EDI,Dumped.00413B90                   UNICODE "open"
004040A9   PUSH Dumped.00413CC4                      ASCII "Wow64DisableWow64FsRedirection"
004040AE   PUSH Dumped.00413CE4                      ASCII "kernel32.dll"
004040DA   MOV ESI,Dumped.004137EF                   ASCII "185.92.220.35,46.108.39.18,192.71.213.69,192.121.16.196,109.237.111.168,212.47.223.19,89.108.85.163"
004041E3   PUSH Dumped.00413B9C                      ASCII "Software\Locky"
0040422D   PUSH Dumped.00413BAC                      ASCII "id"
00404288   MOV EBX,Dumped.00413BB0                   ASCII "pubkey"
004042E2   PUSH Dumped.00413BB8                      ASCII "paytext"
00404355   PUSH Dumped.00413BC0                      ASCII "completed"
004043ED   PUSH Dumped.00413BCC                      UNICODE "svchost.exe"
0040448A   MOV ECX,Dumped.00413BAC                   ASCII "id"
004044E1   PUSH Dumped.00413BE4                      UNICODE ":Zone.Identifier"
004045C6   PUSH Dumped.004139BC                      ASCII "id="
004045DC   PUSH Dumped.00413C08                      ASCII "&act=gettext&lang="
0040468D   PUSH Dumped.00413BB8                      ASCII "paytext"
004047B5   PUSH Dumped.00413C20                      UNICODE "vssadmin.exe Delete Shadows /All /Quiet"
004047E2   PUSH Dumped.00413C70                      ASCII "Software\Microsoft\Windows\CurrentVersion\Run"
0040486B   PUSH Dumped.00413BC0                      ASCII "completed"
004048AD   PUSH Dumped.00413CAC                      ASCII "Locky"
00404993   PUSH Dumped.00413904                      ASCII "vector too long"
00404A78   PUSH Dumped.00413904                      ASCII "vector too long"
00404EE1   PUSH Dumped.00413CA0                      UNICODE "Locky"
00404F81   PUSH Dumped.00413928                      ASCII "invalid string position"
00404FA0   PUSH Dumped.00413918                      ASCII "string too long"
00405041   PUSH Dumped.00413918                      ASCII "string too long"
004050BB   PUSH Dumped.00413918                      ASCII "string too long"
004051B4   PUSH Dumped.00413918                      ASCII "string too long"
00405409   PUSH Dumped.00413918                      ASCII "string too long"
004055C2   PUSH Dumped.00413928                      ASCII "invalid string position"
0040563A   PUSH Dumped.00413928                      ASCII "invalid string position"
004057E6   PUSH Dumped.00413918                      ASCII "string too long"
00405AAC   MOV EDX,Dumped.00413CB4                   UNICODE "/\"
00406393   MOV EDX,Dumped.00413CB4                   UNICODE "/\"
004064A2   PUSH Dumped.00413D0C                      UNICODE "cmd.exe /C del /Q /F ""
004064DE   PUSH Dumped.00413D04                      UNICODE "sys"
004069CA   PUSH Dumped.00413D50                      ASCII "HTTP/1.1"
004069D6   PUSH Dumped.00413D8C                      ASCII "POST"
004071D5   PUSH Dumped.00413D84                      ASCII "http://"
004071E5   PUSH Dumped.00413D78                      ASCII "/main.php"
0040753F   PUSH Dumped.00413904                      ASCII "vector too long"
0040759C   PUSH Dumped.00413904                      ASCII "vector too long"
0040778B   PUSH Dumped.00413918                      ASCII "string too long"
004078CA   PUSH Dumped.00413928                      ASCII "invalid string position"
00407CBA   PUSH Dumped.004147A0                      UNICODE "\*"
004087B9   PUSH Dumped.00413904                      ASCII "vector too long"
0040880F   PUSH Dumped.00413904                      ASCII "vector too long"
00408866   PUSH Dumped.00413904                      ASCII "vector too long"
004088C6   PUSH Dumped.00413904                      ASCII "vector too long"
004089C4   PUSH Dumped.00413904                      ASCII "vector too long"
00408AC0   PUSH Dumped.00413904                      ASCII "vector too long"
00409CF7   MOV EAX,Dumped.00411344                   ASCII "Unknown exception"
00409E56   MOV DWORD PTR SS:[EBP-4],Dumped.004138B4  ASCII "bad allocation"
0040AB74   CALL Dumped.0040D1F9                      (Initial CPU selection)
0040ADAC   PUSH Dumped.00411D44                      UNICODE "Runtime Error!

Program: "
0040ADED   PUSH Dumped.00411D14                      UNICODE ""
0040AE2E   PUSH Dumped.00411D0C                      UNICODE "..."
0040AE43   PUSH Dumped.00411D04                      UNICODE "

"
0040AE74   PUSH Dumped.00411CB8                      UNICODE "Microsoft Visual C++ Runtime Library"
0040B4F9   PUSH Dumped.00411D88                      UNICODE "mscoree.dll"
0040B508   PUSH Dumped.00411D78                      ASCII "CorExitProcess"
0040C47C   PUSH Dumped.004120F0                      UNICODE "KERNEL32.DLL"
0040C6E9   PUSH Dumped.004120F0                      UNICODE "KERNEL32.DLL"
0040C70A   PUSH Dumped.0041212C                      ASCII "FlsAlloc"
0040C712   PUSH Dumped.00412120                      ASCII "FlsGetValue"
0040C71F   PUSH Dumped.00412114                      ASCII "FlsSetValue"
0040C72C   PUSH Dumped.0041210C                      ASCII "FlsFree"
0040D7DD   PUSH Dumped.004129E8                      UNICODE "USER32.DLL"
0040D7F8   PUSH Dumped.004129DC                      ASCII "MessageBoxW"
0040D811   PUSH Dumped.004129CC                      ASCII "GetActiveWindow"
0040D821   PUSH Dumped.004129B8                      ASCII "GetLastActivePopup"
0040D831   PUSH Dumped.0041299C                      ASCII "GetUserObjectInformationW"
0040D84A   PUSH Dumped.00412984                      ASCII "GetProcessWindowStation"

0040FD27   MOV DWORD PTR SS:[EBP+8],Dumped.004147BC  ASCII "bad exception"



Comunicación con el sitio de C&C





PC Cifrada






Shell en sito comprometido donde se aloja el Ransomware.






Muestra: https://www.dropbox.com/s/t4x9i8xu3up8zw4/Locky-07-03-16.rar?dl=0


Eso es todo por el momento @Dkavalanche 2016


 Hola, me mudé a medium .... nos vemos!!! FELIZ 2022!!!