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 (492 Worte)

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/

Remote Desktop per Powershell Remote aus der Ferne...
Programme und Code in Base64 und zurück konvertier...

Ähnliche Beiträge

 

Kommentare

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

Sicherheitscode (Captcha)