Tipps

Binärdaten in der Registry speichern mit Powershell

In den letzten beiden Artikeln habe ich gezeigt, wie man mit Powershell Binärdaten einlesen kann. Die eingelesenen Daten können auch in der Registry gespeichert werden, und zwar direkt binär oder Base64-codiert als String. Diese Beispiele stammen aus einem Webcast, den ich für die Firmat Netwrix unter dem Titel "Die Windows Registry als Angriffsvektor" am 2. Mai gehalten habe. Die Aufzeichnung kann man unter https://www.netwrix.com/webinars.html#featured anschauen. 

Um Daten direkt im Binärformat zu speichern, legen Sie einen neuen Registry-Wert mit dem Cmdlet New-Itemproperty an. Der Schlüssel (Ordner), in dem der Wert erzeugt werden soll, muß dafür existieren.

$FindExe = Get-Content -Path C:\Windows\System32\find.exe -Encoding Byte -Raw
$RegKey = New-Item -Path Registry::Hkey_local_machine\SOFTWARE -Name NetzWeise
New-ItemProperty -Path $RegKey.PSPath -Name Find -Value $FindExe -PropertyType Binary

Um die Datei wieder als Exe-Datei zu speichern, lesen Sie den Schlüssel einfach aus. 

$FindBinaryData = (Get-ItemProperty -Path Registry::Hkey_Current_User\SOFTWARE\NetzWeise -Name Find).Find
Set-Content -Value $FindExe -Path c:\temp\find.exe -Encoding Byte

Alternativ können Sie auch die .net-Klasse IO.File verwenden (s. Binärdateien einlesen und Base64-Codieren mit Powershell)

Sie können die Binärdateien auch als Text speichern, indem Sie sie mit der Convert-Klasse ins Base64-Format konvertieren. 

$ExeToHide = "$env:Windir\System32\find.exe"
$Base64string = [Convert]::ToBase64String(( Get-Content -Path $ExeToHide -Raw -Encoding Byte ))
$key = New-ItemProperty -Path $RegKey.PSPath -Name FindasString -Value $base64string -PropertyType ExpandString

Die Rückkonvertierung findet dann mit der Methode FromBase64STring() aus der Convert-Klasse statt. 

$OutFile = "$env:Temp\HiddenCode.exe"
$Malware = ( Get-ItemProperty -Path $key.PSPath -Name FindAsString ).FindasString

Set-Content -Path $OutFile -Value ( [Convert]::FromBase64String( $MalWare )) -Encoding Byte

Um zu verhindern, dass die Textschlüssel zu groß werden, kann man den Base64-Code auch einfach auf mehrere Zeilen aufteilen. 

$key2 = New-Item -Path Registry::Hkey_Current_User\SOFTWARE\ -Name EvilNetzWeise
$ExeToHide = "$env:Windir\System32\find.exe"

$Base64string = [Convert]::ToBase64String(( Get-Content -Path $ExeToHide -Raw -Encoding Byte ), 'InsertLineBreaks' )
$NewString = $Base64string -split "`r`n"
For ( $i=0; $i -lt $NewString.Length; $i++ )
{
   $null = New-ItemProperty -Path $Key2.PsPath -Name $i -Value $NewString[$i] -PropertyType String
}

Hier wird der Parameter 'InsertLineBreaks' an die Methode ToBase64String() übergeben, der den Text alle 78 Zeichen umbricht. Der Zeilenumbruch wird kodiert mit CarriageReturn,Newfeed und in Powershell dargestellt als `r`n. Der -Split-Operator wird dann verwendet, um den Code an genau diesen Zeichen aufzubrechen. -Split erzeugt ein Array und entfernt die Trennzeichen, so dass wir am Ende für jeweils 78 Zeichen eine neue Zeile erhalten, die dann per For-Schleife in jeweils einen eigenen Registry-Wert geschrieben wird. 

Um die Daten wieder zusammenzuführen, brauchen die einzelnen Zeilen jetzt nur wieder aneinandergefügt zu werden. 

$Key2Properties = Get-Item -path $key2.PSPath
$EvilCode = For ( $i=0; $i -le $key2Properties.ValueCount-1 ; $i++ )
{
   ( Get-ItemProperty -Path $key2.PSPath -Name $i ).$i
}
Set-Content -Path $OutFile -Value ([Convert]::FromBase64String($EvilCode)) -Encoding Byte

Sie sehen also, dass es mit Powershell ein Kinderspiel ist, ausführbaren Code in der Registry abzulegen, so dass er keine Spuren auf der Festplatte hinterlässt. Sie haben natürlich Recht, wenn Sie anmerken, dass Ihr Virenscanner spätestens beim Speichern auf der Festplatte anschlägt, aber wer sagt denn, dass ein Programm auf der Festplatte liegen muß, um gestartet zu werden? https://powersploit.readthedocs.io/en/latest/CodeExecution/Invoke-ReflectivePEInjection/


 590,    08  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!