Uporaba PowerShell za zbiranje informacij o incidentu

PowerShell je precej razširjeno orodje za avtomatizacijo, ki ga pogosto uporabljajo tako razvijalci zlonamerne programske opreme kot tudi strokovnjaki za informacijsko varnost.
V tem članku bomo obravnavali uporabo PowerShell-a za oddaljeno zbiranje podatkov iz končnih naprav med odzivanjem na varnostne incidente. Za to bo potrebno napisati skripto, ki bo zagnana na končni napravi, in v nadaljevanju bo podroben opis te skripte.

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
		}

	}

}

Za začetek dela se ustvari funkcija CSIRT, ki bo sprejela argument – pot za shranjevanje prejetih podatkov. Ker večina cmdlet-ov deluje v Powershell v5, je za pravilno delovanje opravljena preverba različice PowerShell.

function CSIRT{
		
param($path)# pri zagonu skripte je treba navesti imenik za shranjevanje
if ($psversiontable.psversion.major -ge 5)

Za lažje iskanje po ustvarjenih datotekah sta inicializirani dve spremenljivki: $date in $Computer, katerima bosta dodeljena ime računalnika in trenutni datum.

$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"

Seznam procesů spuštěných pod aktuálním uživatelským jménem získáme následujícím způsobem: vytvoříme proměnnou $process a přiřadíme jí cmdlet get-ciminstance s třídou win32_process. Pomocí cmdletu Select-Object můžeme přidat další výstupní parametry, v našem případě to budou parentprocessid (identifikátor rodičovského procesu PPID), creationdate (datum vytvoření procesu), processid (identifikátor procesu PID), processname (název procesu), commandline (příkaz spuštění).

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

Abychom získali seznam všech TCP a UDP spojení, vytvoříme proměnné $netTCP a $netUDP a přiřadíme jim cmdlety Get-NetTCPConnection a Get-NetUDPEndpoint.

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

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

Důležité je také zjistit seznam naplánovaných úloh a zakázek. K tomu použijeme cmdlety get-ScheduledTask a Get-ScheduledJob. Přiřadíme jim proměnné $task a $job, protože v systému již existuje spousta naplánovaných úloh, proto, abychom určili škodlivou aktivitu, je dobré filtrovat legitimní naplánované úlohy. S tím nám pomůže cmdlet 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 vylučuje autory, kteří obsahují „Microsoft“, „*@%systemroot%*“, a také „prázdné“ autory
$job = Get-ScheduledJob

V souborovém systému NTFS existuje takzvaný alternativní datový proud (Alternate Data Stream, ADS). To znamená, že soubor v NTFS může být navíc spojen s několika datovými proudy libovolné velikosti. Pomocí ADS lze skrýt data, která nebudou viditelná standardními kontrolami systému. Díky tomu je možné implantovat škodlivý kód a/nebo skrýt data.

Pro zobrazení alternativních datových proudů v PowerShellu budeme používat cmdlet get-item a vestavěný nástroj Windows stream se symbolem * pro zobrazení všech dostupných proudů, na to vytvoříme proměnnou $ADS.

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

Užitečné bude také zjistit seznam uživatelů, kteří se přihlásili do systému, k tomu vytvoříme proměnnou $user a přiřadíme jí provedení programu quser.

$user = quser

Napadalci, da se v sistemu utrdijo, lahko spremenijo avtozagon. Za ogled predmetov v avtozagonskem seznamu lahko uporabite ukaz Get-ItemProperty.
Ustvarili bomo dve spremenljivki: $runUser – za ogled avtozagonov v imenu uporabnika in $runMachine – za ogled avtozagonov v imenu računalnika.

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

Da območje vseh informacij shranimo v različne datoteke, ustvarimo matriko s spremenljivkami in matriko z imeni datotek.


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

In, z uporabo for zanke, bodo pridobljeni podatki shranjeni v datoteke.

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

Po izvršitvi skripte bo ustvarjenih 9 besedilnih datotek, ki vsebujejo potrebne informacije.

Trenutno lahko strokovnjaki za kibernetsko varnost uporabijo PowerShell za obogatitev informacij, potrebnih pri reševanju različnih nalog v svojem delu. Z dodajanjem skripte v avtozagonski seznam lahko pridobivamo nekatere informacije brez odstranjevanja vseh zvočnih posnetkov, slik itd.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster