Fin Octobre 2012, FreeMobile a proposé pour ses clients Android la Messagerie Visuelle Vocale (MVV) en téléchargement gratuit sur le PlayStore mais l'a réservée aux dernières générations de téléphones Android et Apple. Cette limite est d'autant plus étonnante que FreeMobile propose encore des terminaux en 2.3 :
![]() |
Le Galaxy Y en 2.3 (GingerBread) |
Comme à mon habitude, je privilégie l'approche candide pour deviner le protocole. Une fois que je sais reproduire les fonctions ciblées je vérifie avec la documentation si elle est disponible.
Prérequis universels.
Pour accéder à la MVV quelques conditions préalables sont nécessaires :- La MVV doit être activée dans l'espace abonné :
- Les requêtes à destination de la MVV doivent impérativement se faire depuis une connexion FreeMobile. Le client doit s'assurer (route ip ?) que "vvm.proxad.net" passe par la bonne interface réseau.
- Le système doit pouvoir envoyer des SMS en binaire.
- Le système doit savoir gérer les fichiers audio au format amr.
![]() |
Espace Abonné FreeMobile |
puis
![]() |
Activer/Désactiver la MVV |
Fonctionnement
Être prévenu d'un nouveau message:
L'information d'un nouveau message est un SMS binaire envoyé depuis le numéro 2051//VVM:SYNC:ev=NM;id=3;c=2;t=v;s=+33123456789;dt=21/02/2012 20:12 +0100;l=11Les informations intéressantes sont:
- l'index du message à récupérer dans le champ id,
- le numéro de l’appelant dans le champ s,
- la date du message dans le champ dt
- la longueur en seconde du message dans le champ l.
Préambule IMAP
Dans tout ce qui va suivre vous trouverez les instructions du client au serveur et les réponses du serveur au client (visuel emprunté à WireShark).* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Free VVM IMAP. 1 CAPABILITY * CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN 1 OK Pre-login capabilities listed, post-login capabilities have more. 2 ID ("name" "fr.freemobile.android.vvm" "os" "android" "os-version" "4.3.0; JZO87L" "vendor" "Samsung" "x-android-device-model" "Galaxy Nexus" "x-android-mobile-net-operator" "Free" "AGUID" "zsbZs90F6zwemMegCHCrwlucHHS=") * ID NIL 2 OK ID completed.Techniquement, c'est ici que vous pouvez envoyer un petit coucou aux développeurs de Free. Ils apprécieront sûrement la diversité des systèmes d'exploitation ou un x-android-mobile-net-operator de chez Mandarine ou de Béton Télécom.
La commande id est optionnelle. N'importe quel client IMAP se connecte sans difficultés :
![]() |
EarlyBird (Thunderbird) |
![]() |
Le client Mail natif Android |
Récupérer le contenu d'un message (IMAP)
6 UID FETCH 3 (UID BODY.PEEK[]) * 1 FETCH (UID 3 BODY[] {16**4} From: +336********@vvm.free-mobile.fr To: +336********@vvm.free-mobile.fr Date: Sun, 14 Oct 2012 1*:3*:2* +0200 MIME-version: 1.0 (Voice Version 2.0) Content-Duration: 20 Message-Context: voice-message Message-ID: <14 data-blogger-escaped-vvm.free-mobile.fr="vvm.free-mobile.fr"> Content-type: multipart/mixed; boundary="part" --part Content-Transfer-Encoding: base64 Content-Type: audio/3gpp Content-Duration: 20 Content-Disposition: attachment; filename="vvm.amr" ***KBD**HxU7aLbh4WAK7***PPL1W5SW3YnWGlYEHM***Cj7u48cArP+BDQ2C8M***fWDrBs ngSSFoj3JugU4ylRoegEMyXJtR3sR9QE***YBFiY5zY***oSnYhSWMkQyUfua4H*JRK5rwfHx8 (...) BcAEWnP3PyN0KzqWAA8***8wpNgfHw***EZFowc8l/O5zjk**8wpNgfHxEIzzCk3B8fHx8fHx8 BGAKNfLrQmwzCP+9Gg== --part-- ) 6 OK Fetch completed.
Récupérer la liste des messages existants (protocole IMAP):
4 SELECT "INBOX" * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 4 EXISTS * 0 RECENT * OK [UIDVALIDITY 1] UIDs valid * OK [UIDNEXT 20] Predicted next UID * OK [HIGHESTMODSEQ 19] Highest 4 OK [READ-WRITE] Select completed. 5 UID SEARCH 1:* NOT DELETED * SEARCH 3 5 19 5 OK Search completed (0.000 secs).Il suffit d'itérer les valeurs données par le serveur :
6 UID FETCH 3 (UID FLAGS INTERNALDATE RFC822.SIZE BODY.PEEK[HEADER.FIELDS (date subject from content-type content-duration to cc message-id)] BODYSTRUCTURE) * 1 FETCH (UID 3 FLAGS (\Seen) INTERNALDATE "14-Oct-2012 1*:3*:2* +0200" RFC822.SIZE 160** BODY[HEADER.FIELDS (DATE SUBJECT FROM CONTENT-TYPE CONTENT-DURATION TO CC MESSAGE-ID)] {231} From: +336********@vvm.free-mobile.fr To: +336********@vvm.free-mobile.fr Date: Sun, 14 Oct 2012 1*:3*:2* +0200 Content-Duration: 20 Message-ID: <143**76** data-blogger-escaped-vvm.free-mobile.fr="vvm.free-mobile.fr"> Content-type: multipart/mixed; boundary="part" BODYSTRUCTURE (("audio" "3gpp" NIL NIL NIL "base64" 1**44 NIL ("attachment" ("filename" "vvm.amr")) NIL NIL) "mixed" ("boundary" "part") NIL NIL NIL)) 6 OK Fetch completed.puis 5 :
7 UID FETCH 5 (...) * 3 FETCH (UID 5 FLAGS (\Seen) INTERNALDATE "25-Oct-2012 2*:4*:1* +0200" RFC822.SIZE 12896 BODY[HEADER.FIELDS (DATE SUBJECT FROM CONTENT-TYPE CONTENT-DURATION TO CC MESSAGE-ID)] {231} From (...) (...)
Effacer un message (protocole IMAP):
5 UID STORE 23 +FLAGS.SILENT (\DELETED) 5 OK Store completed.
Définir une annonce d’accueil (protocole IMAP) :
5 APPEND "Greetings" () {20447} + OK Message-ID:From: 10**** <-- le LOGIN MVV ! X-CNS-Greeting-Type: normal-greeting Subject: uploaded greeting at 135********4 To: 10**** <-- le LOGIN MVV ! Content-Type: multipart/mixed; boundary="----V52U96BXR*************" MIME-Version: 1.0 ------ V52U96BXR************* Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 Rn**********3JlZXRpbmcu ------V52U96B*****************8GV842QGPV [612 bytes missing in capture file]DHVybCAAAAABAAAAsXN0YmwAAABFc3Rz ZAAAAAAAAAABAAAANXNhbXIAAAAAAAAAAQAAAAAAAAAAAAEAEAAAAAAfQAAAAAAAEWRhbXIgICAA (...) Zm1OwcIQukCBHwA8IH95hM4MC+H3jXdGLZbHSDEHvaotStMxQg40+aMzcDxCaV2CTxoAoelnWKPR +Y0yCumVL2/O12NbEt0hSwSA ------V52U96B*****************8GV842QGPV * 1 EXISTS 5 OK Append completed. 6 UID SEARCH (HEADER MESSAGE-ID) * SEARCH 27 6 OK Search completed (0.180 secs).
Effacer une annonce d’accueil (protocole IMAP):
4 SELECT "Greetings" * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 1 EXISTS * 0 RECENT * OK [UNSEEN 1] First unseen. * OK [UIDVALIDITY 1] UIDs valid * OK [UIDNEXT 19] Predicted next UID * OK [NOMODSEQ] No permanent modsequences 4 OK [READ-WRITE] Select completed. 5 UID SEARCH 1:* NOT DELETED * SEARCH 18 5 OK Search completed (0.000 secs). 6 UID STORE 18 +FLAGS.SILENT (\DELETED) 6 OK Store completed.
Identifiant, Mot de Passe, Serveur et Port ?
MISE À JOUR : Vous pouvez récuperer vos identifiants avec l'application net.cekage.vvmfreemobile depuis le PlayStoreLes identifiants sont stockés en clair dans l'espace protégé de l'application.
Si vous êtes root:
$ adb shell sqlite3 /data/data/fr.freemobile.android.vvm/databases/omtpsource.db .dump
Si vous n'êtes pas root :
$ adb backup -f vvm.ab fr.freemobile.android.vvmVous pouvez extraire le fichier omtpsource.db avec un outil du genre android-backup-extractor
Les limites de deux méthodes précédentes sont évidentes :
- Avoir un téléphone Android 4+
- Télécharger l'application officielle sur le Play Store et l’avoir exécutée une fois
- Être root ou avoir les outils de débogage sur sa machine (ADB).
Méthode alternative.
Il est relativement (trop ?) facile d'extraire les informations des serveurs de FreeMobile.J'ai essayé de contacter Free pour m'assurer que cette partie était aussi sécurisée que le reste et que je pouvais communiquer publiquement. En vain.
Encore aujourd'hui, Free ne propose aucun mail ou formulaire pour discuter d'un éventuel problème de sécurité. Le compte twitter dédié ne sert visiblement qu'à retweeter ce qui sert l’intérêt du community manager.
![]() |
la PoC sur ma ligne. |
Aucun commentaire:
Enregistrer un commentaire