Il y a quelques semaines, nous avons lancé Censeyeun utilitaire open-source conçu pour aider les chercheurs et les chasseurs de menaces à explorer les données d'analyse de Censys et à s'orienter automatiquement vers de nouvelles découvertes. Si vous ne l'avez pas encore vue, consultez notre annonce originale ici. Il est très intéressant de voir les captures d'écran et les découvertes que les gens partagent, car des résultats vraiment fascinants ont déjà été obtenus grâce à cet outil. Voir l'outil en action et découvrir des informations intéressantes ? C'est tout simplement génial.
L'une des premières choses auxquelles nous voulions nous attaquer après la première version était de construire un cadre pour faciliter l'extension du système dans deux domaines clés :
- Génération de requêtes: Nous avions besoin d'un moyen simple de nous connecter au pipeline de traitement des données de l'hôte et de générer dynamiquement des requêtes pour le reporting et le pivotement. Par exemple, nous pouvions analyser les noms de fichiers à partir des répertoires ouverts HTTP et rechercher ces fichiers dans d'autres répertoires ouverts. Ces requêtes générées devaient être traitées de la même manière que les définitions de champs déjà en place, les configurations de poids pivot et tout le reste.
- Étiquetage des données: Nous voulions un moyen simple d'ajouter des étiquettes personnalisées aux rapports finaux, ce qui nous donnerait plus de contrôle et de flexibilité sur la façon dont les résultats sont affichés. Par exemple, nous pourrions rechercher l'hôte dans une base de données externe et renvoyer une chaîne de caractères pour l'étiqueter.
Pour rendre cela possible, nous avons construit un système de plugins simple appelé Censeye Gadgets et avons commencé à mettre en œuvre certaines des fonctionnalités que nous souhaitions voir. Celles-ci se trouvent désormais dans l'installation par défaut de la version 1.0.0.
Remarque Vous pouvez afficher tous les gadgets disponibles en les exécutant :
~$ censeye -list-gadgets
Gadgets du générateur de requêtes
Les gadgets générateurs de requêtes lisent les données d'analyse de l'hôte Censys et génèrent une ou plusieurs requêtes de recherche, qui sont traitées comme n'importe quel autre champ dans la configuration de Censeye. La section suivante détaille les gadgets que nous avons mis en œuvre actuellement.
Gadget d'annuaire ouvert
Ce gadget traite le résultat d'un hôte Censys , identifie les services avec un répertoire ouvert HTTP, extrait les noms de fichiers du corps de la réponse et génère des requêtes de recherche pour localiser ces noms de fichiers dans d'autres corps de réponse HTTP.
Dans la capture d'écran ci-dessous, nous avons exécuté Censeye contre 209.105.248.135 en utilisant l'option "-g odir"qui active le gadget open directory. Le rapport comprend désormais plusieurs clés intitulées "open-directory.gadget.censeye", avec des valeurs contenant des requêtes de recherche Censys pour trouver des noms de fichiers spécifiques sur d'autres hôtes.
Si nous regardons de plus près, ce gadget a généré trois requêtes pour les fichiers "sostener.vbs", "svchost.vbs"et "sostener1.vbs". Le premier fichier a été trouvé sur six autres hôtes avec des répertoires ouverts, tandis que les deux derniers semblent être propres à l'hôte que nous voyons.
Et comme tous les autres champs configurés, ces données peuvent être utilisées pour le pivotement automatique! Par exemple, en exécutant la commande suivante avec un poids minimum de 0,9 (pour ignorer les champs NTLM pour le pivotement) et en réglant la profondeur à 1 :
~$ censeye 209.105.248.135 -gadget odir -min-pivot-weight 0.9 -profondeur 1
Ici, nous pouvons voir que les données du fichier du répertoire ouvert ("sostener.vbs") sont utilisées pour découvrir d'autres hôtes, comme l'indique l'arbre croisé dynamique (Pivot Tree). arbre croisé ci-dessous :
Configuration du gadget open-directory
La configuration par défaut du gadget de répertoire ouvert ressemble à ceci (notez qu'il est désactivé par défaut) :
Ce gadget ne comporte que deux variables configurables :
- max_files: Limite la génération de requêtes aux N premiers fichiers du corps de la réponse HTTP. La valeur par défaut est 32, ce qui permet d'éviter que des répertoires ouverts massifs ne consomment trop de temps et de ressources.
- min_chars: Assure que seuls les noms de fichiers comportant au moins ce nombre de caractères sont traités.
Le gadget doit être ajouté à la configuration du champ pour s'assurer que ces champs sont traités comme les autres. (Heureusement, la configuration intégrée par défaut gère déjà cela, et oui, vous pouvez également ajouter des valeurs ignorées comme pour les autres champs. Voici à quoi cela ressemble :
Le gadget Nobbler
Le gadget "Nobbler" cible les services inconnus ("services.service_name=UNKNOWN"). Il extrait la bannière brute et génère des recherches de caractères génériques à différents endroits de la réponse.
Si vous avez déjà travaillé avec des données de protocole, vous avez probablement constaté que de nombreux protocoles binaires ou systèmes d'encadrement comprennent un en-tête structuré ou un numéro magique, suivi de charges utiles dynamiques. Le gadget Nobbler est conçu pour aider à trouver automatiquement d'autres services en tenant compte de ce concept.
Pour le démontrer, examinons un exemple concret de la façon dont nous avons utilisé ce gadget pour identifier des charges utiles Metasploit !
Nous avons rencontré un hôte aléatoire(45.144.137.45) avec un ensemble inhabituel de services que Censys n'a pas pu identifier. L'exécution de Censeye avec l'option "nobbler"en utilisant la commande suivante :
~$ censeye -gadget barbouilleur 45.144.137.45
La sortie (capture d'écran ci-dessous) révèle quatre lignes générées par le nobbler, chacune avec des métriques intrigantes.
Nobbler a généré les requêtes suivantes et en a rendu compte :
Au fur et à mesure que chaque requête devient plus spécifique, de moins en moins d'hôtes correspondent. Cela suggère fortement que ces services présentent des données encadrées ou compilées de manière à pouvoir être interprétées par une machine. Nous avons donc décidé de vérifier manuellement certaines de ces données en utilisant Netcat et en transférant la sortie dans le fichier "data.bin" :
~$ netcat 45.144.137.45 56241 > data.bin
La commande file n'a pas été d'une grande utilité pour déterminer de quoi il s'agissait :
~$ file data.bin
data.bin : données
Cependant, binwalk a pu identifier que nous avons affaire à une sorte de binaire ELF, au moins à partir de l'offset 126 dans le fichier.
Enfin, nous nous sommes tournés vers l'outil de piratage informatique par excellence, les chaînes, pour voir si quelque chose de significatif ressortait - et c'est là que nous avons eu un déclic.
Avec une simple recherche sur le web et presque sans effort, nous avons rapidement identifié ce service comme étant une charge utile Metasploit (Meterpreter) configurée pour exécuter mettle et se connecter à cet hôte.
Alors que les différentes charges utiles générées peuvent produire des données variables dans Censys, le gadget "nobbler" simplifie le processus en examinant les premiers octets à différents décalages pour découvrir les points communs dans les données brutes. Pour couronner le tout, nous savons maintenant que tout ce qui correspond à cette requête de recherche Censys est très probablement lié à Metasploit !
Configuration du gadget nobbler
La configuration par défaut de nobler est désactivée par défaut mais peut être activée avec l'option "-gadget nobbler" ; la configuration par défaut intégrée est présentée ci-dessous :
Le gadget "nobbler" n'a qu'une seule directive de configuration : la directive itérations (itérations). Il définit les décalages auxquels les recherches de caractères génériques sont générées pour les services inconnus. Par défaut, il utilise les décalages 4, 8, 16 et 32.
Étant donné que cette opération porte sur la valeur services.banner_hex des données Censys , il faut garder à l'esprit que 2 octets de ces données correspondent à 1 octet de données réelles. Par exemple, 8 octets de données de bannière correspondent à 2 octets de données réelles, et ainsi de suite. Avec les paramètres par défaut, cela signifie que nous générons des requêtes pour 2 octets, 4 octets, 8 octets et 16 octets de données réelles.
Pour que ce gadget soit utilisé dans le pivotement, nous devons également l'ajouter à la configuration des champs (qui est déjà présente par défaut) :
Gadgets pour étiqueteuses
Ces gadgets sont simples et n'ont qu'un seul objectif : enrichir les données de l'hôte en y ajoutant des étiquettes pertinentes. Actuellement, nous avons implémenté deux gadgets d'étiquetage :
- ThreatFox (-gadget threatfox) : Vérifie si l'hôte a été vu ou a fait l'objet d'un rapport ThreatFox.
- VirusTotal (-gadget virustotal) : Vérifie si l'hôte a été vu ou signalé sur VirusTotal.
Voici un exemple (utilisant l'hôte que nous avons examiné précédemment) de ces gadgets d'étiquetage :
Développer votre propres gadgets
Si vous souhaitez mettre en œuvre votre propre générateur de requêtes ou étiqueteur d'hôtes, consultez le dépôt GitHub de Censeye GitHub repository pour voir comment les gadgets existants - ils sont d'une simplicité extrême (et peut-être embarrassante).
Réflexions finales
Censeye a été une évolution amusante de blocs de construction simples qui se sont empilés les uns sur les autres pour créer un utilitaire puissant et utile pour un public très spécialisé, et si vous voulez en savoir plus, veuillez consulter l'annonce originale de Censeye.
Cet utilitaire utilitaire open-source est hébergé sur GitHub; commentaires, problèmes et correctifs sont les bienvenus !
Une dernière chose que nous voulions mentionner est que Censeye est maintenant sur PyPI et peut être installé en utilisant Python pip :
~$ pip install censeye -mise à niveau