
Script Python pour trouver efficacement des fichiers sur les systèmes de fichiers de type UNIX avec des propriétés spécifiques (plus rapide que find)
Après avoir obtenu un accès à une machine distante lors d'un test d'intrusion, vous souhaiterez peut-être trouver des fichiers de configuration ou des binaires intéressants afin de tenter une élévation de privilèges.
Le script est autonome et fonctionne à la fois sur Python3 et Python2.7, afin d'être compatible aussi bien avec les machines récentes (qui ne fournissent pas python2 par défaut) qu'avec les moins récentes.
Au lieu d'exécuter plusieurs commandes find, ce script simple se contente de les suivre en effectuant un seul passage sur toute l'arborescence de votre disque, en appliquant tous les prédicats (les fonctions se terminant par _p ou _filep pour les prédicats à appliquer uniquement aux fichiers).
Toujours en cours de développement (WIP), mais le code est très resserré et il est très facile d'écrire vos propres prédicats : il suffit que ce soit une fonction qui reçoit un chemin de fichier et renvoie un booléen.
À la fin, tous les ensembles de fichiers sont stockés dans un dictionnaire appelé d, dont les clés sont les noms des prédicats. Pour y accéder, exécutez simplement python3 -i diskwalk.py. Vous vous retrouverez dans un REPL Python, et comme il s'agit d'ensembles Python, vous pouvez facilement effectuer des opérations comme
d['executable_files'] & d['writable_files']
Pour obtenir l'ensemble des fichiers à la fois accessibles en écriture et exécutables
d['executable_files'] - d['readable_files']
Pour obtenir les fichiers exécutables mais non lisibles
d['owned_by_nobody_dirs'] | d['owned_by_nobody_files']
Pour obtenir l'union des répertoires et des fichiers appartenant à l'utilisateur nobody
Les données obtenues seront enregistrées dans un fichier sérialisé (pickle) et compressé dump.gz ; passez-le simplement en argument pour le charger et éviter de scanner à nouveau le disque
python -i diskwalk.py dump.gz
En raison du fonctionnement du pickle de Python, les mises en garde habituelles s'appliquent : vous ne pourrez pas charger ce même fichier dans un interpréteur Python différent de celui que vous avez utilisé pour générer le fichier, par exemple.