Insecure Data Storage

DEMO

Insecure data storage ocurre cuando la aplicación guarda información sensible, como pueden ser user credentials, passwords, API keys etc.. de manera insegura. Normalmente las aplicaciones móviles usan una  base de datosSQLIte.

En Android las aplicaciones guardan su base de datos en el directorio:
/data/data/com.app.exampleApp/database/, cualquiera que tenga acceso root accederia sin problemas.

Para empezar con este reto, primero convendría sabernos manejar con la consola de comandos de adb (android debug bridge), ya que nos facilitará mucho la existencia.

Este reto lo realizaremos de dos maneras, una accediendo en modo debug y la otra mucho más clara conectando por adb. Empezamos accediendo desde el modo debug de inicio de la VM Android.

Primero, entramos en modo debug, escapamos a shell con exit y nos dirigimos al directorio de la aplicación:

En la tabla Members sacamos el pass que nos piden:

AdminBattery777
User: Admin
Password: Battery777

Esta manera de realizarlo es un poco engorroso, ya que la shell a veces se queda parada o imprime los carácteres por pantalla de manera defectuosa, por lo tanto ahora lo haremos mediante adb.

En primer lugar, localizamos nuestra máquina virtual, y conectamos a ella mediante:
adb connect 192.168.1.44

Una vez hemos conectado, abrimos shell para empezar a interactuar con el dispositivo android:
adb shell

Muy importante comprobar con que usuario estamos logueados.. En este caso vemos que estamos logueados como shell que será un usuario con pocos privilegios, por lo tanto escalamos con el comando su:
su root

Una vez como root navegamos hasta el directorio donde estan almacenadas las claves y con el comando cat las imprimimos por pantalla.

A continuación,  les dejo un video con toda la secuencia de comandos :D, espero que les guste, nos vemos en el próximo reto!

LEVEL 1

The App for this challenge stores user credentials within a database, the data has not been stored in plain text but it also has not been encrypted. Make the credentials readable to get the key. The key is the Admin’s password.

Aquí nos dice que el user y el pass no están encriptados, como observaremos luego están en Base64, que es un sistema de numeración posicional que usa 64 como base.

Nos dirigimos a la carpeta del reto:

shell@x86:/data/data/com.mobshep.insecuredata1 # ls
cache
databases
lib

shell@x86:/data/data/com.mobshep.insecuredata1 # cd databases/
shell@x86:/data/data/com.mobshep.insecuredata1/databases # ls
Users
Users-journal

Imprimimos por pantalla la tabla Users:

shell@x86:/data/data/com.mobshep.insecuredata1/databases # cat Users
SQLite format 3

C�Cb�#tableUsersUsersCREATE TABLE Users (id integer primary key, name VARCHAR, password VAM����sM$ERootV2Fyc2hpcHNBbmRXcmVuY2hlcw==ottlescGFzc3dvcmQxMjM0atrickZGlub3NhdXI=%TroolMannQnJpZGdlcw==!-ToothBrushMmNvb2w0dWxvbD8=�-TyrkyrZG9jaGRvY2hkb2No

Vamos sacando en texto legible todos los passwords:

sM$ERootV2Fyc2hpcHNBbmRXcmVuY2hlcw==ottlescGFzc3dvcmQxMjM0atrickZGlub3NhdXI=%TroolMannQnJpZGdlcw==!-ToothBrushMmNvb2w0dWxvbD8=�-TyrkyrZG9jaGRvY2hkb2No

root:V2Fyc2hpcHNBbmRXcmVuY2hlcw== → WarshipsAndWrenches
ottles:cGFzc3dvcmQxMjM0atrickZGlub3NhdXI=→ password1234jrFF6W
ToothBrush:MmNvb2w0dWxvbD8= → 2cool4ulol?

LEVEL 2

The App for this challenge, InsecureData2 uses a hashing algorithm on stored user credentials. However, there are two issues here, firstly the user is using a bad password. Secondly, the App does not use a salt when hashing the data.

Vamos a la carpeta donde está almacenado el password:

shell@x86:/data/data/com.mobshep.insecuredata2 # ls
cache
databases
lib

shell@x86:/data/data/com.mobshep.insecuredata2 # cd databases
shell@x86:/data/data/com.mobshep.insecuredata2/databases # ls
passwordDB
passwordDB-journal

shell@x86:/data/data/com.mobshep.insecuredata2/databases#cat passwordDB

tablepasswordDBpasswordDBCREATE TABLE passwordDB (id integer primary key, name VARCHAR, password VARCHAR)W–ctableandroid_metadataandroid_metadataCREATE TABLE android_metad)MAdmin0e3a0c8c3a571a855c958813d9b851a1

Admin0e3a0c8c3a571a855c958813d9b851a1

Nos dirigimos a la siguiente dirección, para ver si podemos crackear el password:

https://crackstation.net/

Obtenemos el password starfish123.

LEVEL 3

Not all Apps will use sqlite to store user data, in some cases SharedPreferences is used. The key to this level can be gained once you log in as a legitimate user.

Nos dirigimos a la carpeta del reto:

shell@x86:/data/data/com.mobshep.insecuredata3 # ls
cache
lib
shared_prefs

Observamos la carpeta que nos indican en el enunciado SharedPreferences:

shell@x86:/data/data/com.mobshep.insecuredata3/shared_prefs # ls
AppData.xml
Saved Data.xml

Vemos el xml SavedData.xml, con el comando cat lo imprimimos por pantalla y obtenemos el password del user:

shell@x86:/data/data/com.mobshep.insecuredata3/shared_prefs # cat Saved Data.xml
<?xml version=’1.0′ encoding=’utf-8′ standalone=’yes’ ?>
<map>
<string name=»Username»>Tony</string>
<string name=»Password»>qazwsx4562</string>
</map>

Nos dirigimos a la app de la máquina virtual del dispositivo Android, abrimos la app Insecure data Storage 3 y en el login metemos el user & el pass del XML.