Piratage de WhatsApp, partie 2 - Analyse du protocole VOIP Whatsapp
Dans cet article, je veux vous dire comment j'ai craqué plusieurs parties du protocole VoIP WhatsApp à l'aide d'un appareil iOS jailbreaké et d'un ensemble de différents programmes d'analyse.
Récemment, Whatsapp a reçu beaucoup d'attention en raison des vulnérabilités et des opportunités pour les pirates.
De ce point de vue, il est très intéressant pour la recherche sur sa sécurité.
Tous ceux qui s'y intéressent également, bienvenue sous le chat.
Bien que les pages officielles de Whatsapp aient une description de son cryptage, en fait, il n'y a aucune information détaillée sur son fonctionnement et sa mise en œuvre dans le protocole.
Par conséquent, il n'y a aucune base pour des analyses de sécurité détaillées sur Whatsapp lui-même.
Ma recherche était basée sur trois choses:
1. Analyse du trafic réseau
2.
Analyse
binaire 3. Analyse du
comportement des applications dans différents modes
Boîte
à outils Pour analyser le client Wahtsapp pour iOS, j'ai utilisé les outils suivants:
- Descripteur binaire - bfdecrypt
- Désassembleur de fichiers binaires - Désassembleur de trémie et radare2
- Analyse du trafic réseau - Wireshark
- Analyse des actions applicatives - Frida
La configuration du jailbreak sur iOS dépasse le cadre de cet article.
Analyse du trafic réseau
Dans cette partie, nous analyserons le trafic réseau du client Whatsapp lors d'un appel, que nous enregistrerons à l'aide de Wireshark.
Pour enregistrer ce trafic, j'ai créé une interface réseau virtuelle distante.
La commande pour Makos ressemble à ceci:
rvictl -s Ici, l'UUID du périphérique doit être remplacé par l'UUID du périphérique avec le client watsap.
Wireshark détecte l'utilisation des utilitaires de traversée de session pour NAT (STUN).
STUN est un protocole de signalisation requis pour établir des connexions peer-to-peer entre les clients.
Ici, le client WhatsApp utilise des paquets TCP pour communiquer avec différents serveurs Watzap.
Dans le même temps, les paquets UDP sont utilisés pour l'échange entre les clients.
Des centaines de paquets UDP passent en une minute.
Vatsap utilise le protocole SRTP (Secure Real Time Protocol) et il est évident que ces paquets UDP contiennent des données SRTP sur l'appel.
Le protocole SRTP fournit le chiffrement, l'authentification et la protection contre les attaques de relecture sur le trafic RTP.
Examinons de plus près les paquets SRTP échangés entre les côtés A et B.
Pour ce faire, convertissez-les en hexadécimal:
On voit que les champs contiennent des en-têtes RTP spécifiques à SRTP.
Les quatre premiers octets (surlignés en rouge) sont les 7 champs d'en-tête RTP.
Examinons-les plus en détail:
0x8078001e = 0b10_0_0_0000_0_111100_00000000000011110 = V = 10 | P = 0 | X = 0 | CC = 0000 | M = 0 | PT = 111100 | SEQ = 00000000000011110
Les 2 premiers bits contiennent le numéro de version (V), dans notre cas c'est la deuxième version.
Le troisième bit est un champ d'informations optionnelles, dans notre cas il est vide.
Le quatrième bit - le champ d'extension (X) indique que dans ce cas, il n'y a pas d'autres en-têtes après l'en-tête de paquet RTP.
Bits 5 à 8 - Contient le nombre d'identificateurs CSRC suivant l'en-tête permanent.
CSRC (contribution source) est la source du flux de paquets RTP qui contribue au flux total généré par le mélangeur RTP. Le mélangeur insère une liste d'identificateurs SSRC qui identifient des sources partielles dans l'en-tête des paquets RTP. Cette liste est appelée une liste CSRC. Par exemple - une conférence audio où le mélangeur marque tous les orateurs dont la voix génère des paquets sortants. Cela permet au côté récepteur d'identifier le locuteur, bien que tous les paquets aient le même ID SSRC.
8 bits est un marqueur de bits (M). Utilisé au niveau de l'application et déterminé par le profil. Si ce champ est défini, les données du package ont une signification particulière pour l'application.
Les 6 bits suivants sont des codes de type de données supplémentaires. Ces données ne sont pas définies dans les normes RTP et SRTP. La signification de ces bits est probablement une signification personnalisée choisie par Whatsapp.
Les 17 derniers bits indiquent la source d'horloge. Le nombre est incrémenté dans l'ordre de 1 lors de l'envoi du prochain paquet de données RTP; ce code peut être utilisé par le récepteur pour enregistrer les pertes de paquets et restaurer le véritable ordre des fragments envoyés. Par la norme, la valeur initiale du code est aléatoire, mais cette recommandation n'est pas remplie par le watsap, car comme nous pouvons le voir à partir des données Wireshark, la valeur initiale du watsap est toujours 0.
Les 4 octets suivants (surlignés en bleu) sont l'horodatage du paquet.
4 octets ensuite (vert) - champ SSRC. Il identifie la source de synchronisation. Cet identifiant est choisi au hasard afin qu'il n'y ait pas deux codes SSRC égaux dans une session RTP. Toutes les applications doivent pouvoir détecter si les SSRC sont égaux. Si l'expéditeur change son adresse de transport, il doit également changer l'identifiant SSRC.
Nous avons donc découvert que Whatsapp utilise le protocole SRTP pour protéger les appels.
Ceci est confirmé par la structure des paquets UDP échangés entre les clients Watcap.
En outre, Watzap utilise le protocole TCP pour échanger des données entre le client et le serveur.
Ci - dessous , nous verrons comment le protocole canaux de bruit est utilisé pour chiffrer cette partie. Binary
analyse
Le client WhatsApp pour iOS contient 2 binaires principaux - le binaire d'application WhatsApp et le cadre de base de WhatsApp.
Dans cette partie, nous les examinerons de plus près avec le désassembleur de trémie et radare2.
Ces binaires sont chiffrés lorsqu'ils sont téléchargés depuis l'Appstore.
Ici, nous avons incité Apple à jailbreaker un appareil iOS et à accéder à ces fichiers.
Ajoutez également que ces binaires Whatsapp ont été déchiffrés avec bfdecrypt.
Ensuite, je vais vous montrer comment j'ai rassemblé des informations sur les principes de base du protocole, les algorithmes et les bibliothèques open source que Whatsapp utilise.
Les bibliothèques open source sont particulièrement intéressantes car elles peuvent être facilement analysées.
libsignal-protocole-c
Watsap utilise libsignal-protocol-c - une bibliothèque open source - qu'il a implémentée dans le protocole Signal.
Le protocole est basé sur l'algorithme Double Ratchet, qui crypte les messages watsap.
Cette bibliothèque a été trouvée dans les binaires Whatsapp pour les caractéristiques suivantes:
Watcap utilise également libsrtp pour implémenter son protocole Secure Real Time.
Les noms de symboles ont été supprimés des binaires Whatsapp, mais malgré cela, les binaires contiennent des lignes qui indiquent directement leur lien vers libsrtp:
0x100ee5883 hit1_4 .ck crypto Init libsrtp. créer un pool ..
0x100f07b80 hit1_5. paquet:% slibsrtpstat test% s: c.
De plus, les binaires watsap contiennent des chaînes qui sont utilisées dans le code brut de la libsrtp, par exemple «flux de clonage (SSRC: 0x% 08x)»:
r2 WhatsApp
[0x1013ddb4f]> / cloning stream La
recherche de 14 octets dans [0x100000000-0x100fb4000]
Watzap utilise également le protocole XMPP (Extensible Messaging and Presence Protocol) ouvert pour échanger des messages asynchrones entre les clients.
Cela a été découvert par les noms de classe dans le code watsap utilisé dans XMPP:
r2 WhatsApp
[0x1013ddb4f]> / XMPP
Recherche de 4 octets dans [0x1013ac000-0x1014b4000]
hits: 150
Recherche de 4 octets dans [0x100fb4000-0x1013ac000]
résultats: 150
Recherche de 4 octets dans [0x100000000-0x100fb4000]
Selon les rapports officiels, Watzap utilise le Noise Protocol Framework pour communiquer en toute sécurité entre les clients et les serveurs.
Le Noise Protocol Framework a été conçu pour créer des protocoles cryptographiques faciles à utiliser en utilisant un ensemble de blocs discrets.
Mais à proprement parler, Watzap n'utilise que le Noise Pipes Protocol, qui a été tiré du Noise Protocol Framework plus complet.
Ces lignes ont été trouvées dans les binaires Watzap:
«Noise_XX_25519_AESGCM_SHA256»,
• «Noise_IK_25519_AESGCM_SHA256»,
• «Noise_XXfallback_25519_AESGCM_SHA256».
Ces lignes contiennent les modèles de prise de contact implémentés dans les clients watsap.
La première ligne appartient à la classe WANoiseFullHandshake.
Le second est à WANoiseResumeHandshake et le dernier à WANoiseFallbackHandshak.
Nous n'examinerons pas en détail le fonctionnement de ce protocole dans le cadre de cet article.
Analyse d'exécution
Dans cette partie, nous explorerons le comportement du client watsap en utilisant Frida.
Frida est le soi-disant Dinamic Instrumentation Toolkit, qui est un ensemble d'outils qui vous permet d'injecter votre propre code dans d'autres applications à la volée.
Nous nous connecterons à un processus dans l'application et modifierons son comportement à l'aide d'une console JS interactive.
Key Transport
Dans cette partie, nous explorerons les mécanismes clés du travail du protocole watcap.
Selon la description officielle de Whatsapp décrivant le cryptage d'un appel VOIP - l'initiateur de l'appel génère un secret maître SRTP aléatoire de 32 octets.
Ensuite, le message chiffré est transmis au côté B avec le contenu de ce secret principal SRTP.
Ces informations sont ensuite utilisées pour la reconstruction du côté B.
J'ai d'abord fait une trace en utilisant le mot «secret»:
J'ai réussi à faire une fausse notification à propos d'un appel manqué de A à B, bien que l'appel ait été en fait initié par Mallory ...
Cela est devenu possible après la réécriture du créateur d'appel et des paramètres du JID du côté A.
Bien que le nom Mallory soit affiché dans la notification.
Lorsque la partie B commence à répondre à un tel message, la partie A est appelée à la place de Mallory.
Ce comportement sera plus intéressant à analyser plus tard.
Résumons les résultats intermédiaires - dans vatsap, le secret principal chiffré est emballé dans un message de signal, qui est ajouté aux chaînes XMPP.
Les chaînes XMPP contiennent également l'ID et le JID des deux côtés.
Transfert du secret principal à l'autre partie
Selon la description officielle des clients Watsup, utilisez le protocole Noise Pipes avec Curve25519, AESGCM et SHA256 à partir du Noise Protocol Framework.
Si vous utilisez un traçage contenant des mots-clés liés à Noise Protocol Framework, vous pouvez voir que la classe WANoiseStreamCipher est utilisée pour crypter les appels aux serveurs Vatsap.
La classe utilise la méthode encryptPlaintext.
Une fois l'appel lancé, la valeur en texte brut est le message XMPP décrit ci-dessus.
Le message est ensuite à nouveau chiffré à l'aide de la bibliothèque mbed TLS mbedtls_gcm_crypt_and_tag.
mbedtls_gcm_setkey a une taille de 256 bits, ce qui signifie que AES-256-GCM est utilisé.
La clé de chiffrement est utilisée à partir du protocole Noise Pipes, qui n'est pas traité dans cet article.
Le texte en clair chiffré passe ensuite par TCP vers le serveur watsap (cela peut être vu avec Wireshark).
Le serveur transmettra ensuite ce message à l'appelé pour initier l'appel.
Key Shaping
Dans cette partie, nous verrons comment fonctionne la Key Shaping Function (KDF) /
Les résultats ont été obtenus en utilisant Frida tout en traçant la classe WAHKDF et la bibliothèque libcommonCrypto.
La classe WAHKDF a été utilisée pour extraire les clés, le sel et les codes à usage unique lors de l'initialisation des flux SRTP.
La méthode deriveSecretsFromInputKeyMaterial est appelée 10 fois avant le début de l'appel:
De plus, les développeurs doivent également supprimer les constantes de chaîne qui contiennent des informations critiques ou peuvent être utiles pour identifier les fonctionnalités.