Auto élévation de privilèges en PowerShell

élévation de privilèges en PowerShell

Salut à tous, aujourd’hui on va s’intéresser au RunAs dans PowerShell, et plus particulièrement comment faire une élévation de privilèges en PowerShell. J’ai récemment eu besoin de distribuer un script à quelques utilisateurs, tous administrateur local de leur poste, pour qu’ils l’exécutent en tant qu’admin.

Je vous passe les détails, mais comme il n’y avait pas que des utilisateurs avancés en PowerShell, il me fallait un mode « clic-clic un peu propre » pour qu’ils lancent le script via un batch à la souris.

D’autant plus que le script jardine dans le registre et les fichiers système tout en utilisant des paramètres interactifs, en chemin relatif (puisqu’on ne sait pas où sur le poste nos utilisateurs vont exécuter le livrable). Et le tout sur des configuration de postes sécurisés qui ne me laissaient pas faire ce que je voulais via le traditionnel runas.exe.

Le diable est dans les détails… J’ai galéré un moment pour trouver un enchainement propre de mon .cmd et du .ps1, qui permet de s’affranchir des problématiques de chemin de fichiers, sans utiliser runas.exe.

Au final je m’en suis sortie comme ça.

Reconstruction du chemin dans le script CMD

C’est la partie la plus simple, vous remplissez une variable avec le rrépertoire courant. Dans le cas d’un double clic sur un exécutable batch « .cmd », c’est le repertoire où il se trouve. Et ensuite vous utilisez cette variable pour reconstruire le full-path de votre script et ses fichiers de configuration à côté.

SET CURRENTDIR=%cd%
powershell.exe -File "%CURRENTDIR%\Get-Script.ps1" -ConfFile "%CURRENTDIR%\Conf.xml"
pause

Ça permet de s’affranchir des problématique d’environnement et de profil entre les différents utilisateurs qui devront exécuter le script.

Auto élévation de privilège en PowerShell

La deuxième partie, plus intéressante, consiste à gérer l’élévation de privilège directement dans le PowerShell. Pour cela, on va procéder ainsi :

  1. Tester si le compte qui exécute le script est administrateur
  2. Si oui, on continue.
  3. Sinon on relance le script avec les mêmes paramètres mais dans un PowerShell grâce à la cmd Start-Process avec l’option « -Verb RunAs » qui va permettre d’ouvrir l’UAC et de relancer le process avec les droits suffisants.

Dans le détail du code, ça donne ça pour tester si votre compte est administrator :

-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Et le lancement du processus via RunAs comme ça.

Start-Process powershell.exe "-File",('"{0}"' -f $MyInvocation.MyCommand.Path) -Verb RunAs

J’ai piqué cette syntaxe ici, j’ai beaucoup hésité à la réécrire avant de la proposé sur le site. Je la trouve peu élégante dans la mesure où elle est peu lisible à cause de l’utilisation implicite des options de Start-Process et surtout de l’opérateur « -f » qui finalement est peut utilisé par rapport à replace et aux expression régulières. L’intérêt du « -f » c’est ici c’est qu’il permet de placer les quotes de protection des paramètres facilement. Au final, je me suis dis que vous apprendriez surement un truc, du coup je l’ai laissé.

Bon voilà, donc à la fin le script complet ressemble à la structure ci dessous :

If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
    Start-Process powershell.exe "-File",('"{0}"' -f $MyInvocation.MyCommand.Path),"-ConfFile ",('"{0}"' -f $ConfFile) -Verb RunAs
}Else{
  Write-Verbose "I AM (Ps>)ROOT"
  Pour lancer un exe, c'est pas ici la doc : https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx
}

Et pour les bad boys ?

Notez au passage que le script vous fait splasher un jolie UAC bien propre comme il faut qui, ne permet pas de voler les credentials de l’utilisateur, a de bonnes chances d’être remplies correctement par un utilisateur peu vigilant. En mode attaquant, on pourrait imaginer une sorte de phishing à l’élévation de privilège. Faite tourner le script une fois par jour aléatoirement sur une machine victime ou vous savez que l’utilisateur est admin, avec un nom de script du genre « Support-$compagny-robot.ps1 » Je pense que vous avez de bonne chance de chopper un accès root sur le poste en attaque ciblé.

Voilà j’espère que ça vous aura intéressé et que maintenant vous savez comment réaliser proprement une élévation de privilèges en PowerShell. Moi en tout cas je me garde ce bout de code bien au chaud sur le blog car je compte bien m’en resservir à l’occasion. @+

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.