Bruk av PowerShell for å samle inn informasjon om hendelser

PowerShell er et ganske utbredt automatiseringsverktøy, som ofte brukes av både skadelig programvareutviklere og spesialister innen informasjonssikkerhet.
I denne artikkelen vil vi se på hvordan PowerShell kan brukes til å samle inn data eksternt fra slutt-enheter under respons på informasjonssikkerhetshendelser. Dette vil kreve at vi skriver et skript som kjøres på slutt-enheten, og det vil bli 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 '*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
		}

	}

}

For å begynne å arbeide opprettes en funksjon CSIRT, som vil ta et argument - en sti for å lagre de innsamlede dataene. Fordi de fleste cmdlets fungerer i Powershell v5, er det gjort en sjekk av PowerShell-versjonen for å sikre korrekt funksjon.

function CSIRT{
		
param($path)# ved kjøring av skriptet må en katalog for lagring spesifiseres
if ($psversiontable.psversion.major -ge 5)

For å gjøre navigasjonen i de opprettede filene lettere, er det initialisert to variabler: $date og $Computer, som vil bli tildelt datamaskinens navn og dagens 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 en liste over kjørende prosesser på vegne av den nåværende brukeren på følgende måte: Vi oppretter en variabel $process og tilordner den cmdleten get-ciminstance med klassen win32_process. Ved å bruke cmdleten Select-Object kan vi legge til ekstra utdatafelt; i vårt tilfelle vil dette være parentprocessid (parentprosessens ID, PPID), creationdate (prosessens opprettelsesdato), processid (prosessens ID, PID), processname (prosessens navn) og commandline (oppstartskommanden).

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

For å få en liste over alle TCP- og UDP-forbindelser oppretter vi variablene $netTCP og $netUDP og tilordner dem cmdlet-ene Get-NetTCPConnection og Get-NetUDPEndpoint henholdsvis.

$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 er også viktig å vite om listen over planlagte oppgaver og jobber. For dette bruker vi cmdlet-ene get-ScheduledTask og Get-ScheduledJob. Vi tilordner dem variablene $task og $job; siden det fra før fins mange planlagte oppgaver i systemet, er det viktig å filtrere ut legitime planlagte oppgaver for å avdekke ondsinnet aktivitet. Cmdleten Select-Object vil hjelpe oss med dette.

$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 ekskluderer forfattere som inneholder “Microsoft”, “*@%systemroot%*”, samt “null”-forfattere
$job = Get-ScheduledJob

I NTFS-filsystemet finnes det et begrep kjent som alternative datastreams (Alternate Data Streams, ADS). Dette betyr at en fil i NTFS kan være koblet til flere datastreams av vilkårlig størrelse. Gjennom ADS kan data skjules som ikke vil være synlige ved standard systemkontroller. Dette gjør det mulig å injisere ondsinnet kode og/eller skjule data.

For å vise alternative datastreams i PowerShell bruker vi cmdleten get-item og det innebygde Windows-verktøyet stream med symbolet * for å vise alle tilgjengelige streams; derfor oppretter vi variabelen $ADS.

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

Det vil også være nyttig å få en liste over brukere som er logget inn i systemet. For dette oppretter vi variabelen $user og tilordner den kommandoen quser.

$user = quser

Angripere kan endre oppstartsvilkårene for å få fotfeste i systemet. For å se objekter i oppstart kan man bruke kommandolinjeverktøyet Get-ItemProperty.
Vi lager to variabler: $runUser – for å se oppstarten på vegne av brukeren og $runMachine – for å se oppstarten på vegne av datamaskinen.

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

For at all informasjon skal lagres i ulike filer, lager vi et array med variabler og et array 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 innsamlede dataene bli skrevet til filer.

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

Etter at skriptet har blitt kjørt, vil det bli opprettet 9 tekstfiler som inneholder nødvendig informasjon.

I dag kan cybersikkerhetsspesialister bruke PowerShell for å berike informasjonen som trengs for å løse ulike oppgaver i arbeidet sitt. Ved å legge til skriptet i oppstarten kan de skaffe seg informasjon uten å ta dump, bilder osv.

Kilde: habr.com

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster