En juillet, le chercheur en sécurité Vladimir Smitka a décidé de vérifier sur Internet la présence de dossiers .git
ouverts aprÚs qu'un audit similaire ait été récemment mené pour les domaines Internet en République tchÚque et en Slovaquie.

Comme le dit le proverbe: "cela ne s'est jamais produit, et le voici Ă nouveau." Permettez-moi de vous rappeler, il y a 9 ans, exactement la mĂȘme histoire avec le segment russe d'Internet touchĂ© par le syndrome de .svn
ouvert. Voici les résultats du travail minutieux d'un chercheur tchÚque, des outils et des méthodes.
Raisons de la vulnérabilité
Un attaquant peut extraire de nombreuses informations critiques pour la sécurité du site à partir du répertoire .git
. Voici Ă quoi ressemble une arborescence de projet typique.
âââ HEAD âââ branches âââ config âââ description âââ hooks â âââ pre-commit.sample â âââ pre-push.sample â âââ ... âââ info â âââ exclude âââ objects â âââ info â âââ pack âââ refs âââ heads âââ tags
Les mots de passe et les clĂ©s d'accĂšs Ă diverses API, bases de donnĂ©es et services cloud peuvent y ĂȘtre stockĂ©s.
Souvent, comme prévu, une tentative d'ouverture du dossier .git
génÚre une erreur HTTP 403, mais la raison est simplement le manque d' index.html / index.php
et les droits d'indexation automatique du dossier, tandis que des fichiers individuels sont toujours disponibles . Afin de vous assurer que le site n'est pas vulnérable, vous devez ouvrir la page /.git/HEAD
.
Ce fichier contient un lien vers la branche de projet actuelle.
$ cat .git/HEAD ref: refs/heads/master
MĂȘme si l'indexation automatique des rĂ©pertoires est dĂ©sactivĂ©e, vous pouvez facilement restaurer l'intĂ©gralitĂ© .git
dossier .git
en téléchargeant des fichiers individuels et en déterminant les dépendances par le processeur d'expressions réguliÚres, car la structure .git
est clairement définie. Il existe également un outil spécial - GitTools , qui effectue automatiquement toutes les actions nécessaires.
Moyens de production
Malgré la complexité et l'ambition de la tùche, les coûts en termes d'argent étaient modestes. Pour tout, pour tout, il a fallu 250 dollars américains.
Serveur
Smithka a louĂ© pour le projet 18 VPS et 4 serveurs physiques. Selon lui, son choix n'est pas tombĂ© sur AWS car le coĂ»t total du service, compte tenu des gigantesques volumes de trafic attendus, de l'espace disque important et des charges CPU Ă©levĂ©es, n'a pas pu ĂȘtre facilement calculĂ©. Le prix des VPS louĂ©s a Ă©tĂ© fixĂ© Ă l'avance.
Liste des domaines
La liste est basée sur les journaux de texte du projet OpenData Rapid7 au JSON
.
Transférer le schéma de la base de données DNS { "$id": "https://opendata.rapid7.com/sonar.fdns_v2/", "type": "object", "definitions": {}, "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "timestamp": { "$id": "/properties/timestamp", "type": "string", "description": "The time when this response was received in seconds since the epoch" }, "name": { "$id": "/properties/name", "type": "string", "description": "The record name" }, "type": { "$id": "/properties/type", "type": "string", "description": "The record type" }, "value": { "$id": "/properties/value", "type": "string", "description": "The response received for a record of the given name and type" } } }
AprÚs un certain filtrage des TLD et des domaines de deuxiÚme niveau, la liste comptait encore plus de 230 millions d'entrées .
Ensuite, la base de données a été divisée en blocs de 2 millions d'enregistrements et la charge a été répartie sur différents serveurs à l'aide d'une application PHP.
Logiciels
Python était suspendu aux bibliothÚques de communication asyncio async avec aiohttp comme cheval de bataille . Une tentative d'utilisation de Requests et d' Urllib3 à ces fins a échoué, dont la premiÚre aurait bien pu convenir, mais le chercheur n'a pas compris les délais d'attente dans la documentation. Le second n'a pas géré la redirection de domaine, et pour cette raison, la mémoire des serveurs a été épuisée trÚs rapidement.
Pour identifier la plateforme et le profil des sites vulnérables, Smitha a utilisé l'utilitaire WAD , basé sur la base de données Wappalyzer , une extension pour le navigateur Web qui vous permet de déterminer les technologies utilisées sur la page.
Des utilitaires de ligne de commande simples comme GNU Parallels
ont Ă©galement Ă©tĂ© utilisĂ©s pour accĂ©lĂ©rer le temps d'exĂ©cution du gestionnaire et empĂȘcher l'arrĂȘt du script en raison d'un blocage unique.
cat sites.txt | parallel --bar --tmpdir ./wad --files wad -u {} -f csv
Résultats
Le scan a duré 2 semaines, en conséquence, le chercheur:
- découvert 390 000 sites Web vulnérables;
- 290 000 adresses e-mail collectées;
- a informé 90 000 destinataires de la vulnérabilité trouvée.
En réponse à ses efforts, Smithka a reçu:
- 18 mille erreurs de livraison de messages;
- environ 2000 lettres de remerciements;
- 30 fausses alarmes avec des systĂšmes de pots de miel;
- 1 menace d'appeler la police canadienne;

Le langage de programmation le plus populaire s'est avĂ©rĂ© ĂȘtre PHP . Cependant, si vous normalisez le rĂ©sultat Ă la part relative d'un PL particulier, alors PHP cĂšde la place Ă la tĂȘte de Python et Node.js. Cependant, la fiabilitĂ© de ces statistiques pour dĂ©terminer la part de marchĂ© d'un langage de programmation donnĂ© n'est pas claire.
Apache est en haut de la liste de la popularité des serveurs Web, avec Nginx à la deuxiÚme place et le clone chinois Nginx Tengine à la troisiÚme place.
L'OS le plus populaire était Ubuntu , puis Debian et CentOS en troisiÚme place.

La nomination CMS s'est presque rĂ©vĂ©lĂ©e ĂȘtre un théùtre Ă acteur unique, et cet acteur est WordPress avec 85% de toutes les plateformes trouvĂ©es.
Et ensuite
Réparer une vulnérabilité est facile.
.htaccess
RewriteRule "(^|/)\.(?!well-known\/)" - [F]
.nginx
location ~ /\.(?!well-known\/) { deny all; }
apache22.conf
<Directory ~ "/\.(?!well-known\/)"> Order deny,allow Deny from all </Directory>
apache24.conf
<Directory ~ "/\.(?!well-known\/)"> Require all denied </Directory>
Caddyfile
status 403 /blockdot rewrite { r /\.(?!well-known\/) to /blockdot }