2012-11-18

La Messagerie Visuelle Vocale FreeMobile pour tous.

MISE À JOUR : Vous pouvez récuperer vos identifiants avec l'application net.cekage.vvmfreemobile  depuis le PlayStore  
 
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)
L'objectif de cet article est de documenter pour les développeurs d'applications mobiles pour Android <4, Symbian, Windows Mobile, Bada,... le fonctionnement de la MVV pour pouvoir l'utiliser sur leur système favori. Pour ma part, j'utilise souvent mon vieux Smartophonus Ginderbreadus et la MVV est un confort.

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é :
  • Espace Abonné FreeMobile
    puis
    Activer/Désactiver la MVV

  • 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.

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=11
Les 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.
À toutes fins utiles, ce SMS binaire est envoyé au port 5499.
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 PlayStore

Les 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.vvm
Vous 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.
Après avoir posté sur twitter la preuve de concept, un salarié de Free (mais pas FreeMobile) s'est gentiment proposé de faire remonter l'information et m'a demandé de ne pas donner de détails.

Conclusion

Pendant l'analyse du fonctionnement de l'application, j'ai eu le loisir de voir que l'implémentation OMTP réalisée par FreeMobile est loin d'être du bricolage. Il est fort probable que je vais pouvoir actualiser ce billet dans quelques jours et donner le modus operandi pour extraire le couple Identifiant / Mot de passe.

    Aucun commentaire: