W dzisiejszych czasach większość złośliwego oprogramowania jest pisana przez cyberprzestępców w taki sposób, aby jak nie było ono wykrywalne przez specjalistyczne oprogramowanie do bezpieczeństwa. Wiąże się to z zyskująca na popularności wśród cyberprzestępców na świecie technice ukrywania kodu zwaną Living of the Land (LotL). W tym artykule pokażemy jedną z takich technik wykorzystująca specjalnie napisany skrypt w PowerShell oraz sprawdzimy w lab jego wykrywalność.


ReverseTCPShell

ReverseTCPShell jest skryptem napisanym w Poweshell’u umożliwiającym przeprowadzanie zwrotnej komunikacji szyfrowanej (klucz AES 256-bit) pomiędzy dwoma komputerami w sieci. Wykorzystuje protokół TCP i komunikację PowerShell SecureString (klasę System.Net.Sockets.TCPClient). Ponieważ transmisja w sieci pomiędzy klientem a serwerem jest zaszyfrowana może być trudna do wykrycia przez skanery sieciowe. Autorem skryptu jest anonimowy hacker o pseudonimie ZHacker13.


Budowa skryptu

Skrypt jest zbudowany z części klienckiej i serwerowej. Część kliencka (przeznaczona na komputer ofiary) uruchamiana jest z poziomu wiersza linii komend jednym poleceniem wygenerowanym przez serwer C2 na Windows z uruchomionym skryptem ReverseTCP. Natomiast cześć serwerowa (komputer atakującego) uruchamia C2 Listener i czeka na nawiązanie komunikacji z klientem. Po udanym nawiązaniu komunikacji po stronie serwera otrzymujemy w PowerShell wiersz poleceń, z poziomu którego będziemy mogli wykonywać zdalnie komendy na komputerze ofiary.


Scenariusz ataku

W celu poprawnego wykonania scenariusza w pierwszej kolejności musimy wygenerować payload, który potem uruchomimy na komputerze ofiary. W tym celu musimy uruchomić na serwerze skrypt „ReverseTCP.ps1” z wyłączoną usługą Windows Defender lub antywirusem, ponieważ w naszym przypadku uruchomienie skryptu na Windows 10 (wydanie 1903 i 1809) kończyło się niepowodzeniem i komunikatem jak na poniższym ekranie. Brawo Microsoft!

Błąd wygenerowany na Windows 10 z włączoną usługa Windows Defender

Tak więc w celu prawidłowego uruchomienia skryptu i wygenerowania payload musimy posłużyć się niezabezpieczonym Windows (w naszym przypadku Windows 2012 R2). Następnie musimy wykonać następujące kroki:

1.Uruchamiamy skrypt „ReverseTCP.ps1” na komputerze z wyłączonym antywirusem i usługą Windows Defender i podajemy wymagane parametry:

  • 1-clear shell, 2-Encrypted Shell (AES-256 bit)
  • Port
  • Adres serwera C2 (nasłuchującego)
Uruchomiony skrypt PowerShell ReverseTCP.ps1 i wygenerowany payload

Po tej operacji wygeneruje się kod ładunku (payload) pokazany na powyższym ekranie. W naszym przypadku zmodyfikowaliśmy nieznacznie kod skryptu ReverseTCP, aby payload zapisywał się dodatkowo do pliku na dysku, ponieważ jak kopiowaliśmy wynik z okna PowerShell, musieliśmy ręcznie usuwać znaki końca linii.

2. Kopiujemy wygenerowany wynik payload i uruchamiamy go w linii komend na drugim komputerze (w naszym przypadku zabezpieczony system Windows 10 wydanie 1809).

Uruchomiony kod payload na zabezpieczonym Windows 10

3. Po stronie serwera C2 powinniśmy otrzymać wiersz poleceń, w którym możemy wpisywać komendy Windows 🙂

Uruchomiona zdalna powłoka PowerShell z możliwościa wpisywania komend uruchamianych na Windows 10

Uruchomienie ładunku (payload) sprawdzaliśmy także na najnowszej wersji Windows 10 wydanie 1903 – w tym przypadku także udało nam się połączyć z serwerem C2.


Analiza od strony bezpieczeństwa

W celu sprawdzenia jak sobie radzi z wykrywalnością skryptu standardowe oprogramowanie do bezpieczeństwa posłużyliśmy się portalem VIrusTotal i wrzuciliśmy na niego plik „ReverseTCP.ps1”. Wynik bardzo nas zaskoczył, ponieważ tylko Microsoft pojawił się wśród 59 skanerów i rozpoznał w skrypcie trojana „Trojan:Script/Foretype.A!ml”. Oczywiście nie jest to 100% wyznacznik, że żadne inne oprogramowanie nie rozpozna skryptu, ale zawsze coś.

Wynik skanowania oprogramowaniem VirusTotal pliku “ReverseTCP.ps1”

Oprócz sprawdzenia skryptu serwera C2 (ReverseTCP) wykonaliśmy sprawdzenie ładunku (payload), który wygenerował oraz jaki uruchamialiśmy na komputerze ofiary. Tak naprawdę interesowało nas to najbardziej, ponieważ ładunek zawsze jest dostarczany na komputery ofiar. Otrzymany wynik 0/57!

Wynik skanowania oprogramowaniem VirusTotal pliku “payload.ps1”

Wniosek. Istnieje prawdopodobieństwo udanego wykonania złośliwego kodu w sieci, dzięki czemu atakujący może uzyskać zdaną sesję w PowerShell. Zatem mamy potencjalne zagrożenie.

Dla zainteresowanych umieściliśmy poniżej wideo pokazujące wykonanie powyższego scenariusza.


Jak sobie radzić z problemem?

O tym, że PowerShell może służyć cyberprzestępcom do atakowania komputerów ofiar wiemy nie od dziś. Od strony infrastruktury IT warto włączyć audyt skryptów i poleceń PowerShell oraz je monitorować. Warto także rozważyć opcję wyłączenia go na komputerach, na których nie jest konieczne jego użycie, pod warunkiem, że nie są zaimplementowane inne aplikacje w infrastrukturze, które go wymagają. Przypominamy też, że istnieją sposoby na ominięcie braku powłoki PowerShell – możemy ją załadować za pomocą specjalnej biblioteki. Pisaliśmy o tym tutaj.

W każdym bądź razie, jeśli okazałoby się, że Wasze oprogramowanie antywirusowe nie jest w stanie wykryć złośliwego skryptu wówczas pomocne może być monitorowanie procesów i poleceń, które dostarczy wiedzę i szerszy obraz tego co się dzieje na końcówkach. Istnieje na rynku dedykowane oprogramowanie pozwalające wykryć złośliwy PowerShell, ale nie jest one przedmiotem tego artykułu.
Więcej porad na temat zabezpieczenia tego typu ataku wykorzystującego techniki LotL zamieściliśmy tutaj.