Använda PowerShell för att samla in incidentinformation

PowerShell är ett ganska vanligt automatiseringsverktyg som ofta används av både utvecklare av skadlig programvara och informationssäkerhetsspecialister.
Den här artikeln kommer att diskutera alternativet att använda PowerShell för att på distans samla in data från slutenheter när du svarar på informationssäkerhetsincidenter. För att göra detta måste du skriva ett skript som körs på slutenheten och sedan kommer det att finnas en detaljerad beskrivning av detta skript.

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
		}

	}

}

För att komma igång, skapa en funktion CSIRT-tillägg, som tar ett argument - sökvägen för att spara mottagna data. På grund av det faktum att de flesta cmdlets fungerar i Powershell v5, kontrollerades PowerShell-versionen för korrekt funktion.

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

För att underlätta navigeringen genom de skapade filerna initieras två variabler: $date och $Computer, som kommer att tilldelas datornamnet och det aktuella datumet.

$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 listan över processer som körs på uppdrag av den aktuella användaren enligt följande: skapa en $process-variabel, tilldela den get-ciminstance-cmdleten med klassen win32_process. Med hjälp av Select-Object-cmdleten kan du lägga till ytterligare utdataparametrar, i vårt fall kommer dessa att vara parentprocessid (överordnad process-ID PPID), creationdate (process skapelsedatum), processed (process ID PID), processname (process name), kommandorad ( Kör kommando).

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

För att få en lista över alla TCP- och UDP-anslutningar, skapa $netTCP- och $netUDP-variablerna genom att tilldela dem Get-NetTCPConnection- respektive Get-NetTCPConnection-cmdlets.

$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 kommer att vara viktigt att ta reda på listan över planerade uppgifter och uppdrag. För att göra detta använder vi cmdletarna get-ScheduledTask och Get-ScheduledJob. Låt oss tilldela dem variablerna $task och $job, eftersom Inledningsvis finns det många schemalagda uppgifter i systemet, sedan för att identifiera skadlig aktivitet är det värt att filtrera bort legitima schemalagda uppgifter. Select-Object-cmdleten hjälper oss med detta.

$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 finns det något sådant som alternativa dataströmmar (ADS). Detta innebär att en fil i NTFS valfritt kan associeras med flera dataströmmar av godtycklig storlek. Med ADS kan du dölja data som inte skulle vara synliga genom vanliga systemkontroller. Detta gör det möjligt att injicera skadlig kod och/eller dölja data.

För att visa alternativa dataströmmar i PowerShell kommer vi att använda get-item cmdlet och det inbyggda Windows-strömningsverktyget med *-symbolen för att se alla möjliga strömmar, för detta skapar vi $ADS-variabeln.

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

Det kommer att vara användbart att ta reda på listan över användare som är inloggade i systemet; för detta kommer vi att skapa en $user-variabel och tilldela den till exekveringen av quser-programmet.

$user = quser

Angripare kan göra ändringar i autorun för att få fotfäste i systemet. För att visa startobjekt kan du använda cmdleten Get-ItemProperty.
Låt oss skapa två variabler: $runUser - för att visa uppstart för användarens räkning och $runMachine - för att visa uppstart för datorns räkning.

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

För att all information ska skrivas till olika filer skapar vi en array med variabler och en array med filnamn.


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

Och med hjälp av en for-loop kommer mottagna data att skrivas till filer.

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

Efter exekvering av skriptet skapas 9 textfiler som innehåller den nödvändiga informationen.

Idag kan cybersäkerhetsproffs använda PowerShell för att berika den information de behöver för att lösa en mängd olika uppgifter i sitt arbete. Genom att lägga till ett skript vid start kan du få lite information utan att ta bort dumpar, bilder etc.

Källa: will.com

Lägg en kommentar