🏈Composants Internes windows
📚 Introduction
Chaque processus est une instance d'un programme en cours d'exécution, isolée(indépendant) et dotée de ses propres ressources.
Chaque processus a son propre espace d'adresse, son propre ensemble de ressources (mémoire, fichiers ouverts, etc.) et son propre état (informations de contexte d'exécution).
🛠️ Exemples d'Applications par Défaut qui Démarrent des Processus
MsMpEng: Microsoft Defenderwininit: Initialisation du clavier et de la sourislsass: Stockage des identifiants
🔍 Types de Processus
Processus système : Processus critiques pour le fonctionnement du système d'exploitation.
Processus utilisateur : Processus initiés par l'utilisateur, comme les applications et les logiciels.
Services : Processus qui fonctionnent en arrière-plan pour fournir diverses fonctionnalités du système.
🛠️ Outils de Gestion des Processus
Gestionnaire des tâches : Pour surveiller et gérer les processus.
(Ctrl + Shift + Esc)Process Explorer : Outil avancé fourni par Microsoft Sysinternals offrant une vue détaillée des processus en cours d'exécution, incluant les DLL chargées et les descripteurs ouverts.
System Informer :
Process Monitor v3.96 : Surveille les activités du système.
Process Explorer v17.05 : Vue détaillée des processus et des DLL.
💻 Commandes de Ligne de Commande
tasklist: Affiche une liste de processus en cours d'exécution.taskkill: Termine un processus en utilisant son PID ou son nom.wmic: Permet d'exécuter des tâches de gestion à partir de la ligne de commande.
🔒 Sécurité des Processus
Les processus sous Windows sont protégés par des mécanismes de sécurité tels que :
Listes de contrôle d'accès (ACL) : Contrôlent les permissions sur les objets.
Jetons de sécurité : Garantissent que seuls les utilisateurs et processus autorisés peuvent accéder à certaines ressources ou effectuer des actions spécifiques.
Techniques d'attaques :
Process Injection (T1055)
Process Hollowing (T1055.012) : voir tutoriel
Process Masquerading (T1055.012)
Thread
Un thread, c'est comme si vous pouviez faire deux, trois, ou même dix tâches en même temps.
Chaque thread est une petite liste de tâches qui peut s'exécuter en parallèle avec les autres.
Programme + rapide et + réactif, car il n'a pas à attendre qu'une tâche soit terminée avant de commencer la suivante.
Par exemple, dans un jeu vidéo, un thread peut être responsable du mouvement du personnage, tandis qu'un autre peut gérer les graphismes.
Les applications utilisent des fonctions et des procédures pour effectuer différentes tâches, et ces fonctions sont stockées dans des bibliothèques de liens dynamiques (DLL).
Plutôt que de réécrire ces fonctions pour chaque application, elles sont regroupées dans des bibliothèques partagées. Ainsi, plusieurs applications peuvent utiliser la même bibliothèque pour des fonctionnalités communes, comme l'ouverture d'une fenêtre.
En pratique, les applications recherchent des DLL contenant ces bibliothèques, qui à leur tour contiennent les fonctions nécessaires.
Liens dynamiques au moment de l'exécution (run-time dynamic linking) :
Chargement manuel des DLL par l'application.
Plus de flexibilité et de contrôle pour l'application.
Code de l'application plus complexe.
Performances légèrement réduites.
Liens dynamiques au moment du chargement (load-time dynamic linking) :
Chargement automatique des DLL par le système d'exploitation.
Plus de simplicité pour l'application.
Moins de flexibilité et de contrôle pour l'application.
Performances légèrement meilleures.
Les acteurs malveillants préfèrent souvent les liens dynamiques au moment de l'exécution car cela leur permet de charger manuellement les DLL, ce qui est plus facile à gérer et permet d'éviter les mécanismes de sécurité du système d'exploitation.
Technique d'attaque :
Prévention :
Mettez à jour régulièrement vos logiciels et votre système d'exploitation.
Téléchargez et utilisez uniquement des logiciels provenant de sources fiables.
Évitez d'exécuter des programmes ou des fichiers dont vous ne connaissez pas l'origine ou la fonction.
Utilisez des outils de sécurité tels que des antivirus, des pare-feu et des systèmes de détection d'intrusion.
Contrôlez l'accès en écriture aux répertoires système et utilisez des ACL (listes de contrôle d'accès) pour restreindre l'accès aux DLL et aux répertoires contenant des DLL.
PE (Portable Executable)
Qu'est-ce que c'est ?
Les PE (Portable Executables) sont des fichiers utilisés par les systèmes d'exploitation Windows pour exécuter des programmes, comme des applications (.exe) ou des bibliothèques de liens dynamiques (DLL).
Qu'est-ce qu'ils contiennent ?
Code exécutable : Les instructions que l'ordinateur doit suivre pour exécuter le programme.
Données : Les informations nécessaires au programme pendant son exécution.
Ressources : Comme les images, les icônes ou les chaînes de texte utilisées par le programme.
Informations d'exécution : Des détails sur la manière dont le programme doit être exécuté.
En-têtes : Des informations sur la structure du fichier PE.
Pourquoi sont-ils importants ?
Ils permettent aux programmes d'être portables, ce qui signifie qu'ils peuvent être exécutés sur différentes versions de Windows et sur différentes architectures de processeurs.
Qu'est-ce qu'une API ?
Les API sont des outils puissants qui permettent aux développeurs d'accéder aux fonctionnalités système et logicielles et de créer des applications plus riches et plus interactives.
API signifie Application Programming Interface. Une API est un ensemble de règles et de protocoles qui permet à différents logiciels de communiquer entre eux. Elle définit les méthodes et les données que les applications peuvent utiliser pour interagir avec le système d'exploitation, d'autres applications ou des services externes.
L'API de Windows
L'API de Windows, aussi appelée WinAPI ou Windows API, c'est une sorte de boîte à outils pour les développeurs qui veulent créer des programmes pour Windows. Elle leur donne accès à toutes sortes de fonctionnalités comme la création de fenêtres, l'accès aux fichiers ou la gestion des périphériques. En gros, elle facilite la vie des développeurs en leur donnant les outils nécessaires pour construire des applications qui fonctionnent bien sur Windows.
Voici un exemple simple d'utilisation de l'API de Windows en C++ pour afficher une boîte de dialogue de message :
Dans cet exemple :
Nous incluons le fichier d'en-tête
<windows.h>qui contient les déclarations des fonctions de l'API de Windows.La fonction
MessageBoxest une fonction de l'API de Windows qui affiche une boîte de dialogue de message à l'utilisateur.Les paramètres de
MessageBoxsont :NULL: Indique que la boîte de dialogue de message n'a pas de fenêtre parent."Bonjour ! Ceci est un message de test.": Le texte à afficher dans la boîte de dialogue."Message": Le titre de la boîte de dialogue.MB_OK: Un indicateur pour spécifier le type de boutons à afficher dans la boîte de dialogue. Dans ce cas, il s'agit d'un bouton "OK".
Lorsque vous exécutez ce programme, une boîte de dialogue de message avec le texte "Bonjour ! Ceci est un message de test." et le titre "Message" s'affichera à l'écran, avec un bouton "OK" pour fermer la boîte de dialogue.
Fichier d'en-tête Windows :
Le fichier d'en-tête Windows le plus important s'appelle windows.h. Il contient toutes les instructions nécessaires pour créer des programmes Windows en utilisant l'API de Windows (WinAPI). Cela inclut les déclarations des fonctions, des types de données et des valeurs constantes utilisées par les programmes Windows.
P/Invoke et DLL dans le contexte de .NET :
P/Invoke, qui signifie Platform Invocation Services, est une fonctionnalité du framework .NET. Elle permet à du code écrit dans des langages comme C# ou VB.NET (ce qu'on appelle du code "managé") d'appeler des fonctions qui sont écrites dans d'autres langages (comme du code "non managé") et qui sont stockées dans des fichiers DLL. Ces fichiers DLL contiennent des fonctions et des données qui peuvent être utilisées par d'autres programmes.
PowerShell et les API :
PowerShell peut utiliser les API de Windows pour effectuer des actions comme gérer des fichiers, configurer le système, contrôler des processus et des services, et bien plus encore. Cela rend PowerShell très utile pour la gestion et l'automatisation des systèmes Windows.
API dans la Bibliothèque Win32
Plusieurs appels d'API au sein de la bibliothèque Win32 peuvent être utilisés de manière malveillante. Voici quelques-uns des appels d'API les plus couramment abusés et leur explication :
LoadLibraryA
Charge une DLL spécifiée dans l'espace d'adressage du processus appelant
GetUserNameA
Récupère le nom de l'utilisateur associé au thread actuel
GetComputerNameA
Récupère un nom NetBIOS ou DNS de l'ordinateur local
GetVersionExA
Obtient des informations sur la version du système d'exploitation en cours
GetModuleFileNameA
Récupère le chemin d'accès complet du fichier du module spécifié et du processus
GetStartupInfoA
Récupère le contenu de la structure STARTUPINFO (station de fenêtre, bureau, etc.)
GetModuleHandle
Retourne une poignée de module pour le module spécifié s'il est mappé dans l'espace d'adressage du processus appelant
GetProcAddress
Retourne l'adresse d'une fonction DLL exportée spécifiée
VirtualProtect
Modifie la protection sur une région de mémoire dans l'espace d'adressage virtuel du processus appelant
Utilisation dans les Logiciels Malveillants
Keylogger :
Utilise les API pour installer un crochet mémoire dans la chaîne de crochet pour surveiller certains événements.
Les appels d'API impliqués sont :
SetWindowsHookEx,UnhookWindowsHookEx,GetModuleHandle,GetCurrentProcess.
Shellcode Launcher :
Utilise les API pour allouer de la mémoire, créer un thread et attendre qu'un objet soit dans l'état signalé.
Les appels d'API impliqués sont :
VirtualAlloc,WaitForSingleObject,CreateThread.
Ces exemples illustrent comment les attaquants utilisent les API pour des activités malveillantes, telles que l'installation de logiciels espions ou le déploiement de code malveillant en mémoire.
Les outils intégrés et Sysinternals sont utiles pour les administrateurs système, ces outils sont également utilisés par les pirates, les logiciels malveillants et les pentesters en raison de la confiance inhérente qu'ils ont dans le système d'exploitation. Cette confiance est bénéfique pour les Red Teamers, qui ne veulent pas être détectés ou interceptés par un contrôle de sécurité sur le système cible. Par conséquent, ces outils ont été utilisés pour échapper à la détection et à d’autres contrôles de l’équipe bleue..
The following are some popular Windows Sysinternals tools:
Helps system administrators check specified access for files, directories, Registry keys, global objects, and Windows services.
A tool that executes programs on a remote system.
An advanced Active Directory tool that helps to easily view and manage the AD database.
Monitors running processes for CPU spikes and the ability to dump memory for further analysis.
An essential tool for process monitoring.
A tool that lists all TCP and UDP connections.
The first tool designed in the Sysinternals suite to help list detailed information.
Monitors and displays all serial and parallel port activity on a system.
Provides information for a specified domain name or IP address.
L'une des grandes fonctionnalités de Windows Sysinternals est qu'il n'y a pas d'installation Requis. Microsoft fournit un service Windows Sysinternals, Sysinternals live, avec différentes manières d'utiliser et d'exécuter les outils. Nous pouvons y accéder et les utiliser via:
Navigateur Internet (lien).
Partage Windows
Invite de commande
Pour utiliser ces outils, soit vous les téléchargez, soit en entrant le chemin Sysinternal Live \\live.sysinternals.com\tools dans l'Explorateur Windows.
💿 Mémoire virtuelle
La mémoire virtuelle est une technique utilisée par les systèmes d'exploitation pour donner l'impression que votre ordinateur a plus de mémoire physique (RAM) qu'il n'en a réellement.
Lorsque vous utilisez un programme, il est d'abord chargé dans la mémoire de l'ordinateur (RAM).
Si vous avez trop de programmes ouverts et que la mémoire est pleine, le système d'exploitation utilise une partie du disque dur pour créer de la "mémoire virtuelle".
Les parties du programme dont vous avez besoin immédiatement restent dans la mémoire (RAM), tandis que le reste est stocké sur le disque dur.
Si une partie du programme est nécessaire mais n'est pas en mémoire, le système la récupère depuis le disque dur.
Pour libérer de la place en mémoire, le système peut déplacer des parties du programme non utilisées sur le disque dur.
Modifier la façon dont la mémoire est allouée pour les applications nécessitant un espace d'adressage plus grand : "increaseUserVA" ou en utilisant AWE (Address Windowing Extensions).
🔧 Attaque par injection de shellcode
Le but est d'injecter un shellcode dans l'espace mémoire d'un autre processus sur les systèmes Windows x86/x64 en utilisant l'API Windows.
Choix du Processus : L'attaquant choisit un processus déjà en cours d'exécution sur l'ordinateur cible.
Injection de Code : À l'aide d'un programme spécial, l'attaquant injecte un petit morceau de code malveillant, appelé shellcode, dans la mémoire de ce processus.
Activation du Code : Le shellcode est ensuite activé dans le processus cible, lui permettant d'exécuter des actions malveillantes, telles que prendre le contrôle du système ou voler des données.
Pour exécuter ce script, vous devez le lancer depuis un environnement Python sur un système Windows. Vous pouvez spécifier le PID du processus cible en utilisant l'option -p ou --pid. Assurez-vous également d'avoir défini le shellcode à injecter dans la variable shellcode au début du script.
⚙️ Hijacking de Thread
Le hijacking de thread est une technique qui permet à un attaquant de prendre le contrôle d'un thread dans un processus en cours d'exécution.
Étapes du hijacking de thread :
Localiser et ouvrir le processus cible : Dans cette étape, nous ouvrons le processus dans lequel nous souhaitons injecter du code.
Allouer une région mémoire pour le code malveillant : Nous réservons de la mémoire dans le processus cible pour y écrire notre code.
Écrire le code malveillant dans la mémoire allouée : Nous écrivons notre code dans la région mémoire que nous avons allouée.
Identifier l'ID du thread cible à hijacker : Nous devons identifier le thread spécifique que nous voulons hijacker dans le processus.
Ouvrir le thread cible : Une fois que nous avons l'ID du thread, nous ouvrons le thread pour y accéder.
Suspendre le thread cible : Nous suspendons le thread pour empêcher son exécution pendant que nous effectuons des manipulations.
Obtenir le contexte du thread : Nous obtenons le contexte du thread, qui contient des informations sur l'état actuel du thread, y compris l'emplacement de l'IP (Instruction Pointer).
Mettre à jour l'IP pour pointer vers le code malveillant : Nous modifions l'IP pour qu'il pointe vers notre code malveillant.
Réécrire le contexte du thread : Nous mettons à jour le contexte du thread avec les modifications que nous avons apportées.
Reprendre l'exécution du thread : Enfin, nous reprenons l'exécution du thread, maintenant avec notre code malveillant.
💉 DLL injection
C'est une technique qui consiste à insérer du code dans un programme en cours d'exécution en chargeant une bibliothèque de liens dynamiques (DLL) malveillante. Voici les étapes principales :
Trouver le programme cible : Identifier le programme dans lequel vous voulez injecter la DLL.
Ouvrir le programme : Ouvrir une connexion vers ce programme pour pouvoir y faire des changements.
Réserver de la mémoire : Allouer un espace dans le programme cible pour y stocker le chemin d'accès de la DLL.
Écrire le chemin de la DLL : Écrire le chemin complet de la DLL dans cet espace mémoire.
Charger la DLL : Charger la DLL dans le programme cible en démarrant un thread spécial.
Nettoyer : Une fois que la DLL est injectée, libérer les ressources utilisées.
Voici un script en C++ qui effectue toutes les étapes de l'injection de DLL, suivi d'explications sur la compilation et l'exécution :
Pour compiler ce script :
Vous avez besoin d'un environnement de développement C++ tel que Visual Studio ou un compilateur C++ tel que GCC.
Créez un nouveau projet C++ dans votre environnement de développement.
Copiez le code ci-dessus dans un fichier source (par exemple,
main.cpp) dans votre projet.Ajoutez les dépendances appropriées (par exemple,
Windows.h).Compilez le projet pour obtenir l'exécutable.
🔌Evasion des défenses
Dans certains environnements, exécuter du code malveillant peut être difficile en raison de la surveillance des threads ou des hooks sur les appels d'API. Cependant, nous avons plusieurs options pour contourner ces obstacles.
Jusqu'à présent, nous avons principalement examiné comment allouer et écrire des données dans les processus. Mais l'exécution du code est également cruciale. Nous avons principalement utilisé CreateThread et CreateRemoteThread, mais nous avons d'autres méthodes :
Appel de pointeurs de fonction : Cette méthode consiste à transformer un pointeur de mémoire alloué en pointeur de fonction et à l'invoquer pour exécuter le code. Cela peut être utile lorsque vous ne pouvez pas utiliser d'API système.
Appels de procédure asynchrone (APC) : Les APC sont des fonctions qui s'exécutent de manière asynchrone dans un thread spécifique. Nous utilisons
QueueUserAPCpour mettre une fonction en file d'attente dans un thread etResumeThreadpour le réactiver. Cela peut être une alternative aux threads classiques mais peut être détecté par certaines solutions de sécurité.Manipulation des sections : Cette technique implique la manipulation des sections d'un fichier exécutable (PE) pour exécuter du code. C'est une méthode avancée qui nécessite une connaissance approfondie du format PE. Elle peut inclure l'analyse des points d'entrée, le mappage de sections, etc.
Je vous invite a poursuivre la formation vers l'évasion des défenses !
Last updated