{"id":96,"date":"2020-11-01T18:44:20","date_gmt":"2020-11-01T17:44:20","guid":{"rendered":"http:\/\/theredwindows.net\/?p=96"},"modified":"2021-08-13T18:53:50","modified_gmt":"2021-08-13T16:53:50","slug":"powershell","status":"publish","type":"post","link":"https:\/\/theredwindows.net\/index.php\/2020\/11\/01\/powershell\/","title":{"rendered":"PowerShell"},"content":{"rendered":"\n<p>PowerShell est un langage tr\u00e8s puissant, qu\u2019il s\u2019agisse de Red Team ou bien d\u2019administration. PowerShell est un incontournable de la s\u00e9curit\u00e9 et m\u00eame de l\u2019univers Microsoft Windows.<\/p>\n\n\n\n<h3>Historique<\/h3>\n\n\n\n<p>PowerShell a \u00e9t\u00e9 initialement publi\u00e9 en Novembre 2006, il \u00e9tait alors qu\u2019\u00e0 ses d\u00e9buts, tr\u00e8s peu de fonctionnalit\u00e9 pour cette premi\u00e8re version mais qui a n\u00e9anmoins pos\u00e9e les bases. Il fut inclus avec Windows XP, Windows Vista, ainsi que Windows Server 2003. Etrangement il \u00e9tait un composant optionnel pour Windows Server 2008. La version 2 de PowerShell est sortie en Octobre 2008 incluant plusieurs nouvelles options comme le &#8220;PSRemoting&#8221;, les modules, PowerShell ISE (qui est un IDE pour PowerShell), les fonctions avanc\u00e9es, des nouveaux op\u00e9rateurs, les commentaires sur plusieurs lignes et bien d\u2019autres. C\u2019est \u00e0 partir de cette version que PowerShell est inclus par d\u00e9faut dans toutes les solutions Microsoft. PowerShell 3.0 (Septembre 2012) n\u2019a pas apport\u00e9 \u00e9norm\u00e9ment de nouveaut\u00e9s (d\u00e9tection des cmdlets appartenant \u00e0 des modules m\u00eame quand ces derniers ne sont pas charg\u00e9s, pour PowerShell ISE une meilleure autocompl\u00e9tions gr\u00e2ce \u00e0 &#8220;l&#8217;intellisense&#8221;), il est d\u00e9sormais install\u00e9 par d\u00e9faut sur Windows 8 ainsi que Windows Server Server 2012. Apr\u00e8s la version 4 (2013), 5 (2016), Microsoft publiera pour la derni\u00e8re fois PowerShell 5.1 (2017), avant d\u2019en faire un syst\u00e8me multiplateforme et &#8220;Open Source&#8221; avec la version 6.0. PowerShell en est aujourd\u2019hui \u00e0 la version 7.0.3 et <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/PowerShell\/PowerShell\" data-type=\"URL\" data-id=\"https:\/\/github.com\/PowerShell\/PowerShell\" target=\"_blank\">disponible sur github ici<\/a>.<\/p>\n\n\n\n<h3>Fonctionnement<\/h3>\n\n\n\n<p>Le c\u0153ur de PowerShell est bas\u00e9 sur la <code>dll<\/code> <code>System.Management.Automation<\/code>. Cette derni\u00e8re d\u00e9finit la tr\u00e8s grande majorit\u00e9 du fonctionnement des commandes. En PowerShell une commande est appel\u00e9e cmdlet et est la contraction de commandlet (en fran\u00e7ais, applet de commande). Ces derni\u00e8res sont enti\u00e8rement programm\u00e9es en C#, et tous les outils n\u00e9cessaires pour en programmer sont situ\u00e9s dans la m\u00eame <code>dll<\/code>. Elles poss\u00e8dent une structure syntaxique en 2 parties (sans compter les \u00e9ventuelles arguments), le verbe: qui d\u00e9termine le type d\u2019action \u00e0 mener (usuellement ils sont class\u00e9s par cat\u00e9gories: <code>Security<\/code>, <code>Data<\/code>, <code>Common<\/code>, <code>Lifecycle<\/code>, <code>Communications<\/code>, <code>Diagnostic<\/code>, <code>Other<\/code>), et le nom qui indique ce sur quoi l\u2019action sera men\u00e9e. Pour avoir une liste des verbes disponibles, une cmdlet y est toute destin\u00e9e <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Verb<\/code><\/code>. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"616\" height=\"762\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Verb.png\" alt=\"\" class=\"wp-image-97\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Verb.png 616w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Verb-243x300.png 243w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Verb-400x495.png 400w\" sizes=\"(max-width: 616px) 100vw, 616px\" \/><\/figure>\n\n\n\n<p>Par exemple prenons la cmdlet <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Process<\/code><\/code>, il facile de comprendre que le r\u00e9sultat de la commande sera une liste des processus qui sont actuellement en cours d&#8217;ex\u00e9cution. Bien que le syst\u00e8me de &#8220;commandlet&#8221; peut s&#8217;av\u00e9rer pratique pour les retenir, pour certaines, il existe des alias qui permettent d\u2019une part de plus facilement les m\u00e9moriser, mais aussi de pouvoir plus ais\u00e9ment transitionner d\u2019un environnement &#8220;bash\/zsh\/sh&#8221; vers PowerShell. Pour obtenir la liste d\u2019alias disponible, <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Alias<\/code><\/code> est la commande \u00e0 utiliser. Il y est possible de retrouver <code>ls<\/code>, <code>cd<\/code>, <code>pwd<\/code> et bien d\u2019autres qui vous seront assur\u00e9ment famili\u00e8res. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"791\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Alias-1024x791.png\" alt=\"\" class=\"wp-image-98\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Alias-1024x791.png 1024w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Alias-300x232.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Alias-768x593.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Alias-400x309.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Alias-800x618.png 800w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/Alias.png 1144w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Attention cependant, il est impossible d\u2019utiliser les m\u00eames arguments (exemple: <code>ls -ail<\/code> en PowerShell sera <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">ls -force<\/code><\/code>). <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"944\" height=\"430\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/ArgsLinuxPwsh.png\" alt=\"\" class=\"wp-image-99\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/ArgsLinuxPwsh.png 944w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/ArgsLinuxPwsh-300x137.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/ArgsLinuxPwsh-768x350.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/ArgsLinuxPwsh-400x182.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/ArgsLinuxPwsh-800x364.png 800w\" sizes=\"(max-width: 944px) 100vw, 944px\" \/><\/figure>\n\n\n\n<p>Le fonctionnement d\u2019une cmdlet repose sur 3 diff\u00e9rentes parties, <code>BeginProcessing<\/code> (th\u00e9oriquement cette m\u00e9thode permet d\u2019initialiser les diff\u00e9rents objets dont la fonction\/cmdlet peut avoir besoin), <code>ProcessRecord <\/code>(Il s\u2019agit du c\u0153ur des instructions de la cmdlet), <code>EndProcessing<\/code> (th\u00e9oriquement cette partie sert \u00e0 retourner, ou nettoyer apr\u00e8s l\u2019ex\u00e9cution d\u2019une cmdlet), certaines cmdlets permettent une d\u00e9finition similaire de bloc de contr\u00f4le, c\u2019est le cas de <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">ForEach-Object<\/code><\/code> avec les arguments <code>-Begin<\/code>, <code>-Process<\/code> et <code>-End<\/code> (ces derniers doivent \u00eatre suivis de &#8220;scriptblock&#8221;), enfin lors de la cr\u00e9ation de fonction avanc\u00e9e (fonction qui simule un comportement d&#8217;une cmdlet), ces blocs apparaissent sous la forme suivante: <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">BEGIN{}<\/code><\/code>, <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">PROCESS{}<\/code><\/code>, <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">END{}<\/code><\/code>. Contrairement aux environnements &#8220;Linux\/OpenBSD&#8221; et le &#8220;CMD&#8221;, la &#8220;pipe&#8221; de PowerShell a un comportement quelque peu diff\u00e9rent. En effet, elle ne passe pas une cha\u00eene de caract\u00e8re repr\u00e9sentative de la sortie de la commande. Ici elle passera l&#8217;objet entier ainsi que les donn\u00e9es qui y sont associ\u00e9es: <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Process | % {$_.GetType()<\/code><\/code>}. Le r\u00e9sultat de <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Process<\/code><\/code> est envoy\u00e9 au travers d\u2019une pipe, puis utilis\u00e9 dans <code>ForEach-Object<\/code> (qui est une boucle <code>foreach<\/code> qui attend une entr\u00e9e par une <code>pipe<\/code>), une variable est cr\u00e9\u00e9e automatiquement \u00e0 cette occasion <code>$_<\/code>, enfin la m\u00e9thode <code>.GetType()<\/code> permet de donner le type.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"821\" height=\"184\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/PipeLine.png\" alt=\"\" class=\"wp-image-103\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/PipeLine.png 821w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/PipeLine-300x67.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/PipeLine-768x172.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/PipeLine-400x90.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/PipeLine-800x179.png 800w\" sizes=\"(max-width: 821px) 100vw, 821px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"885\" height=\"170\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/WithoutPipe.png\" alt=\"\" class=\"wp-image-104\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/WithoutPipe.png 885w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/WithoutPipe-300x58.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/WithoutPipe-768x148.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/WithoutPipe-400x77.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2020\/10\/WithoutPipe-800x154.png 800w\" sizes=\"(max-width: 885px) 100vw, 885px\" \/><\/figure>\n\n\n\n<p>PowerShell est un langage orient\u00e9 objet, dont les types sont les m\u00eames que ceux en .NET. Il y a donc une tr\u00e8s forte interaction entre le Framework .NET et PowerShell, ce qui permet plusieurs choses:<\/p>\n\n\n\n<ul><li>utiliser les classes et <code>namespace<\/code> les plus communs (par extension charg\u00e9 n\u2019importe quel &#8220;bytecode&#8221; C#, gr\u00e2ce \u00e0 l\u2019espace de nom <code>System.Reflection<\/code>).<\/li><li>ajouter des types C# directement en runtime avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Add-Type<\/code><\/code>, pour les utilisations les plus commune.<\/li><\/ul>\n\n\n\n<p>L\u2019ex\u00e9cution de commande ou de script dans PowerShell passe par la cr\u00e9ation d\u2019objets d\u00e9j\u00e0 mentionn\u00e9s, les &#8220;scriptblock&#8221;, ils sont constitu\u00e9s d\u2019accolades de part et d\u2019autres et peuvent contenir n\u2019importe quel code PowerShell. Ces derniers sont invoqu\u00e9s avec la m\u00e9thode <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">.Invoke()<\/code><\/code>. <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># invocation d'un scriptblock \n{Get-ChildItem | % {$_.Name}}.Invoke()\n# utilisation de System.Management.Automation.PowerShell\n$powershell = [powershell]::Create()\n$powershell.AddScript('Get-ChildItem | % {$_.Name}')\n$powershell.Invoke()<\/pre>\n\n\n\n<p>Une fois la commande ou le script ex\u00e9cut\u00e9s, toute donn\u00e9e ou trace de son passage est oubli\u00e9e, pour palier \u00e0 cela, il existe les <code>RunSpaces<\/code> qui permettent de cr\u00e9er une session pour maintenir une persistance des variables ou fonctions inject\u00e9es dans la m\u00e9moire. Il est possible d&#8217;utiliser PowerShell sans PowerShell, en utilisant la <code>dll<\/code> <code>System.Management.Automation<\/code> dans un code C#. Par exemple:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Management.Automation; \nusing System.Management.Automation.Runspaces;\n \nnamespace CustomPowerShell\n{\n        class Program\n\t{\n\t\tpublic static void Main(string[] args)\n\t\t{\n                        Runspace runspace = RunspaceFactory.CreateRunspace();\n                        runspace.Open();\n                        RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);\n                        Pipeline pipeline = runspace.CreatePipeline();\n                        pipeline.Commands.AddScript(\"ls -force\");\n                        pipeline.Commands.Add(\"Out-Default\");\n                        pipeline.Invoke();\n                 }\n        }\n}<\/pre>\n\n\n\n<p>Comme vous pouvez le constater, le code C# ressemble un peu au deuxi\u00e8me exemple d&#8217;ex\u00e9cution de &#8220;scriptblock&#8221; avec PowerShell.<\/p>\n\n\n\n<h3>S\u00e9curit\u00e9<\/h3>\n\n\n\n<p>Au vue de l\u2019\u00e9volution des m\u00e9thodologies d\u2019attaques sur PowerShell, beaucoup de s\u00e9curit\u00e9 a progressivement \u00e9t\u00e9 mise en place autour de notre ami. On note par exemple depuis PowerShell v3 l\u2019impl\u00e9mentation du <code>module logging<\/code>, c\u2019est une protection rudimentaire qui permet d\u2019enregistrer les diff\u00e9rents \u00e9v\u00e9nements d\u2019ex\u00e9cution de commande, l\u2019enregistrement partiel des sorties et des donn\u00e9es d\u2019entr\u00e9es, ainsi que l\u2019ex\u00e9cution des scripts. PowerShell v4 introduit le <code>script block logging<\/code>, ce dernier est une forme \u00e9volu\u00e9e du premier, il enregistre chaque bloc d&#8217;ex\u00e9cution, et propose dans les journaux d&#8217;\u00e9v\u00e9nement un rapport d\u00e9taill\u00e9 avec le r\u00e9sultat et les entr\u00e9es de la commande. PowerShell v5 impl\u00e9mente toutes les d\u00e9fenses modernes qu\u2019il existe autour de PowerShell (<a rel=\"noreferrer noopener\" href=\"https:\/\/devblogs.microsoft.com\/powershell\/powershell-the-blue-team\/\" data-type=\"URL\" data-id=\"https:\/\/devblogs.microsoft.com\/powershell\/powershell-the-blue-team\/\" target=\"_blank\">PowerShell &lt;3 BlueTeam<\/a>) mise en place du &#8220;Transcript&#8221; qui enregistre chaque commande entr\u00e9e dans PowerShell, (si activ\u00e9e, la cl\u00e9 de registre <code>EnableTranscripting<\/code> de chemin <code>HKLM:\\Software\\Policies\\Microsoft\\Windows\\PowerShell\\Transcription<\/code> est \u00e9gal \u00e0 1, il est possible de sp\u00e9cifier dans les registres le fichier de sorties, <code>OutputDirectory<\/code>). Introduction au <code>DeepScriptBlockLogging<\/code> la diff\u00e9rence majeure avec la pr\u00e9c\u00e9dente version est que cette fois-ci m\u00eame si l\u2019appel est offusqu\u00e9, \u00e9tant donn\u00e9 qu\u2019il enregistre chaque phase, la commande sera donc logg\u00e9 enti\u00e8rement. Pour d\u00e9fendre au mieux les implants via PowerShell (enti\u00e8rement en PowerShell ou l\u2019utilisant comme support pour ex\u00e9cuter du .NET en m\u00e9moire), il est cr\u00e9\u00e9e l\u2019AMSI (<code>AntiMalware ScanInterface<\/code>) qui permet de faire valider une commande avant son ex\u00e9cution par un antivirus (Defender ou autre). Une autre lourde protection est la possibilit\u00e9 de changer le <code>LangageMode<\/code> pour restreindre au maximum l\u2019utilisation de PowerShell. Plusieurs contournements existent autour de ces solutions que nous verrons dans un futur article.<\/p>\n\n\n\n<h3>Quelques Cmdlets<\/h3>\n\n\n\n<ul><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Write-Host<\/code><\/code> permet d\u2019afficher un message. On peut en changer la couleur et le fond avec les param\u00e8tres <code>-ForeGroundColor<\/code> et <code>-BackGroundColor<\/code>.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Write-Verbose<\/code><\/code> permet d\u2019afficher un message dans une fonction uniquement si le param\u00e8tre <code>-Verbose<\/code> est pr\u00e9sent, \u00e9galement pour <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Write-Debug<\/code><\/code>.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Process<\/code><\/code> permet d\u2019acc\u00e9der aux diff\u00e9rents processus en cours.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Service<\/code><\/code> permet d\u2019acc\u00e9der aux diff\u00e9rents services.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-ComputerInfo<\/code><\/code> permet d\u2019obtenir des informations sur le syst\u00e8me local.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-ChildItem<\/code><\/code> permet de lister un dossier.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Set-Location<\/code><\/code> permet de changer de dossier.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Location<\/code><\/code> permet d\u2019obtenir le chemin actuel.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-PSDrive<\/code><\/code> permet d\u2019obtenir les &#8220;PSDrives&#8221; actuellement mont\u00e9s.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">New-PSDrive<\/code><\/code> permet de monter un &#8220;PSDrive&#8221;.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Where-Object<\/code><\/code> permet d\u2019appliquer une condition et d\u2019en ressortir les \u00e9l\u00e9ments la remplissant.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">New-Object<\/code><\/code> permet la cr\u00e9ation d\u2019objet .NET en indiquant au choix le type ou le chemin.<\/li><li><code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Sort-Object<\/code><\/code> permet de trier les objets selon certains ordres ou arrangements pass\u00e9 en argument comme <code>-Unique<\/code> qui permet de filtrer les propri\u00e9t\u00e9s et les retournes uniquement une seule fois.  <\/li><\/ul>\n\n\n\n<p>En combinant ces cmdlets et des &#8220;pipelines&#8221; il est possible de faire des choses tr\u00e8s complexes avec une seule ligne.<\/p>\n\n\n\n<h3>Astuces<\/h3>\n\n\n\n<p>Plusieurs astuces et ont \u00e9t\u00e9 mises \u00e0 disposition pour faciliter la vie des programmeurs. Les commentaires par exemple sont cr\u00e9\u00e9s pour une ligne avec <code>#<\/code> sur plusieurs il faut utiliser la structure <code>&lt;# #><\/code>. Les chemins vers les types .NET sont parfois long, pour les raccourcir il existe les acc\u00e9l\u00e9rateurs de types, par exemple <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">[System.Management.Automation.PSCredential]<\/code><\/code> poss\u00e8de un acc\u00e9l\u00e9rateur de type <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">[PSCredential]<\/code><\/code> vous pouvez trouver une liste d\u2019acc\u00e9l\u00e9rateur de type <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.core\/about\/about_type_accelerators?view=powershell-5.1\" data-type=\"URL\" data-id=\"https:\/\/docs.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.core\/about\/about_type_accelerators?view=powershell-5.1\" target=\"_blank\">ici<\/a>. A propos des <code>PSCredential<\/code>, ces derniers permettent l\u2019utilisation d\u2019identifiants alternatifs pour l\u2019action de la cmdlet (g\u00e9n\u00e9ralement ils sont attendus avec le param\u00e8tre <code>-Credential<\/code>), coupl\u00e9s avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Start-Process<\/code><\/code>, ils peuvent se transformer en un <code>runAs<\/code> tr\u00e8s puissant et naturel. Il existe plusieurs mani\u00e8res de d\u00e9finir un <code>PSCredential<\/code>: la cmdlet <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-Credential<\/code><\/code> peut \u00eatre utilis\u00e9 dans ce but, une interface graphique demandera les identifiants, cette m\u00e9thode est pratique pour du Scripting, mais peu int\u00e9ressante lors de manipulation sans ce genre d\u2019interface ou n\u00e9cessitant une automatisation plus importante, un <code>PSCredential <\/code>\u00e0 besoin d\u2019un <code>SecureString<\/code>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$pass = ConvertTo-SecureString -AsPlainText -Force \"passw0rd\"\n$cred = New-Object System.Management.Automation.PSCredential -ArgumentList \"domain\\user\",$pass\nStart-Process powershell.exe -Credential $cred<\/pre>\n\n\n\n<p>Si l\u2019article vous a plu je vous invite \u00e0 aller regarder la s\u00e9rie sur la programmation avec PowerShell.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PowerShell est un langage tr\u00e8s puissant, qu\u2019il s\u2019agisse de Red Team ou bien d\u2019administration. PowerShell est un incontournable de la s\u00e9curit\u00e9 et m\u00eame de l\u2019univers Microsoft Windows. Historique PowerShell a \u00e9t\u00e9 initialement publi\u00e9 en Novembre 2006, il \u00e9tait alors qu\u2019\u00e0 ses d\u00e9buts, tr\u00e8s peu de fonctionnalit\u00e9 pour cette premi\u00e8re version mais qui a n\u00e9anmoins pos\u00e9e [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/96"}],"collection":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/comments?post=96"}],"version-history":[{"count":10,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/96\/revisions"}],"predecessor-version":[{"id":285,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/96\/revisions\/285"}],"wp:attachment":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/media?parent=96"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/categories?post=96"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/tags?post=96"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}