Logi skryptów blokowych PowerShell znajdują się w Logi Aplikacji i Usług → Microsoft → Windows → PowerShell → Operacyjny, jako zdarzenie 4104. Są one kompletne tylko wtedy, gdy logowanie skryptów blokowych jest włączone. Aby je wyeksportować:
wevtutil epl "Microsoft-Windows-PowerShell/Operational" C:logspowershell.evtx
PowerShell 7 to oddzielny produkt z osobnym kanałem, PowerShellCore/Operational, i własnym ustawieniem polityki.
Jeżeli atakujący dotknął komputera z Windows, prawdopodobnie PowerShell był zaangażowany. Logowanie skryptów blokowych rejestruje kod, który faktycznie uległ uruchomieniu, często po usunięciu warstw zaciemnienia. Prime Core ma 663 reguły detekcyjne dla logów PowerShell, przypisane do 417 technik MITRE ATT&CK. Obejmują one złośliwe użycie PowerShell (T1059.001), zaciemnianie (T1027) i „download cradle”, które pobierają narzędzia (T1105).
Zanim zaczniesz
Czy logowanie skryptów blokowych jest włączone?
reg query "HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging"
Ustawienie EnableScriptBlockLogging na 0x1 oznacza tak. Jeśli klucz nie istnieje, jest wyłączone. Nawet wtedy, Windows PowerShell 5.1 nadal loguje bloki skryptów, które uważa za podejrzane, jako zdarzenia 4104 na poziomie ostrzeżenia. Możesz zatem znaleźć niektóre zdarzenia. Nie myl ich jednak z pełnym obrazem.
Włączenie tego pomaga od teraz, nie dla tego, co już się stało. Użyj ustawienia Zasad Grupy Szablony Administracyjne → Komponenty Windows → Windows PowerShell → Włącz logowanie skryptów blokowych PowerShell, albo ustaw wartość w rejestrze bezpośrednio:
reg add "HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging" /v EnableScriptBlockLogging /t REG_DWORD /d 1 /f
PowerShell 7 odczytuje własny klucz polityki pod HKLMSOFTWAREPoliciesMicrosoftPowerShellCore. Jeśli zainstalowano go z pliku zip, zamiast z MSI, jego kanał zdarzeń może nie być zarejestrowany, dopóki nie uruchomisz RegisterManifest.ps1 z $PSHOME.
Oczekuj dużej ilości danych. Każdy skrypt i moduł, który się uruchamia, trafia do logu. Zwiększ maksymalny rozmiar kanału, inaczej zachowasz tylko kilka godzin.
Oczekuj tajemnic. Skrypty administracyjne czasem zawierają hasła i klucze API w postaci tekstowej, a logowanie skryptów blokowych rejestruje je wiernie. Pamiętaj o tym, zanim ten plik pójdzie gdziekolwiek, i przeczytaj sekcję LogTotal poniżej.
Eksportuj logi
W Podglądzie zdarzeń, kliknij prawym przyciskiem myszy Operacyjny pod PowerShell i wybierz Zapisz wszystkie zdarzenia jako… Z linii poleceń:
:: tylko skrypty blokowe
wevtutil epl "Microsoft-Windows-PowerShell/Operational" C:logsps_4104.evtx /q:"*[System[(EventID=4104)]]"
:: PowerShell 7
wevtutil epl "PowerShellCore/Operational" C:logspwsh.evtx
:: klasyczny log "Windows PowerShell": zdarzenia uruchomienia silnika z poleceniem hosta
wevtutil epl "Windows PowerShell" C:logswindows_powershell.evtx
Tego ostatniego łatwo zapomnieć, ale warto go zdobyć. Zdarzenie 400 rejestruje każde uruchomienie silnika, w tym wersję silnika. Wersja silnika 2.0 na nowoczesnym systemie zwykle oznacza, że ktoś celowo zredukował wersję, aby uniknąć logowania skryptów blokowych.
Prześlij i przejrzyj w LogTotal
LogTotal odczytuje EVTX natywnie. Jedna rzecz do zapamiętania: LogTotal jeszcze nie sanitizuje plików EVTX. W przypadku logów PowerShell to ma większe znaczenie niż zwykle, ze względu na wspomniane wcześniej tajemnice. Korzystaj ze wgrywania EVTX swobodnie w przypadku maszyn testowych. W przypadku hostów produkcyjnych, uzyskaj zgodę od osoby zarządzającej danymi.
- Prześlij. Otwórz logtotal.com i przeciągnij plik.
- Przejrzyj.
Kiedy coś pójdzie nie tak
| Symptom | Prawdopodobna przyczyna | Fix |
|---|---|---|
| Brak zdarzeń 4104 | Logowanie skryptów blokowych jest wyłączone, nic nie wyglądało podejrzanie | Włącz to na przyszłość; sprawdź log Windows PowerShell dla tego, co można jeszcze dostać |
| Tylko kilka zdarzeń 4104, wszystkie ostrzeżenia | Logowanie jest wyłączone; widzisz automatyczne logowanie podejrzanych bloków | Taki sam jak powyżej |
| PowerShellCore/Operational nie znaleziono | PowerShell 7 nie jest zainstalowany, lub jego manifest nie jest zarejestrowany | Uruchom RegisterManifest.ps1 z $PSHOME |
| Tekst 4104 to nieczytelny szyfrowany tekst | Logowanie Zdarzeń Chronionych jest włączone | Potrzebujesz certyfikatu do dekryptażu |
| Log obejmuje tylko kilka godzin | Domyślny rozmiar, duża ilość danych | Zwiększ maksymalny rozmiar kanału |
FAQ
Czy logowanie skryptów blokowych łapie zaciemniony kod?
W dużym stopniu tak. Rejestruje bloki skryptów w trakcie ich kompilacji. Kiedy zaciemniony kod buduje i uruchamia następną fazę, ta faza jest logowana jako własny blok, często w formie czytelnej.
Jaka jest różnica między transkrypcją?
Transkrypcja zapisuje pliki tekstowe z sesji wejścia i wyjścia do folderu. Logowanie skryptów blokowych rejestruje sam kod w dzienniku zdarzeń. Uzupełniają się nawzajem i oba są warte posiadania.