18.11.2019 13:37
Powershell ConstrainedLanguage Mode
Gastbeitrag vom milCERT - Philipp Thaller und Stefan Bachmair
Bei der Analyse von aktueller Malware stellte sich heraus dass viele der aktuellen Exemplare (inkl. Emotet ) auf die PowerShell angewiesen sind um ihr schadhaftes Potential entfalten zu können. Schränkt man die PowerShell entsprechend ein, ist eine Ausführung des eigentlichen Schadcodes oft gar nicht möglich. Der von Microsoft Windows offiziell bereit gestellte „ConstrainedLanguage Mode" erscheint daher als sehr geeignet um einen wenig invasiven und trotzdem erhöhten Schutz vor PowerShell basierter Schadsoftware zu bieten.
Beispiel an einem aktuellen Emotet Sample:
PowerShell befindet sich im Constrained Language Mode
PS C:\> $ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
Ausführen des extrahierten PowerShell Codes aus dem Emotet Word Dokument
PS C:\> powershell -enco JABWAHAAcwBrAHU[...gekürzt...]gAYwAnAA==
New-Object : Der Typ kann nicht erstellt werden. In diesem Sprachmodus werden nur Kerntypen unterstützt.
In Zeile:1 Zeichen:164
+ ... skhyjxb';$Eqwymdbgwfpn=.('ne'+'w-'+'obj'+'ect') nET.WEBClIent;$Cqngij ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (:) [New-Object], PSNotSupportedException
+ FullyQualifiedErrorId : CannotCreateTypeConstrainedLanguage,Microsoft.PowerShell.Commands.NewObjectCommand
Emotet wollte hier über den Befehl New-Object und dem Objekttyp Net.WebClient die Second Stage Schadsoftware nachladen und ausführen, das wurde jedoch abgelehnt weil Net.WebClient sich nicht in der Whitelist der erlaubten Objekttypen befindet. Damit wäre die Infektion des Systems verhindert worden.
Weitere bekannte und verifizierte Beispiele bei denen der ConstrainedLanguage Mode schützen kann ist der Banking Trojaner "Ursnif" sowie fileless Malware wie „Rozena“. Dieser Modus ist natürlich kein 100%iger Schutz vor PowerShell Schadsoftware, verkleinert dessen Angriffsfläche jedoch deutlich.
Aktiviert werden kann der Modus auf mehreren Varianten: Applocker, DeviceGuard, Registry Key oder Umgebungsvariablen. Wichtig dabei ist vorab zu testen ob etwaige Custom Scripts die im Benutzerkontext laufen kompatibel sind bzw. ob Ausnahmen notwendig sind. Zusätzlich sollte man noch darauf achten, dass der Modus auch wirklich auf alle PowerShell Sessions des Benutzers angewendet werden nachdem jede PowerShell Session mit dieser Option gestartet werden muss, Default ist sonst der FullLanguage Mode.
Setzen des Modes
Language Mode auf Constrained in aktueller Session ändern:
PS C:\> $ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"
PS C:\> $ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
Dauerhaftes setzen per Umgebungsvariable __PSLockdownPolicy = 4
In powershell als admin ausführen:
[Environment]::SetEnvironmentVariable(‘__PSLockdownPolicy‘, ‘4’, ‘Machine‘)
Das wird aber erst bei neuen Sessions wirksam.