Savoir si un dossier a été vu/copié/supprimé/etc SANS programme
Les amis, je vous propose de découvrir un projet personnel que j’ai régulièrement complété au fil du temps et qui est basé sur une question simple : comment peut-on savoir si un dossier a été vu sous Windows ? Et cela par exemple dans un cadre de surveillance (légale) de l’ordinateur, ou dans le cadre de la récupération de preuves d’accès si un problème de piratage a lieu.
Pour cela, utiliser un programme de surveillance ne me paraissait pas assez discret pour une surveillance discrète. J’ai donc mis en place un moyen de savoir si un dossier a été vu sans aucun programme externe, tout simplement car c’est le système Windows lui-même qui va m’en informer automatiquement.
Voici la vidéo où je fais la démonstration :
Pour la démonstration, il suffit de se rendre sur le site créé à l’occasion : http://trgrd.site. Lien dead à présent, désolé. Voir ci-dessous pour le code source.
Cliquez ensuite sur le bouton pour générer votre dossier piégé (il contiendra un identifiant unique). Vous pourrez ensuite le placer où vous le souhaitez sur votre PC, le renommer, y ajouter des fichiers ou dossiers, etc.
Puis vous pourrez cliquer sur le lien permettant d’observer les statistiques d’ouvertures.
Et vous devriez toutes les voir sous forme de tableau avec le nom du pc et la date de l’action.
Le code source a été placé sur Github à l’adresse suivante : https://github.com/LeBlogDuHacker/trgrd
Savoir si un dossier a été vu grâce à des requêtes DNS
J’ai déjà expliqué le fonctionnement du site dans la vidéo et dans le dépôt Github, je vais donc ici me contenter de mentionner les grandes lignes.
Windows utilise des fichiers desktop.ini dans les dossiers afin d’enregistrer diverses préférences. Par exemple, si vous changez l’icône d’un dossier, celle-ci sera enregistré via ce fichier de préférence.
Et il se trouve que l’on peut donner également un chemin réseau (URL) pour renseigner cette icône !
Windows va automatiquement faire une requête DNS si c’est le cas, pour trouver l’adresse IP de la machine possédant physiquement l’icône, et l’afficher.
Mais qui dit requête DNS dit accès distant.
Nous pouvons ainsi créer un serveur DNS pour récupérer volontairement les dates d’ouvertures du dossier, car Windows fait beaucoup de requêtes DNS suivant diverses actions : ouverture du dossier, renommage du dossier, déplacement, suppression, liste via un dossier parent, etc. De plus, des variables Windows comme le nom du PC peuvent être passées via le sous domaine de l’URL utilisée.
En gérant ainsi un serveur DNS autoritaire sur le nom de domaine choisi, nous recevons les requêtes avec les variables et nous pouvons les enregistrer, en toute transparence. Je me suis donc basé sur un projet open source de serveur DNS autoritaire en PHP (lien dans le dépôt) pour y associer une base de données.
La création du dossier piégé, pas si facile…
Le serveur DNS étant en place, il restait à créer des dossiers à la demande, contenant des fichiers desktop.ini avec une URL prédéfinie. Voici un exemple de fichier desktop.ini généré :
%USERNAME%.%USERDOMAIN%.23911.ID.trgrd.site va en fait former une URL avec plusieurs sous-domaines de ce type : m.pc.23911.ID.trgrd.site. Le numéro 23911 arbitraire ne sert qu’à séparer l’identifiant (ID) aléatoire du nom du PC… il y a d’autres façons de faire.
Une fois le fichier desktop.ini généré, il reste à le mettre dans un dossier et de le proposer au téléchargement.
Mais c’est là que les choses se compliquent…
Le fichier desktop.ini contient par défaut des attributs systèmes (il n’est visible qu’en affichant les dossiers cachés ET en autorisant l’affichage des fichiers systèmes). Sans ces attributs, il devient un simple fichier normal, non pris en compte, et donc visible dans le dossier.
C’est pour cela que j’ai décidé de faire un fichier .zip contenant le dossier lui-même contenant desktop.ini ainsi que les attributs. Mais aucune bibliothèque ZIP en PHP ne m’a vraiment aidé (je n’ai peut-être simplement pas réussi/trouvé). J’ai donc décidé de m’intéresser au format de fichier .ZIP, pour créer le fichier, octet par octet en décompilant d’abord un fichier desktop.ini officiel.
Mon code est donc très « bas niveau » (et moche), mais si vous avez une solution alternative, je la lirai avec grand plaisir, c’est bien là l’avantage de l’open source après tout !