PowerShell protip 007f
in 𝕏

Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}';[Foo]::Main() - uruchom kod C# prosto z PowerShella

tty1 · powershell
PS> Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}';[Foo]::Main()
#PowerShell#CSharp#RedTeam#Magic

Cmdlet Add-Type pozwala nam zdefiniować klasę .NET (lub .NET Core) dla bieżącej sesji PowerShella, którą następnie możemy wykorzystywać. Domyślnym językiem programowania dla klasy jest C#, jednak można to zmienić za pomocą parametru -Language. Kod źródłowy podajemy w parametrze -TypeDefinition (co możemy skrócić do -t). W wyniku uruchomienia tego onelinera, otrzymamy:

PS C:\Users\drg> Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}';[Foo]::Main()
Ciekawe te protipy!
PS C:\Users\drg>

Oczywiście możemy to zapisać w bardziej czytelny sposób:

$code = @"
public class Foo {
    public static void Main() {
        System.Console.WriteLine("Ciekawe te protipy!");
    }
}
"@

Add-Type -TypeDefinition $code -Language CSharp
[Foo]::Main()

Kompilowanie do pliku wykonywalnego

Wykorzystując parametr -OutputAssembly możemy dokonać kompilacji do pliku wykonywalnego (np. .exe czy .dll). A zatem moglibyśmy wykonać coś takiego:

PS C:\Users\drg> Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}' -OutputAssembly foo.exe
PS C:\Users\drg> .\foo.exe
Ciekawe te protipy!
PS C:\Users\drg>

Polecam zapoznać się z manualem, ponieważ w ten sposób można kompilować zupełnie poważne programy.

Go deeper

Podczas takiej powiedzmy sobie niejawnej kompilacji, wykorzystywany jest domyślnie instalowany wraz z .NET kompilator csc.exe. Jeśli chcielibyście mieć na to niezbity dowód, możemy wykorzystać rejestrową sztuczkę z Debuggerem i ustawić Debugger dla csc.exe na przykład na calc.exe:

ni -f "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csc.exe" | sp -name Debugger -Value "calc.exe #"

Oczywiście, by dodać ten wpis musimy mieć uprawnienia administratora. Kiedy Debugger dla csc.exe jest zdefiniowany, kolejne wywołanie naszych przykładowych Add-Type nie zwróci oczekiwanych rezultatów, natomiast powinien uruchomić się kalkulator.

Więcej na ten temat przeczytasz w protipach 005d oraz 0008.

By posprzątać po sobie, możemy usunąć wartość Debugger dla csc.exe:

Remove-ItemProperty  "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csc.exe" -Name Debugger

lub usunąć cały element csc.exe:

Remove-Item  "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csc.exe"

Przydatne linki

learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/add-type dokumentacja cmdletu Add-Type web ↗ https://lolbas-project.github.io/lolbas/Binaries/Csc/ spojrzenie na csc.exe z punktu widzenia LOLBAS (Living Off The Land Binaries, Scripts and Librariess web ↗
← poprzedni protip 007e ••• Wszystkie protipy następny → protip 0080
// subskrybuj

Nowe protipy prosto na maila.

Mięsiste jednolinijkowce i triki z prawdziwych zleceń. Zero spamu, zero teorii. Wypisujesz się jednym kliknięciem.

wersja newslettera: