
smbcrawler est un outil sans fioritures qui prend des identifiants et une liste d'hôtes et 'crawle' (ou 'spiderise') ces partages.
SmbCrawler est un outil sans fioritures qui prend des identifiants et une liste d'hôtes et 'explore' (ou 'araignée') ces partages. Fonctionnalités :
Si vous avez besoin d'instructions sur la façon d'installer un paquet Python, je vous recommande de vous assurer que vous avez pipx installé et d'exécuter pipx install smbcrawler.
SmbCrawler peut automatiquement convertir certains fichiers binaires comme PDF, XLSX, DOCX, ZIP, etc. en texte brut en utilisant MarkItDown. Comme ce paquet tire beaucoup de dépendances, il est marqué comme un extra. Cependant, il est fortement recommandé pour obtenir les meilleurs résultats. Si vous souhaitez convertir automatiquement des binaires, installez SmbCrawler comme ceci :
pipx install 'smbcrawler[binary-conversion]'
L'ajout de la complétion shell est fortement recommandé. En tant qu'application Python utilisant la bibliothèque click, vous pouvez ajouter la complétion par tabulation à bash, zsh et fish en utilisant le mécanisme habituel.
Exécutez-le comme ceci (10 threads, profondeur maximale 5) :
$ smbcrawler crawl -i hosts.txt -u pen.tester -p iluvb0b -d contoso.local -t 10 -D 5
SmbCrawler a subi une refonte majeure. Les changements les plus significatifs sont :
Les anciens arguments de la CLI concernant les 'fichiers intéressants', les 'partages ennuyeux' etc. étaient lourds et confus. Nous utilisons désormais des 'profils' ; voir ci-dessous pour plus de détails.
Aussi, j'ai réalisé que j'avais essentiellement réinventé les bases de données relationnelles, mais très mal, alors pourquoi ne pas utiliser sqlite directement ? L'approche sqlite nous permet de produire un joli rapport HTML interactif avec de bonnes performances. Vous pouvez toujours exporter les résultats dans divers formats si vous devez utiliser les données dans un pipeline d'outils.
L'ancienne façon dont SmbCrawler signalait les permissions n'était parfois pas très utile. Par exemple, il n'est pas rare d'avoir des permissions de lecture dans le répertoire racine du partage, mais tous les sous-répertoires sont protégés, par exemple pour les profils utilisateurs. SmbCrawler signalera désormais jusqu'à quelle profondeur il a pu lire l'arborescence des répertoires d'un partage et s'il a atteint le maximum ou s'il aurait pu aller plus loin si vous aviez fourni une valeur plus élevée pour l'argument de profondeur maximale.
Si vous préférez l'ancienne version, elle est toujours disponible sur PyPI et installable avec pipx install smbcrawler==0.2.0, par exemple.
Pendant l'exécution, vous pouvez utiliser les touches suivantes :
p : mettre en pause l'explorateur et ignorer des hôtes ou partages individuels<space> : afficher la progression actuelles : afficher une mise à jour de statut plus détailléePour plus d'informations, exécutez smbcrawler -h.
Même dans des réseaux de taille moyenne, SmbCrawler trouvera des tonnes de données. Le défi est de réduire les faux positifs.
Il est important de réaliser que les permissions peuvent s'appliquer au niveau du service et au niveau du système de fichiers. Le service SMB distant peut vous permettre de vous authentifier et votre compte utilisateur peut avoir des permissions de lecture en principe, mais il pourrait manquer ces permissions sur le système de fichiers.
SmbCrawler signalera si vous avez les permissions de :
--depth)Comme il n'est pas trivial de vérifier les permissions des partages SMB sans tenter l'action en question, SmbCrawler tentera de créer un répertoire sur chaque partage. Son nom est smbcrawler_DELETEME_<8 caractères aléatoires> et sera supprimé immédiatement, mais soyez-en conscient.
[!WARNING] Parfois, vous avez la permission de créer des répertoires, mais pas de les supprimer, vous laisserez donc un répertoire vide.
Pour décider quoi faire avec certains partages, fichiers ou répertoires, SmbCrawler a une fonctionnalité appelée 'profils'. Jetez un œil au profil par défaut.
Les profils sont chargés à partir de fichiers avec les extensions *.yml ou *.yaml depuis ces emplacements :
$XDG_DATA_HOME/smbcrawler/ (~/.local/share/smbcrawler par défaut)--extra-profile-directory--extra-profile-fileLes profils de chaque emplacement remplacent les définitions précédentes.
La valeur regex détermine si un profil correspond, et le dernier profil correspondant sera utilisé. Toutes les expressions régulières sont insensibles à la casse, reflétant le comportement le plus courant dans le monde Windows.
Comme il peut être déroutant de comprendre comment les profils de différentes sources fonctionnent ensemble, assurez-vous d'utiliser le paramètre --dry-run. Il vous montre la configuration effective et ne fait rien de plus.
Regardons chaque section, qui est toujours une liste de dictionnaires. Chaque clé du dictionnaire est une étiquette arbitraire et chaque valeur est à nouveau un dictionnaire avec différentes propriétés.
comment : Une chaîne utile décrivant ce profilregex : Une expression régulière qui définit à quels fichiers ce profil s'applique. La dernière regex qui correspond est celle qui compte.regex_flags : Un tableau de drapeaux qui seront passés à la fonction match de la regexhigh_value (défaut : false) : Si un fichier est de 'haute valeur', sa présence sera signalée, mais il ne sera pas nécessairement téléchargé (pensez aux disques durs virtuels - importants, mais trop gros pour être téléchargés automatiquement)download (défaut : true) : Si true, les premiers 200KiBi seront téléchargés (ou le fichier entier si high_value=true) et analysés pour trouver des secretscomment, regex, regex_flags : Identique à ci-dessushigh_value : sa présence sera signalée et la profondeur d'exploration changée à l'infinicrawl_depth : Explorez ce partage ou répertoire jusqu'à une profondeur différente de celle définie par l'argument --depthcomment, regex_flags : Identique à ci-dessusregex : Une expression régulière correspondant au secret. Le secret lui-même peut être un groupe nommé avec le nom secret.Il est logique d'exécuter d'abord SmbCrawler avec une profondeur d'exploration de 1 pour avoir une idée de ce avec quoi vous travaillez. Dans ce premier passage, vous pouvez activer la vérification d'écriture avec -w :
$ smbcrawler -C permissions_check.crwl crawl -D1 -t10 -w \
-i <INPUT FILE> -u <USER> -d <DOMAIN> -p <PASSWORD>
Notez que cela vérifie les permissions d'écriture et de lecture uniquement dans le répertoire racine de chaque partage. Seul un passage complet vous en dira plus sur la profondeur des permissions de lecture.
Après la vérification initiale des permissions, vous pouvez identifier les partages intéressants et ennuyeux pour votre prochain passage ou plusieurs passages. Certains partages comme SYSVOL et NETLOGON apparaissent plusieurs fois, vous devriez donc définir la profondeur d'exploration à zéro lors de votre prochain passage et choisir un hôte pour analyser ces partages en double lors d'un troisième passage. Voici un exemple :
$ smbcrawler -C dc_only.crwl crawl -D -1 <DC IP> \
-u <USER> -d <DOMAIN> -p <PASSWORD>
$ smbcrawler -C full.crwl crawl -D5 -t10 -i <NEW INPUT FILE> \
-u <USER> -d <DOMAIN> -p <PASSWORD> \
--extra-profile-file skip_sysvol.yml
Ici, skip_sysvol.yml serait :
shares:
sysvol:
comment: "Skip sysvol and netlogon share"
regex: 'SYSVOL|NETLOGON'
crawl_depth: 0
N'hésitez pas à inclure ici d'autres partages que vous pensez ne pas valoir la peine d'être explorés.
Les données brutes sont contenues dans une base de données SQLite et un répertoire (output.crwl et output.crwl.d par défaut). Le répertoire contient deux autres répertoires : un avec les fichiers téléchargés rendus uniques par le contenu de hachage et un répertoire miroir de tous les partages avec des liens symboliques pointant vers les fichiers de contenu. Ce dernier est utile pour grepper à travers tous les fichiers téléchargés.
Les données peuvent être transformées en différents formats. Vous pouvez également simplement accéder à la base de données avec sqlitebrowser, par exemple. Des vues utiles ont été prédéfinies. Ou vous pouvez sortir du JSON et utiliser jq pour manipuler les données.
Si vous souhaitez afficher tous les partages que vous avez pu lire au-delà du répertoire racine dans un tableau LaTeX, par exemple, utilisez cette requête :
SELECT target_id || " & " || name || " & " || remark || " \\"
FROM share
WHERE read_level > 0
ORDER BY target_id, name
Il existe également une fonctionnalité expérimentale de sortie HTML. Elle n'est peut-être pas encore entièrement utile pour de grandes quantités de données.
Si vous remarquez beaucoup de faux positifs ou de faux négatifs dans les secrets signalés, aidez-nous et faites-le moi savoir. Les contributions de la communauté sont importantes pour améliorer la détection automatique. Le meilleur scénario : fournir une pull request avec des modifications du fichier de profil par défaut.
Adrian Vollmer, SySS GmbH
Licence MIT ; voir LICENSE pour les détails.