So verschlüsseln Sie PowerShell-Skripte
Eine Sammlung von PowerShell-Skripten, die in Ihrem Netzwerk gespeichert ist, birgt unweigerlich ein gewisses Risiko in sich. Ein Angreifer könnte beispielsweise eines Ihrer Skripts analysieren, um Einblick in die IT-Infrastruktur Ihres Unternehmens zu erhalten. Ebenso könnte ein Angreifer oder ein IT-Mitarbeiter Ihres Unternehmens, eine Änderung an einem vorhandenen Skript vornehmen, die allgemeine Probleme verursacht.
Inhaltsverzeichnis
Eine Möglichkeit, diese Risiken zu verringern, besteht darin, verschlüsselte PowerShell-Skripte zu erstellen. Ein verschlüsseltes Skript erfordert einen wesentlich höheren Aufwand zum Lesen oder Ändern als ein Skript im Klartext.
In diesem Artikel zeigen wir Ihnen, wie Sie ein solches Skript erstellen können.
Verschlüsseln des Originalskripts
Der erste Schritt beim Erstellen eines verschlüsselten PowerShell-Skripts besteht darin, eine Klartextversion des Skripts zu schreiben. Sobald Sie das Skript erstellt haben, sollten Sie es gründlich testen und die Skriptdatei umbenennen, sodass sie eine TXT-Dateierweiterung hat. In Abbildung 1 wurde ein einfaches "Hello World"-Skript erstellt, das als Textdatei namens HelloCode.txt gespeichert wurde.
Sie müssen Ihre Textdatei in PowerShell laden, den Inhalt der Datei verschlüsseln und den verschlüsselten Inhalt in eine Datei schreiben. Im Folgenden finden Sie einige Befehle zum Lesen, Verschlüsseln und Ausgeben des Codes, der derzeit in der Textdatei enthalten ist:
$Text = Get-Content C:\CMD\HelloCode.txt
$TextSecure = ConvertTo-SecureString $Text -AsPlainText -Force
$EncryptedText = ConvertFrom-SecureString -SecureString $TextSecure
$EncryptedText | Out-File -FilePath C:\CMD\HelloEncrypted.txt
In diesem Codeblock erstellen wir eine Variable namens $Text, die den unverschlüsselten Inhalt der Textdatei enthält. Als Nächstes wandeln wir die Skriptdatei in eine sichere Zeichenfolge um und speichern ihren Inhalt in einer Variablen namens $TextSecure. An diesem Punkt behandeln wir die Textdatei im Wesentlichen wie ein Klartextpasswort. Die dritte Codezeile wandelt die Daten der sicheren Zeichenfolge in einen verschlüsselten Wert um. In der letzten Codezeile werden die verschlüsselten Daten in eine Textdatei namens HelloEncrypted.txt geschrieben.
Abbildung 1 veranschaulicht diese Schritte. In der Abbildung wurden einige zusätzliche Zeilen eingefügt, in denen der Inhalt der Variablen $Text, $TextSecure und $EncryptedText ausgeben wird, damit Sie genau sehen können, wofür diese Variablen verwendet werden. Zusätzlich wurde auch den Inhalt der Datei HelloEncrypted.txt ausgegeben, damit Sie ihn sehen können.
Einfügen des verschlüsselten Codes in PowerShell
Nun, da wir das ursprüngliche Skript verschlüsselt haben, haben wir die erste Hälfte des Prozesses abgeschlossen. Leider können wir nicht einfach verschlüsselten Code in PowerShell einfügen und erwarten, dass er ausgeführt wird. Zusätzlich zum Einfügen des verschlüsselten Codes in ein Skript müssen wir eine Reihe von Befehlen einfügen, die PowerShell mitteilen, wie der Code entschlüsselt werden soll.
Hier ist der Code:
$Code = "01000000d08c9ddf0115d1118c7a00c04fc297eb010000000d59683f0d508b4da7577e9bc541c9ea000000000200000000001066000000010000200000006ced0f7e8d0505aac0cb7348b0edce750143ddca56b1a0adacff2b46027a9c3d000000000e80000000020000200000004993a6de0a370418a1b37d3bbfec6825ab10d3e1ee3d44f5a490dbc77632de6f400000007c252282843703447ec0fb834b7b46e477d66efb2eb89c68bd0e3e9ee10494a5607a878271dfbf1ae210050d51963b976a3342a09e53e81b1c12297562a795bf40000000cae3bd6c8e7d8be3db1fe31f1421474995fb54aea7e40f0f2aa727402e92f95092d743e1bd8a350f92ded5ebae16b466a6dad2f28f1bda92c5a7bafdd259e5a9"
$DecryptText = $Code | ConvertTo-SecureString
$Text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($DecryptText))
Invoke-Expression $Text
Die erste Anweisung schreibt den verschlüsselten Code in eine Variable namens $Code. Als Nächstes erstellen wir eine Variable namens $DecryptText, wandeln den verschlüsselten Code in eine sichere Zeichenfolge um und schreiben das Ergebnis in die Variable $DecryptText. Von dort aus wird die endgültige Entschlüsselung durch einen Aufruf von .NET durchgeführt. Der entschlüsselte Code wird in eine Variable namens $Text geschrieben. Anschließend können wir das Cmdlet "Invoke-Expression" verwenden, um den Code auszuführen.
In Abbildung 2 wurden die oben aufgeführten Anweisungen manuell eingegeben. Dabei wurde auch den Inhalt der Variablen "$DecryptText" und "$Text" ausgegeben, damit Sie beobachten können, wie der Entschlüsselungsprozess funktioniert.
Das Fazit ist, dass der gesamte im obigen Beispiel gezeigte Code in ein PowerShell-Skript eingebettet und unverändert verwendet werden kann. Durch die Verschlüsselung ist es nahezu unmöglich zu erkennen, wofür das Skript gedacht ist, ohne es tatsächlich auszuführen. Sie verhindert auch, dass jemand Änderungen am Skript vornimmt, da jede nicht autorisierte Änderung die verschlüsselte Zeichenfolge beschädigen würde.
Hinweise zur PowerShell-Verschlüsselung
Sie können dieselbe Technik verwenden, um sichere Kennwortdateien zu entschlüsseln, die von PowerShell (mit Get-Credential) erstellt wurden. Da Kennwortdateien entschlüsselt werden können, ist es immer wichtig, daran zu denken, dass sie an einem sicheren Ort gespeichert werden müssen.
Das Beispiel, welches oben verwendet wurde, beinhaltete ein sehr einfaches Skript. Wenn Sie versuchen würden, ein längeres, komplexeres Skript zu verschlüsseln, müssten Sie möglicherweise eine Schleife einrichten, um die entschlüsselten Anweisungen nacheinander zu lesen und auszuführen - anstatt zu versuchen, das Ganze mit einer einzigen Invoke-Expression-Anweisung auszuführen.