Brug af PowerShell til at indsamle oplysninger om hændelser

PowerShell er et ret almindeligt automatiseringsværktøj, der ofte bruges af både malware-udviklere og informationssikkerhedsspecialister.
Denne artikel vil overveje brugen af ​​PowerShell til fjernindsamling af data fra slutenheder, når der reageres på informationssikkerhedshændelser. For at gøre dette skal du skrive et script, der kører på slutenheden, og så vil der være en detaljeret beskrivelse af dette script.

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 at komme i gang skal du oprette en funktion CSIRT-udvidelse, som vil tage et argument - stien til at gemme de modtagne data. På grund af det faktum, at de fleste cmdlet'er fungerer i Powershell v5, er der foretaget en kontrol af PowerShell-versionen for korrekt drift.

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

For at lette navigationen gennem de oprettede filer initialiseres to variabler: $date og $Computer, som vil blive tildelt computernavnet og den aktuelle 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 kørende processer på vegne af den aktuelle bruger som følger: opret $process-variablen ved at tildele den get-ciminstance-cmdlet'en med win32_process-klassen. Ved hjælp af Select-Object-cmdlet'en kan du tilføje yderligere outputparametre, i vores tilfælde vil disse være parentprocessid (overordnet proces-id PPID), oprettelsesdato (procesoprettelsesdato), behandlet (PID-proces-id), procesnavn (procesnavn), kommandolinje (start kommando).

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

For at få en liste over alle TCP- og UDP-forbindelser skal du oprette variablerne $netTCP og $netUDP ved at tildele dem henholdsvis Get-NetTCPConnection- og Get-NetTCPConnection-cmdlet'erne.

$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 vigtigt at kende listen over planlagte opgaver og opgaver. For at gøre dette bruger vi cmdlet'erne get-ScheduledTask og Get-ScheduledJob. Lad os tildele dem variablerne $task og $job, fordi I første omgang er der en masse planlagte opgaver i systemet, så for at identificere ondsindet aktivitet er det værd at filtrere legitime planlagte opgaver fra. Select-Object cmdlet'en vil hjælpe os 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 der sådan noget som alternative datastrømme (Alternate Data Streams, ADS). Dette betyder, at en fil på NTFS yderligere kan associeres med flere datastrømme af vilkårlig størrelse. Med ADS kan du skjule data, der ikke vil være synlige ved standard systemtjek. Dette kan injicere ondsindet kode og/eller skjule data.

For at vise alternative datastrømme i PowerShell, vil vi bruge get-item cmdlet og det indbyggede Windows-streamværktøj med *-symbolet for at se alle mulige strømme, til dette vil vi oprette $ADS-variablen.

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

Det vil være nyttigt at kende listen over brugere, der er logget ind i systemet, for dette vil vi oprette en $user-variabel og tildele udførelsen af ​​quser-programmet til den.

$user = quser

For at få fodfæste i systemet kan angribere foretage ændringer i autorun. Du kan bruge cmdlet'en Get-ItemProperty til at se elementerne i autoplay.
Lad os oprette to variabler: $runUser - for at se autoload på vegne af brugeren og $runMachine - for at se autoload på vegne af computeren.

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

For at al information kan skrives til forskellige filer, opretter vi et array med variable og et array med filnavne.


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

Og ved at bruge en for-løkke vil de resulterende data blive skrevet til filer.

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

Efter udførelse af scriptet vil der blive oprettet 9 tekstfiler, der indeholder de nødvendige oplysninger.

I dag kan cybersikkerhedsprofessionelle bruge PowerShell til at berige den information, de har brug for til at løse en række opgaver i deres arbejde. Ved at tilføje et script til autoload, kan du få nogle oplysninger uden dumping, billeder osv.

Kilde: www.habr.com

Tilføj en kommentar