Data Leaks - Shhgit
Dates des modifications : | Intervenants : | Modifications apportées : |
---|---|---|
- | Matthieu BILLAUX @_euzebius |
Nhammmber One Mentor ! |
Dimanche 19 Juin 2022 | Mudsor MASOOD mudpak |
Mise à jour vers le blog (v1.0.1) |
Jeudi 20 Janvier 2022 | Philippe SEGRET Pich |
Relecture et finalisation du document (v0.0.4) |
Samedi 1er Janvier 2022 | mudpak | Ajout de la partie shhgit (v0.0.3) |
Jeudi 9 Décembre 2021 | mudpak | Ajout de la partie Docker (v0.0.2) |
Mercredi 8 Décembre 2021 | mudpak | Création du document (v0.0.1) |
1. Avant-propos
L’objectif principal de ce document est de guider l’utilisateur dans la mise en place de la solution « shhgit ».
Au-delà de la simple mise en place, nous allons lister les fonctionnalités avancées afin d’adapter cet outil selon votre contexte.
Important :
De par sa fonction, shhgit va vous permettre de trouver des données sensibles voire hautement confidentielles et donc par nature des données qui ne devraient pas être publiquement accessibles.
Les auteurs de ce document et de cet outil ne seront pas tenus responsables des usages malveillants qui peuvent en être faits.
2. Prérequis
Afin de pouvoir exploiter pleinement ce document, il est nécessaire de disposer des éléments suivants :
- Avoir accès à internet
- Avoir les droits d’installation et d’administration des services ou « root » sur le poste
- Avoir installé Docker
- Pour utiliser l’image docker shhgit
- Avoir installé Docker-compose
- Pour construire l’image de shhgit
- Avoir un compte GitHub
- Pour générer un token afin de requêter les repositories
- Avoir installé Go
- Pour utiliser la partie scan des repositories locaux
Information :
Bien que cela sera précisé par la suite, les manipulations ont été effectuées sur la distribution Debian 11 (Bullseye) x64 et Raspbian.
3. Debian 11
Par défaut certains éléments que nous allons utiliser ne sont pas installés, c’est pourquoi nous allons procéder à leur installation.
Les commandes sont identiques sur une machine virtuelle Debian ou Raspbian puisque c’est la distribution Debian qui est utilisée dans les deux cas.
3.1 Installation de curl
Cet utilitaire va permettre de récupérer les éléments présents sur un serveur vers une autre machine, et ce sans interaction de l’utilisateur.
Saisir la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 5 |
|
L’installation est très rapide :
3.2 Installation de git
Pour récupérer manuellement des répertoires à scanner comme nous le verrons dans la partie de scan des répositories locaux, il faut installer git.
Saisir la commande suivante :
1 |
|
Remarque :
Si vos répertoires se trouvent dans d’autres emplacements vous pouvez simplement les copier via la commande « wget » ou d’autres méthodes.
L’installation est rapide :
3.3 Installation de golang
Dans la première partie nous allons utiliser l’image docker de shhgit, mais après cela nous allons utiliser le script pour scanner manuellement et celui-ci est développé en Golang.
Pour installer les packages nécessaires, exécuter la commande suivante :
1 |
|
Vous pouvez afficher la version qui a été installée en exécutant la commande suivante :
1 |
|
4. Docker
Il est possible d’installer shhgit via docker ou via go, toutefois, pour la seconde méthode l’interface web n’est pas incluse.
Et puisque nous allons voir les deux types d’installations, dans le cas présent nous allons aborder l’installation avec Docker.
4.1 Installation
Se rendre à l’adresse suivante pour récupérer le script d’installation :
1 |
|
Exécuter la commande suivante dans le terminal, elle va permettre de télécharger le script d’installation :
1 |
|
Nous pouvons vérifier que le script a bien été téléchargé via la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 5 6 7 8 |
|
Dans le cas présent nous avons bien un script qui a été récupéré le 8 Décembre à 19h24 :
Pour lancer l’installation de docker, exécuter la commande suivante :
1 |
|
Détails de la commande :
1 2 |
|
Remarque :
A la place de la commande « sh » nous pouvons exécuter le script en saisissant « ./getdocker .sh ».
C’est une méthode alternative.
Le process va prendre un certain temps :
Lorsque l’installation sera terminée vous devrez obtenir un résultat semblable à ci-dessous, on peut voir un certain nombre d’informations :
4.2 Utilisation sécurisée
Il est recommandé de ne pas utiliser Docker avec un compte root, à la place vous pouvez suivre la bonne pratique décrite ci-dessous.
Pour des raisons de démonstrations et de facilité je ne vais pas appliquer cette recommandation.
4.3 Vérification de la version
Vous pouvez afficher la version installée de docker via la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 |
|
Dans le cas présent et comme vu précédemment nous avons la version courante ainsi que la branche dont elle est issue :
Maintenant que Docker est installé, il faut installer un composant principal, « docker-compose » en effet c’est lui qui va construire l’image à notre place grâce à un fichier de configuration qu’on lui aura spécifié.
5. docker-compose
5.1 Récupération du programme
Exécuter la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 5 6 7 8 9 10 11 12 |
|
5.2 Droits d’exécution du programme
Exécuter la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 5 6 |
|
5.3 Vérification de la version
Pour construire l’image nous allons avoir besoin de docker-compose et il n’est pas installé en mêmetemps que docker, pour l’installer exécuter la commande suivante :
1 |
|
Dans le cas présent dans avons la version courante issue de la branche « Build » :
6. GitHub
Comme il est spécifié dans la documentation de shhgit, il n’y a pas besoin de token pour scanner les répositories GitLab, BitBucket, mais pour ce qui est de GitHub il est nécessaire d’avoir ce token.
Remarque :
Bien qu’il soit nécessaire d’avoir cet élément, cela ne signifie pas qu’on devra lui accorder tous les privilèges.
En effet puisqu’il ne fera que de la lecture des repositories il n’aura besoin d’aucun droit particulier pour faire cette action.
6.1 Connexion au compte
Se rendre à l’adresse suivante :
1 |
|
Dans la partie supérieure droite de la fenêtre, cliquer sur
- Sign in
Remplir les champs suivants
- Username or email address
- Soit par votre pseudo GitHub
- Soit par Adresse email
- Password
- Par le mot de passe
Cliquer sur
- Sign in
6.2 Création d’un token
6.2.1 Settings
Dans le coin supérieur droit de la fenêtre, cliquer sur l’image représentant votre compte utilisateur et cliquer sur
- Settings
6.2.2 Developer settings
Dans le menu situé à gauche de la fenêtre, cliquer sur
- Developer settings
6.2.3 Personal access tokens
Cliquer sur
- Personal access tokens
6.2.4 Generate new token
Cliquer sur
- Generate new token
Note :
Penser à remplir le champ « Note », surtout si vous disposez de plusieurs tokens, cela permettra de les identifier facilement :
6.2.5 Expiration
Vous pouvez définir une date d’expiration du token qui va être généré, ceci est fortement recommandé, surtout si vous l’utilisez pour des besoins de démonstrations :
Si les choix par défaut en termes de durée ne vous conviennent pas, vous pouvez cliquer sur « Custom… » et choisir une durée adaptée à vos besoins :
6.2.6 Select scopes
Au niveau des droits d’accès vous pouvez choisir très finement les droits qui seront accordés, dans notre cas nous n’avons pas besoins d’apporter de modifications mais juste créer un token :
6.2.7 Generate token
Cliquer sur
- Generate token
Le token est créé :
6.3 Récupération du token
Puisqu’il sera utile pour la suite des évènements, je vous conseille de le noter en lieu sûr, vous pouvez le copier en cliquant sur le logo copier/coller ou le copier en le sélectionnant manuellement.
Remarque :
Vous pouvez constater le bouton « Delete » situé à droite du token, dès que vous aurez terminé l’utilisation vous pouvez le supprimer manuellement ou attendre la date d’expiration si vous en avez défini une.
7. Cas 1 : Scan des dépôts publics
Important :
A partir de ce chapitre et jusqu’à la fin du document, pour des questions de respect et de légalité, des données ont étés masquées, elles sont représentées par des zones blanches car elles contiennent des données confidentielles.
Dans le cas présent nous allons installer et configurer shhgit pour effectuer des scans sur les répositories publics.
Puisqu’il est plus pratique et visuellement agréable de voir les résultats sur un navigateur web, nous allons utiliser l’installation avec Docker qui intègre l’installation de l’interface graphique (Web).
7.1 shhgit
7.1.1 Récupération du dépôt
Exécuter la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 5 6 |
|
La récupération est relativement rapide, durant ce processus nous pouvons constater qu’un répertoire nommé « shhgit » est créé :
7.1.2 Vérification du répertoire
Nous pouvons vérifier que la création du répertoire s’est déroulée correctement en executant la commande suivante :
1 |
|
On voit bien qu’il s’agit d’un répertoire car dans la première colonne le paramètre « d » comme « directory » est présent :
Nous pouvons également nous déplacer dans le répertoire via la commande
1 |
|
Détails de la commande :
1 2 3 4 |
|
Une fois dans le répertoire nous pouvons également afficher le chemin absolu de celui-ci en saisissant la commande suivante :
1 |
|
Voici donc le chemin complet du répertoire :
Nous pouvons afficher le contenu du répertoire via la commande suivante :
Un certain nombre d’éléments sont présents, parmi eux les éléments suivants seront très importants pour la suite des opérations:
- config.yml : Fichier de configuration de shhgit, c’est ici qu’on va définir le token à utiliser, les types de répertoires à scanner ou non
- docker-compose.yml : C’est le fichier de configuration qui sera utilisé pour construire l’image
- Le répertoire « www » contient un fichier de configuration qui sera vu dans la partie « Erreurs courantes » si rien ne s’affiche dans l’interface web.
7.1.3 Configuration du fichier « config.yml »
Nous allons, à présent, définir le token à utiliser dans le fichier de configuration, pour cela, éditer le fichier config.yml via la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 |
|
Le token doit être dans le paramètre « github_access_tokens » et inséré entre les simples côtes de la seconde ligne :
Voici un exemple de résultat attendu, il faut veiller à insérer le contenu entre les simples côtes sinon il risque d’y avoir des erreurs dans l’interprétation de celui-ci.
Pour enregistrer les modifications saisir la combinaison des touches
1 |
|
Pour confirmer la prise en compte des modifications, appuyer sur la touche
1 |
|
Pour quitter l’éditeur, appuyer sur la touche
1 |
|
7.1.4 Construction de l’image
Exécuter la commande suivante :
1 |
|
Remarque :
Il est crucial de se trouver dans le même répertoire que le fichier « dockercompose.yml » en effet le programme va aller chercher ce fichier par défaut dans le répertoire courant.
Si le fichier se trouve ailleurs il faudra le spécifier dans la commande.
Cette étape va prendre un certain temps, il faudra se montrer patient.
La construction de l’image « shhgit-www » commence, en réalité, dans notre cas il va construire deux images, une pour la partie front-end et une autre pour la back-end.
Dans l’exemple ci-dessous docker-compose a terminé la création de l’image « shhigt-app :
Lorsque docker-compose a terminé les opérations, nous pouvons afficher les images disponibles via la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 |
|
Voici les images qu’a téléchargé docker-compose :
7.1.5 Démarrage du container
Exécuter la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 |
|
Nous pouvons voir :
- Que les images « shhgit-www » et « shhgit-app » sont utilisées
- Que le dossier « tmp/shhgit » est utilisé comme dossier temporaire
7.2 Visualisation depuis le navigateur
Après quelques secondes nous pouvons nous rendre que le navigateur sur l’adresse IP de notre machine hébergeant la solution et au port « 8080 » se trouve l’interface web de shhgit.
1 |
|
Dans la zone supérieure gauche de la fenêtre nous pouvons observer
- La version qui est utilisée
- La liste complète de tous les types de fichiers qui sont cherchés
Dans la partie centrale de la fenêtre, le chargement des éléments commence :
Voici un exemple de résultats qu’on peut obtenir après quelques minutes d’attentes :
Il peut y avoir beaucoup de données qui remontent avec le temps, ainsi si vous souhaitez n’obtenir que certains types de résultats alors vous pouvez appliquer des filtres.
Pour faire cela vous pouvez cliquer dans la colonne gauche pour ne sélectionner les types de résultats souhaités comme c’est le cas ci-dessous :
Ainsi uniquement les résultats les plus pertinents à vos critères sont affichés :
Remarque :
Il est également possible de configurer dans le fichier « config.yml » le type d’éléments à chercher.
7.3 Visualisation depuis les containers
Puisque l’interface web n’est qu’un affichage de ce qui a été trouvé en amont ainsi vous pouvez tout simplement voir les résultats en temps réel sur le container même si visuellement c’est moins agréable :
8. Cas 2 : Scan des dépôts locaux
Nous avons vu le cas où on peut attendre que shhgit scanne les dépôts publics et on peut trouver tous types d’éléments sensibles.
Il est également possible de scanner vos propres dépôts publics avant par exemple leur publication que des plateformes, ainsi vous vous assurez de ne pas avoir oublié un élément sensible.
Bien que cela ne procure pas une garantie à 100% cela vous permet de réduire le risque de fuites de données confidentielles.
8.1 Récupération des dépôts
Dans notre cas, j’ai créé un script très simple qui consiste à récupérer un certain nombre de dépôts publiquement disponible sur GitHub dans le but de simuler des répertoires locaux.
Comme vous pouvez le constater la commande « git clone » est utilisée :
Pour que le script puisse s’exécuter il faut lui accorder les droits à l’aide de la commande :
1 |
|
Pour l’exécuter nous pouvons le faire comme précédemment avec la commande « sh » mais pour changer nous allons utiliser la commande suivante :
1 |
|
La récupération des répertoires commence, des dossiers sont créés portant le même nom :
Voici la liste des répertoires qui ont été téléchargés :
8.2 Scan simple
Puisque les répertoires sont présents localement, nous allons utiliser le paramètre « --local » pour dire à shhgit de scanner les répertoires et lui donner leur emplacement.
Exécuter la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 5 6 |
|
Nous pouvons voir un certain nombre d’éléments s’afficher avant le scan :
- 150 signatures
- Ce sont les types de fichiers qui seront recherchés
- La liste complète des fichiers est disponible dans le fichier « config.yml »
- 4 worker threads : qui seront dédiés à cette tâche, ainsi le scan sera plus rapide
- Temp work dir : le répertoire temporaire
Nous pouvons suivre le scan en temps réel ou attendre qu’il se termine pour analyser les résultats, voici un exemple de résultat obtenu à la fin du scan.
Nous pouvons mieux visualiser les résultats grâce à la coloration syntaxique qui permet de trouver les éléments plus facilement :
8.3 Utilisation des fonctions avancées
Pour afficher toutes les commandes de shhgit, exécuter la commande suivante :
1 |
|
Remarque :
Les paramètres peuvent être spécifiés suivi d’un simple tiret « - paramètre » ou de deux tirets « - - paramètre ».
8.3.1 clone-repository-timeout
Ce paramètre permet de définir le temps d’attente pour récupérer un dépôt, par défaut il est de 10 secondes mais vous pouvez le personnaliser si vous avez une connexion plus lente.
8.3.2 --config-path
Il permet de chercher les fichiers « config.yml » dans un répertoire spécifique.
8.3.3 --csv-path
Il permet d’enregistrer dans un fichier CSV les éléments sensibles qui ont été découverts, ainsi vous pouvez vous baser sur ce fichier pour faire les traitements.
Voici un exemple de commande qu’on peut exécuter en utilisant ce paramètre :
1 |
|
Détails de la commande :
1 2 3 4 5 6 7 8 9 10 |
|
Lorsque le scan est terminé, nous pouvons voir que le fichier a bien été créé au format CSV :
8.3.4 --debug
Ce paramètre permet d’afficher les informations en cas de débogage du programme :
8.3.5 entropy-threshold
?
8.3.6 --live
?
8.3.7 --local
Ce paramètre que nous utilisons depuis le cas 2, permet donc de spécifier un répertoire local à scanner :
8.3.8 --maximum-file-size
Ce paramètre permet de spécifier la taille maximale d’un fichier à scanner :
8.3.9 --maximum-repositories-size
Ce paramètre permet de spécifier la taille maximale d’un répertoire à scanner :
8.3.10 --minimum-stars
Ce paramètre permet de scanner uniquement les dépôts ayant un certain nombre d’étoiles :
8.3.11 --path checks
?
8.3.12 process-gists
?
8.3.13 --search-query
Ce paramètre permet de chercher un élément précis lors du scan :
Dans le cas présent le critère de recherche est l’élément « API », ainsi si l’outil trouve un résultat correspondant à notre critère, il sera mis en surbrillance :
8.3.14 --silent
Ce paramètre permet de dire à shhgit de ne rien afficher hormis les erreurs.
8.3.15 --temp-directory
Ce paramètre permet de spécifier un répertoire temporaire personnalisé :
Dans le cas présent nous avons défini comme répertoire personnalisé le dossier « _TEMP » :
Comme vous pouvez le voir lors du scan le nouveau répertoire est bien utilisé :
8.3.16 threads
Ce paramètre permet de spécifier le nombre de cœurs à allouer au scan :
Dans le cas présent nous avons défini à « 1 » :
Nous pouvons voir que lors du scan l’outil utilise bien un cœur uniquement pour ses besoins :
9. Erreurs courantes
Lors de la mise en place de l’outil j’ai rencontré quelques difficultés, soit ce sont des erreurs que d’autres personnes ont faites soit c’est un cas particulier que j’ai rencontré.
Je vous partage ci-dessous les solutions.
9.1 Erreur de connexion à la base de données
Lorsque vous tentez de consulter l’interface web de shhgit, il se peut que l’erreur ci-dessous s’affiche :
Pour corriger cela il faut modifier un paramètre dans le fichier de configuration.
Exécuter la commande suivante :
1 |
|
Détails de la commande :
1 2 3 4 |
|
Il faut chercher la ligne où se trouve la valeur « localhost » pour faire cela vous pouvez utiliser la combinaison de touches :
1 |
|
Et saisir « localhost » puis appuyer sur la touche :
1 |
|
Dans notre cas la valeur se trouve au paramètre « host : » :
Il faut modifier la valeur par l’adresse IP de la machine sur laquelle s’exécute shhgit, comme ci-dessous :
Lorsque cette modification est effectuée, pour quitter le fichier, saisir la combinaison des touches :
1 |
|
Pour enregistrer le changement, appuyer sur la touche
1 |
|
Pour confirmer ce changement, appuyer sur la touche
1 |
|
Vous pouvez revenir sur le navigateur et recharger la page.
Si le problème persiste, vous pouvez arrêter les containers et les relancer via docker-compose.
9.2 Synchronisation entre containers et navigateur impossible
Si toutes les étapes ont bien été respectées et les données ne s’affichent toujours pas sur votre navigateur, alors je vous recommande de changer de navigateur.
En effet avec Google Chrome 96.0.4664.93 (Build officiel) (64 bits) je n’ai pas réussi à visualiser les données.
Avec les navigateurs suivants aucun problème n’a été constaté pour ma part :
- Firefox 95.0 (64 bits)
- Microsoft Edge Version 96.0.1054.43 (Version officielle) (64 bits)
- Opera 82.0.4227.23
10. Conclusion
Comme vous avez pu le constater, il est très facile pour des acteurs malveillants de trouver des éléments hautement confidentiels sur les entreprises. En effet :
- Il n’y a pas besoin d’avoir un niveau de compétences techniques élevé, même un profil débutant en informatique peut mettre en place une telle solution
- Il n’y a pas besoin de ressources particulières si ce n’est une machine et de la patience
Pour ma part il m’a suffit d’attendre environ 30 minutes pour voir des clés privées SSH, clés API voire des accès à des bases de données.
Le « leak » de ces données suivie d’une mauvaise application des privilèges utilisateurs (= non application du principe du moindre privilège) permet aux acteurs malveillants très souvent non seulement de s’introduire dans les systèmes mais également conduire des activités telles que phishing, cryptominning, élévation de privilèges, tout en utilisant les ressources de l’entreprise.
11. Sources
Voici les différentes sources qui m’ont permis de mettre en place la solution.