Aller au contenu

Data Leaks - Shhgit

Logo Plan B

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
apt install curl -y 

Détails de la commande :

1
2
3
4
5
apt install
    -> permet de dire quon souhaite installer un package 
-y
    -> permet de demander à ne pas avoir la confirmation pour linstallation
    -> sinon par défaut lorsque le paquet aura été trouvé il vous sera demandé de confirmer son installation 

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
sudo apt install git -y 

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
apt install golang -y

Vous pouvez afficher la version qui a été installée en exécutant la commande suivante :

1
go version


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
https://get.docker.com/ 

Exécuter la commande suivante dans le terminal, elle va permettre de télécharger le script d’installation :

1
curl -fsSL https://get.docker.com -o get-docker.sh 

Nous pouvons vérifier que le script a bien été téléchargé via la commande suivante :

1
ls -al | grep get-docker.sh

Détails de la commande :

1
2
3
4
5
6
7
8
ls -al
    -> permet dafficher les fichiers et dossiers, même ceux qui sont cachés 
|
    -> appelé « pipe » en anglais, permet de filtrer les résultats sur le critère définit 
grep
    -> cest ce qui va servir de filtre 
get-docker.sh
    -> le nom du fichier quon souhaite filtrer 

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
sh get-docker.sh

Détails de la commande :

1
2
sh
    -> pour dire dexécuter un script 

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
docker -version 

Détails de la commande :

1
2
3
4
docker
    -> le programme auquel on fait appel 
--version
    -> le paramètre qui permet dobtenir la version 

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
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 

Détails de la commande :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
-L
    -> paramètre qui permet de spécifier lemplacement  se trouve lélément à récupérer 
https://...
    -> cest le chemin  se trouve le programme quon souhaite récupérer
$(uname -s)
    -> permet de spécifier le type de système dexploitation pour laquelle récupérer le programme, dans le cas présent « Linux » 
$(uname -m)
    -> permet de spécifier le type darchitecture pour laquelle récupérer le programme, dans le cas présent « x86_64 » 
-o
    -> permet de définir le répertoire  sera récupéré le programme sur le poste local 
/usr/local/bin/docker-compose
    -> permet de définir lemplacement de sauvegarde ainsi que le nom du fichier récupéré 

5.2 Droits d’exécution du programme

Exécuter la commande suivante :

1
chmod +x /usr/local/bin/docker-compose 

Détails de la commande :

1
2
3
4
5
6
chmod
    -> programme qui permet la gestion des droits 
+x
    -> permet de spécifier quon souhaite rendre exécutable le programme / script 
/usr/local/bin/docker-compose
    -> lemplacement de lélément dont on souhaite modifier ces droits 

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
docker-compose version 

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
https://github.com/ 

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
git clone https://github.com/eth0izzle/shhgit.git 

Détails de la commande :

1
2
3
4
5
6
git
    -> programme à utiliser 
clone
    -> permet de demander la création dune copie dun répertoire 
https://...
    -> chemin  se trouve le répertoire à copier, dans le cas présent cest le répertoire officiel du projet ! 

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
ls -al | grep shhgit 

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
cd shhgit/ 

Détails de la commande :

1
2
3
4
cd
    -> pour changer de répertoire ou « change directory » 
shhgit/
    -> chemin relatif du répertoire  

Une fois dans le répertoire nous pouvons également afficher le chemin absolu de celui-ci en saisissant la commande suivante :

1
pwd 

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
nano config.yml 

Détails de la commande :

1
2
3
4
nano
    -> éditeur de texte simple 
config.yml
    -> le fichier à modifier 

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
ctrl +x 

Pour confirmer la prise en compte des modifications, appuyer sur la touche

1
Y 

Pour quitter l’éditeur, appuyer sur la touche

1
Entrée  

7.1.4 Construction de l’image

Exécuter la commande suivante :

1
docker-compose build 

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
docker images 

Détails de la commande :

1
2
3
4
docker
    -> programme à utiliser 
images
    -> pour afficher les images disponibles localement 

Voici les images qu’a téléchargé docker-compose :

7.1.5 Démarrage du container

Exécuter la commande suivante :

1
docker-compose up 

Détails de la commande :

1
2
3
4
docker-compose
    -> programme à utiliser 
up
    -> pour dire au programme de lire et exécuter les instructions contenues dans le fichier « config.yml » 

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
http://IP:8080

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
chmod +x potato.sh

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
./potato.sh 

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
./shhgit local /home/pi/_labs/ 

Détails de la commande :

1
2
3
4
5
6
./shhgit
    -> programme à exécuter 
--local
    -> pour spécifier quon souhaite scanner des répertoires locaux 
/home/pi/_labs
    -> le chemin du dossier qui contient les répertoires à scanner 

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
./shhgit --help

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
./shhgit --local /home/pi/_labs - - csv-path resultats.csv

Détails de la commande :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
./shhgit
    -> le programme à utiliser 
--local
    -> ce paramètre permet de spécifier quon souhaite scanner un répertoire local 
/home/pi/_labs
    -> lemplacement du répertoire à scanner 
--csv-path
    -> ce paramètre permet de spécifier le fichier  seront enregistrés les résultats du scan 
resultats.csv
    -> le nom du fichier de sortie 

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
nano www/public/script.js 

Détails de la commande :

1
2
3
4
nano
    -> éditeur de texte simple 
www/public/script.js
    -> le fichier de configuration qui contient le paramètre à modifier 

Il faut chercher la ligne où se trouve la valeur « localhost » pour faire cela vous pouvez utiliser la combinaison de touches :

1
ctrl + w 

Et saisir « localhost » puis appuyer sur la touche :

1
Entrée 

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
ctrl + x

Pour enregistrer le changement, appuyer sur la touche

1
Y

Pour confirmer ce changement, appuyer sur la touche

1
Entrée 

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.

11.1 Docker

11.2 Docker compose

11.3 GitHub

11.4 shhgit