L'application Android contient une méthode Password() qui génère un mot de passe pour se connecter à une base de données Firebase. Cette méthode n'est jamais appelée dans le flux normal de l'application.
L'objectif est de :
- Analyser l'APK avec Jadx (reverse statique)
- Forcer l'exécution de
Password()avec Frida (hooking dynamique) - S'authentifier sur Firebase avec le mot de passe obtenu
- Récupérer le flag depuis la Realtime Database
| Outil | Usage |
|---|---|
| Jadx-GUI | Décompilation de l'APK |
| Frida 17.9.1 | Hooking dynamique Java |
| ADB | Communication avec l'émulateur Android |
| Python + pyrebase4 | Authentification Firebase |
| Android Studio Emulator | Environnement d'exécution |
Vérification de tous les outils et de la connexion à l'émulateur :
adb version
adb devices
adb shell getprop ro.product.cpu.abi
adb shell pm list packages | Select-String "pwnsec"
frida-ps -URésultats obtenus :
- Émulateur
emulator-5554connecté ✅ - Architecture
x86✅ - Package
com.pwnsec.firestorminstallé ✅ - Frida-server actif,
Firestormvisible dans les processus ✅
Ouverture de l'APK dans Jadx-GUI pour décompiler le code Java.
Éléments importants trouvés :
Dans MainActivity, la méthode Password() est définie mais jamais appelée :
- Elle combine des chaînes statiques depuis
strings.xml - Elle appelle
generateRandomString()— une fonction native danslibfirestorm.so
Dans strings.xml on extrait :
- Email Firebase :
TK757567@pwnsec.xyz - API Key :
AIzaSyAXsK0qsx4RuLSA9C8IPSWd0eQ67HVHuJY - Database URL :
https://firestorm-9d3db-default-rtdb.firebaseio.com
Le script frida_firestorm.js utilise Java.choose pour trouver l'instance de MainActivity en mémoire et appeler manuellement Password() :
Java.perform(function() {
function getPassword() {
console.log("[*] Recherche d'instances de MainActivity...");
Java.choose('com.pwnsec.firestorm.MainActivity', {
onMatch: function(instance) {
console.log("[+] Instance trouvée : " + instance);
try {
var pass = instance.Password();
console.log("[+] Mot de passe : " + pass);
} catch (e) {
console.log("[-] Erreur : " + e);
}
},
onComplete: function() {
console.log("[*] Recherche terminée.");
}
});
}
setTimeout(getPassword, 3000);
});Lancement du script :
adb shell am force-stop com.pwnsec.firestorm
frida -U -f com.pwnsec.firestorm -l frida_firestorm.jsMot de passe obtenu : C7_dotpsC7t7f_._In_i.IdttpaofoaIIdIdnndIfC
⚠️ Ce mot de passe change à chaque lancement car il contient une partie générée dynamiquement par la fonction nativegenerateRandomString().
Le script get_flag.py s'authentifie sur Firebase avec les credentials obtenus, puis lit la Realtime Database :
import pyrebase
config = {
"apiKey": "AIzaSyAXsK0qsx4RuLSA9C8IPSWd0eQ67HVHuJY",
"authDomain": "firestorm-9d3db.firebaseapp.com",
"databaseURL": "https://firestorm-9d3db-default-rtdb.firebaseio.com",
"storageBucket": "firestorm-9d3db.appspot.com",
"projectId": "firestorm-9d3db"
}
firebase = pyrebase.initialize_app(config)
auth = firebase.auth()
email = "TK757567@pwnsec.xyz"
password = "C7_dotpsC7t7f_._In_i.IdttpaofoaIIdIdnndIfC"
user = auth.sign_in_with_email_and_password(email, password)
print("Connexion reussie. Token obtenu.")
db = firebase.database()
flag_data = db.get(user['idToken'])
print("FLAG recupere :")
print(flag_data.val())Installation de pyrebase :
pip install pyrebase4Exécution :
python get_flag.pyPWNSEC{C0ngr4ts_Th4t_w45_4N_345y_P4$$w0rd_t0_G3t!!!_0R_!5_!t???}
APK (FireStorm.apk)
│
├── Jadx ──→ strings.xml ──→ email + config Firebase
│
├── Jadx ──→ MainActivity.Password() ──→ méthode cachée identifiée
│
├── Frida ──→ Java.choose ──→ instance.Password() forcée
│ └──→ mot de passe dynamique obtenu
│
└── Python + pyrebase ──→ Firebase Auth ──→ Realtime Database ──→ FLAG 🏆
- Reverse Android avec Jadx — décompiler un APK et identifier des méthodes cachées
- Hooking dynamique avec Frida — forcer l'exécution de code mort non appelé normalement
Java.choose— parcourir la mémoire pour trouver des instances de classes Android- Firebase Auth — s'authentifier programmatiquement pour accéder à une base de données protégée
- Le mot de passe est dynamique — il faut lancer Frida et Python dans la foulée




