Użycie PowerShell do zbierania informacji o incydencie

PowerShell to dość powszechnie używane narzędzie do automatyzacji, które często wykorzystywane jest zarówno przez programistów złośliwego oprogramowania, jak i specjalistów ds. bezpieczeństwa informacji.
W tym artykule omówimy sposób użycia PowerShell do zdalnego zbierania danych z urządzeń końcowych w odpowiedzi na incydenty bezpieczeństwa. W tym celu będziemy musieli napisać skrypt, który będzie uruchamiany na urządzeniu końcowym, a następnie podamy szczegółowy opis tego skryptu.

function CSIRT{
param($path)
if ($psversiontable.psversion.major -ge 5)
	{
	$date = Get-Date -Format dd.MM.yyyy_hh_mm
	$Computer = $env:COMPUTERNAME
	New-Item -Path $path$computer$date -ItemType 'Directory' -Force | Out-Null
	$path = "$path$computer$date"

	$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname,
	processid, commandline, parentprocessid

	$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress,
	localport, remoteaddress, remoteport, owningprocess, state
	
	$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress,
	localport, remoteaddress, remoteport, owningprocess, state

	$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname|
	where author -notlike '*Microsoft*' | where author -ne $null |
	where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*'

	$job = Get-ScheduledJob

	$ADS =  get-item * -stream * | where stream -ne ':$Data'

	$user = quser

	$runUser = Get-ItemProperty "HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"

	$runMachine =  Get-ItemProperty "HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

	$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
	$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
	"ScheduledJob", "AlternativeDataStream"


	for ($w = 0; $w -lt $array.count; $w++){
		$name = $arrayName[$w]
		$array[$w] >> $path$name.txt
		}

	}

}

Na początek tworzymy funkcję CSIRT, która będzie przyjmować argument – ścieżkę do zapisu uzyskanych danych. Ponieważ większość cmdletów działa w PowerShell v5, wprowadzono sprawdzenie wersji PowerShell w celu zapewnienia poprawności działania.

function CSIRT{
		
param($path)# podczas uruchamiania skryptu należy wskazać katalog do zapisu
if ($psversiontable.psversion.major -ge 5)

Dla ułatwienia nawigacji po utworzonych plikach zainicjowano dwie zmienne: $date i $Computer, którym przypisane zostaną nazwa komputera oraz bieżąca data.

$date = Get-Date -Format dd.MM.yyyy_hh_mm
$Computer = $env:COMPUTERNAME
New-Item -Path $path$computer$date –ItemType 'Directory' -Force | Out-Null 
$path = "$path$computer$date"

Aby uzyskać listę uruchomionych procesów pod nazwiskiem bieżącego użytkownika, stworzymy zmienną $process, przypisując jej polecenie get-ciminstance z klasą win32_process. Używając polecenia Select-Object, możemy dodać dodatkowe parametry wyjściowe, w naszym przypadku będą to parentprocessid (identyfikator procesu macierzystego PPID), creationdate (data utworzenia procesu), processed (identyfikator procesu PID), processname (nazwa procesu), commandline (komenda uruchamiająca).

$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessid

Aby uzyskać listę wszystkich połączeń TCP i UDP, stworzymy zmienne $netTCP i $netUDP, przypisując im polecenia Get-NetTCPConnection i Get-NetUDPEndpoint odpowiednio.

$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

Ważne będzie również poznanie listy zaplanowanych zadań i prac. W tym celu użyjemy poleceń get-ScheduledTask i Get-ScheduledJob. Przypiszemy im zmienne $task i $job, ponieważ w systemie istnieje wiele zaplanowanych zadań, aby zidentyfikować złośliwą aktywność, warto przefiltrować legalne zaplanowane zadania. W tym pomoże nam polecenie Select-Object.

$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname| where author -notlike '*Microsoft*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task wyklucza autorów zawierających „Microsoft”, „*@%systemroot%*” oraz „pustych” autorów
$job = Get-ScheduledJob

W systemie plików NTFS istnieje pojęcie alternatywnych strumieni danych (Alternate Data Streams, ADS). Oznacza to, że plik w NTFS może być dodatkowo powiązany z wieloma strumieniami danych o dowolnym rozmiarze. Dzięki ADS można ukryć dane, które nie będą widoczne podczas standardowych kontroli systemu. Dzięki temu można wprowadzić złośliwy kod i/lub ukryć dane.

Aby wyświetlić alternatywne strumienie danych w PowerShell, będziemy używać polecenia get-item oraz wbudowanego narzędzia Windows stream z symbolem * do przeglądania wszystkich możliwych strumieni, w tym celu stworzymy zmienną $ADS.

$ADS = get-item * -stream * | where stream –ne ':$Data' 

Warto również poznać listę użytkowników, którzy zalogowali się do systemu, w tym celu stworzymy zmienną $user i przypiszemy jej wywołanie programu quser.

$user = quser

Aby cyberprzestępcy mogli zainstalować się w systemie, mogą wprowadzić zmiany w autostart. Aby przejrzeć obiekty w autostart, można skorzystać z polecenia Get-ItemProperty.
Utwórzmy dwie zmienne: $runUser – do przeglądania autostartu w imieniu użytkownika oraz $runMachine – do przeglądania autostartu w imieniu komputera.

$runUser = Get-ItemProperty 
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty 
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

Aby wszystkie informacje były zapisywane do różnych plików, tworzymy tablicę z zmiennymi i tablicę z nazwami plików.


$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"

A używając pętli for, uzyskane dane zostaną zapisane do plików.

for ($w = 0; $w -lt $array.count; $w++){
	$name = $arrayName[$w]
	$array[$w] >> $path$name.txt

Po wykonaniu skryptu zostanie utworzonych 9 plików tekstowych zawierających potrzebne informacje.

Obecnie specjaliści ds. bezpieczeństwa cybernetycznego mogą korzystać z PowerShell do wzbogacenia informacji potrzebnych do rozwiązywania różnych problemów w swojej pracy. Dodając skrypt do autostartu, można uzyskiwać pewne informacje bez tworzenia zrzutów, obrazów itp.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster