Używanie programu PowerShell do zbierania informacji o zdarzeniach

PowerShell to dość powszechne narzędzie do automatyzacji, z którego często korzystają zarówno twórcy złośliwego oprogramowania, jak i specjaliści ds. bezpieczeństwa informacji.
W tym artykule omówiona zostanie możliwość wykorzystania PowerShella do zdalnego zbierania danych z urządzeń końcowych podczas reagowania na incydenty związane z bezpieczeństwem informacji. Aby to zrobić trzeba będzie napisać skrypt, który będzie działał na urządzeniu końcowym i wtedy pojawi się 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 '*Майкрософт*' | 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
		}

	}

}

Aby rozpocząć, utwórz funkcję rozszerzenie zespołu CSIRT, który przyjmie argument - ścieżkę do zapisania otrzymanych danych. Z uwagi na fakt, że większość poleceń cmdlet działa w Powershell v5, sprawdzono poprawność działania wersji PowerShell.

function CSIRT{
		
param($path)# при запуске скрипта необходимо указать директорию для сохранения
if ($psversiontable.psversion.major -ge 5)

Dla ułatwienia nawigacji po utworzonych plikach inicjowane są dwie zmienne: $date i $Computer, którym zostanie przypisana nazwa komputera i aktualna 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"

Listę uruchomionych procesów w imieniu bieżącego użytkownika otrzymujemy w następujący sposób: utwórz zmienną $process, przypisując jej cmdlet get-ciminstance z klasą win32_process. Za pomocą polecenia cmdlet Select-Object możesz dodać dodatkowe parametry wyjściowe, w naszym przypadku będą to nadrzędny proces (identyfikator procesu nadrzędnego PPID), data utworzenia (data utworzenia procesu), przetworzone (identyfikator procesu PID), nazwa procesu (nazwa procesu), linia poleceń ( Uruchom polecenie).

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

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

$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 poznanie listy planowanych zadań i zadań. W tym celu używamy poleceń cmdlet get-ScheduledTask i Get-ScheduledJob. Przypiszmy im zmienne $zadanie i $zadanie, ponieważ Początkowo w systemie jest dużo zaplanowanych zadań, następnie w celu zidentyfikowania szkodliwej aktywności warto odfiltrować legalne zaplanowane zadania. Pomoże nam w tym cmdlet Select-Object.

$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname| where author -notlike '*Майкрософт*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task исключает авторов, содержащих “Майкрософт”, “Microsoft”, “*@%systemroot%*”, а также «пустых» авторов
$job = Get-ScheduledJob

W systemie plików NTFS istnieje coś takiego jak alternatywne strumienie danych (ADS). Oznacza to, że plik w systemie plików NTFS może być opcjonalnie powiązany z wieloma strumieniami danych o dowolnym rozmiarze. Za pomocą ADS możesz ukryć dane, które nie byłyby widoczne podczas standardowych kontroli systemowych. Umożliwia to wstrzyknięcie złośliwego kodu i/lub ukrycie danych.

Aby wyświetlić alternatywne strumienie danych w PowerShellu, użyjemy polecenia cmdlet get-item i wbudowanego w Windows narzędzia strumieniowego z symbolem *, aby wyświetlić wszystkie możliwe strumienie, w tym celu utworzymy zmienną $ADS.

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

Przyda się poznanie listy użytkowników zalogowanych do systemu, w tym celu utworzymy zmienną $user i przypiszemy ją do wykonania programu quser.

$user = quser

Atakujący mogą wprowadzić zmiany w trybie automatycznego uruchamiania, aby zdobyć przyczółek w systemie. Aby wyświetlić obiekty startowe, możesz użyć polecenia cmdlet Get-ItemProperty.
Utwórzmy dwie zmienne: $runUser - aby wyświetlić uruchomienie w imieniu użytkownika i $runMachine - aby wyświetlić uruchomienie w imieniu komputera.

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

Aby wszystkie informacje były zapisywane w różnych plikach, tworzymy tablicę ze 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"

Za pomocą pętli for otrzymane 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 niezbędne informacje.

Obecnie specjaliści ds. cyberbezpieczeństwa mogą używać programu PowerShell do wzbogacania informacji potrzebnych do rozwiązywania różnych zadań w swojej pracy. Dodając skrypt do uruchamiania, możesz uzyskać pewne informacje bez usuwania zrzutów, obrazów itp.

Źródło: www.habr.com

Dodaj komentarz