Script Block Logging vs System-Wide transcription. Różnice

Jeśli myślisz o bezpiecznym wykorzystywaniu PowerShella to prędzej czy później natkniesz się na Script Block Logging i System-Wide Transcription.

Myślisz? Jeśli nie to zobacz mój wpis na temat wykorzystania PowerShell do złośliwych ataków.

… rosnącej ilości ataków. Od połowy 2017 do początku 2018 zwiększyła się o 661 procent

Co robi Script Block Logging?

Po włączeniu Script Block Logging wszystkie bloki skryptu PowerShell będą zapisywane, do dziennika zdarzeń Microsoft-Windows-PowerShell\Operational. Tak logowane zdarzenia posiadają identyfikator o numerze 4104. Dodatkowe te, które uznane są, jako podejrzane rozpoznamy po ostrzeżeniu (Warning).


Warto pamiętać o tym, że włączenie Script Block Logging spowoduję, zapis bardzo duże ilości zdarzeń do dziennika.

Jak włączyć Script Block Logging?

Włączenie Script Block Logging można wykonać na dwa sposoby. Włączając opcje Turn on PowerShell Script Block Logging w lokalizacji Windows Components\Administrative Templates\Windows PowerShell poprzez edytor Group Policy.

Lub poprzez zmianę wartości klucza rejestru HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging na 1. Poniżej funkcje PowerShell do włączania/wyłączania funkcji Script Block Logging.

Co robi System-wide transcription?

Realizuje systemową transkrypcje (nagrywanie) wykonywanego kodu PowerShell zapisując wszystkie polecenia do wskazanego pliku. Co prawda już od wersji 2.0 istniała taka możliwość poprzez wbudowane cmdlety Start-Transcript i Stop-Transcript. Jednak rzadko, kiedy wykorzystywane.

Po pierwsze działało tylko w sesjach interaktywnych (brak nagrywania sesji zdalnych) a po drugie, wymagało np. implementacji w profilach, aby transkrypcja była automatyczna

Jak włączyć System-wide transcription?

Windows PowerShell 5.0 upraszcza sposób implementacji. Włączymy ją za pomocą zasady Turn on PowerShell Transcription w lokalizacji
Windows Components\Administrative Templates\Windows PowerShell poprzez Group Policy Editor. Tam też wskazujemy katalog bądź zasób sieciowy dla plików transkrypcji.

Druga opcja to zmiana wartości klucza rejestru
EnableTranscripting na 1 w  lokalizacji HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell. Poniżej polecenia PowerShell do włączania/wyłączania funkcji System-wide transcription

System-Wide Transcription vs Script Block Logging

Mając podstawowe informacje o Script Block Logging i System-wide transcription można stwierdzić, że jedno i drugie realizuję po prostu zapisywania wykonywanego kodu PowerShell. Spróbuje przybliżyć różnice.

Po pierwsze lokalizacja zapisu. System-wide transcription możemy wdrożyć na poziome domeny z zapisem do jednej lokalizacji sieciowej. Co według mnie stanowi sporą zaletę.

Dla porównania Script Block Logging nie ma z „pudełka” możliwości zapisu zdarzeń z kilku hostów w jedno centralne miejsce. Do tego szukanie, analizowanie logów przy tak dużej ziarnistości (nawet każde wywołanie funkcji prompt) nie należy do najłatwiejszych.

Jednak to są niuanse. Najważniejsze według mnie jest to, co i jak rejestruję jedno bądź drugie rozwiązanie. W tym celu posłużę się poniższym poleceniem i pokaże co znajdziemy w pliku transkrypcji a później w dzienniku zdarzeń.

Na początek System-wide transcription . Jak widać zapisane zostało bardzo dużo metadanych o sesji co ułatwi idetyfikacje kto, kiedy, skąd. Jednak ja chciałbym się skupić na zaznaczonych obszarach.

W polu Host Application zostało zapisane to, co przekazałem do konsoli Powershell, czyli przygotowane polecenie kodowane w Base64. Dalej można zauważyć, że zostało to skonwertowane do ciągu znaku i tak wykonane. Ostatnie pole to wynik zapytania. Z tej transkrypcji ciężko powiedzieć jakie zapytanie dokładnie zostało wykonane. Sam wynik może coś podpowiedzieć ale pewności nie daje. Może w tle było coś jeszcze?

W takim razie jak to wygląda przy Script Block Logging. Może tam znajdziemy odpowiedź. Już prezentuję. To samo zapytanie przechwycone do dziennika zdarzeń Microsoft-Windows-PowerShell/Operational.

W dzienniku znalazły się dwa wpisy dotyczące mojego wykonania. Pierwszy wpis nie jest zaskoczeniem, jednak to, co znalazło się w drugim jest kluczowe. Script Block Logging zalogował dokładnie to, co wykonał PowerShell aby zwrócić wynik.

Podsumowanie

Script Block Logging przy wszelkich atakach z użyciem zaszyfrowanych i/lub zaciemnianych odpowie nam na pytanie, jakie poleceń zostały wykonane. Jeśli interesują nas wyniki poleceń to bardziej pomocne okaże się System-wide transcription, tego w dzienniku zdarzeń nie znajdziemy. To są kluczowa różnica które chciałem zaprezentować.

Które stosować? Do konkretnej odpowiedzi wstrzymam się do omówienia trzeciego rozwiązania jakim jest Module logging.

Jeśli masz swoje spostrzeżenia lub używasz którego z tych rozwiązań to proszę zostaw komentarz.

Photo by Vladislav Babienko on Unsplash

Z pasją poświęcam czas na zdobywanie wiedzy w zakresie szeroko rozumianej Data Platform. Zachwycony językiem skryptowym Windows PowerShell. Swoją wiedzę, doświadczenia i spostrzeżenia opisuję na blogu.

Leave a Reply

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *