mobisec

Catégorie: Mobile Difficulté: Moyen Flag: CTF{77cd55d22ef0d516a45ed0e238fbc5dbc4c93b0824047ea3e0a0509a5a9735ac}

Challenge

file-archive
1MB
circle-info

Description


Secure note-taking app.

You are given a wordlist. Furthermore rockyou.txt may be of use.

Note that the initial data on the server was stored differently, and decryption should take in consideration:

nonce, tag, ciphertext = encrypted_data[:16], encrypted_data[16:32], encrypted_data[32:]

Use pycryptodome and default key derivation hashing algorithm.

circle-exclamation

Solution

La première chose à faire est de décompiler l'apk. Dans sources/com/example/flagen on trouve les fichiers Java important.

Reverse de l'application

Dans NotesActivity.java on trouve la fonction qui sert à faire les requêtes HTTP, on voit qu'elle ajoute l'entête X-MOBISEC=ef75826d9de13292593aa57f82a7763d et un identifiant unique de type UUID à la fin de l'url

Une autre fonction intéressante est celle qui sert de hashage :

En cherchant les fichiers utilisant NotesActivity, on trouve sources\z0\a.java qui utilise la fonction de requêtes HTTP pour faire un GET sur l'endpoint /api/v1/acc/pass/.

Ce passage vérifie que le hash du password entré est le même que celui renvoyé par le serveur.

On a également une fonction intérressante dans le même fichier :

Ici on récupère un secret sur le serveur, on le décode en base64 puis on le passe dans la fonction z1.a.J() avec le mot de passe. Pour déchiffrer un secret on a donc visiblement besoin des mots de passe.

Regardons cette fonction :

On utilise PBKDF2 (une méthode pour dériver un secret) avec la fonction de hashage SHA256, le sel 0123456789abcdef et 100000 itérations. On génère un secret dérivé de 256 bits.

Ce secret dérivé est utilisé pour déchiffrer avec de l'AES en mode GCM. Le nonce du GCM est situé sur les 12 premiers octets du ciphertext, on a également le tag (qui sert de vérification) situé sur les 16 derniers octets. Le véritable ciphertext est situé entre les deux. En gros :


Récupération des comptes existants

On va tester les UUID présents dans wordlist.txt pour récupérer ceux qui possède un hash et un secret :


Cassage de mot de passe

3 comptes parmis les uuid dans wordlist.txt existes, il faut maintenant casser leur hash avec un bruteforce. Comme indiqué dans la description, on part sur rockyou.txt :


Récupération des secrets

Maintenant que l'on connaît les mots de passe, on peut déchiffrer les secrets ?

Eh bien non, il y a eu un GROS foirage dans le CTF et la façon dont sont stockés les secrets (et donc le flag) sur le serveur n'est pas la même que celle sur l'application.

Il faut utiliser PBKDF2 avec SHA1 (et pas SHA256) et ensuite, comme indiqué dans la description (changée 2 fois en 2j de CTF), le nonce, le tag et le ciphertext sont placé différemment.

A noter le "I'm using Arch btw" pour un challenge avec autant de bug, ça fait sourire

Mis à jour