Tipps

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/.

 


 560,    09  Mai  2019 ,   Tipp
Holger Voges

  E-Mail Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!

Holger Voges ist Inhaber der Firma Netz-Weise IT-Training und seit 1999 als Trainer und Consultant tätig. Als Allrounder in den Bereichen Windows Server, Active Directory, SQL Server, Hyper-V und Windows PowerShell, hat er in der Vergangenheit zahlreiche Einsätze als Consultant in namenhaften Firmen absolviert und so neben der Theorie auch umfangreiche praktische Erfahrungen gesammelt.

 

Netz-Weise

Das Haupt-Tätigkeitsfeld von Netz-Weise sind Schulungen für Profis. Bei uns bekommen Sie das Programm für den fortgeschrittenen Praktiker, der die Tiefen des Systems ausloten möchte genauso wie Standard-Schulungen.

So erreichen Sie uns:

Netz-Weise
IT-Training und Beratung
Freundallee 13a
30173 Hannover
 
Tel: (0511) 165 925-0
Fax: (0511) 165 925-99
email: info(at)netz-weise.de
 

Newsletter bestellen

Das Wichtigste kompakt ins E-Mailfach!