OSINT Tools: Facilitez vos investigations avec Tampermonkey

Predicta Lab
7 min readMay 17, 2023

--

Quelque soit l’investigation, le temps d’enquête est un facteur déterminant. Ainsi tout outil, méthode ou technique permettant de gagner du temps est extrêmement précieux. Dans cet article nous allons explorer un outil qui vous permettra d’optimiser vos recherches : Tampermonkey.

Tampermonkey est une extension de navigateur qui permet d’ajouter ou de modifier les fonctionnalités des sites web que vous visitez. Ainsi, que vous ayez besoin de changer la fonction de recherche d’un site, d’en extraire automatiquement les photos ou de traduire automatiquement des commentaires, vous pouvez simplement rédiger un script à cet effet dans Tampermonkey et celui-ci se chargera de l’exécuter.

Ces scripts sont appelés ‘userscript’ et doivent être rédigés en Javascript mais n’ayez crainte : nous allons voir qu’une personne avec peu ou pas de compétences en termes de développement peut créer un userscript fonctionnel sans trop de difficultés.

Tout d’abord voyons d’abord ensemble comment installer Tampermonkey.

1. Installation

Tampermonkey s’installe comme la plupart des extensions : en passant par le menu des extensions de votre navigateur. Le site de Tampermonkey en facilite l’accès sur son site : rendez-vous sur https://www.tampermonkey.net/ , le site ouvrira automatiquement l’onglet correspondant à votre navigateur et vous n’aurez qu’à cliquer sur “Aller au magasin” dans la partie “Télécharger” pour accéder à la page appropriée dans le menu des extensions.

De là, ajoutez Tampermonkey à votre navigateur comme vous le feriez pour n’importe quelle extension et retrouvez le raccourci à côté de votre barre de recherche. Si ce n’est pas le cas, cliquez sur le raccourci extension de votre navigateur et attachez (‘pin’) Tampermonkey à la barre de recherche.

2. Utilisation

En cliquant sur l’icône Tampermonkey vous trouverez l’option “Tableau de bord”.

À partir de ce tableau de bord vous pourrez retrouver les userscripts que vous aurez créé, les éditer, les activer, les désactiver et les supprimer.

3. Faire son propre userscript

Passons maintenant au cœur du sujet : créer un userscript.

Dans le Tableau de bord, cliquez sur l’onglet (+) à gauche de l’onglet “Userscripts installés”.

Les 10 premières lignes définissent la documentation du script, voyons comment les remplir.

Une fois ces paramètres établis, le reste de la page est dédié à la rédaction de votre script. Si vous n’êtes pas inspiré sachez qu’il existe de nombreux forums qui ont pour but de partager des userscripts avec la communauté, tels que Userscript.Zone Search, Greasy Fork, GitHub Gist, OpenUserJS. Cependant ces scripts peuvent comporter des risques de sécurité : si vous avez des connaissances en Javascript, il est recommandé de comprendre et de vérifier leur fonctionnement avant de les utiliser. Sinon, il sera plus prudent de seulement utiliser vos propres scripts.

Vous n’avez pas forcément besoin de compétences en Javascript pour cela. Pour ma part je n’ai pour ainsi dire aucune compétence en code, j’ai donc demandé à une intelligence artificielle de rédiger mes scripts pour moi. Que ce soit Chat GPT ou plus récemment Bard (avec un VPN), ces outils sont en mesure de rédiger des scripts fonctionnels et efficaces, et c’est avec leur aide que j’ai rédigé un userscript qui extrait les emails, numéros de téléphone et adresses IP d’une page web.

En partant du prompt suivant :

Rédige un script à utiliser sur Tampermonkey pour extraire les emails, les numéros de téléphone et les adresses IP d’une page, utilise Javascript.

Je lui ai ensuite demandé d’afficher un bouton sur lequel cliquer pour extraire les données et les afficher dans une fenêtre pop-up directement sur la page web.

Et enfin je lui ai demandé d’optimiser le code. Celui-ci peut aussi être optimisé en changeant les regex (expression régulière) : ces séquences de caractères sont les modèles auquel les données doivent correspondre pour être remontée comme email, numéro de téléphone ou adresses IP. Les regex sont écrites dans leur propre langage et il existe des librairies de regex pour toutes sortes de données, par exemple Regular Expressions 101.

J’ai aussi demandé à l’AI de commenter le script ligne par ligne afin que je puisse en comprendre le fonctionnement.

Ainsi, je suis arrivée au script suivant :

// ==UserScript==
// @name Extraire des données structurées
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Extraire les adresses e-mail, les numéros de téléphone et les adresses IP d'une page Web
// @author Santa
// @match *://*/*
// @grant none
// ==/UserScript==

(function() {
'use strict';

function extractEmails(text) {
const regex = /[\w._%+-]+@(?!1x\.png|2x\.png)[\w.-]+\.[A-Za-z]{2,}/g;
return text.match(regex);
}

function extractPhoneNumbers(text) {
const regex = /\+?(\d[\s-]?){10,13}/g;
return text.match(regex);
}

function extractIPAddresses(text) {
const regex = /\b(\d{1,3}\.){3}\d{1,3}\b/g;
return text.match(regex);
}

function displayData(emails, phoneNumbers, IPAddresses) {
let message = 'Adresses e-mail trouvées :<br>';
message += emails ? emails.join('<br>') : 'Aucune adresse e-mail trouvée.';
message += '<br><br>Numéros de téléphone trouvés :<br>';
message += phoneNumbers ? phoneNumbers.join('<br>') : 'Aucun numéro de téléphone trouvé.';
message += '<br><br>Adresses IP trouvées :<br>';
message += IPAddresses ? IPAddresses.join('<br>') : 'Aucune adresse IP trouvée.';


const modal = document.createElement('div');
modal.style.position = 'fixed';
modal.style.top = '0';
modal.style.right = '0';
modal.style.bottom = '0';
modal.style.left = '0';
modal.style.zIndex = '1000000000';
modal.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
modal.style.display = 'flex';
modal.style.justifyContent = 'center';
modal.style.alignItems = 'center';

const modalContent = document.createElement('div');
modalContent.style.backgroundColor = 'white';
modalContent.style.padding = '20px';
modalContent.style.borderRadius = '5px';
modalContent.style.maxWidth = '80%';
modalContent.style.maxHeight = '80%';
modalContent.style.overflowY = 'auto';

const modalMessage = document.createElement('div');
modalMessage.innerHTML = message;
modalContent.appendChild(modalMessage);

const closeButton = document.createElement('button');
closeButton.textContent = 'Fermer';
closeButton.style.marginTop = '10px';
closeButton.onclick = () => {
document.body.removeChild(modal);
};
modalContent.appendChild(closeButton);

modal.appendChild(modalContent);
document.body.appendChild(modal);
}

function createButton() {
const button = document.createElement('button');
button.textContent = 'Extraire les données';
button.style.position = 'fixed';
button.style.top = '10px';
button.style.right = '10px';
button.style.zIndex = '1000000000';
button.onclick = () => {
const text = document.documentElement.innerHTML ;
const emails = extractEmails(text);
const phoneNumbers = extractPhoneNumbers(text);
const IPAddresses = extractIPAddresses(text);


displayData(emails, phoneNumbers, IPAddresses);
};

document.body.appendChild(button);
}

createButton();
})();

Quand ce script est activé dans mon navigateur, un bouton “Extraire les données” s’affiche en haut à droite de la fenêtre et il renvoie vers une fenêtre pop up qui affiche les données extraites de la page.

L’expression régulière qui dicte le format des numéros de téléphone inclut les numéros de téléphone faisant jusqu’à 13 caractères, cela me permet d’inclure les numéros internationaux et leur code de pays. L’inconvénient de cette limite est que mon script remonte un grand nombre de faux positifs : pour réduire ce nombre je pourrais réduire la limite de caractères de l’expression régulière à 10 caractères. Sinon, je pourrais aussi remplacer la constante document.documentElement.innerHTML par document.body.innerText ligne 82, de cette manière les données ne seront pas extraites du code source mais du texte affiché. Extraire les données du texte affiché permet de réduire le nombre de faux positifs mais contrairement à l’extraction du code source, cela ne permet pas de relever les données qui sont masquées ou réduites dans l’affichage de la page.

Par exemple sur le site des pages Jaunes, les numéros sont masquées dans l’affichage par défaut de la page.

Dans ce cas là utiliser la constante document.documentElement.innerText ne relèvera pas le numéro du résultat tandis que la constante document.documentElement.innerHTML le fera.

Ainsi, deux scripts ayant la même fonction peuvent être adaptés de mille façons différentes selon les besoins auxquels ils répondent.

Le script “Extraire des données structurées” permet de relever automatiquement des données à partir desquelles pivoter dans une enquête et facilite le travail d’archive, mais cela ne fait qu’effleurer le potentiel de Tampermonkey. Libre à vous d’en tester les limites : vous pourriez créer un script pour sauvegarder les pages web que vous visitez sur WaybackMachine afin de conserver vos sources ou faire un script qui cherchera automatiquement des profils de réseaux sociaux pour les noms que vous sélectionnez…

N’hésitez pas à partager vos créations avec nous sur Twitter et LinkedIn !

--

--