Bruke PowerShell til å samle hendelsesinformasjon

PowerShell er et ganske vanlig automatiseringsverktøy som ofte brukes av både skadevareutviklere og informasjonssikkerhetsspesialister.
Denne artikkelen vil diskutere muligheten for å bruke PowerShell til å eksternt samle inn data fra sluttenheter når du svarer på informasjonssikkerhetshendelser. For å gjøre dette, må du skrive et skript som skal kjøres på sluttenheten, og så vil det være en detaljert beskrivelse av dette skriptet.

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
		}

	}

}

For å komme i gang, lag en funksjon CSIRT-utvidelse, som vil ta et argument - banen for å lagre de mottatte dataene. På grunn av det faktum at de fleste cmdlets fungerer i Powershell v5, ble PowerShell-versjonen sjekket for korrekt drift.

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

For enkel navigering gjennom de opprettede filene, initialiseres to variabler: $date og $Computer, som vil bli tildelt datamaskinnavnet og gjeldende dato.

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

Vi får listen over kjørende prosesser på vegne av gjeldende bruker som følger: lag en $process-variabel, og tilordne den get-ciminstance-cmdleten med win32_process-klassen. Ved å bruke Select-Object-cmdleten kan du legge til flere utdataparametere, i vårt tilfelle vil disse være parentprocessid (overordnet prosess-ID PPID), opprettelsesdato (prosessopprettelsesdato), behandlet (prosess-ID PID), prosessnavn (prosessnavn), kommandolinje ( kjør kommando).

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

For å få en liste over alle TCP- og UDP-tilkoblinger, lag $netTCP- og $netUDP-variablene ved å tilordne dem henholdsvis Get-NetTCPConnection- og Get-NetTCPConnection-cmdletene.

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

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

Det vil være viktig å finne ut listen over planlagte oppgaver og oppdrag. For å gjøre dette bruker vi cmdletene get-ScheduledTask og Get-ScheduledJob. La oss tildele dem variablene $task og $job, fordi I utgangspunktet er det mange planlagte oppgaver i systemet, og for å identifisere ondsinnet aktivitet er det verdt å filtrere ut legitime planlagte oppgaver. Select-Object-cmdleten vil hjelpe oss med dette.

$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

I NTFS-filsystemet er det noe slikt som alternative datastrømmer (ADS). Dette betyr at en fil i NTFS valgfritt kan assosieres med flere datastrømmer av vilkårlig størrelse. Ved å bruke ADS kan du skjule data som ikke vil være synlige gjennom standard systemsjekker. Dette gjør det mulig å injisere ondsinnet kode og/eller skjule data.

For å vise alternative datastrømmer i PowerShell, vil vi bruke get-item cmdlet og det innebygde Windows-strømverktøyet med *-symbolet for å se alle mulige strømmer, for dette vil vi lage $ADS-variabelen.

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

Det vil være nyttig å finne ut listen over brukere som er logget på systemet; for dette vil vi lage en $user-variabel og tilordne den til kjøringen av quser-programmet.

$user = quser

Angripere kan gjøre endringer i autorun for å få fotfeste i systemet. For å vise oppstartsobjekter kan du bruke Get-ItemProperty-cmdleten.
La oss lage to variabler: $runUser - for å vise oppstart på vegne av brukeren og $runMachine - for å vise oppstart på vegne av datamaskinen.

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

For at all informasjon skal skrives til forskjellige filer, lager vi en matrise med variabler og en matrise med filnavn.


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

Og ved å bruke en for-løkke, vil de mottatte dataene bli skrevet til filer.

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

Etter utførelse av skriptet vil det bli opprettet 9 tekstfiler som inneholder nødvendig informasjon.

I dag kan cybersikkerhetseksperter bruke PowerShell til å berike informasjonen de trenger for å løse en rekke oppgaver i arbeidet. Ved å legge til et skript til oppstart, kan du få litt informasjon uten å fjerne dumps, bilder osv.

Kilde: www.habr.com

Legg til en kommentar