Remarque importante avant de commencer : les différentes phases ne sont pas entièrement détaillées, les informations fournies ici permettent d'illustrer le contexte et de fournir une meilleure compréhension du récit, certains détails sont manquants - nous nous en excusons.

Conception de la charge utile

Avant toute action, nous nous sommes concentrés sur la conception de la charge utile qui sera utilisée avec nos scénarios d'attaque. Nous avons décidé d'opter pour la charge utile HTTPS inverse sans étape de PowerShell qui sera fournie à l'aide du dropper HTA et exécutée sur la machine cible. Pour ce faire, nous devons d'abord disposer d'une charge utile fonctionnelle qui contourne les solutions EDR et AV.

Les charges utiles PowerShell sont de plus en plus difficiles à contourner grâce à la protection AMSI qui analysera le contenu en mémoire, ce qui signifie que le cryptage n'aura aucun effet. Ensuite, AmsiScanBuffer() vérifiera le contenu de notre script décrypté à la recherche de menaces connues. Sachant que la version 2 de PowerShell, qui ne prend pas en charge AMSI, peut ne pas être installée sur notre machine cible et que les derniers exploits de contournement d'AMSI sont connus et détectés, nous avons dû construire une charge utile qui contourne la détection.

Nous avons décidé de nous concentrer sur le contournement de l'antivirus Sophos car ils ont implémenté leur propre moteur AMSI et supportent Windows AMSI.

(Réf. pour le support AMSI par solution AV/EDR

Pour la conception de notre charge utile, nous avons utilisé Cobalt Strike avec notre modèle personnalisé sur lequel nous avons modifié les chaînes de caractères et les appels les plus courants (adieu VirtualAlloc() !). En outre, nous avons créé un profil Cobalt Strike personnalisé sur le serveur de notre équipe, qui sera utilisé avec des en-têtes « prepend » et « strrep » personnalisés (parmi beaucoup d'autres) afin de supprimer/ajouter des chaînes spécifiques de notre charge utile générée. Ces paramètres seront également utilisés par la génération de la charge utile Cobalt Strike pendant la phase de post-exploitation pour la persistance et le mouvement latéral.

(Réf.)

Pour assurer l'évasion, nous pourrions même utiliser l'artefact « dist-pipe » du kit d'artefacts afin d'échapper à la détection de la sandbox (cela peut nécessiter quelques modifications).

Une fois notre charge utile générée, nous avons décompressé manuellement la partie shellcode de celle-ci (décompression GZIP -> base64 et décodage XOR key -> encodage hex) et l'avons modifiée en ajoutant quelques instructions d'assemblage afin de modifier la signature, en prenant soin en même temps de ne pas casser son flux d'exécution.

Ci-dessous un exemple de charge utile codée en hexadécimal avant personnalisation :

Figure 1 : Charge utile par défaut

Après la personnalisation, nous l'avons exécutée et avons remarqué qu'elle était toujours signalée par AMSI. Après une vérification plus approfondie, nous avons découvert que c'est l'appel à « [System.Runtime.InteropServices.Marshal]::Copy($var_code, 0x0, $var_buffer, $var_code.length) » qui était signalé.

Pour résoudre ce problème, nous avons utilisé l'outil PowerShell Invoke-Obfuscation développé par Daniel Bohannon afin d'obfusquer les chaînes de notre modèle PowerShell

Pour résumer, nous avons maintenant une charge utile avec :

  • Un modèle PS1 personnalisé
  • Un profil Cobalt personnalisé pour la communication C2 et la génération de charges utiles
  • Un shellcode personnalisé
  • Une charge utile obfusquée

Après plusieurs tentatives sur notre machine virtuelle sur laquelle Sophos était installé, nous avons finalement réussi à le contourner grâce à notre charge utile, mais aussi d'autres produits AV :

Figure 2 Résultat de l'analyse des produits AV

En plus de notre charge utile PowerShell avec proxy HTTPS, nous avons également créé notre dropper HTA (Mitre ATT&CK T1218.005) qui, s'il est exécuté par la cible, téléchargera et exécutera notre charge utile .ps1 en mémoire. Bien entendu, nous avons également dû créer et configurer un certificat SSL valide sur notre proxy inverse Nginx pour assurer le cryptage du trafic et la réussite de la connexion cible à notre serveur C&C.

La charge utile est maintenant prête, il est temps de préparer les scénarios d'attaque !

Scénario 1 : Approche de l'abandon d'une clé USB

Comme évoqué dans le chapitre précédent, le scénario d'abandon d'une clé USB avait été défini sur la base du fait que le parking est ouvert au public et que l'abandon d'une clé USB est un vecteur d'attaque couramment utilisé.

Il permet de tester la sécurité et le durcissement des ordinateurs portables utilisés, mais aussi la sensibilisation à la sécurité des employés eux-mêmes et les politiques en cas d'incident signalé au service de sécurité informatique.

Pour réussir une attaque par abandon de clé USB, nous devions la rendre légitime pour les employés du client, ce qui a nécessité plusieurs étapes :

  • Un scénario d'attaque réaliste ;
  • Une charge utile proxy non détectée pour l'évasion AV/EDR/AMSI etc. ;
  • Un faux site web en raison de ce que nous avions prévu de faire ;
  • Un moyen de tromper les employés afin de les faire cliquer sur un lien et exécuter notre dropper.

Le scénario retenu était un nouveau service sécurisé HR Payslips, permettant aux employés d'accéder à leurs bulletins de salaire numériques directement en ligne. Pour ce faire, nous avons acheté un nom de domaine réaliste, et hébergé la fausse page web sur un hôte virtuel qui usurpe le nom de la société cliente.

Nous avons ajouté une redirection en fonction de l'agent utilisateur du navigateur des visiteurs afin de rediriger sur une page 404 not found si un navigateur différent d'Internet Explorer ou Edge est utilisé, sinon de rediriger sur notre dropper HTA à exécuter.

Nous avons créé un document PDF en utilisant le modèle de PDF d'entreprise trouvé sur Internet. Ce PDF explique ce qu'est le nouveau service HR Payslips et comment y accéder (lien hypertexte malveillant). Pour avoir de meilleures chances d'exécuter la charge utile, nous avons créé un exécutable C# pour les utilisateurs qui ne veulent pas s'embêter avec la méthode WEB HR Payslips. Pour le rendre plus légitime, nous avons signé cet exécutable à l'aide d'un certificat d'entreprise usurpé et nous avons également utilisé le logo de l'entreprise pour l'icône de l'exécutable généré. Cet exécutable C# effectuera les actions suivantes :

  • Vérifier la configuration du proxy et l'utiliser ;
  • Vérifier la connexion Internet ;
  • Obtenir le nom d'utilisateur actuel et l'envoyer au serveur C2 ;
  • Télécharger et exécuter la charge utile PowerShell ;
  • Le flux d'exécution peut être schématisé comme suit :

La structure de l'exécutable C# peut être résumée dans l'échantillon de code suivant :

Figure 3 Exemple de dropper C#

Le PDF et l'exécutable ont été copiés sur 10 clés USB.

Nous nous sommes ensuite rendus dans le parking public souterrain. Les employés se garent dans le même parking, mais dans une zone privée.

Nous avons choisi d'abandonner les clés USB juste après l'heure du déjeuner à trois endroits : devant les trois ascenseurs réservés aux employés, dans les escaliers privés à l'intérieur du parking, et dans les escaliers privés à l'intérieur du bâtiment près des bureaux des employés. Ensuite, retour au bureau et vérification des journaux du serveur web !

Résultats de l'abandon de clés USB :

Malheureusement, aucun résultat n'a été observé sur les journaux du serveur, ce qui signifie que ni le dropper HTA ni le script PS1 n'ont été téléchargés. En effet, nous avons reçu un appel de notre contact dans l'entreprise, nous informant que les ports USB sont désactivés sur les ordinateurs portables de l'entreprise, et que la plupart des employés ont rendu les clés USB trouvées. Nous avons perdu pour ce scénario, mais il est temps de corser l'exercice !

Trophées : Aucun

Scénario 2 : Intrusion physique

Ok, l'abandon de clés USB a échoué, mais nous avons aussi des objectifs d'intrusion physique. Nous avons décidé de changer et d'explorer le rez-de-chaussée [nous passons les détails concernant la phase de reconnaissance]. De là, il y avait un grand patio, et derrière, nous pouvions accéder à une partie du bâtiment utilisée par les employés avec des bureaux et surtout des salles de formation (intéressant n'est-ce pas ?).

Plusieurs clés USB ont été abandonnées à cet endroit, à proximité des imprimantes et dans certaines salles de réunion.

Une fois toutes les clés abandonnées, nous avons décidé de poursuivre notre exploration afin de voir s'il y avait un moyen d'aller plus loin. Nous avons attendu un moment dans le patio, assis sur un banc juste en face des ascenseurs/escaliers des employés

L'avantage de choisir l'heure du déjeuner est que de nombreux employés sortent pour déjeuner et qu'ils reviennent à leur bureau. Après quelques minutes, nous avons repéré notre première cible, un employé avec un sandwich à la main qui semblait chercher son badge.

Nous avons donc décidé de nous lever et de commencer à le suivre. Après quelques secondes, il a trouvé son badge, a ouvert la porte menant aux escaliers et... nous a gentiment tenu la porte.

Comme nous ne savions pas exactement où se trouvait le bureau des membres du conseil (notre prochain trophée), nous avons ralenti en faisant semblant de chercher quelque chose dans notre sac, ce qui nous a permis de le laisser prendre un peu d'avance. Nous l'avons suivi jusqu'à l'étage où il allait, le premier.

Après avoir exploré l'étage, nous avons réalisé qu'il n'y avait que des bureaux d'employés et qu'aucun d'entre eux n'était membre du conseil d'administration.

De retour dans la cage d'escalier, nous avons continué notre exploration des étages. Une fois au 3e étage, le nombre de mesures de sécurité physique pour l'accès était plus important, un indice que nous devions être proches de notre but.

Au premier et au deuxième étage, nous avions pu accéder au couloir menant au bureau sans avoir besoin de carte d'accès. Par contre, pour accéder au troisième étage, il fallait une carte valide, et une caméra était également placée au-dessus de la porte.

Comme cet étage semblait plus intéressant que les autres, nous avons décidé de nous y attarder.

Selon le célèbre adage « keep it simple », la première technique que nous avons utilisée a été d'attendre un étage au-dessus. L'objectif était d'attendre qu'un employé vienne de cet étage, de descendre rapidement pendant que la porte se ferme, et de la retenir avant qu'elle ne se ferme complètement.

Cependant, après que le premier employé est sorti, nous avons réalisé que la porte se fermait trop vite, et avons donc décidé d'attendre et d'essayer une autre technique.

Après quelques minutes, nous avons entendu un employé qui semblait se diriger vers un étage spécifique.

Nous avons décidé d'y aller exactement au même moment que l'employé qui montait, et quand nous sommes arrivés à côté de lui, nous avons dit « oh mince, j'ai oublié mon badge ».

Pendant que la personne continuait son ascension, nous l'avons suivie et une fois de plus, elle nous a poliment tenu la porte.

Arrivés à cet étage, nous avons immédiatement repéré un interphone avec l'étiquette « direction » : nous étions proches de l'objectif !

Sur la base de ces informations, nous savions que nous étions au bon étage et nous savions également à quelle partie du bâtiment nous devions accéder.

La personne que nous suivions allait exactement là où nous voulions aller, mais il était très probable que les membres du conseil d'administration se connaissent tous. Pour éviter tout soupçon, nous sommes allés dans la direction opposée.

Il arrive que des bâtiments soient mal conçus et nous permettent de contourner certaines des mesures de sécurité physique en place, nous avons donc décidé d'explorer un peu plus l'étage.

Pour accéder à la partie droite de l'étage, il fallait également une carte d'accès, nous avons donc attendu qu'un employé sorte pour le suivre en utilisant la même approche que celle présentée précédemment.

L'exploration de cette partie du bâtiment n'a rien donné et le passage de la partie droite à la partie gauche nécessitant également une carte d'accès, nous avons dû nous résigner et revenir sur nos pas.

En revenant vers la porte de la direction, nous avons repéré une personne qui, cette fois, nous permettrait d'atteindre notre objectif. On a tendance à penser que les personnes ayant le plus haut niveau d'accès dans un bâtiment sont celles qui ont le plus haut niveau de responsabilité, mais c'est rarement le cas.

Les personnes disposant d'une carte d'accès leur permettant de se déplacer dans le bâtiment sont soit des agents de nettoyage, soit des hommes à tout faire, car ils doivent avoir un accès complet au bâtiment pour faire leur travail.

Heureusement, à ce moment-là, une femme de ménage nettoyait l'ascenseur. Nous avons sorti notre ordinateur portable, en le tenant d'une main, et lui avons demandé gentiment si elle pouvait nous ouvrir la porte :

Nous avons dû réparer une imprimante et malheureusement nous n'avons pas la possibilité d'ouvrir ce bâtiment »

Oui, pas de problème

Elle a ouvert la porte, et BINGO, cette fois nous étions dans la bonne partie du bâtiment !

Pour atteindre l'un de nos trophées, il suffisait d'entrer dans le bureau d'un membre du conseil.

De là, nous avions une vue sur chacun des bureaux fermés à travers une petite fenêtre à côté de la porte qui nous permettait de voir si les bureaux étaient occupés ou non.

La plupart des membres du conseil d'administration étaient dans leur bureau, seul l'un d'entre eux était fermé et n'avait pas de fenêtre, le bureau des présidents du conseil d'administration.

Notre objectif était à portée de main : nous avons décidé de tenter notre chance, nous avons donc frappé doucement à la porte du bureau... pas de réponse... nous avons ouvert la porte et ... personne à l'intérieur !

Nous sommes rapidement entrés, le temps de prendre quelques photos et de voler deux documents qui étaient présents sur le bureau, les avons mis dans notre sac, et avons quitté le bureau. Il était alors temps de sortir du bâtiment avec notre premier trophée : des documents sensibles avaient été exfiltrés avec succès du bureau du directeur du conseil d'administration !

Bien évidemment, les documents ont été rapportés dans l'heure qui a suivi, une fois le client informé que notre premier objectif avait été atteint.

Trophée : Accéder à et/ou exfiltrer un document confidentiel des membres du conseil : mission accomplie !

Rendez-vous au prochain chapitre pour de nouvelles aventures, dans la zone des salles de formation ?

Nos experts répondent à vos questions

Des questions sur un article ? Besoin de conseils pour trouver la solution qui répondra à vos problématiques ICT ?