Netz-Weise Logo

Weisheiten - der Netz-Weise Blog

Hier finden Sie Tipps und Tricks für vor, während und nach der Schulung.
2 Minuten Lesezeit (326 Worte)

Programme und Code in Base64 und zurück konvertieren und ausführen mit Powershell

Base64 ist ein Format, das es erlaubt, Binärdaten als Text darzustellen. Den Zweck von Base64 habe ich bereits im Artikel Binärdateien einlesen und Base64-Codieren mit Powershell beschrieben. Eine sehr gute und ausführliche Beschreibung finden Sie außerdem bei Wikipedia.

Das Umwandeln von Binärdaten in Text ist im Powershell-Kontext aus mehreren Gründen spannend. Zum Einen kann man mit Base64 ausführbare Programme in einem Skript mitliefern, ohne sie als eigenständige Dateien mitliefern zu müssen. Zum Anderen kann Powershell Base64-kodierten Code direkt ausführen, indem man die Powershell.exe mit dem Parameter -encodedCommand aufruft.

Lesen Sie zuerst die Datei ein, die in Text umgewandelt werden soll. Hierfür verwenden Sie entweder das Powershell-Cmdlet Get-Content mit dem Parameter -Encoding Byte und -Raw, oder Sie benutzen die Powershell-Klasse [IO.File]:

$BinaryData = Get-Content -Path C:\Tools\Drivesnapshot64.exe -Encoding Byte -Raw
# Alternativ:
$BinaryData = [IO.File]::ReadAllBytes('C:\Tools\Drivesnapshot64.exe')

Der Parameter -Raw sorgt dafür, dass die Datei komplett und nicht zeilenweise eingelesen wird, -Encoding Byte sagt Powershell, dass es sich um eine Binärdatei handelt. 

Die Konvertierung findet mit der [Convert]-Klasse aus dem .Net-Framework statt. Die Methode ToBase64string() wandlet die Binärdaten in Text um:

$base64string = [Convert]::ToBase64String($BinaryData)

Zurückschreiben können Sie die Daten mit Set-Content oder der Methode WriteAllBytes():

$BinaryData = [Convert]::FromBase64String($base64string)
Set-Content -Value $BinaryData -Path 'C:\Temp\Snapshot.exe' -Encoding Byte
# Alternativ
[IO.File]::WriteAllBytes('C:\Temp\Snapshot.exe', [Convert]::FromBase64String($base64string))

Um einen Powershell-Befehl zu kodieren, wandeln Sie ihn zuerste in Unicode um. Das geht mit der Klasse [System.Text.Encoding]. 

$code = 'Write-Warning "Ich bin versteckter Code"'
$UTFCode = [System.Text.Encoding]::Unicode.GetBytes($code)
$Base64Code = [Convert]::ToBase64String($UTFCode)

Das kodierte Kommando ist jetzt vollkommen unverständlich:

VwByAGkAdABlAC0AVwBhAHIAbgBpAG4AZwAgACIASQBjAGgAIABiAGkAbgAgAHYAZQByAHMAdABlAGMAawB0AGUAcgAgAEMAbwBkAGUAIgA=

Aber Powershell kann es trotzdem ausführen.

Powershell.exe -EncodedCommand $Base64Code
WARNUNG: Ich bin versteckter Code

Das ist nicht ungefährlich, weil ein Base64-codierte Schadcode nicht als solcher zu erkennen ist. Mit AMSI (Anti Malware Scan Interface) eine Schnittstelle geschaffen, die es Virenscanner erlaubt, auf den auszuführenden Code zuzugreifen, und nicht auf den übergebenen Textwert. Die gleiche Funktion macht sich übrigens auch Powershell Skriptblocklogging zunutze, um ausgeführen Code im Eventlog anzuzeigen, und nicht den an Powershell übergebenen sinnlosen Aufruf. Mehr zu AMSI finden Sie unter https://blogs.technet.microsoft.com/poshchap/2015/10/16/security-focus-defending-powershell-with-the-anti-malware-scan-interface-amsi/.

 

Binärdaten in der Registry speichern mit Powershel...
Binärdateien einlesen und Base64-Codieren mit Powe...

Ähnliche Beiträge

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Bereits registriert? Hier einloggen
Montag, 20. Mai 2024

Sicherheitscode (Captcha)