{WhatsApp} – Petit « Hack » qui permet d’exploiter les fonctions de l’application

 

Coucou à tous,

 

Cela fait 1 an et demi que ma frangine vit aux States ... et pour tout vous avouez je n'ai pas réussi à lui faire abandonner son outil de communication "WhatsApp" !
J'ai donc dû me résoudre à "essayer" cette application appartenant à Facebook ...
Comme je vous le dis souvent, mes articles viennent souvent de mes expériences personnelles ... ainsi donc, en communiquant au travers de "WhatsApp" avec ma petite soeur, j'ai été tenté de voir ce qu'on pouvait en tirer !

Respect de la vie privée & WhatsApp

Un truc qui me gêne avec cette application c'est que vous pouvez ajouter à votre annuaire, n'importe quel numéro de mobile que vous aurez inventé, et vous aurez environ 7 chances sur 10 d'avoir un vrai compte WhatsApp associé à ce numéro ... soit  une photo de profil, une disponibilité, et un statut !!!

La plupart des gens laissent les paramètres par défaut ... il est possible de masquer votre photo de profil, statut & dispo aux personnes qui ne vous ont pas dans leurs annuaires dans vos paramètres.

Ça peut paraître bête ... mais s'il y avait un moyen d'automatiser la récupération de ces informations ... ça pourrait très rapidement devenir un Tinder :D

Analyse de l'application WhatsApp

J'ai d'abord regardé s'il existait une API pour les développeurs, un truc gratos de préférence.
Mais je n'ai trouvé que des projets abandonnés ou instables à droite à gauche, et une API "Business" que je n'ai pas essayé (si certains l'ont fait, je vous invite à partager votre expérience en commentaire)

Je me suis donc mis à éplucher un peu cette application :

Sur la partie "mobile", je n'ai pas vraiment réussi à récupérer d'informations utiles ...
Mais saviez-vous qu'il était possible d'utiliser la version Web (à condition d'avoir connecté votre application mobile à celle-ci)
Et c'est clairement plus facile de voir le fonctionnement sur la version  Web que sur l'application.

Tout se passe via un WebSocket !
Mais qu'est-ce que c'est ?!?

Pour faire simple, ceux qui ont l'habitude de regarder dans l'onglet network de la console développeur du navigateur (touche F12 de votre clavier), vous voyez souvent des requêtes simples GET ou POST
votre navigateur fait une demande et reçoit une réponse du serveur, et la discussion s'arrête.

Un WebSocket c'est  un peu le même principe, sauf qu'il peut y avoir un nombre indéfini de demande et de réponse (c'est le développeur qui gère), avant que la discussion ne s'arrête.

Si vous accédez à l'application Web de WhatsApp, que vous ouvrez la console développeur avec la touche F12 et que vous vous rendez dans l'onglet Network, vous pourrez apercevoir un "WebSocket"

Vous trouverez le socket dans la colonne "name" sous le nom de ws.
Ensuite vous pourrez voir ce qui se passe en "background" dans l'onglet "Frame".
Si vous êtes un peu curieux est néophyte, je vous invite à garder cette console ouverte, et à faire des actions, comme ouvrir une discussion, ajouter des contacts dans un groupe, charger des photos, etc ...

Par exemple, lorsque WhatsApp cherche à afficher le statut d'une personne, vous devriez voir apparaître ceci :

["query","Status","<numéro de téléphone>@c.us"]

Bien entendu, <numéro de téléphone> est à remplacer par le numéro de la personne dont on souhaite voir le statut.

Lorsque WhatsApp cherche à afficher la photo de profil d'un numéro de téléphone, ça sera plutôt

["query","ProfilePicThumb","<numéro de téléphone>@c.us"]

Enfin, lorsque WhatsApp voudra afficher la disponibilité d'un numéro de téléphone (actif, inactif, ...) ça sera :

["action","presence","subscribe","<numéro de téléphone>@c.us"]

Bref, si certains veulent recenser ici toutes les actions possibles, vous pouvez le faire en commentaire, ça sera super cool pour toute la communauté "Dyrkienne"

 

Le "Hack" du fonctionnement de WhatsApp

Maintenant que nous savons comment WhatsApp récupère et / ou exécute certaines actions, vous vous demandez certainement, comment faire pour envoyer vos propres "instructions".

Eh bien, je n'ai pas vraiment ré-inventé la roue ...
Comme vous avez pu le lire dans certains de mes articles, sur des sujets  liés à la copie de vidéo ou d'audio sur des plateformes comme Deezer, Youtube, etc ... j'ai utilisé encore une fois les prototypes  Javascript.

J'ai surchargé la méthode "send" des "WebSockets" en Javascript, pour pouvoir récupérer l'objet en question.

WebSocket.prototype.send = ma_Fonction_De_Vilain_Pirate

Ainsi, lorsque WhatsApp envoie un message ... hop, il rentre dans ma méthode (fonction).
Une fois dans ma fonction je copie la référence (le lien vers le socket de WhatsApp), et je peux l'utiliser à ma guise.

 

Le Script

Pour les personnes qui souhaiteraient s'amuser un peu, j'ai créé ces quelques lignes de code qui vous permettront de faire quelques expériences

/*
*
* WhatsApp.js - Hack Api
* (c) Dyrk.org : 2018 - 2019
*
* Required : You need to be on the "Web WhatsApp"'s Page
*
* Get Status :
* SocketHack.send(["query","Status","<phone number>@c.us"])
*
* Get Picture :
* SocketHack.send(["query","ProfilePicThumb","<phone number>@c.us"])
*
* Get state : away / available
* SocketHack.send(["action","presence","subscribe","<phone number>@c.us"])
*
*/

SocketHack = {
socket : null,
send:function(e){ SocketHack.socket.send('6666.--10, '+JSON.stringify(e)); },
onReceive:function(e){
/* function where you receive data */
},
onReady:function(){
/* Put here your main Code */
}
};
WebSocket.prototype.send2 = WebSocket.prototype.send;
WebSocket.prototype.send = function(e){
if (!SocketHack.socket) {
SocketHack.socket= this;
this.addEventListener('message', function(e){
if (/6666|^s[1-9]{1},/.exec(e.data))
SocketHack.onReceive(JSON.parse(e.data.replace('6666.--10,','').replace(/^s[1-9]{1},/,'')));
});
console.log("SocketHack : Ready");
SocketHack.onReady();
}
this.send2(e);
}

Si vous vous posez la question de ce qu'est le "'6666.--10,'" :
WhatsApp utilise cette syntaxe avant chaque message qu'il envoie ou reçoit.
C'est un "identifiant" afin de pouvoir établir une correspondance entre les messages

 - Bonjour, je suis la requête 123, je souhaiterais récupérer la photo de profile du 065254....


- Ici le serveur, réponse à la requête 456, le statut de l'utilisateur est "Bob Marley c'est mwa !"


- Ici le serveur, réponse à la requête 123, la photo est la suivante : https://www.whatsapp....

- Bonjour je suis la requête 789, je souhaiterais savoir si le 074521... est disponible

J'ai mis "'6666.--10,'" pour identifier les réponses que vous recevrez aux requêtes que vous feriez avec mon script, mais après vous pouvez l'adapter à votre guise.

 

Petit exemple à la Tinder 

Dans le paragraphe d'avant, je vous partage un script "neutre" que vous pourrez customiser pour y mettre ce que vous voulez.
Ici je vous propose un exemple concret, où j'affiche sur la page de WhatsApp les photos de profil de tous les numéros de téléphone compris entre 0658100000 et 0658999999

 



/*
* WhatsApp become Tinder 2.0
* (c) 2018-2019 - Dyrk.org
*/


SocketHack = {
socket : null,
send :function(id, e){ SocketHack.socket.send(id+JSON.stringify(e)); },
phoneBook : null,
onReceive :function(e){
/*
* Example to display Picture
*
*/
console.log('got',e)
var raw = /([0-9]{10,14})\.\-\-10\,/.exec(e),
item = document.createElement('div'),
nbphone = document.createElement('div');
item.appendChild(nbphone);
e = JSON.parse(e.replace(/([0-9]{10,14})\.\-\-10\,/,''));
if (!raw || !e.eurl) return -1;
nbphone.textContent = '+'+raw[1];
nbphone.setAttribute('style','font-size:24px;font-weight:bold;background:#000;color:#FFF;position:absolute;bottom:0px;')
item.setAttribute('style','position:relative;width:150px;height:250px;border:1px solid black;'+
'float:left;display:inline-block;background:url("'+e.eurl+'");background-size:100% 100%');
SocketHack.phoneBook.appendChild(item)
},
onReady :function(){
/*
* Example to get Picture from random phone
*
*/
var i = 100000;
SocketHack.phoneBook = document.createElement('div');
SocketHack.phoneBook.setAttribute('style','position:fixed;top:0px;left:0px;z-index:9999;width:98%;height:100%;overflow:auto;');
document.getElementsByTagName('html')[0].appendChild(SocketHack.phoneBook);
while (i++ < 999999){
phoneNumber = "33658"+i;
setTimeout((function(request, phoneNumber) {
SocketHack.send(phoneNumber+'.--10, ',request);
}).bind(null, ["query","ProfilePicThumb",phoneNumber+"@c.us"], phoneNumber), 150)
}
}
};
WebSocket.prototype.send2 = WebSocket.prototype.send;
WebSocket.prototype.send = function(e){
if (!SocketHack.socket) {
SocketHack.socket= this;
this.addEventListener('message', function(e){ if (/([0-9]{10,14})\.\-\-10\,/.exec(e.data)) SocketHack.onReceive(e.data); });
console.log("SocketHack : Ready");
SocketHack.onReady();
}
this.send2(e);
}

 

Peut-être y a t-il des célébrités ;)

Un usage "professionnel" ?

Cette petite "API" officieuse, vous permettra surement de vous amuser quelques minutes.
Elle est cependant limitée à être utilisé depuis la page web de WhatsApp !
Il est en revanche, tout à fait possible pour vous de créer un serveur local qui recevrait les informations et pourrait envoyer des instructions :

Conclusion

Ce "Hack" n'a rien d'exceptionnel, j'espère néanmoins qu'il pourra vous plaire, et que vous serez créatif dans l'usage que vous en ferez.
N’hésitez pas à partager cela en commentaire.
Je vous invite en revanche, à ne pas en faire un usage malveillant, il s'agit ici d'un simple divertissement, que vous pourrez utiliser à des fins "d'expérimentations"

 

18 comments

  • Pingback: {WhatsApp} – Petit « Hack » qui permet d’exploiter les fonctions de l’application – SVNET Libre

  • Pingback: {WhatsApp} – Petit « Hack » qui permet d’exploiter les fonctions de l’application - My Tiny Tools

  • Ça impressionne quand tu vois les centaines de photos de profil (avec les nums) apparaître sur ton écran, bel article

    Cela peut bien sur aussi servir comme technique d’OSINT et pour les vicieux de doxxing, donc veillez bien à protéger votre compte, on ne sait jamais.

  • Je n’ai pas d’onglet frame après web sockets ni sur firefox ni sur chrome, j’ai raté qqchose? j’ai du mal à comprendre ou tu utiliser tes scripts.

    Sinon super article!

    • Sur chrome:

      Pense à bien activer l’option « Preserve log », puis rafraîchis la page https://web.whatsapp.com/ , et suis les étapes de cette image :

      https://vgy.me/1CNakl.png

       

      Par contre le script lui s’utilise dans l’onglet « Console », l’onglet « Network » avec les frames c’est juste pour voir les communications de whatsapp, pour comprendre comment ils fonctionnent.

       

       

       

       

      • ;) ça fait plaisir lorsque mes fidèles Dyrknautes prennent le temps de s’entraider ahah !

        Merci à toi BarbossHack pour l’aide que tu apportes et aussi pour tout tes commentaires encourageants !!!

        Je t’avoue qu’avec la R&D qu’il y a « derrière » l’écriture de mes articles, pour trouver des sujets intéressants, je ne prends parfois pas le temps qu’il faudrait
        pour répondre aux commentaires ^^

      • Merci pour ta réponse

        Après qq testes j’ai fini par réussir :D

  • Très beau boulot, comme à dit BarbossHack, « Ça impressionne quand tu vois les centaines de photos de profil

  • Superbe boulot !

    Est-ce que l’application web de What’s app qui bloque le nombre d’affichage ? ( je sais pas si vous avez remarqué mais, chez moi il affiche env. les 1000 premières personnes qu’ils trouvent, continue sa recherche mais, ne les affiches plus)

    Y a t’il un moyen d’enregistrer ça dans un fichier HTML directement pour pallier a ce problème ?

     

  • c’est juste…. impressionnant en effet…

  • Merci pour cet exemple, c’est assez fou comme démonstration.

  • Bien joué pour cette trouvaille.

    Pour ceux qui pensent aller plus loin, avec un rapide calcul on arrive à 1 073 741 824 possibilités pour les numéros en 06 XX XX XX XX

    En prenant la liste des préfixes (datant de 2012) sur Wikipédia (https://fr.wikipedia.org/wiki/Liste_des_pr%C3%A9fixes_des_op%C3%A9rateurs_de_t%C3%A9l%C3%A9phonie_mobile_en_France) je suis arrivé aux nombres plus raisonnables de

    87 449 823 combinaisons pour les 06
    25 219 836 combinaisons pour les 07

    Pour un total de 112 669 659 combinaisons avec un timeout de 150 ms ça nous fait donc un temps de 195 jours d’envoi de requête (et ce temps prend pas même en compte le temps des réponses).

    Si l’envie vous prenait de scanner tous les 06 avec ses 1 073 741 824 combinaisons et un timeout de 150ms ça fait respectivement 1864 jours passés pour envoyer toutes vos requêtes.

    Donc pour ce constituer une base de donnée exhaustive on oublie, mais ça n’enlève rien à la beauté de la « faille »

  • Bonjour j’ai testé votre script et il n’est pas mal du tout. J’aurai une question est-il possible d’envoyer un message en masse à différents numéros ?

  • Bonjour,

    Merci pour ce code très interssant malheureusement j’y arrive pas avec SocketHack.send([« action », »presence », »subscribe », »<phone number>@c.us »])

    Pouvez-vous m’aider ? Par avance, merci

  • Bonjour BarbossHack  et merci pour ta page inspirante

    J’ai voulu adapter le scripte pour mon besoin qui est de vérifier la présence d’un contact sur une durée déterminée (au début je voulais 12h mais mes tests sur 3 min ne sont pas concluants…)

    Voici les problèmes que je rencontre:

    j’ai l’impression qu’avec mon code, j’ouvre une multitude de ws qui n’était pas le but original
    toutes les ws créées sont vides – normal car socket = Null est toujours vrai
    je n’arrive pas à me dépétrer dans les Identifiants de transactions…

    Voici mon code (je suis toute nouvelle en Javascript!)

    Merci et à bientôt!

    Laetitia

    /*
    *
    * WhatsApp.js – Hack Api
    * (c) Dyrk.org : 2018 – 2019
    *
    * Required : You need to be on the « Web WhatsApp »‘s Page
    *
    * Get Status :
    * SocketHack.send([« query », »Status », »<phone number>@c.us »])
    *
    * Get Picture :
    * SocketHack.send([« query », »ProfilePicThumb », »<phone number>@c.us »])
    *
    * Get state : away / available
    * SocketHack.send([« action », »presence », »subscribe », »<phone number>@c.us »])
    *
    */
    var dDate = new Date();
    var dNeoDate = new Date(dDate);
    var i = 0

    SocketHack = {
    socket : null,
    send:function(id,e){ SocketHack.socket.send(id+JSON.stringify(e)); },
    onReceive:function(e){
    console.log(« test onReceive »)
    },
    onReady:function(){
    SocketHack.send([« action », »presence », »subscribe », »<je cache volontairement le numéro à suivre>@c.us »])
    }
    };

    dNeoDate.setSeconds(dNeoDate.getSeconds()+180);
    console.log(dNeoDate)

    do {
    i += 1;
    console.log(i)

    WebSocket.prototype.send2 = WebSocket.prototype.send;
    WebSocket.prototype.send = function(id,e){
    if (!SocketHack.socket) {
    SocketHack.socket= this;
    this.addEventListener(‘message’, function(id,e){
    if (/([0-9]{10,14})\.\-\-10\,/.exec(e.data))
    SocketHack.onReceive(e);
    });
    console.log(« SocketHack : Ready »);
    SocketHack.onReady();
    }
    this.send2(e);
    }

    dDate.setSeconds(dDate.getSeconds()+4)

    } while (dDate.getMinutes()< dNeoDate.getMinutes());

Répondre à LittleBuddha Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site est protégé par reCAPTCHA et le GooglePolitique de confidentialité etConditions d'utilisation appliquer.